找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于单片机执行的时序冲突问题理解

查看数: 3611 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-12-5 11:34

正文摘要:

         请问一个困扰很久的问题,在做矩阵按键实验时,采用行列扫描原理编程,假如上电后,我一直按着某个键,那么在读取按键的程序中,三个断点触岂不是有矛盾了,我按键持续 ...

回复

ID:213173 发表于 2017-12-13 14:30
蓝野 发表于 2017-12-13 10:17
再次请教一下:有的人表述为程序是读取端口的状态,有的说是检测寄存器的值。这两者 怎么区分?我该怎么辨 ...

这是表述不严谨,端口的电平状态不一定就是端口寄存器的值,端口作为输出,端口的电平通常是与寄存器的值相同,端口作为输入其电平状态是受外接电路的电平状态影响的,端口的电平往往是与寄存器的值不相同。
ID:223571 发表于 2017-12-13 10:17
wulin 发表于 2017-12-5 14:04
你按住某个键不放不是赋值操作,只是改变端口状态,程序读取端口状态与所赋值作比较获取键值。

再次请教一下:有的人表述为程序是读取端口的状态,有的说是检测寄存器的值。这两者 怎么区分?我该怎么辨别呢?
ID:213173 发表于 2017-12-11 21:11
蓝野 发表于 2017-12-11 14:51
补充一下:程序前面是#define GPIO_KEY P1       
按你的意思赋值是对寄存器的赋值与端口状态的电平不同,第04 ...

端口寄存器的值只能软件改变,按键只是暂时改变端口电平状态,不能改变端口寄存器的值,一旦按键抬起,端口电平状态恢复为端口寄存器的值。给你一个4*4矩阵键盘程序参考,每句都有注释,不难理解。
#include <reg52.h>                                                 //头文件
#define uchar unsigned char                         //宏定义
#define uint unsigned int                                 //宏定义
uchar key=0;                                                        //键值变量

void key_scan()                                                        //矩阵键盘扫描函数
{
        uchar temp1,temp2,temp3;                        //临时变量
        static bit sign=0;                                        //按键自锁标志
        static uchar count=0;                                //消抖计数变量
        P3=0xf0;                                                        //先给P3赋一个初值1111 0000
        if(P3!=0xf0)                                                 //判断P3不等于所赋初值,说明有健按下
        {
                if(sign==0)                                                //如果按键自锁标志为0
                {
                        count++;                                        //消抖计数,摒弃Delay延时方式
                        if(count>=250)                                //估算主循环周期调整100~255
                        {
                                sign=1;                                        //按键自锁标志置1,键不抬起,按其他键无效
                                temp1=P3;                                //temp1保存高4位变化xxxx 0000
                                P3=0x0f;                                //再给P3赋值0x0f    0000 1111
                                temp2=P3;                                //temp2保存低4位变化0000 xxxx
                                temp3=temp2|temp1;                //temp3=temp2按位与temp1,等效于低4位+高4位
                                key=temp3;                                //保存键值
                        }
                }
        }
        else                                                                 //按键抬起
        {
                sign=0;                                                        //按键自锁标志清0
                count=0;                                                //消抖计数清0
        }
}

void main()
{
        while(1)
        {
                key_scan();                                                //键盘扫描
                P1=key;                                                        //LED低电平亮显示键值
        }                                                                               
}
ID:223571 发表于 2017-12-11 14:51
wulin 发表于 2017-12-5 14:04
你按住某个键不放不是赋值操作,只是改变端口状态,程序读取端口状态与所赋值作比较获取键值。

补充一下:程序前面是#define GPIO_KEY P1       
按你的意思赋值是对寄存器的赋值与端口状态的电平不同,第045是赋值,048是读取寄存器的赋值,如果满足条件就执行下面的程序,那么问题来了:If条件满足的原因不是按键的操作,致使寄存器的值发成改变吗?

这该如何理解呢?
ID:223571 发表于 2017-12-11 12:00
ahshmj 发表于 2017-12-5 20:09
你在按住按键,程序已经固化了,你怎么“赋值”?

请你详细解释一下,程序固化怎么理解,是程序停止不运行?
ID:7485 发表于 2017-12-5 20:09
你在按住按键,程序已经固化了,你怎么“赋值”?
ID:213173 发表于 2017-12-5 14:04
你按住某个键不放不是赋值操作,只是改变端口状态,程序读取端口状态与所赋值作比较获取键值。

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

Powered by 单片机教程网

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