找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简易加法计算器 编译通过,数码管显示0,但4*4按键都没反应

[复制链接]
跳转到指定楼层
楼主
ID:160658 发表于 2017-1-13 16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请高手们检查哪有不对,检查快一下午了,没发现不对,编译通过,数码管显示0,但4*4按键都没反应。       注:接口等定义均无误

  1. #include<reg51.h>

  2. sbit KEYOUT_1 = P1^4;
  3. sbit KEYOUT_2 = P1^5;
  4. sbit KEYOUT_3 = P1^6;
  5. sbit KEYOUT_4 = P1^7;

  6. sbit KEYIN_1 = P1^0;
  7. sbit KEYIN_2 = P1^1;
  8. sbit KEYIN_3 = P1^2;
  9. sbit KEYIN_4 = P1^3;

  10. unsigned char code LedChar[] = {
  11.         0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
  12.         0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
  13.         };
  14. unsigned char LedBuff[6] = {
  15.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  16.         };
  17. unsigned char code KeyCodeMap[4][4] = {
  18.         {0x31,0x32,0x33,0x26},                           //1、2、3、向上
  19.         {0x34,0x35,0x36,0x25},                           //4、5、6、向左
  20.         {0x37,0x38,0x39,0x28},                           //7、8、9、向下
  21.         {0x30,0x1B,0x0D,0x27}                           //0、ESC、回车、向右
  22.         };                           
  23. unsigned char KeySta[4][4] = {
  24.         {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}
  25.         };

  26. void Keydrive();
  27. void ShowNumber(unsigned long num);

  28. void main()
  29. {
  30.         EA = 1;
  31.         TMOD = 0x01;
  32.         ET0 = 1;
  33.         TH0 = 0xFC;
  34.         TL0 = 0x67;
  35.         TR0 = 1;
  36.         
  37.         ShowNumber(0);
  38.         while(1)
  39.         {
  40.                 Keydrive();        
  41.         }
  42. }

  43. void ShowNumber(unsigned long num)
  44. {
  45.         char i;
  46.         unsigned char ledbuf[6];

  47.         for(i=0; i<6; i++)
  48.         {
  49.                 ledbuf[i] = num %10;
  50.                 num = num /10;
  51.         }
  52.         for(i=5; i>=1; i--)
  53.         {
  54.                 if(ledbuf[i] == 0)
  55.                         LedBuff[i] = 0xFF;
  56.                 else
  57.                         break;
  58.         }
  59.         for( ; i>=0; i--)
  60.                 LedBuff[i] = LedChar[ledbuf[i]];
  61. }

  62. void KeyAction(unsigned char keycode)
  63. {
  64.         static unsigned long result = 0;
  65.         static unsigned long addend = 0;
  66.         
  67.         if((keycode >= 0x30) && (keycode <= 0x39))
  68.         {
  69.                 addend = addend*10 + (keycode - 0x30);
  70.                 ShowNumber(addend);               
  71.         }
  72.         else if(keycode == 0x26)
  73.         {
  74.                 result += addend;
  75.                 addend = 0;
  76.                 ShowNumber(result);
  77.         }
  78.         else if(keycode == 0x0D)
  79.         {
  80.                 result += addend;
  81.                 addend = 0;
  82.                 ShowNumber(result);
  83.         }
  84.         else if(keycode == 0x1B)
  85.         {
  86.                 result = 0;
  87.                 addend = 0;
  88.                 ShowNumber(addend);
  89.         }
  90. }

  91. void Keydrive()
  92. {
  93.         unsigned char i, j;
  94.         static unsigned char backup[4][4] = {
  95.                 {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}
  96.         };

  97.         for(i=0; i<4; i++)
  98.         {
  99.                 for(j=0; j<4; j++)
  100.                 {
  101.                         if(KeySta[i][j] != backup[i][j])
  102.                         {
  103.                                 if(backup[i][j] == 0)
  104.                                         KeyAction(KeyCodeMap[i][j]);        
  105.                                 KeySta[i][j] = backup[i][j];
  106.                         }
  107.                 }
  108.         }        
  109. }

  110. void KeyScan()
  111. {
  112.         unsigned char i;
  113.         static unsigned char keyout = 0;
  114.     unsigned char keybuf[4][4];

  115.         keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEYIN_1;
  116.         keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEYIN_2;
  117.         keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEYIN_3;
  118.         keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEYIN_4;
  119.         
  120.         for(i=0; i<4; i++)
  121.         {
  122.                 if((keybuf[keyout][i] & 0x0F) == 0x00)
  123.                         KeySta[keyout][i] = 0;
  124.                 else if((keybuf[keyout][i] & 0x0F) == 0x0F)
  125.                         KeySta[keyout][i] = 1;
  126.         }
  127.         keyout++;
  128.         keyout = keyout & 0x03;
  129.         switch(keyout)
  130.         {
  131.                 case 0: KEYOUT_4 = 1; KEYOUT_1 = 0; break;
  132.                 case 1: KEYOUT_1 = 1; KEYOUT_2 = 0; break;
  133.                 case 2: KEYOUT_2 = 1; KEYOUT_3 = 0; break;
  134.                 case 3: KEYOUT_3 = 1; KEYOUT_4 = 0; break;
  135.                 default: break;
  136.         }
  137. }

  138. void LedRefresh()
  139. {
  140.         static unsigned char i = 0;

  141.         P0 = 0xFF;
  142.         switch(i)
  143.         {
  144.                 case 0: P2 = 0xFE; i++; P0 = LedBuff[0]; break;
  145.                 case 1: P2 = 0xFD; i++; P0 = LedBuff[1]; break;
  146.                 case 2: P2 = 0xFB; i++; P0 = LedBuff[2]; break;
  147.                 case 3: P2 = 0xF7; i++; P0 = LedBuff[3]; break;
  148.                 case 4: P2 = 0xEF; i++; P0 = LedBuff[4]; break;
  149.                 case 5: P2 = 0xDF; i=0; P0 = LedBuff[5]; break;
  150.                 default: break;
  151.         }
  152. }

  153. void inttimer0() interrupt 1
  154. {
  155.         TH0 = 0xFC;
  156.         TL0 = 0x67;

  157.         LedRefresh();
  158.         KeyScan();
  159. }

复制代码


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

使用道具 举报

沙发
ID:160658 发表于 2017-1-13 19:01 | 只看该作者
自己搞明白了,是KeySta[i][j] = backup[i][j];这句写反了,得反过来,不然总是原来backup[i][j]的值。初学者特别要注意!!!!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:161757 发表于 2017-1-14 16:15 | 只看该作者
void Keydrive()函数有问题
回复

使用道具 举报

地板
ID:160658 发表于 2017-1-15 11:42 | 只看该作者
akszhf 发表于 2017-1-14 16:15
void Keydrive()函数有问题

没问题啊,正常了
回复

使用道具 举报

5#
ID:825883 发表于 2021-1-15 16:44 | 只看该作者
请问30、31行什么意思?只写名称、不写函数体?
回复

使用道具 举报

6#
ID:877929 发表于 2021-1-15 17:27 | 只看该作者
一般读数据时要先假读一次,
假读就是先读一次,然后第二次的才有效,
并且你要先把4x4按键接的接口拉到高电平

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:825883 发表于 2021-1-15 22:41 | 只看该作者
abccccaefe 发表于 2021-1-15 17:27
一般读数据时要先假读一次,
假读就是先读一次,然后第二次的才有效,
并且你要先把4x4按键接的接口拉到 ...

谢谢,刚查到了,作用是提前声明函数,防止报错。提前声明了可以在任意位置定义声明的函数。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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