找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 714|回复: 0
收起左侧

新手关于单片机矩阵键盘和点阵程序的求助

[复制链接]
ID:1002906 发表于 2022-2-13 09:24 | 显示全部楼层 |阅读模式
刚学单片机没多久,现在下想写一个程序,按下矩阵键盘S6的时候点阵最外圈亮,然后按下S11让点阵熄灭,我现在写出来让点阵亮的程序了,但是怎么让它熄灭呢?我代码里面注释掉的原本是想让点阵熄灭的代码,但是发现并不可行。我将注释掉的部分写到 if(key_number==0) 里面的while(1)循环里面也不可行。
另外我打开单片机电源的时候点阵也会亮,但是并没有规律,每次打开亮的图形都不一样,是怎么回事?就像最下面两张图那样子。

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. sbit DIO=P3^4;
  4. sbit S_CLK=P3^5;
  5. sbit R_CLK=P3^6;
  6. unsigned char key_number=1;
  7. unsigned char table1[8]={0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00};
  8. unsigned char ximie[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
  9. void delay(unsigned int x)
  10. {
  11.     unsigned char i, j;
  12.     while(x>0){
  13.             _nop_();   
  14.             i = 2;
  15.             j = 199;
  16.             do
  17.             {
  18.             while (--j);
  19.             } while (--i);
  20.             x--;
  21.     }
  22. }
  23. void KeyScan()
  24. {
  25.         P3=0xf0;//列扫描
  26.         if(P3!=0xf0)
  27.         {
  28.                 delay(10);
  29.                 if(P3!=0xf0)
  30.                 {
  31.                         switch(P3)
  32.                         {
  33.                                 case 0xe0:key_number=0;break;
  34.                                 case 0xd0:key_number=1;break;
  35.                                 case 0xb0:key_number=2;break;
  36.                                 case 0x70:key_number=3;break;
  37.                         }
  38.                         P3=0x0f;//列扫描
  39.                         switch(P3)
  40.                         {
  41.                                 case 0x0e:key_number=key_number;break;
  42.                                 case 0x0d:key_number=key_number+4;break;
  43.                                 case 0x0b:key_number=key_number+8;break;
  44.                                 case 0x07:key_number=key_number+12;break;
  45.                         }
  46.                 }
  47.         }        
  48. }
  49. void Send_Byte(unsigned char dat)
  50. {
  51.         unsigned char i;
  52.         R_CLK=0;
  53.         for(i=0;i<8;i++)
  54.         {
  55.                 S_CLK=0;
  56.                 if(dat&0x01)
  57.                         DIO=1;
  58.                 else
  59.                         DIO=0;
  60.                 S_CLK=1;
  61.                 dat>>=1;
  62.         }
  63. }
  64. void main()
  65. {
  66.         while(1)
  67.         {
  68.                 unsigned char k,ROW;
  69.                 ROW=0x80;
  70.                 KeyScan();
  71.                 if(key_number==0)
  72.                 {
  73.                         while(1)
  74.                         {
  75.                                 for(k=0;k<8;k++)
  76.                                 {
  77.                                         Send_Byte(table1[k]);
  78.                                         Send_Byte(ROW);
  79.                                         R_CLK=1;
  80.                                         ROW=_cror_(ROW,1);
  81.                                 }
  82.                         }
  83.                 }
  84. //                if(key_number==5)
  85. //                {
  86. //                        for(k=0;k<8;k++)
  87. //                        {
  88. //                                Send_Byte(ximie[k]);
  89. //                                Send_Byte(ROW);
  90. //                                R_CLK=1;
  91. //                                ROW=_cror_(ROW,1);
  92. //                        }        
  93. //                }
  94.         }
  95. }
复制代码

点阵原理图

点阵原理图

矩阵键盘原理图

矩阵键盘原理图
IMG_1732.JPG
IMG_1733.JPG
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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