附件和圖發:
3.jpg (179.63 KB, 下載次數: 89)
下載附件
2017-3-12 18:50 上傳
2.jpg (178.26 KB, 下載次數: 83)
下載附件
2017-3-12 18:50 上傳
51單片機源程序:
- #include<reg52.h>
- struct sTime{ //日期時間結構體申明
- unsigned int year;
- unsigned char mon;
- unsigned char day;
- unsigned char hour;
- unsigned char min;
- unsigned char sec;
- unsigned char week;
- };
- bit flag200ms = 1; //200ms 定時標志
- struct sTime bufTime; //日期時間緩沖區
- unsigned char setIndex = 0; //時間設置索引 0 0 就表示正常運行,
- unsigned char T0RH, T0RL;
- void RefreshTimeShow();
- void ConfigTimer0(unsigned int ms);
- extern void KeyScan();
- extern void KeyDriver();
- extern void InitLcd1602();
- extern void LcdOpenCursor();
- extern void LcdCloseCursor();
- extern void LcdSetCursor(unsigned char x, unsigned char y);
- extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
- extern void InitDS1302();
- extern void SetRealTime(struct sTime *time);
- extern void GetRealTime(struct sTime *time);
- void main()
- {
- unsigned char psec = 0xaa; //秒備份,初值 AA 確保首次讀取時間后刷新顯示
- EA = 1;
- ConfigTimer0(1);
- InitLcd1602();
- InitDS1302();
- LcdShowStr(0, 0, "20 - - Week "); //初始化屏幕上固定不變的內容
- LcdShowStr(4, 1, " : : ");
- while(1)
- {
- KeyDriver(); //調用按鍵驅動
- if(flag200ms && (setIndex == 0))
- {
- flag200ms = 0; //每隔200ms且未處于設置狀態時,
- GetRealTime(&bufTime); //獲取當前時間
- if(psec != bufTime.sec) //檢測到時間有變化時刷新顯示
- {
- RefreshTimeShow();
- psec = bufTime.sec; //用當前值更新上次秒數
- }
- }
- }
- }
- /* 將一個BCD碼字節顯示到屏幕上,(x,y)-屏幕起始坐標,bcd-待顯示BCD碼 */
- void ShowBCDByte(unsigned char x, unsigned char y, unsigned char bcd)
- {
- unsigned char str[4];
- str[0] = (bcd >> 4) + '0';
- str[1] = (bcd & 0x0f) + '0';
- str[2] = '\0';
- LcdShowStr(x, y, str);
- }
- void ShowBCDWeek(unsigned char x, unsigned char y, unsigned char bcd)
- {
- unsigned char str[3];
- str[0] = (bcd & 0x0f) + '0';
- str[1] = '\0';
- LcdShowStr(x, y, str);
- }
- /* 刷新日期時間的顯示 */
- void RefreshTimeShow()
- {
- ShowBCDByte(2, 0, bufTime.year);
- ShowBCDByte(5, 0, bufTime.mon);
- ShowBCDByte(8, 0, bufTime.day);
- ShowBCDByte(4, 1, bufTime.hour);
- ShowBCDByte(7, 1, bufTime.min);
- ShowBCDByte(10, 1, bufTime.sec);
- ShowBCDWeek(15, 0, bufTime.week);
- }
- /* 刷新當前設置位的光標指示 */
- void RefreshSetCursorShow()
- {
- switch(setIndex)
- {
- case 1: LcdSetCursor(2, 0); break;
- case 2: LcdSetCursor(3, 0); break;
- case 3: LcdSetCursor(5, 0); break;
- case 4: LcdSetCursor(6, 0); break;
- case 5: LcdSetCursor(8, 0); break;
- case 6: LcdSetCursor(9, 0); break;
- case 7: LcdSetCursor(4, 1); break;
- case 8: LcdSetCursor(5, 1); break;
- case 9: LcdSetCursor(7, 1); break;
- case 10: LcdSetCursor(8, 1); break;
- case 11: LcdSetCursor(15, 0); break;
- default: break;
- }
- }
- unsigned char DecrBCDHight(unsigned char bcd)
- {
- if((bcd & 0xf0) > 0x00)
- {
- bcd -= 0x10;
- }
- else
- {
- if(setIndex == 1)
- bcd |= 0x90;
- else if(setIndex == 3)
- bcd |= 0x10;
- else if(setIndex == 5)
- bcd |= 0x30;
- else if(setIndex == 7)
- bcd |= 0x20;
- else if((setIndex == 9))
- bcd |= 0x60;
- }
-
- return bcd;
- }
- unsigned char DecrBCDLow(unsigned char bcd)
- {
- if((bcd & 0x0f) > 0x00)
- {
- bcd -= 0x01;
- }
- else if(setIndex == 11)
- {
- bcd |= 0x07;
- }
- else
- {
- bcd |= 0x09;
- }
-
- return bcd;
- }
- unsigned char IncrBCDHight(unsigned char bcd)
- {
- if((setIndex == 1)&&((bcd & 0xf0)< 0x90))
- {
- bcd += 0x10;
- }
- else if((setIndex == 3)&&(bcd < 0x10))
- {
- bcd +=0x10;
- }
- else if((setIndex == 5)&&(bcd < 0x30))
- {
- bcd += 0x10;
- }
- else if((setIndex == 7)&&(bcd < 0x20))
- {
- bcd += 0x10;
- }
- else if(setIndex == 9)
- {
- bcd += 0x10;
- }
- else if(setIndex == 11)
- {
- if(bcd < 0x07)
- {
- bcd++;
- }
- else
- {
- bcd = 0x01;
- }
- }
- else
- {
- bcd &= 0x0f;
- }
-
- return bcd;
- }
- unsigned char IncrBCDLow(unsigned char bcd)
- {
- if(setIndex != 11)
- {
- if ((bcd&0x0F) < 0x09)
- bcd += 0x01;
- else
- bcd &= 0xF0;
- }
- else
- {
- if ((bcd&0x0F) < 0x07)
- bcd += 0x01;
- else
- bcd &= 0x01;
- }
-
- return bcd;
- }
- /* 遞增當前設置位的值 */
- void IncrSetTime()
- {
- switch(setIndex)
- {
- case 1: bufTime.year = IncrBCDHight(bufTime.year); break;
- case 2: bufTime.year = IncrBCDLow(bufTime.year); break;
- case 3: bufTime.mon = IncrBCDHight(bufTime.mon); break;
- case 4: bufTime.mon = IncrBCDLow(bufTime.mon); break;
- case 5: bufTime.day = IncrBCDHight(bufTime.day); break;
- case 6: bufTime.day = IncrBCDLow(bufTime.day); break;
- case 7: bufTime.hour = IncrBCDHight(bufTime.hour); break;
- case 8: bufTime.hour = IncrBCDLow(bufTime.hour); break;
- case 9: bufTime.min = IncrBCDHight(bufTime.min); break;
- case 10: bufTime.min = IncrBCDLow(bufTime.min); break;
- case 11: bufTime.week = IncrBCDLow(bufTime.week); break;
- default: break;
- }
- RefreshTimeShow();
- RefreshSetCursorShow();
- }
- /* 遞減當前設置位的值 */
- void DecrSetTime()
- {
- switch(setIndex)
- {
- case 1: bufTime.year = DecrBCDHight(bufTime.year); break;
- case 2: bufTime.year = DecrBCDLow(bufTime.year); break;
- case 3: bufTime.mon = DecrBCDHight(bufTime.mon); break;
- case 4: bufTime.mon = DecrBCDLow(bufTime.mon); break;
- case 5: bufTime.day = DecrBCDHight(bufTime.day); break;
- case 6: bufTime.day = DecrBCDLow(bufTime.day); break;
- case 7: bufTime.hour = DecrBCDHight(bufTime.hour); break;
- case 8: bufTime.hour = DecrBCDLow(bufTime.hour); break;
- case 9: bufTime.min = DecrBCDHight(bufTime.min); break;
- case 10: bufTime.min = DecrBCDLow(bufTime.min); break;
- case 11: bufTime.week = DecrBCDLow(bufTime.week); break;
- default: break;
- }
- RefreshTimeShow();
- RefreshSetCursorShow();
- }
- /* 左移設置位 */
- void LeftShiftTimeSet()
- {
- if(setIndex != 0)
- {
- if(setIndex > 1)
- setIndex--;
- else
- setIndex = 11;
- RefreshSetCursorShow();
- }
- }
- /* 右移設置位 */
- void RightShifTimeSet()
- {
- if(setIndex != 0)
- {
- if(setIndex < 11)
- setIndex++;
- else
- setIndex = 1;
- RefreshSetCursorShow();
- }
- }
- /* 進入設置狀態 */
- void EnterTimeSet()
- {
- setIndex = 2; //把設置索引設置為2,即可進入設置狀態
- LeftShiftTimeSet(); //再利用現成的左移操作移到位置1并完成顯示刷新
- LcdOpenCursor(); //打開光標閃爍效果
- }
- /* 退出設置狀態,save-是否保存當前設置的時間值 */
- void ExitTimeSet(bit save) //save = 1 保存,save = 0 不保存
- {
- setIndex = 0; //把設置索引設置為0,即可退出設置狀態
- if(save) //需保存時即把當前設置時間寫入DS1302
- SetRealTime(&bufTime);
- LcdCloseCursor(); //關閉光標顯示
- }
- /* 按鍵動作函數,根據鍵碼執行相應的操作,keycode-按鍵鍵碼 */
- void KeyAction(unsigned char keycode)
- {
- if((keycode >= '0')&&(keycode <= '9'))//不響應字符鍵
- {}
- else if((keycode == 0x26)) //向上鍵,遞增當前設置位的值
- {
- IncrSetTime();
- }
- else if(keycode == 0x28) //向下鍵,遞減當前設置位的值
- {
- DecrSetTime();
- }
- else if(keycode == 0x25) //向左鍵,向左切換設置位
- {
- LeftShiftTimeSet();
- }
- else if(keycode == 0x27) //向右鍵,向右切換設置位
- {
- RightShifTimeSet();
- }
- else if(keycode == 0x0d) //回車鍵,進入設置模式/啟用當前設置值
- {
- if(setIndex == 0) //不處于設置狀態時,進入設置狀態
- {
- EnterTimeSet();
- }
- else //已處于設置狀態時,保存時間并退出設置狀態
- {
- ExitTimeSet(1);
- }
- }
- else if(keycode == 0x1b) //Esc鍵,取消當前設置
- {
- ExitTimeSet(0);
- }
- }
- void ConfigTimer0(unsigned int ms)
- {
- unsigned long tmp;
- tmp = 11059200 / 12;
- tmp = tmp * ms / 1000;
- tmp = 65536 - tmp;
- tmp = tmp + 28;
- T0RH = (unsigned char)(tmp >> 8);
- T0RL = (unsigned char)tmp;
- TMOD = (TMOD & 0xf0)|0x01;
- TH0 = T0RH;
- TL0 = T0RL;
- ET0 = 1;
- TR0 = 1;
- }
- void IntTimer0() interrupt 1
- {
- static unsigned char tmr200ms = 0;
- TH0 = T0RH;
- TL0 = T0RL;
- KeyScan();
- tmr200ms++;
- if(tmr200ms >= 200)
- {
- tmr200ms = 0;
- flag200ms = 1;
- }
- }
復制代碼
0.png (68.09 KB, 下載次數: 90)
下載附件
2017-3-12 18:54 上傳
下載:
時鐘.rar
(4.99 KB, 下載次數: 37)
2017-3-12 18:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|