網路城邦
上一篇 回創作列表 下一篇  字體:
步進馬達之追日系統(二) – LCD1602顯示器
2013/01/16 17:04:36瀏覽519|回應0|推薦1

    本文在延續步進馬達之追日系統的第二篇,介紹主程式的控制,本次主要修改在引入LCD1602的顯示器與使用switch指令來選擇按鍵輸入的執行,原先使用之7-segment LED顯示模組,因為只能顯示8個數字,不敷使用,所以將顯示部份導入LCD 16*2行的液晶顯示器,再者是嚐試使用switch命令來解析按鍵操作,分別定義以下各按鍵之功能:

     按鍵1:時鐘的小時數增加一

     按鍵2:時鐘的小時數減少一

     按鍵3:時鐘的分鐘數增加一

     按鍵4:時鐘的分鐘數減少一

     按鍵5:設定馬達停止動作

     按鍵6:設定馬達啟動動作

/*------------------------------------------------

                    主程式

------------------------------------------------*/

main()

{

    unsigned char i,num;

 

    LCD_Init();           //初始化液晶

    DelayMs(20);          //延時有助於穩定

    LCD_Clear();          //清除LCD螢幕內容

 

    Init_Timer0();

    Ds1302_Init();

    UART_Init();

    FrFlag=1;             //FrFlag:為馬達正反轉之旗號

    Coil_OFF

    Ds1302_Read_Time();  //首次讀取時間

    if(SetFlag)         //如果接收到串口資訊則更新時鐘

    {  for(i=0;i<8;i++)  font="">

       {  time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];

       }    //資料整合,如2個數 1和5整合成15

       Ds1302_Write_Time();

       SetFlag=0;      //時鐘資訊更新後標誌位元清零

    }

    StopFlag=1;

    StepCnt=0;

START:

    timesx=28;

    timesz=StepCnt;

    while(1)

    { Ds1302_Read_Time();

 

      num=KeyPro16();           //迴圈調用按鍵掃描

      switch(num)

      {SCFlag=1;

       case 0:time_buf1[4]++;if(time_buf1[4]==24)time_buf1[4]=0;Ds1302_Write_Time();break; //正常時間 小時 加1

       case 1:time_buf1[4]--;if(time_buf1[4]==255)time_buf1[4]=23;Ds1302_Write_Time();break; //正常時間 小時減1

       case 2:time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5]=0;Ds1302_Write_Time();break; //分加1

       case 3:time_buf1[5]--;if(time_buf1[5]==255)time_buf1[5]=59;Ds1302_Write_Time();break; //分減1

       case 4:Coil_OFF    StopFlag=1;break;    //馬達停機

       case 5:StopFlag=0;break;             //馬達啟動

       default:break;

       }

 

       sprintf(temp," %02d/%02d  ",(int)time_buf1[2],(int)time_buf1[3]);//第一行前8個字,是顯示月份與日期

       LCD_Write_String(0,0,temp);//顯示第一行前8個字

       sprintf(temp,"%2d:%2d:%2d ",(int)time_buf1[4],(int)time_buf1[5], (int)time_buf1[6]);//第一行後8個字,是顯示時間 時/分/秒

       LCD_Write_String(8,0,temp);//顯示第一行後8個字

       sprintf(temp," %02d %03d ",(int)StepCnt,(int)timesw);//第二行前8個字,是顯示馬達運轉數據,StepCnt表示下一個時後數,timesw表示目前已動作之步進數

       LCD_Write_String(0,1,temp);//顯示第二行前8個字

       sprintf(temp,"%1d %02d %03d",(int)StopFlag,(int)timesz,(int)timesx);//第三行後8個字,是顯示馬達運轉控制狀態, StopFlag表示馬達啟動與否旗號,timesz表示時段數,timesx表示下個時段的將運轉的步進數

       LCD_Write_String(8,1,temp);//顯示第二行後8個字

    }

    goto START;

}

( 興趣嗜好其他 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=PYANG&aid=7230395