久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7836|回復: 16
打印 上一主題 下一主題
收起左側

可調矩陣按鍵+LCD1602簡單萬年歷程序 已制作出實物

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


原理圖:


pcb圖:



單片機主程序:

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

  2. //****************LCD1602萬年歷 :顯示 年月日、 溫度、 時間、 星期****************//
  3. //******************************矩陣按鍵可調整***********************************//
  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;                          //到達200ms標志
  13. uchar mode=0;                             //設置變量
  14. struct STime bufTime;                     //日期時間緩沖區
  15. uchar tflag;
  16. void Timer0Init(uint ms);


  17. /**************************************************主函數***********************************************************/
  18. /*                                                                                                                 */         
  19. /*******************************************************************************************************************/
  20. void main()
  21. {
  22.         uchar psec = 0xAA;                      //確保第一次讀取時間能刷新顯示
  23.         EA=1;                                   //打開總中斷
  24.         Timer0Init(1);                          //初始化定時器0 定時1ms
  25.         RESET_DS18B20();                        //復位18B20
  26.         InitDS1302();                           //初始化DS1302
  27.         InitLcd1602();                          //初始化LCD1602
  28.         
  29.         LcdShowStr(0,0,"20");                   //固定顯示內容
  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))         //到達200ms且沒有進入設置模式時
  39.                 {
  40.                         flag200ms=0;
  41.                         GetRealTime(&bufTime);              //獲取當前時間
  42.                         Display_Tem();                      //顯示溫度
  43.                         if(psec!=bufTime.sec)               //檢測時間有變化時刷新時間顯示
  44.                         {
  45.                                 Refresh_TimeShow();                 //更新顯示
  46.                                 psec=bufTime.sec;
  47.                         }
  48.                 }
  49.         }
  50. }



  51. /*********************************************定時器0初始化函數***************************************************/
  52. /*                                           形參ms 當ms=1 定時1毫秒                                             */
  53. /*****************************************************************************************************************/
  54. void Timer0Init(uint ms)
  55. {
  56.         ulong tmp;                              //16位長整型變量tmp
  57.         tmp=12000000/12;                        //用晶振頻率除以12得到定時器計數頻率
  58.         tmp=(tmp*ms)/1000;                      //計算出需要多少個機器周期
  59.         tmp=65536-tmp;                          //定時器的初始值
  60.         tmp=tmp+27;                             //補償中斷延時響應造成的誤差
  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;                                  //開啟定時器0中斷         
  68.         TR0=1;                                  //開啟定時器0
  69. }

  70. /*************************************************T0中斷服務函數**************************************************/
  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)                       //定時200ms
  81.         {
  82.                 tmr_ms=0;
  83.                 flag200ms=1;
  84.         }
  85. }
復制代碼

