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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

HT66F50單片機4*4矩陣鍵盤源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:109672 發表于 2016-3-19 12:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
只是一個鍵盤源碼   和泰的單片機
44矩陣鍵盤.rar (17.34 KB, 下載次數: 8)

  1. //**************此程序的功能是用PA口接一個4*4的鍵盤,并通過按鍵的鍵值不同,在LCD1602上顯示不同的信息*
  2. //跳線接法:將4*4的矩陣鍵盤依次接到PA口,其顯示的值分別為0123456789*#ABCD,其中液晶的接法同做1602的實驗一樣
  3. //做這個實驗的時候,我們采用的是模塊化編程
  4. //注意,在液晶初始化之前,需先將引腳的其他功能去掉,設設置好相應的輸入輸出模式
  5. //此程序的鍵盤掃描函數我感覺太繁瑣,希望能找到更好的辦法解決,再就是程序有點問題,就是當液晶顯示已滿之后,當你再次按下按鍵時
  6. //液晶為何沒有顯示。這是個問題。希望大家能夠找到答案。我們一起相互交流QQ:846754315
  7. #include"HT66F50.h"
  8. #include"yejingdc.h"
  9. #define rs _23_0//pd.0
  10. #define rw _23_1//pd.1
  11. #define e _23_2//pd.2
  12. #define data _pc//數據傳送通道
  13. #define rsc _24_0//控制pd.0
  14. #define rwc _24_1//控制pd.1
  15. #define ec _24_2//控制pd.2
  16. #define datac _pcc//數據pc0~7
  17. #define k _pa//鍵盤接口
  18. #define kc _pac//鍵盤接口控制輸入輸出端寄存器
  19. #define ks _papu//鍵盤接口上拉電阻控制寄存器
  20. #define k1 _1a_0
  21. #define k2 _1a_1
  22. #define k3 _1a_2
  23. #define k4 _1a_3
  24. #define k5 _1a_4
  25. #define k6 _1a_5
  26. #define k7 _1a_6
  27. #define k8 _1a_7
  28. const uchar table0[]="0123456789*#ABCD";
  29. void main(void)
  30. {
  31.         uchar i=0;//記錄按鍵的次數
  32.         quchu();//去除液晶接口其它功能子函數
  33.         quchu2();//去除鍵盤接口其他功能子函數
  34.         shezhi();//設置液晶鍵盤的輸入輸出模式
  35.         lcd_init();//液晶初始化子程序
  36.         lcd_pos(0x00);//送初始顯示地址
  37.         while(1)//開始鍵盤掃描
  38.         {
  39.                 k8=0;k7=1;k6=1;k5=1;//將鍵盤接口的最高位拉低,以檢測低四位的電平變化
  40.                 if((k3==0)||(k2==0)||(k1==0)||(k4==0))//只要有一個成立就成立
  41.                     {
  42.                                 _delay(45000);//12m,延時大約15ms
  43.                                 if(k1==0)
  44.                                     {
  45.                                                 while(!k1);//松手檢測
  46.                                                 if(i==16)
  47.                                                    {
  48.                                                            i=0;
  49.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  50.                                                     lcd_wcmd(0x01);
  51.                                                    }
  52.                                                    else
  53.                                                        i++;
  54.                                                 lcd_wdat(table0[0]);//液晶顯示零
  55.                                         }
  56.                                         else if(k2==0)
  57.                                             {
  58.                                                         while(!k2);//松手檢測
  59.                                                         if(i==16)
  60.                                                    {
  61.                                                            i=0;
  62.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  63.                                                     lcd_wcmd(0x01);
  64.                                                    }
  65.                                                    else
  66.                                                        i++;
  67.                                                         lcd_wdat(table0[1]);//液晶顯示一
  68.                                                 }
  69.                                                 else if(k3==0)
  70.                                                 {
  71.                                                                 while(!k3);//松手檢測
  72.                                                                 if(i==16)
  73.                                                    {
  74.                                                            i=0;
  75.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  76.                                                     lcd_wcmd(0x01);
  77.                                                    }
  78.                                                    else
  79.                                                        i++;
  80.                                                                 lcd_wdat(table0[2]);//液晶顯示二
  81.                                                     }
  82.                                                     else if(k4==0)
  83.                                                    {
  84.                                                                         while(!k4);//松手檢測
  85.                                                                         if(i==16)
  86.                                                    {
  87.                                                            i=0;
  88.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  89.                                                     lcd_wcmd(0x01);
  90.                                                    }
  91.                                                    else
  92.                                                        i++;
  93.                                                                         lcd_wdat(table0[3]);//液晶顯示三
  94.                                                        }
  95.                         }
  96.                         k8=1;k7=0;k6=1;k5=1;//將高七位拉低
  97.                         if((k3==0)||(k2==0)||(k1==0)||(k4==0))//只要有一個成立就成立
  98.                     {
  99.                                 _delay(45000);//12m,延時大約15ms
  100.                                 if(k1==0)
  101.                                     {
  102.                                                 while(!k1);//松手檢測
  103.                                                 if(i==16)
  104.                                                    {
  105.                                                            i=0;
  106.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  107.                                                     lcd_wcmd(0x01);
  108.                                                    }
  109.                                                    else
  110.                                                        i++;
  111.                                                 lcd_wdat(table0[4]);//液晶顯示四
  112.                                         }
  113.                                         else if(k2==0)
  114.                                             {
  115.                                                         while(!k2);//松手檢測
  116.                                                         if(i==16)
  117.                                                    {
  118.                                                            i=0;
  119.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  120.                                                     lcd_wcmd(0x01);
  121.                                                    }
  122.                                                    else
  123.                                                        i++;
  124.                                                         lcd_wdat(table0[5]);//液晶顯示五
  125.                                                 }
  126.                                                 else if(k3==0)
  127.                                                 {
  128.                                                                 while(!k3);//松手檢測
  129.                                                                 if(i==16)
  130.                                                    {
  131.                                                            i=0;
  132.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  133.                                                     lcd_wcmd(0x01);
  134.                                                    }
  135.                                                    else
  136.                                                        i++;
  137.                                                                 lcd_wdat(table0[6]);//液晶顯示六
  138.                                                     }
  139.                                                     else if(k4==0)
  140.                                                    {
  141.                                                                         while(!k4);//松手檢測
  142.                                                                         if(i==16)
  143.                                                    {
  144.                                                            i=0;
  145.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  146.                                                     lcd_wcmd(0x01);
  147.                                                    }
  148.                                                    else
  149.                                                        i++;
  150.                                                                         lcd_wdat(table0[7]);//液晶顯示七
  151.                                                        }
  152.                         }
  153.                         k8=1;k7=1;k6=0;k5=1;//將高六位拉低
  154.                         if((k3==0)||(k2==0)||(k1==0)||(k4==0))//只要有一個成立就成立
  155.                     {
  156.                                 _delay(45000);//12m,延時大約15ms
  157.                                 if(k1==0)
  158.                                     {
  159.                                                 while(!k1);//松手檢測
  160.                                                 if(i==16)
  161.                                                    {
  162.                                                            i=0;
  163.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  164.                                                     lcd_wcmd(0x01);
  165.                                                    }
  166.                                                    else
  167.                                                        i++;
  168.                                                 lcd_wdat(table0[8]);//液晶顯示八
  169.                                         }
  170.                                         else if(k2==0)
  171.                                             {
  172.                                                         while(!k2);//松手檢測
  173.                                                         if(i==16)
  174.                                                    {
  175.                                                            i=0;
  176.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  177.                                                     lcd_wcmd(0x01);
  178.                                                    }
  179.                                                    else
  180.                                                        i++;
  181.                                                         lcd_wdat(table0[9]);//液晶顯示九
  182.                                                 }
  183.                                                 else if(k3==0)
  184.                                                 {
  185.                                                                 while(!k3);//松手檢測
  186.                                                                 if(i==16)
  187.                                                    {
  188.                                                            i=0;
  189.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  190.                                                     lcd_wcmd(0x01);
  191.                                                    }
  192.                                                    else
  193.                                                        i++;
  194.                                                                 lcd_wdat(table0[10]);//液晶顯示*
  195.                                                     }
  196.                                                     else if(k4==0)
  197.                                                    {
  198.                                                                         while(!k4);//松手檢測
  199.                                                                         if(i==16)
  200.                                                    {
  201.                                                            i=0;
  202.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  203.                                                     lcd_wcmd(0x01);
  204.                                                    }
  205.                                                    else
  206.                                                        i++;
  207.                                                                         lcd_wdat(table0[11]);//液晶顯示#
  208.                                                        }
  209.                         }
  210.                         k8=1;k7=1;k6=1;k5=0;//將高五位拉低
  211.                         if((k3==0)||(k2==0)||(k1==0)||(k4==0))//只要有一個成立就成立
  212.                     {
  213.                                 _delay(45000);//12m,延時大約15ms
  214.                                 if(k1==0)
  215.                                     {
  216.                                                 while(!k1);//松手檢測
  217.                                                 if(i==16)
  218.                                                    {
  219.                                                            i=0;
  220.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  221.                                                     lcd_wcmd(0x01);
  222.                                                    }
  223.                                                    else
  224.                                                        i++;
  225.                                                 lcd_wdat(table0[12]);//液晶顯示A
  226.                                         }
  227.                                         else if(k2==0)
  228.                                             {
  229.                                                         while(!k2);//松手檢測
  230.                                                         if(i==16)
  231.                                                    {
  232.                                                            i=0;
  233.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  234.                                                     lcd_wcmd(0x01);
  235.                                                    }
  236.                                                    else
  237.                                                        i++;
  238.                                                         lcd_wdat(table0[13]);//液晶顯示B
  239.                                                 }
  240.                                                 else if(k3==0)
  241.                                                 {
  242.                                                                 while(!k3);//松手檢測
  243.                                                                 if(i==16)
  244.                                                    {
  245.                                                            i=0;
  246.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  247.                                                     lcd_wcmd(0x01);
  248.                                                    }
  249.                                                    else
  250.                                                        i++;
  251.                                                                 lcd_wdat(table0[14]);//液晶顯示C
  252.                                                     }
  253.                                                     else if(k4==0)
  254.                                                    {
  255.                                                                         while(!k4);//松手檢測
  256.                                                                         if(i==16)
  257.                                                    {
  258.                                                            i=0;
  259.                                                     lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
  260.                                                     lcd_wcmd(0x01);
  261.                                                    }
  262.                                                    else
  263.                                                        i++;
  264.                                                                         lcd_wdat(table0[15]);//液晶顯示D
  265.                                                        }
  266.                         }
  267.         }
  268.        
  269.        
  270. }                                                                                    
