字體:小 中 大 | |
|
|
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; } |
|
( 興趣嗜好|其他 ) |