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