用開發板上的矩陣按鍵 DS1302 LCD1602 寫了一個簡單的萬年歷程序
顯示 年月日 時間 星期 溫度 可用矩陣按鍵調整(其中的幾個按鍵 具體的看程序)
程序包括了矩陣按鍵掃描 、 DS1302、LCD1602、DS18B20 底層文件 可以用來移植到別的程序中
希望對新人的學習有所幫助!
實物圖:
P70320-124000.gif (3.7 MB, 下載次數: 123)
下載附件
2017-4-4 15:52 上傳
原理圖:
0.png (122.38 KB, 下載次數: 114)
下載附件
2017-4-4 16:23 上傳
pcb圖:
0.png (78.42 KB, 下載次數: 101)
下載附件
2017-4-4 16:22 上傳
HQY]71MT}SSOQJ_GGA$NHWT.png (113.18 KB, 下載次數: 87)
下載附件
2017-4-4 15:54 上傳
單片機主程序:
- //******************************Write By F H X***********************************//
- //****************LCD1602萬年歷 :顯示 年月日、 溫度、 時間、 星期****************//
- //******************************矩陣按鍵可調整***********************************//
- //*****************************LCD1602界面如下***********************************//
- //************************ ■〓〓〓〓〓〓〓〓〓〓〓■ *****************************//
- //************************ ■ 2017年03月20日 15°C ■ *****************************//
- //************************ ■ 12:30:00 week:1 ■ *****************************//
- //************************ ■〓〓〓〓〓〓〓〓〓〓〓■ *****************************//
- #include"function.h"
- uchar T0RH=0;
- uchar T0RL=0;
- bit flag200ms=1; //到達200ms標志
- uchar mode=0; //設置變量
- struct STime bufTime; //日期時間緩沖區
- uchar tflag;
- void Timer0Init(uint ms);
- /**************************************************主函數***********************************************************/
- /* */
- /*******************************************************************************************************************/
- void main()
- {
- uchar psec = 0xAA; //確保第一次讀取時間能刷新顯示
- EA=1; //打開總中斷
- Timer0Init(1); //初始化定時器0 定時1ms
- RESET_DS18B20(); //復位18B20
- InitDS1302(); //初始化DS1302
- InitLcd1602(); //初始化LCD1602
-
- LcdShowStr(0,0,"20"); //固定顯示內容
- Display_user(); //顯示自定義字符 年 月 日
- LcdShowDat(14,0,0xDF); //顯示°
- LcdShowStr(15,0,"C");
- LcdShowStr(0,1," : : ");
- LcdShowStr(9,1,"week:");
- while(1)
- {
- KeyDrive();
- if(flag200ms&&(mode==0)) //到達200ms且沒有進入設置模式時
- {
- flag200ms=0;
- GetRealTime(&bufTime); //獲取當前時間
- Display_Tem(); //顯示溫度
- if(psec!=bufTime.sec) //檢測時間有變化時刷新時間顯示
- {
- Refresh_TimeShow(); //更新顯示
- psec=bufTime.sec;
- }
- }
- }
- }
- /*********************************************定時器0初始化函數***************************************************/
- /* 形參ms 當ms=1 定時1毫秒 */
- /*****************************************************************************************************************/
- void Timer0Init(uint ms)
- {
- ulong tmp; //16位長整型變量tmp
- tmp=12000000/12; //用晶振頻率除以12得到定時器計數頻率
- tmp=(tmp*ms)/1000; //計算出需要多少個機器周期
- tmp=65536-tmp; //定時器的初始值
- tmp=tmp+27; //補償中斷延時響應造成的誤差
- T0RH=(uchar)(tmp>>8); //將tmp高8位右移8位 賦值給T0RH
- T0RL=(uchar)tmp; //將tmp低8位賦值給T0RL
- TMOD&=0xF0; //TMOD高4位不變 低四位清零
- TMOD|=0x01; //TMOD低四位變成0001
- TH0=T0RH; //裝載初值
- TL0=T0RL;
- ET0=1; //開啟定時器0中斷
- TR0=1; //開啟定時器0
- }
- /*************************************************T0中斷服務函數**************************************************/
- /* */
- /*****************************************************************************************************************/
- void InterruptTimer0() interrupt 1
- {
- static uchar tmr_ms=0;
- TH0=T0RH;
- TL0=T0RL;
- KeyScan();
- tmr_ms++;
- if(tmr_ms>=200) //定時200ms
- {
- tmr_ms=0;
- flag200ms=1;
- }
- }
復制代碼
按鍵程序:
- #include"key.h"
- //**********************Disigned By F H X***************************//
- //*********************4*4矩陣鍵盤掃描程序**************************//
- //*****1 按鍵驅動函數 :檢測按鍵動作 執行 mian.c 中按鍵動作函數*****//
- //*****2 按鍵掃描函數 :掃描按鍵狀態 在main.c 中的中斷函數被調用****//
- /*uchar code KeyCodeMap[4][4]={ //ASCⅡ鍵碼
- {'1','2','3',0x26}, //數字鍵1,數字鍵2,數字鍵3,向上鍵
- {'4','5','6',0x25}, //數字鍵4,數字鍵5,數字鍵6,向左鍵
- {'7','8','9',0x28}, //數字鍵7,數字鍵8,數字鍵9,向下鍵
- {'0',0x1B,0x0D,0x27} //數字鍵0, ESC鍵 ,回車鍵 ,向右鍵
- };*/
- uchar code KeyCodeMap[4][4]={
- {0x31,0x32,0x33,0x26},
- {0x34,0x35,0x36,0x25},
- {0x37,0x38,0x39,0x28},
- {0x30,0x1B,0x0D,0x27}
- };
- uchar KeySta[4][4]={ //16個按鍵當前狀態
- {1,1,1,1},
- {1,1,1,1},
- {1,1,1,1},
- {1,1,1,1}
- };
- ulong pdata KeyDownTime[4][4]={ //16個按鍵按下時間
- {0,0,0,0},
- {0,0,0,0},
- {0,0,0,0},
- {0,0,0,0}
- };
- /**********按鍵驅動函數**********/
- void KeyDrive()
- {
- uchar i,j;
- static uchar backup[4][4]={ //保存上次按鍵狀態 默認都為彈起
- {1,1,1,1},
- {1,1,1,1},
- {1,1,1,1},
- {1,1,1,1}
- };
- static ulong pdata TimeTh[4][4]={ //按鍵按下時間閾值 超過閾值則為長按模式
- {1000,1000,1000,1000},
- {1000,1000,1000,1000},
- {1000,1000,1000,1000},
- {1000,1000,1000,1000}
- };
- for(i=0;i<4;i++) //循環掃描4×4矩陣鍵盤
- {
- for(j=0;j<4;j++)
- {
- if(backup[i][j]!=KeySta[i][j]) //檢測按鍵動作
- {
- if(KeySta[i][j]==0) //按鍵被按下
- {
- KeyDown(KeyCodeMap[i][j]); //執行按鍵動作函數
- }
- backup[i][j]=KeySta[i][j]; //保存當前按鍵值
- }
- if(KeyDownTime[i][j]>0) //檢測按鍵按下時間
- {
- if(KeyDownTime[i][j]>=TimeTh[i][j])
- {
- KeyDown(KeyCodeMap[i][j]); //按鍵按下時間大于閾值 執行按鍵動作函數
- TimeTh[i][j]+=200; //閾值自增
- }
- }
- else
- {
- TimeTh[i][j]=1000; //按鍵彈起時恢復閾值時間
- }
- }
- }
- }
- /**********按鍵掃描函數**********/
- void KeyScan()
- {
- uchar i;
- static uchar keyout=0; //矩陣按鍵掃描輸出索引
- static uchar Keybuff[4][4]={ //按鍵掃描緩沖區
- {0xFF,0xFF,0xFF,0xFF},
- {0xFF,0xFF,0xFF,0xFF},
- {0xFF,0xFF,0xFF,0xFF},
- {0xFF,0xFF,0xFF,0xFF}
- };
- //逐行檢測按鍵是否被按下 起到按鍵消抖作用
- Keybuff[keyout][0]=(Keybuff[keyout][0]<<1)|KEY_IN_1;
- Keybuff[keyout][1]=(Keybuff[keyout][1]<<1)|KEY_IN_2;
- Keybuff[keyout][2]=(Keybuff[keyout][2]<<1)|KEY_IN_3;
- Keybuff[keyout][3]=(Keybuff[keyout][3]<<1)|KEY_IN_4;
- for(i=0;i<4;i++)
- {
- if((Keybuff[keyout][i]&0x0F)==0x00) //檢測某個按鍵被按下
- {
- KeySta[keyout][i]=0; //改變該按鍵狀態
- KeyDownTime[keyout][i]+=4; //該按鍵按下時間累加
- }
- else if((Keybuff[keyout][i]&0x0F)==0x0F)//檢測某個按鍵彈起
- {
- KeySta[keyout][i] = 1; //改變該按鍵狀態
- KeyDownTime[keyout][i] = 0; //該按鍵按下時間清零
- }
-
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (51.72 KB, 下載次數: 113)
下載附件
2017-4-4 16:21 上傳
資料下載:
按鍵可調萬年歷.rar
(318.62 KB, 下載次數: 145)
2017-4-4 15:55 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
|