找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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, 下载次数: 112)

实验板上矩阵键盘

实验板上矩阵键盘

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

CT107D 芯片

CT107D 芯片

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

isis professional 软件仿真

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

使用道具 举报

沙发
ID:155481 发表于 2017-1-14 21:53 | 只看该作者
在实验板上S11,S10,S9,S8不能起作用,其他都可以工作起来,
回复

使用道具 举报

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

使用道具 举报

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

好的,我试着改一下,谢谢啦
回复

使用道具 举报

5#
ID:162289 发表于 2017-1-18 14:26 | 只看该作者
过来学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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