找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7876|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

可調(diào)矩陣按鍵+LCD1602簡(jiǎn)單萬年歷程序 已制作出實(shí)物

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
用開發(fā)板上的矩陣按鍵 DS1302 LCD1602 寫了一個(gè)簡(jiǎn)單的萬年歷程序
顯示 年月日 時(shí)間 星期 溫度 可用矩陣按鍵調(diào)整(其中的幾個(gè)按鍵  具體的看程序)
程序包括了矩陣按鍵掃描 、 DS1302、LCD1602、DS18B20 底層文件 可以用來移植到別的程序中
希望對(duì)新人的學(xué)習(xí)有所幫助!
實(shí)物圖:


原理圖:


pcb圖:



單片機(jī)主程序:

  1. //******************************Write By F H X***********************************//

  2. //****************LCD1602萬年歷 :顯示 年月日、 溫度、 時(shí)間、 星期****************//
  3. //******************************矩陣按鍵可調(diào)整***********************************//
  4. //*****************************LCD1602界面如下***********************************//
  5. //************************ ■〓〓〓〓〓〓〓〓〓〓〓■ *****************************//
  6. //************************ ■ 2017年03月20日 15°C  ■ *****************************//
  7. //************************ ■ 12:30:00    week:1   ■ *****************************//
  8. //************************ ■〓〓〓〓〓〓〓〓〓〓〓■ *****************************//


  9. #include"function.h"

  10. uchar T0RH=0;
  11. uchar T0RL=0;
  12. bit flag200ms=1;                          //到達(dá)200ms標(biāo)志
  13. uchar mode=0;                             //設(shè)置變量
  14. struct STime bufTime;                     //日期時(shí)間緩沖區(qū)
  15. uchar tflag;
  16. void Timer0Init(uint ms);


  17. /**************************************************主函數(shù)***********************************************************/
  18. /*                                                                                                                 */         
  19. /*******************************************************************************************************************/
  20. void main()
  21. {
  22.         uchar psec = 0xAA;                      //確保第一次讀取時(shí)間能刷新顯示
  23.         EA=1;                                   //打開總中斷
  24.         Timer0Init(1);                          //初始化定時(shí)器0 定時(shí)1ms
  25.         RESET_DS18B20();                        //復(fù)位18B20
  26.         InitDS1302();                           //初始化DS1302
  27.         InitLcd1602();                          //初始化LCD1602
  28.         
  29.         LcdShowStr(0,0,"20");                   //固定顯示內(nèi)容
  30.         Display_user();                         //顯示自定義字符 年 月 日
  31.         LcdShowDat(14,0,0xDF);                  //顯示°
  32.         LcdShowStr(15,0,"C");               
  33.         LcdShowStr(0,1,"  :  :  ");
  34.         LcdShowStr(9,1,"week:");
  35.         while(1)
  36.         {
  37.                 KeyDrive();
  38.                 if(flag200ms&&(mode==0))         //到達(dá)200ms且沒有進(jìn)入設(shè)置模式時(shí)
  39.                 {
  40.                         flag200ms=0;
  41.                         GetRealTime(&bufTime);              //獲取當(dāng)前時(shí)間
  42.                         Display_Tem();                      //顯示溫度
  43.                         if(psec!=bufTime.sec)               //檢測(cè)時(shí)間有變化時(shí)刷新時(shí)間顯示
  44.                         {
  45.                                 Refresh_TimeShow();                 //更新顯示
  46.                                 psec=bufTime.sec;
  47.                         }
  48.                 }
  49.         }
  50. }



  51. /*********************************************定時(shí)器0初始化函數(shù)***************************************************/
  52. /*                                           形參ms 當(dāng)ms=1 定時(shí)1毫秒                                             */
  53. /*****************************************************************************************************************/
  54. void Timer0Init(uint ms)
  55. {
  56.         ulong tmp;                              //16位長(zhǎng)整型變量tmp
  57.         tmp=12000000/12;                        //用晶振頻率除以12得到定時(shí)器計(jì)數(shù)頻率
  58.         tmp=(tmp*ms)/1000;                      //計(jì)算出需要多少個(gè)機(jī)器周期
  59.         tmp=65536-tmp;                          //定時(shí)器的初始值
  60.         tmp=tmp+27;                             //補(bǔ)償中斷延時(shí)響應(yīng)造成的誤差
  61.         T0RH=(uchar)(tmp>>8);                   //將tmp高8位右移8位 賦值給T0RH
  62.         T0RL=(uchar)tmp;                        //將tmp低8位賦值給T0RL
  63.         TMOD&=0xF0;                             //TMOD高4位不變 低四位清零
  64.         TMOD|=0x01;                             //TMOD低四位變成0001
  65.         TH0=T0RH;                               //裝載初值
  66.         TL0=T0RL;
  67.         ET0=1;                                  //開啟定時(shí)器0中斷         
  68.         TR0=1;                                  //開啟定時(shí)器0
  69. }

  70. /*************************************************T0中斷服務(wù)函數(shù)**************************************************/
  71. /*                                                                                                               */
  72. /*****************************************************************************************************************/
  73. void InterruptTimer0() interrupt 1
  74. {
  75.         static uchar tmr_ms=0;
  76.         TH0=T0RH;
  77.         TL0=T0RL;
  78.         KeyScan();
  79.         tmr_ms++;
  80.         if(tmr_ms>=200)                       //定時(shí)200ms
  81.         {
  82.                 tmr_ms=0;
  83.                 flag200ms=1;
  84.         }
  85. }
