找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3354|回复: 1
打印 上一主题 下一主题
收起左侧

C51单片机扫描法矩阵键盘程序,可实现八位数字或者字符输入

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



单片机源程序如下:
  1. #include "reg52.h"           

  2. typedef unsigned int u16;     
  3. typedef unsigned char u8;

  4. #define GPIO_DIG P0
  5. #define GPIO_KEY P1

  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;

  9. u8 KeyValue;    //用来存放读取到的键值
  10. u8 keyflag;     //用来回复是否有按键按下

  11. u8 code smgduan[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  12.                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x08};//显示0~F的值,且显示横杠

  13. u16 wei[8]={16,16,16,16,16,16,16,16}; //用来存放每一位数码管数字的数组,且初始化为横杠


  14. void delay(u16 i)
  15. {
  16.     while(i--);
  17. }

  18. void KeyDown(void)
  19. {
  20.     char a=0;
  21.     GPIO_KEY=0x0f;
  22.     if(GPIO_KEY!=0x0f)//读取按键是否按下
  23.     {
  24.         keyflag=1;   //有按键按下,数值为1;
  25.         delay(1000);//延时10ms进行消抖
  26.         if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
  27.         {   
  28.             //测试列
  29.             GPIO_KEY=0X0F;
  30.             switch(GPIO_KEY)
  31.             {
  32.                 case(0X07): KeyValue=0;break;
  33.                 case(0X0b): KeyValue=1;break;
  34.                 case(0X0d): KeyValue=2;break;
  35.                 case(0X0e): KeyValue=3;break;
  36.             }
  37.             //测试行
  38.             GPIO_KEY=0XF0;
  39.             switch(GPIO_KEY)
  40.             {
  41.                 case(0X70): KeyValue=KeyValue;break;
  42.                 case(0Xb0): KeyValue=KeyValue+4;break;
  43.                 case(0Xd0): KeyValue=KeyValue+8;break;
  44.                 case(0Xe0): KeyValue=KeyValue+12;break;
  45.             }
  46.             while((a<50)&&(GPIO_KEY!=0xf0))  //检测按键松手检测
  47.             {
  48.                 delay(1000);
  49.                 a++;
  50.             }
  51.         }
  52.     }
  53. }

  54. void display()   
  55. {   

  56.      LSA=0; LSB=0; LSC=0; P0=smgduan[wei[0]];delay(50); P0=0x00;
  57.      LSA=1; LSB=0; LSC=0; P0=smgduan[wei[1]];delay(50); P0=0x00;
  58.      LSA=0; LSB=1; LSC=0; P0=smgduan[wei[2]];delay(50); P0=0x00;
  59.      LSA=1; LSB=1; LSC=0; P0=smgduan[wei[3]];delay(50); P0=0x00;
  60.      LSA=0; LSB=0; LSC=1; P0=smgduan[wei[4]];delay(50); P0=0x00;
  61.      LSA=1; LSB=0; LSC=1; P0=smgduan[wei[5]];delay(50); P0=0x00;
  62.      LSA=0; LSB=1; LSC=1; P0=smgduan[wei[6]];delay(50); P0=0x00;
  63.      LSA=1; LSB=1; LSC=1; P0=smgduan[wei[7]];delay(50); P0=0x00;

  64. }


  65. void main()
  66. {   
  67.     u8 i;
  68.     while(1)
  69.     {   
  70.          display(); //数码管显示
  71.          KeyDown(); //判断按键是否按下
  72.          if(keyflag==1)  //若按键按下,数组中每一位数字向前移动一位
  73.          {  

  74.             for(i=7;i>0;i--)
  75.             {wei[i]=wei[i-1];}
  76.             wei[0]=KeyValue;
  77.             keyflag=0;
  78.          }
  79.     }      
  80. }
复制代码
说明:
测试中电路突然无法正常显示,经排查是一个按键卡住一直短路,
更换元器件后,故障得以解决。

仿真程序下载:
任务十.zip (157.51 KB, 下载次数: 28)

评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1050605 发表于 2022-11-5 15:07 | 只看该作者
十分感谢,终于解决了滚动显示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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