找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2485|回复: 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 单片机教程网

快速回复 返回顶部 返回列表