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

简易加法计算器 编译通过,数码管显示0,但4*4按键都没反应,请高手们检查哪有不对,检查快一下午了,没发现不对,编译通过,数码管显示0,但4*4按键都没反应。  &nbs…

简易加法计算器 编译通过,数码管显示0,但4*4按键都没反应,请高手们检查哪有不对,检查快一下午了,没发现不对,编译通过,数码管显示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. }

复制代码

,自己搞明白了,是KeySta[i][j] = backup[i][j];这句写反了,得反过来,不然总是原来backup[i][j]的值。初学者特别要注意!!!!,void Keydrive()函数有问题,

akszhf 发表于 2017-1-14 16:15

void Keydrive()函数有问题

没问题啊,正常了,请问30、31行什么意思?只写名称、不写函数体?

作者: soufei

为您推荐


Fatal error: Can't use function return value in write context in /www/wwwroot/www.qianrushi.com.cn/wp-content/themes/news/footer.php on line 115