復(fù)制代碼

按鍵程序:
  1. #include"key.h"
  2. //**********************Disigned By F H X***************************//
  3. //*********************4*4矩陣鍵盤掃描程序**************************//
  4. //*****1 按鍵驅(qū)動(dòng)函數(shù) :檢測(cè)按鍵動(dòng)作 執(zhí)行 mian.c 中按鍵動(dòng)作函數(shù)*****//
  5. //*****2 按鍵掃描函數(shù) :掃描按鍵狀態(tài) 在main.c 中的中斷函數(shù)被調(diào)用****//

  6. /*uchar code KeyCodeMap[4][4]={             //ASCⅡ鍵碼
  7.      {'1','2','3',0x26},               //數(shù)字鍵1,數(shù)字鍵2,數(shù)字鍵3,向上鍵
  8.      {'4','5','6',0x25},               //數(shù)字鍵4,數(shù)字鍵5,數(shù)字鍵6,向左鍵
  9.      {'7','8','9',0x28},               //數(shù)字鍵7,數(shù)字鍵8,數(shù)字鍵9,向下鍵
  10.      {'0',0x1B,0x0D,0x27}                //數(shù)字鍵0,  ESC鍵 ,回車鍵 ,向右鍵
  11. };*/

  12. uchar code KeyCodeMap[4][4]={            
  13.      {0x31,0x32,0x33,0x26},               
  14.      {0x34,0x35,0x36,0x25},              
  15.      {0x37,0x38,0x39,0x28},            
  16.      {0x30,0x1B,0x0D,0x27}               
  17. };

  18. uchar KeySta[4][4]={                      //16個(gè)按鍵當(dāng)前狀態(tài)
  19.            {1,1,1,1},
  20.      {1,1,1,1},
  21.      {1,1,1,1},
  22.      {1,1,1,1}
  23. };                                       
  24. ulong pdata KeyDownTime[4][4]={           //16個(gè)按鍵按下時(shí)間
  25.      {0,0,0,0},
  26.      {0,0,0,0},
  27.      {0,0,0,0},
  28.      {0,0,0,0}
  29. };  


  30. /**********按鍵驅(qū)動(dòng)函數(shù)**********/
  31. void KeyDrive()
  32. {
  33.         uchar i,j;
  34.         static uchar backup[4][4]={             //保存上次按鍵狀態(tài) 默認(rèn)都為彈起
  35.      {1,1,1,1},
  36.      {1,1,1,1},
  37.      {1,1,1,1},
  38.      {1,1,1,1}
  39.         };
  40.         static ulong pdata TimeTh[4][4]={       //按鍵按下時(shí)間閾值 超過閾值則為長(zhǎng)按模式
  41.      {1000,1000,1000,1000},
  42.      {1000,1000,1000,1000},
  43.      {1000,1000,1000,1000},
  44.      {1000,1000,1000,1000}
  45.         };
  46.         for(i=0;i<4;i++)                        //循環(huán)掃描4×4矩陣鍵盤
  47.         {
  48.                 for(j=0;j<4;j++)
  49.                 {
  50.                         if(backup[i][j]!=KeySta[i][j])      //檢測(cè)按鍵動(dòng)作
  51.                         {
  52.                                 if(KeySta[i][j]==0)               //按鍵被按下
  53.                                 {
  54.                                         KeyDown(KeyCodeMap[i][j]);      //執(zhí)行按鍵動(dòng)作函數(shù)
  55.                                 }
  56.                                 backup[i][j]=KeySta[i][j];        //保存當(dāng)前按鍵值
  57.                         }
  58.                         if(KeyDownTime[i][j]>0)             //檢測(cè)按鍵按下時(shí)間
  59.                         {
  60.                                 if(KeyDownTime[i][j]>=TimeTh[i][j])
  61.                                 {
  62.                                         KeyDown(KeyCodeMap[i][j]);      //按鍵按下時(shí)間大于閾值 執(zhí)行按鍵動(dòng)作函數(shù)
  63.                                         TimeTh[i][j]+=200;              //閾值自增
  64.                                 }
  65.                         }
  66.                         else
  67.                         {
  68.                                 TimeTh[i][j]=1000;                //按鍵彈起時(shí)恢復(fù)閾值時(shí)間
  69.                         }
  70.                 }
  71.         }
  72. }

  73. /**********按鍵掃描函數(shù)**********/
  74. void KeyScan()
  75. {
  76.         uchar i;
  77.         static uchar keyout=0;                  //矩陣按鍵掃描輸出索引
  78.         static uchar Keybuff[4][4]={            //按鍵掃描緩沖區(qū)
  79.                 {0xFF,0xFF,0xFF,0xFF},
  80.     {0xFF,0xFF,0xFF,0xFF},
  81.     {0xFF,0xFF,0xFF,0xFF},
  82.     {0xFF,0xFF,0xFF,0xFF}
  83.         };
  84.                                                 //逐行檢測(cè)按鍵是否被按下 起到按鍵消抖作用
  85.   Keybuff[keyout][0]=(Keybuff[keyout][0]<<1)|KEY_IN_1;
  86.         Keybuff[keyout][1]=(Keybuff[keyout][1]<<1)|KEY_IN_2;
  87.         Keybuff[keyout][2]=(Keybuff[keyout][2]<<1)|KEY_IN_3;
  88.         Keybuff[keyout][3]=(Keybuff[keyout][3]<<1)|KEY_IN_4;
  89.         for(i=0;i<4;i++)
  90.         {
  91.                 if((Keybuff[keyout][i]&0x0F)==0x00)     //檢測(cè)某個(gè)按鍵被按下
  92.                 {
  93.                         KeySta[keyout][i]=0;                //改變?cè)摪存I狀態(tài)
  94.                         KeyDownTime[keyout][i]+=4;          //該按鍵按下時(shí)間累加
  95.                 }
  96.                 else if((Keybuff[keyout][i]&0x0F)==0x0F)//檢測(cè)某個(gè)按鍵彈起
  97.                 {
  98.                         KeySta[keyout][i] = 1;              //改變?cè)摪存I狀態(tài)
  99.       KeyDownTime[keyout][i] = 0;         //該按鍵按下時(shí)間清零
  100.                 }
  101.         

  102. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼



資料下載:
按鍵可調(diào)萬年歷.rar (318.62 KB, 下載次數(shù): 145)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:77707 發(fā)表于 2017-4-4 17:45 | 只看該作者
這個(gè)好,資料詳實(shí),便于模仿。
回復(fù)

使用道具 舉報(bào)

板凳
ID:150346 發(fā)表于 2017-4-4 17:54 | 只看該作者
原理圖PCB圖和程序有些差別 大家注意一下
回復(fù)

使用道具 舉報(bào)

地板
ID:186071 發(fā)表于 2017-4-4 17:56 | 只看該作者

 這個(gè)好,資料詳實(shí),便于模仿。
回復(fù)

使用道具 舉報(bào)

5#
ID:186102 發(fā)表于 2017-4-4 19:52 | 只看該作者
這個(gè)好,資料詳實(shí),便于模仿。
回復(fù)

使用道具 舉報(bào)

6#
ID:82765 發(fā)表于 2017-4-4 20:03 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

7#
ID:150346 發(fā)表于 2017-4-4 20:08 | 只看該作者
cjjcjj1 發(fā)表于 2017-4-4 20:03
PCB和原理圖都是 PDF 格式,樓主能否提供 PCB 源文件呢

這個(gè)也不復(fù)雜 自己試著畫一下
如果沒有器件封裝庫(kù) 可以到我另一個(gè)帖子下載

最全AD器件庫(kù)封裝庫(kù)!超大資源!
http://www.torrancerestoration.com/bbs/dpj-79889-1.html
(出處: 51黑電子論壇)
回復(fù)

使用道具 舉報(bào)

8#
ID:167337 發(fā)表于 2017-4-5 15:07 | 只看該作者
謝謝樓主分析好資源,正需要來學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

9#
ID:185915 發(fā)表于 2017-5-14 12:27 | 只看該作者
正好要做這個(gè) 樓主很給力
回復(fù)

使用道具 舉報(bào)

10#
ID:185915 發(fā)表于 2017-5-14 12:30 | 只看該作者

謝謝樓主分析好資源,正需要來學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

11#
ID:257452 發(fā)表于 2017-12-6 22:16 | 只看該作者
請(qǐng)問有沒有那個(gè)仿真圖呢?
回復(fù)

使用道具 舉報(bào)

12#
ID:122146 發(fā)表于 2018-3-31 08:44 | 只看該作者
謝謝樓主分享資源,正需要來學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

13#
ID:301164 發(fā)表于 2018-4-2 21:56 | 只看該作者
您這個(gè)非常棒   完美解決了我的問題  謝謝您了
回復(fù)

使用道具 舉報(bào)

14#
ID:237239 發(fā)表于 2018-5-15 20:32 | 只看該作者
正在做這個(gè)東西。。。。;诤逈]看到樓主的帖子,浪費(fèi)那么多時(shí)間碼代碼
回復(fù)

使用道具 舉報(bào)

15#
ID:273605 發(fā)表于 2018-5-16 06:59 | 只看該作者
最近要用1602,參考一下~~!
回復(fù)

使用道具 舉報(bào)

16#
ID:670600 發(fā)表于 2019-12-22 18:45 | 只看該作者
博主,我是新人,可以發(fā)一下程序嗎?謝謝!1063847577@qq.com
回復(fù)

使用道具 舉報(bào)

17#
ID:670990 發(fā)表于 2019-12-24 15:33 來自手機(jī) | 只看該作者
樓主實(shí)物圖怎么插的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表