标题: CT107D矩阵键盘,求助大神 [打印本页]

作者: 刘在石617    时间: 2017-1-14 17:34
标题: CT107D矩阵键盘,求助大神

本人小白,刚开始学习单片机,但就卡在矩阵键盘问题中,求助高手
程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit A1=P2^5;
sbit B1=P2^6;
sbit C1=P2^7;
sbit buzz=P0^6;

uint g=0;

void delay(uint t)
{
        uchar i;
        for(t;t>0;t--)
                for (i=1200;i>0;i--);
}
void ms_delay(uint t)
{
        uchar i;
        for(t;t>0;t--)
                for (i=120;i>0;i--);
}
unsigned char keyscan(void)//键盘扫描函数,使用行列反转扫描法 比如:行为低电位,列为高四位
{
        uint i=0;
        for(i=0;i<4;i++)
        {               
                P3=0XFF;
                P3=P3&0XFE;
                if(P3!=0XFF)
                {
                        ms_delay(1200);
                        if(P3!=0XFF)
                        {
                               switch(P3)
                                 {
                                         case 0xEE:g=1;break;
                                        case 0xDE:g=2;break;
                                        case 0xbE:g=3;break;
                                 }
                         }
         }

                P3=0XFF;
                P3=P3&0XFD;
                if(P3!=0XFF)
                {
                        ms_delay(1200);
                        if(P3!=0XFF)
                        {
                                  switch(P3)
                                 {
                                         case 0xED:g=4;break;
                                        case 0xDD:g=5;break;
                                        case 0xbD:g=6;break;
                                 }
                        }
                }
                P3=0XFF;
                P3=P3&0XFB;
                if(P3!=0XFF)
                {
                        ms_delay(1200);
                        if(P3!=0XFF)
                        {
                               switch(P3)
                                 {
                                         case 0xEB:g=7;break;
                                        case 0xDB:g=8;break;
                                        case 0xbB:g=9;break;
                                 }
                        }
                }
                P3=0XFF;
                P3=P3&0XF7;
                if(P3!=0XFF)
                {
                        ms_delay(1200);
                        if(P3!=0XFF)
                        {
                              switch(P3)
                                 {
                                         case 0xE7:g=10;break;
                                        case 0xD7:g=11;break;
                                        case 0xb7:g=12;break;
                                 }
                        }
                }
        }
        return g;

}
void main()
{
        while(1)
        {
                keyscan();        
                switch(g)
                {
                        case 1:
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xff;break;
                        case 2:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xfe;break;
                        case 3:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0x88;break;                                                
                        case 4:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xf7;break;                        
                        case 5:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xef;break;        
                        case 6:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xBB;break;               
                        case 7:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0x7f;break;                                                
                        case 8:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xf0;break;        
                        case 9:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xAA;break;                                       
                        case 10:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0x3c;break;        
                        case 11:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xaa;break;        
                        case 12:        
                                                A1=0;
                                                B1=0;
                                                C1=1;
                                                P0=0xCC;break;                                                                                                                                                                                                                                                                        
                }
        }        
}
可是在实验板上S11,S10,S9,S8不能起作用,其他都可以工作起来,但是我在isis professional上仿真则是可以实行的,求大神帮助。
写法见笑了,

1.PNG (42.47 KB, 下载次数: 114)

实验板上矩阵键盘

实验板上矩阵键盘

捕1获.PNG (51.03 KB, 下载次数: 110)

CT107D 芯片

CT107D 芯片

捕获.PNG (35.74 KB, 下载次数: 106)

isis professional 软件仿真

isis professional 软件仿真

作者: jifengjian    时间: 2017-1-14 21:53
在实验板上S11,S10,S9,S8不能起作用,其他都可以工作起来,
作者: angmall    时间: 2017-1-15 12:48
程序扫描时,给P3口赋值就0Xfe。然后读取高四位的电平,因为此时无按键触发,所以高四位状态是1111 (二进制数)。
      假设此时S1被按下,高四位会变成什么?1110(二进制数),S1对应的编码就是:0B11101110.
      假设是S3被按下,高四位会变成什么?1011(二进制数),S3对应的编码就是:0B10111110
因为S1被按下,所以低四位的状态会变成1110(二进制数)。
将两次得到的P3口状态进行逻辑或运算,就能得到按键S1对应的编码:0B1110 1110.每个按键都会有一个编码,我们只需要对他们的编码进行比对,就知道按下了哪个按键。
注意:编码的确认是在矩阵电路确定后,就已经随着电路固定了。

作者: 刘在石617    时间: 2017-1-17 17:25
angmall 发表于 2017-1-15 12:48
程序扫描时,给P3口赋值就0Xfe。然后读取高四位的电平,因为此时无按键触发,所以高四位状态是1111 (二进 ...

好的,我试着改一下,谢谢啦
作者: 861765213    时间: 2017-1-18 14:26
过来学习一下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1