打印
[51单片机]

新手,求大神们看看程序指导一下,串口助手显示按键值.

[复制链接]
1061|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 淡然处世 于 2016-8-9 10:06 编辑

单片机P0口接的4*4键盘,P1 口接的3*3矩阵键盘,12MHZ晶振。
/*问题:按一下后串口助手一直刷新按键值,而且0  1 4 5 8 9 均不能正常显示*/
#include<reg52.h>
#define uchar unsigned char                        //宏定义,后面所有的uchar,均为 unsigned char
#define uint unsigned int                        // 宏定义,后面所有的uint,均为 unsigned int


uchar num;                                        //定义一个全局变量num

/*4*4矩阵键盘P0口,扫描函数*/
uchar keyscan1()
{
        uchar temp;        
        P0 = 0xfe;                                                                       //1111 1110   第一列线输出一个低电平
        temp = P0;                                                                    //temp = 1111 1110
        temp = temp&0xf0;                                                         //1111 1110 & 1111 0000 = 1111 0000 =0xf0
        while((temp&0xf0) != 0xf0)                                         //当有按键按下,则P0值发生改变,
        {
                delay(5);                                                                      //延时ms
                temp = P0;
                temp = temp & 0xf0;
                while((temp&0xf0) != 0xf0)                                    //再次确认是否有按键按下
                {
                        temp = P0;                                                   //读取P0口的值
                        delay(5);                                                     //延时
                        switch(temp)                                                //进行键值判断
                        {
                                case 0xee:num = 0;  break;        
                                case 0xde:num = 1;        break;
                                case 0xbe:num = 2;        break;
                                case 0x7e:num = 3;        break;

                        }
               
                while(temp != 0xf0)
                        {
                                temp = P0;
                                temp = temp&0xf0;
                        }
                }
        }         
        P0 = 0xfd;                                                            // 1111 1101         第二列线输出一个低电平
        temp = P0;
        temp = temp&0xf0;                        
while((temp&0xf0) != 0xf0)
{
        delay(5);
        temp = P0;
        temp = temp&0xf0;
                while((temp&0xf0) != 0xf0)
                {
                        temp = P0;
                        delay(5);
                        switch(temp)
                        {
                                case 0xed:num = 4;        break;
                                case 0xdd:num = 5;        break;
                                case 0xbd:num = 6;        break;        
                                case 0x7d:num = 7;         break;

                        }
        
                while(temp != 0xf0)
                        {        
                                        temp = P0;
                                        temp = temp&0xf0;
                        }
                }
}
        P0 = 0xfb;                                                                         // 1111 1011  第三列线输出一个低电平
        temp = P0;
        temp = temp&0xf0;
while((temp&0xf0) != 0xf0)
{
        delay(5);
        temp = P0;
        temp = temp&0xf0;
                while((temp&0xf0) != 0xf0)
                        {
                                        temp = P0;
                                        delay(5);
                                switch(temp)
                        {
                                case 0xeb:num = 8;        break;
                                case 0xdb:num = 9;        break;
                                case 0xbb:num = 10; break;
                                case 0x7b:num = 11; break;
                        }
                                                                                                                  
                while(temp != 0xf0)
                        {
                                temp = P0;
                                temp = temp&0xf0;
                        }
                        }
}
        P0 = 0xf7;                                                                                // 1111 0111 第四列输出一个低电平
        temp = P0;
        temp = temp&0xf0;
while((temp&0xf0) != 0xf0)
{
        delay(5);                                                                                                   
        temp = P0;
        temp = temp&0xf0;
                while((temp&0xf0) != 0xf0)
                {
                        temp = P0;
                        delay(5);
                        switch(temp)
                        {
                                case 0xe7:num = 12;break;
                                case 0xd7:num = 13; break;
                                case 0xb7:num = 14;break;
                                case 0x77:num = 15; break;
                        }
        
                while(temp != 0xf0)
                {        
                        temp = P0;
                        temp = temp&0xf0;
                }
                }

}
                return num;
}

/*主函数*/
void main()
{
     uchar temp;
     init();                              //调用串口初始化函数
while(1)
{
    i = keyscan1();           //调用矩阵键盘扫描函数
    delay(200);                  //进行延时
    send(i);                     
}
}

/*更新寄存器的值*/
void  send (uchar  dat)
{
    sbuf = dat;
  while(!TI);
   TI = 0;
}



/*延时函数*/
void delay(uint z)                        
{
                uint i,j;
                for(i=z;i>0;i--)
                for(j=110;j>0;j--);
}

/*串口初始化函数*/
void init()                        
{
        TMOD = 0x20;                                           //定时器工作方式一
        SCON = 0x50;                                        //串口允许接收数据
        TH1 = 0xfd;                                      
        TL1 = 0xfd;
        TR1 = 1;                                                  
}

相关帖子

沙发
淡然处世|  楼主 | 2016-8-9 17:02 | 只看该作者
各位高手哥哥,帮我看看。要被主管骂死了

使用特权

评论回复
板凳
ningling_21| | 2016-8-9 17:26 | 只看该作者
P0口按键扫描时应加上拉电阻

使用特权

评论回复
地板
icecut| | 2016-8-10 10:11 | 只看该作者
淡然处世 发表于 2016-8-9 17:02
各位高手哥哥,帮我看看。要被主管骂死了

你就不会网上抄电路,网上抄代码?非要自己写,然后被挨骂?

使用特权

评论回复
5
淡然处世|  楼主 | 2016-8-10 11:01 | 只看该作者
ningling_21 发表于 2016-8-9 17:26
P0口按键扫描时应加上拉电阻

这个我知道,问题是主管给的是现成的键盘,已经做好了。让写一个测试程序,给的电路图中没加上拉,真搞不懂,他非得把矩阵键盘接在P0,接P3就可以避免很多问题的。现在扔给我让我直接写程序去测试

使用特权

评论回复
6
淡然处世|  楼主 | 2016-8-10 11:05 | 只看该作者
icecut 发表于 2016-8-10 10:11
你就不会网上抄电路,网上抄代码?非要自己写,然后被挨骂?

给的现成的键盘,已经是实物了,硬件连接图也是给好的。让自己写个测试程序的,这键盘行或者列应该要加10K的上拉电阻的,也不该接在P0口,用P3口的第二功能比较好。但是主管这个傻蛋不管,就要写出来他要看结果。

使用特权

评论回复
7
icecut| | 2016-8-10 11:40 | 只看该作者
淡然处世 发表于 2016-8-10 11:05
给的现成的键盘,已经是实物了,硬件连接图也是给好的。让自己写个测试程序的,这键盘行或者列应该要加10 ...

你就告诉那个傻蛋,硬件有问题软件解决不了.用万用表告诉他按键电压不变.哈哈哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