復制代碼


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2016-3-20 01:42 | 只看該作者
  1. //****************此c文件是一個液晶顯示的底層文件
  2. #include"HT66F50.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define rs _23_0//pd.0
  6. #define rw _23_1//pd.1
  7. #define e _23_2//pd.2
  8. #define data _pc//數據傳送通道
  9. #define rsc _24_0//控制pd.0
  10. #define rwc _24_1//控制pd.1
  11. #define ec _24_2//控制pd.2
  12. #define datac _pcc//數據pc0~7
  13. //const uchar table0[]="0123456789*#ABCD";                                                                                    
  14. //******************寫指令子函數******************************/

  15. void lcd_wcmd(uchar cmd)
  16. {                          
  17.    
  18.    _delay(100);
  19.     rs = 0;
  20.     rw = 0;
  21.     e = 0;
  22.     _nop();
  23.     _nop();
  24.     data = cmd;
  25.     _nop();
  26.     _nop();
  27.     _nop();
  28.     _nop();
  29.     _nop();
  30.    
  31.     e = 1;
  32.     _nop();
  33.     _nop();
  34.     _nop();
  35.     _nop();
  36.     _nop();
  37.    
  38.    e = 0;  
  39. }
  40.                                                                                                                               
  41. //****************寫數據到LCD子函數******************************/

  42. void lcd_wdat(uchar dat)
  43. {                          
  44.    
  45.    _delay(100);
  46.     rs = 1;
  47.     rw = 0;
  48.     e = 0;
  49.     data = dat;
  50.     _nop();
  51.     _nop();
  52.     _nop();
  53.     _nop();
  54.     _nop();
  55.     _nop();
  56.    
  57.     e = 1;
  58.    
  59.     _nop();
  60.     _nop();
  61.     _nop();
  62.     _nop();
  63.     e = 0;
  64. }

  65.                                                                                                                                  
  66. //*****************設定顯示地址子函數***********************//

  67. void lcd_pos(uchar pos)
  68. {                          
  69.    lcd_wcmd(pos|0x80);      //數據指針=80+地址變量
  70. }
  71.                                                                                                                               
  72. //***********************LCD初始化子函數*****************************/

  73. void lcd_init()
  74. {                        
  75.     lcd_wcmd(0x38);          //16*2顯示,5*7點陣,8位數據
  76.    
  77.    _delay(30000);
  78.     lcd_wcmd(0x38);         
  79.    
  80.     _delay(30000);
  81.     lcd_wcmd(0x38);         
  82.    
  83.    
  84.     _delay(30000);
  85.     lcd_wcmd(0x0c);          //顯示開,關光標
  86.    
  87.     _delay(30000);
  88.     lcd_wcmd(0x06);          //移動光標
  89.    
  90.     _delay(30000);
  91.     lcd_wcmd(0x01);          //清除LCD的顯示內容
  92.    
  93.     _delay(30000);
  94. }
  95. void quchu(void)//液晶接口其他功能去除子函數
  96.    {
  97.                 _scomen=0;//關閉SCOM功能
  98.                 _tmpc0=0x00;//關閉TM比較輸出功能
  99.                 _cp1c=0x00;//關比較器1輸入功能
  100.                 _tmpc1=0x00;//關TP2_0功能
  101.        
  102.         }
  103. void quchu2(void)//鍵盤接口其它功能去除子函數
  104. {
  105.         _acerl=0x00;//去除PA口的ADC功能
  106.         _tmpc0=0x00;//去除PA0引腳的TM輸出
  107.         _cp0c=0x00;//去除PA0引腳的比較器0功能
  108.         _cp1c=0x00;//去除pa口的比較器1功能
  109. }
  110. void shezhi(void)//鍵盤及液晶的引腳輸出輸入設置子函數
  111. {
  112.         _pac=0x0f;//設置鍵盤接口輸入有效(高四位為輸出,低四位為輸入)
  113.         _papu=0xff;//鍵盤接口上拉電阻設置有效
  114.         datac=0;//設置液晶數據通道輸出有效
  115.         rsc=0;//設置rs端輸出有效
  116.         rwc=0;//設置rw端輸出有效
  117.         ec=0;//設置使能端輸出有效
  118.        
  119.         }
