找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2657|回复: 2
收起左侧

请教一个问题:单片机矩阵键盘按数字在数码管上显示

[复制链接]
ID:789846 发表于 2020-7-15 22:29 | 显示全部楼层 |阅读模式
问题描述:我想写一个程序想要达到目的是:通过矩阵键盘s1~s10分别代表数字0~9,按下矩阵键盘代表的数字然后在数码管的最左两位显示出来。想要达到的效果就像计算器那样当有第一个数字输入时,在最右侧显示;当有第二个数字输入时,最右侧数字向左移动一位,空出来的位置显示第二个数字。
我的思路是:定义一个两字节数组,初值都是0,分别存放个位和十位。第一个输入的数字存入个位,当有第二个数字输入时,先把个位的值存入十位,再将第二个数字存入个位。
下面是我写的一段不完整的代码:请会的大神帮我完成一下代码或者按照你的思路给我一个参考代码,谢谢您!(我用的板子是单核A2开发板)

单片机代码:
  1. #include
  2. #define uchar unsigned char
  3. #define uint        unsigned int
  4. uchar seg_value[2];        //数码管编码存储,数组的0、1位分别存储个位、十位
  5. void delay1();                                                
  6. uchar KEY_SCAN();
  7. void seg_updata(uchar x);
  8. void SEG_display();
  9. uchar code seg_table[] = {0xc0,0xf9,0xa4,0xb0,                //定义一个数组,将0~f对应的编码存入数组
  10.                                         0x99,0x92,0x82,0xf8,
  11.                                         0x80,0x90,0x88,0x83,
  12.                                         0xc6,0xa1,0x86,0x8e};
  13. sbit LSA=P2^2;
  14. sbit LSB=P2^3;
  15. sbit LSC=P2^4;
  16. void delay1()
  17. {
  18.         uint i;
  19.         for(i = 0;i<1000;i++);
  20. }

  21. uchar KEY_SCAN()
  22. {
  23.         uchar key_buf;                        //暂时存储P1口状态
  24.         uchar        key_state;                //存储按键状态
  25.         P1 = 0xf0;                                //高四位高电平,第四位低电平
  26.         key_buf = P1;                        //读取P1口状态
  27.         if(key_buf != 0xf0)
  28.         {
  29.                 delay1();                                        //延时消抖
  30.                 if(P1 == key_buf)                        //再次判断是否有按键按下
  31.                 {
  32.                         key_state = key_buf & 0xf0;                //高四位状态存入key_state
  33.                         P1 = 0x0f;                                                //高四位低电平,第四位高电平
  34.                         key_buf = P1;                                        //读取P1口状态
  35.                         key_state = key_state | key_buf;        //第四位状态存入key_state
  36.                         return key_state;                                        //返回该按键坐标值(请允许我用坐标形容这个值)
  37.                 }
  38.                 else
  39.                         return 0;                        //如果没有按键按下,返回0
  40.         }
  41.         else
  42.                 return 0;                                //如果没有按键按下,返回0
  43. }

  44. /***************************************************
  45. *                                键值判断子函数
  46. *                        判断按键值,更新到数组seg_value[]
  47. ****************************************************/
  48. void seg_updata(uchar x)
  49. {
  50.         uchar table_num;                //存储字符在数组中对应的编号
  51.         switch(x)
  52.         {
  53.                 case 0x77:        table_num = 0;break;        //S1被按下时,对应数字0
  54.                 case 0x7b:        table_num = 1;break;        //S2被按下时,对应数字1,
  55.                 case 0x7d:        table_num = 2;break;
  56.                 case 0x7e:        table_num = 3;break;
  57.                 case 0xb7:        table_num = 4;break;
  58.                 case 0xbb:        table_num = 5;break;
  59.                 case 0xbd:        table_num = 6;break;
  60.                 case 0xbe:        table_num = 7;break;
  61.                 case 0xd7:        table_num = 8;break;
  62.                 case 0xdb:        table_num = 9;break;
  63.                 default: table_num = 10;                        //如有其它坐标值,不作处理
  64.         }
  65.         if(table_num<10)
  66.         {
  67.                 seg_value[1] = seg_value[0];
  68.                 seg_value[0] = seg_table[table_num];
  69.         }
  70. }

  71. /***************************************************
  72. *                                数码管显示子函数
  73. *                        每隔一段时间,更新数据
  74. ****************************************************/
  75. void SEG_display()
  76. {
  77.         uint i;
  78.         for(i=0;i<2;i++)
  79.         {
  80.                 switch(i)         //位选,选择点亮的数码管,
  81.                 {
  82.                         case(0):
  83.                                 LSA=0;LSB=0;LSC=0; break;
  84.                         case(1):
  85.                                 LSA=1;LSB=0;LSC=0; break;        
  86.                 }
  87.                 P0=seg_value[i];//发送段码
  88.                 delay1(); //间隔一段时间扫描        
  89.                 P0=0x00;//消隐
  90.         }
  91. }

  92. void main()
  93. {
  94.         uchar key_value;
  95.         uint state_cnt=1;
  96.         while(1)
  97.         {
  98.                 SEG_display();
  99.         }
  100. }

复制代码

223355z5fffkp6mtfz2zu2.png


223402n22xh7mxjd6egljz.png


223407orezwsg9uwow4qzw.png


223412u196w29g1962kr81.png

A2开发板原理图.pdf

227.86 KB, 下载次数: 5

回复

使用道具 举报

ID:452950 发表于 2020-7-15 23:08 | 显示全部楼层
51黑有很多类似的设计,可以搜一下
51单片机实现多位十进制计算器 带Proteus仿真原理图 - 单片机仿真论坛 单片机论坛 http://www.51hei.com/bbs/dpj-191483-1.html
回复

使用道具 举报

ID:332444 发表于 2020-7-16 03:07 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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