[51单片机] 使用矩阵按键对数码管进行控制的疑问?

[复制链接]
868|1
 楼主| 快鲨1 发表于 2019-4-20 20:24 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>

  2. //********键盘矩阵*******//
  3. sbit KEY_IN_1 = P2^4;//KEY_IN=x轴
  4. sbit KEY_IN_2 = P2^5;//KEY_OUT=Y轴
  5. sbit KEY_IN_3 = P2^6;
  6. sbit KEY_IN_4 = P2^7;
  7. sbit KEY_OUT_1 = P2^3;
  8. sbit KEY_OUT_2 = P2^2;
  9. sbit KEY_OUT_3 = P2^1;
  10. sbit KEY_OUT_4 = P2^0;
  11. //***********************//
  12. sbit ADDR0 = P1^0;
  13. sbit ADDR1 = P1^1;
  14. sbit ADDR2 = P1^2;

  15. unsigned char code LedChar[] = {
  16.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  17.         0x80,0x90
  18. };

  19. unsigned char KeySta[4][4] ={
  20.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  21. };

  22. void main()
  23. {
  24.         unsigned char i,j;
  25.         unsigned char backup[4][4] = {
  26.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  27.         };
  28.        
  29.         EA = 1;
  30.         //*******采用138 Y1 接LED A*******//
  31.         ADDR2 = 0;
  32.         ADDR1 = 0;
  33.         ADDR0 = 0;
  34.         //********************************//
  35.         TMOD = 0x01;
  36.         TH0 = 0xFC;
  37.         TL0 = 0x67;
  38.         ET0 = 1;
  39.         TR0 = 1;
  40.         P0 = LedChar[0];
  41.        
  42.         while(1)
  43.         {
  44.                 for(i = 0; i < 4; i++)
  45.                 {
  46.                         for(j = 0; j < 4; j++)
  47.                         {
  48.                                 if(backup[i][j] != 0)
  49.                                 {
  50.                                         P0 = LedChar[i * 4 +j];
  51.                                 }
  52.                                 backup[i][j] = KeySta[i][j];
  53.                         }
  54.                 }
  55.         }
  56. }


  57. void InterruptTimer0() interrupt 1
  58. {
  59.         unsigned char i;
  60.         static unsigned char keyout = 0;
  61.         static unsigned char keybuf[4][4] = {
  62.         {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
  63.         {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
  64.         };
  65.        
  66.         TH0 = 0xFC;
  67.         TL0 = 0x67;
  68.         keybuf[keyout][0] == (keybuf[keyout][0] << 1) | KEY_IN_1;
  69.         keybuf[keyout][1] == (keybuf[keyout][0] << 1) | KEY_IN_2;
  70.         keybuf[keyout][2] == (keybuf[keyout][0] << 1) | KEY_IN_3;
  71.         keybuf[keyout][3] == (keybuf[keyout][0] << 1) | KEY_IN_4;
  72.        
  73.         for (i=0;i<4;i++)
  74.         {
  75.                 if((keybuf[keyout][i] & 0x0F) == 0x00)
  76.                 {
  77.                         KeySta[keyout][i] = 0;
  78.                 }
  79.                 else if((keybuf[keyout][i] & 0x0F) == 0x0F)
  80.                 {
  81.                         KeySta[keyout][i] = 1;
  82.                 }
  83.         }
  84.         keyout++;
  85.         keyout = keyout & 0x03;
  86.         switch(keyout)
  87.         {
  88.                 case 0:KEY_OUT_4 = 1;
  89.                                          KEY_OUT_1 = 0;
  90.                                          break;
  91.                 case 1:KEY_OUT_1 = 1;
  92.                                          KEY_OUT_2 = 0;
  93.                                          break;
  94.                 case 2:KEY_OUT_2 = 1;
  95.                                          KEY_OUT_3 = 0;
  96.                                          break;
  97.                 case 3:KEY_OUT_3 = 1;
  98.                                          KEY_OUT_4 = 0;
  99.                                          break;
  100.                 default:break;
  101.                        
  102.         }
  103. }


1.我想使用矩阵按键控制8位数码管,矩阵按键按一下就加一,一直到9为止。这个程序有什么问题吗(程序是根据书上的程序改了一下的,原来的程序是用单个数码管的,我改为使用8位数码管,多了一个138译码器)?运行的时候发现数码管没反应。
2.keybuf[keyout][0] == (keybuf[keyout][0] << 1) | KEY_IN_1;后面的| KEY_IN_1有什么作用?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 快鲨1 发表于 2019-4-22 07:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

45

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部