按鍵程序:
  1. #include"key.h"
  2. //**********************Disigned By F H X***************************//
  3. //*********************4*4矩陣鍵盤掃描程序**************************//
  4. //*****1 按鍵驅動函數 :檢測按鍵動作 執行 mian.c 中按鍵動作函數*****//
  5. //*****2 按鍵掃描函數 :掃描按鍵狀態 在main.c 中的中斷函數被調用****//

  6. /*uchar code KeyCodeMap[4][4]={             //ASCⅡ鍵碼
  7.      {'1','2','3',0x26},               //數字鍵1,數字鍵2,數字鍵3,向上鍵
  8.      {'4','5','6',0x25},               //數字鍵4,數字鍵5,數字鍵6,向左鍵
  9.      {'7','8','9',0x28},               //數字鍵7,數字鍵8,數字鍵9,向下鍵
  10.      {'0',0x1B,0x0D,0x27}                //數字鍵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個按鍵當前狀態
  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個按鍵按下時間
  25.      {0,0,0,0},
  26.      {0,0,0,0},
  27.      {0,0,0,0},
  28.      {0,0,0,0}
  29. };  


  30. /**********按鍵驅動函數**********/
  31. void KeyDrive()
  32. {
  33.         uchar i,j;
  34.         static uchar backup[4][4]={             //保存上次按鍵狀態 默認都為彈起
  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]={       //按鍵按下時間閾值 超過閾值則為長按模式
  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++)                        //循環掃描4×4矩陣鍵盤
  47.         {
  48.                 for(j=0;j<4;j++)
  49.                 {
  50.                         if(backup[i][j]!=KeySta[i][j])      //檢測按鍵動作
  51.                         {
  52.                                 if(KeySta[i][j]==0)               //按鍵被按下
  53.                                 {
  54.                                         KeyDown(KeyCodeMap[i][j]);      //執行按鍵動作函數
  55.                                 }
  56.                                 backup[i][j]=KeySta[i][j];        //保存當前按鍵值
  57.                         }
  58.                         if(KeyDownTime[i][j]>0)             //檢測按鍵按下時間
  59.                         {
  60.                                 if(KeyDownTime[i][j]>=TimeTh[i][j])
  61.                                 {
  62.                                         KeyDown(KeyCodeMap[i][j]);      //按鍵按下時間大于閾值 執行按鍵動作函數
  63.                                         TimeTh[i][j]+=200;              //閾值自增
  64.                                 }
  65.                         }
  66.                         else
  67.                         {
  68.                                 TimeTh[i][j]=1000;                //按鍵彈起時恢復閾值時間
  69.                         }
  70.                 }
  71.         }
  72. }

  73. /**********按鍵掃描函數**********/
  74. void KeyScan()
  75. {
  76.         uchar i;
  77.         static uchar keyout=0;                  //矩陣按鍵掃描輸出索引
  78.         static uchar Keybuff[4][4]={            //按鍵掃描緩沖區
  79.                 {0xFF,0xFF,0xFF,0xFF},
  80.     {0xFF,0xFF,0xFF,0xFF},
  81.     {0xFF,0xFF,0xFF,0xFF},
  82.     {0xFF,0xFF,0xFF,0xFF}
  83.         };
  84.                                                 //逐行檢測按鍵是否被按下 起到按鍵消抖作用
  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)     //檢測某個按鍵被按下
  92.                 {
  93.                         KeySta[keyout][i]=0;                //改變該按鍵狀態
  94.                         KeyDownTime[keyout][i]+=4;          //該按鍵按下時間累加
  95.                 }
  96.                 else if((Keybuff[keyout][i]&0x0F)==0x0F)//檢測某個按鍵彈起
  97.                 {
  98.                         KeySta[keyout][i] = 1;              //改變該按鍵狀態
  99.       KeyDownTime[keyout][i] = 0;         //該按鍵按下時間清零
  100.                 }
  101.         

  102. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼



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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:77707 發表于 2017-4-4 17:45 | 只看該作者
這個好,資料詳實,便于模仿。
回復

使用道具 舉報

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

使用道具 舉報

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

 這個好,資料詳實,便于模仿。
回復

使用道具 舉報

5#
ID:186102 發表于 2017-4-4 19:52 | 只看該作者
這個好,資料詳實,便于模仿。
回復

使用道具 舉報

6#
ID:82765 發表于 2017-4-4 20:03 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

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

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

謝謝樓主分析好資源,正需要來學習!
回復

使用道具 舉報

11#
ID:257452 發表于 2017-12-6 22:16 | 只看該作者
請問有沒有那個仿真圖呢?
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

14#
ID:237239 發表于 2018-5-15 20:32 | 只看該作者
正在做這個東西。。。。。悔恨沒看到樓主的帖子,浪費那么多時間碼代碼
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

17#
ID:670990 發表于 2019-12-24 15:33 來自手機 | 只看該作者
樓主實物圖怎么插的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女露尿口视频 | 久久精品视频网站 | 欧美成年人网站 | 成人网av | 欧美一区二 | 97av视频在线 | 国产成人综合在线 | 久久这里只有精品首页 | 亚洲在线一区二区 | 天天av综合| 欧美一区二区三区精品免费 | 婷婷色成人 | 欧美精品久久久久久 | 中文成人在线 | 欧美性精品| 自拍偷拍一区二区三区 | 91精品免费视频 | 黄色大全免费看 | 国产精品高潮呻吟久久久久 | 久久久久久免费精品一区二区三区 | 欧美日韩高清 | 久久久av一区| 亚洲国产高清高潮精品美女 | av片免费观看 | 国产极品车模吞精高潮呻吟 | 欧美一区二区激情三区 | 国产免费又黄又爽又刺激蜜月al | 国产一区二区三区色淫影院 | 亚洲精品一区二区三区蜜桃久 | 91麻豆精品国产91久久久更新资源速度超快 | 一区二区三区视频在线观看 | 国产精品久久久久久久久久久久久 | www久久99 | 成人小视频在线观看 | 久久久久久久网 | 一区二区三区四区五区在线视频 | 国产成人精品一区二区三区视频 | 亚洲午夜视频 | 在线欧美小视频 | 久久精品国产亚洲 | 夜色www国产精品资源站 |