OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5316|回复: 4

求助串口通信与矩阵键盘的问题

[复制链接]

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-8-21
在线时间
11 小时
发表于 2018-8-25 21:53:45 | 显示全部楼层 |阅读模式
1金钱
请问为什么我下面这个程序,只有矩阵键盘的第一行正确输出了,第二三四行都单片机没有输出?
在二三四行的程序中加入P1口的代码,用来点亮发光二极管,结果发光二极管也没有亮。

但是有关矩阵键盘的程序,我单独运行以前编写的,还是可以正确运行的,
下面程序中矩阵键盘的程序就是我从之前程序里复制过来修改的。

//4.按下矩阵键盘第一行时以1200bps发送,1,2,3,4,
//第二行时以2400bps发送5,6,7,8,
//第三行以4800bps发送,9,10,11,12,
//第四行以9600pbs 发送,13,14,15,16.

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)//i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}

void init()
{
        TMOD=0X20;
        SM1=1;
        SM0=0;
        REN=1;
        EA=1; //!!!
}

void matrixkeyscan()                  //矩阵键盘代码
{
        uchar temp;
        P3=0xfe;                          //第一行送入低电平
        temp=P3;
        temp=temp&0xf0;             
        if(temp!=0xf0)                     
        {
                delayms(10);             //去抖动
                temp=P3;
                temp=temp&0xf0;               
                if(temp!=0xf0)
                {
                        TH1=0xe8;
                        TL1=0xe8;
                        TR1=1;         
                        temp=P3;
                        switch(temp)
                        {
                                case 0xee:                  //1110 1110  一行一列
                                        SBUF='1';
                                        break;
                                case 0xde:                  //1101 1110 一行二列
                                        SBUF='2';
                                        break;
                                case 0xbe:
                                        SBUF='3';
                                        break;
                                case 0x7e:
                                        SBUF='4';
                                        break;                       
                         }
                         while(!TI);
                         TI=0;
                        while(temp!=0xf0)                  //等待按键释放
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        TR1=0;                  
                }
        }

        P3=0xfd;                               //第二行
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);           //去抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        TH1=0xf4;
                        TL1=0xf4;
                        TR1=1;
                        switch(temp)
                        {
                                case 0xed:
                                        SBUF='5';
                                        break;
                                case 0xdd:
                                        SBUF='6';
                                        break;
                                case 0xbd:
                                        SBUF='7';
                                        break;
                                case 0x7d:
                                        SBUF='8';
                                        break;               
                        }               
                        while(!TI);
                        TI=0;       
               
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        TR1=0;//!!!!!!!!!!!!
                }
        }

        P3=0xfb;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);                 //去抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        TH1=0xfa;
                        TL1=0xfa;
                        TR1=1;
                        switch(temp)
                        {
                                case 0xeb:
                                        SBUF='9';
                                        break;
                                case 0xdb:
                                        SBUF='1';
                                        while(!TI);
                                        TI=1;
                                        SBUF='0';
                                        break;
                                case 0xbb:
                                        SBUF='1';
                                        while(!TI);
                                        TI=1;
                                        SBUF='1';
                                        while(!TI);
                                        TI=1;
                                        break;
                                case 0x7b:
                                        SBUF='1';
                                        while(!TI);
                                        TI=1;
                                        SBUF='2';
                                        break;               
                        }                       
                        while(!TI);
                        TI=0;
                        while(temp!=0xf0)                 //等待按键释放
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        TR1=0;
                }
        }

        P3=0xf7;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);                    //去抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        TH1=0xfd;
                        TL1=0xfd;
                        TR1=1;
                        switch(temp)
                        {
                                case 0xe7:
                                        SBUF='1';
                                        while(!TI);
                                        TI=0;
                                        SBUF='3';
                                        break;
                                case 0xd7:
                                        SBUF='1';
                                        while(!TI);
                                        TI=0;
                                        SBUF='4';
                                        break;
                                case 0xb7:
                                        SBUF='1';
                                        while(!TI);
                                        TI=0;
                                        SBUF='5';
                                        break;
                                case 0x77:
                                        SBUF='1';
                                        while(!TI);
                                        TI=0;
                                        SBUF='6';
                                        break;               
                        }                       
                        while(!TI);
                        TI=0;
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                }
                TR1=0;
        }
}
void main()
{
        init();
        while(1)
        {
                matrixkeyscan();
        }
}

)GI1PI}9GVHYHTUH~9D9Z(Q.png

最佳答案

查看完整内容[请看2#楼]

uchar temp; P3=0xfe; //第一行送入低电平 temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); //去抖动 temp=P3; temp=temp&0xf0; if(temp!=0xf0) ;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4100
金钱
4100
注册时间
2018-8-14
在线时间
695 小时
发表于 2018-8-25 21:53:46 | 显示全部楼层
本帖最后由 edmund1234 于 2018-8-26 16:52 编辑

  uchar temp;
        P3=0xfe;                          //第一行送入低电平
        temp=P3;
        temp=temp&0xf0;            
        if(temp!=0xf0)                     
        {
                delayms(10);             //去抖动
                temp=P3;
                temp=temp&0xf0;               
                if(temp!=0xf0)           ;<<<<<------
                {

你每一行的按键, 在这一判断下都是为真的, 即, 你按第二行的键, 也会被判断为真, 当成第一行的处理

                delayms(10);             //去抖动
                temp=P3;
                if (((temp&0x0F)==0x0E) && ((temp&0xF0)!=0xF0))           ;<<<<<------
                {

其它行按这方法自行修改吧


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-8-26 01:24:34 | 显示全部楼层
帮顶
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-8-21
在线时间
11 小时
 楼主| 发表于 2018-8-27 14:52:09 | 显示全部楼层
edmund1234 发表于 2018-8-26 16:42
uchar temp;
        P3=0xfe;                          //第一行送入低电平
        temp=P3;

        谢谢你!
        修改了以后led的显示全部都正确了。第四行的显示也正确。
        但是串口的波特率一调整为2400或者4800,RX就会不断增长。以字符显示的话,就没有显示。以十六进制显示的话,就会分别无限输出DB、DF。按键的话,倒是会输出不同的十六进制值。请问该怎么解决呢?
        还有请问为什么if语句要修改成这样呢?从原理图上来说,感觉给第一行赋低电平,按第二行的键并不会影响第二行的电平呀?
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-8-21
在线时间
11 小时
 楼主| 发表于 2018-8-27 14:53:00 | 显示全部楼层
附无限输出的图和矩阵键盘原理图~
J5%LMLNQ7Z5IDR3V9WJT8YA.png
H3~OHN]306I$UO8I3~{9TG8.png
{85IK`D~3]~S5(IMZBP%NT2.png
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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