復制代碼
回復

使用道具 舉報

板凳
ID:171702 發表于 2017-3-18 08:34 | 只看該作者
666,請問有光照傳感器的代碼嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品高潮呻吟久久av野狼 | 久久久久久高潮国产精品视 | 久久青草av | 日韩精品中文字幕一区二区三区 | 成人在线激情 | 欧美一区二区三区在线看 | 久久综合九色综合欧美狠狠 | 国产精品99精品久久免费 | 成人免费一级 | 国产免费麻豆视频 | 久久亚洲一区 | 欧美激情精品久久久久 | 国产午夜在线观看 | 中文字幕 亚洲一区 | 久久免费精品 | 91精品久久久久久久久中文字幕 | 亚洲精品一二区 | 成人午夜精品一区二区三区 | 国产精品久久久久久婷婷天堂 | 色综合一区二区 | 999精品在线观看 | 欧美综合网 | 国产精品视频一区二区三区不卡 | 超碰97干 | 人碰人操| aa级毛片毛片免费观看久 | 青青艹在线视频 | 免费看黄视频网站 | 精品国模一区二区三区欧美 | 欧州一区二区三区 | 日本爱爱视频 | 国产日产精品一区二区三区四区 | 久久久久久国产精品久久 | 欧美日日 | 自拍偷拍亚洲欧美 | 日韩免费一级 | 蜜桃视频在线观看免费视频网站www | 欧美一级二级三级视频 | 欧美久久一区二区三区 | 亚洲激情在线观看 | 亚洲精品中文在线观看 |