找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2382|回复: 8
收起左侧

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

[复制链接]
回帖奖励 9 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
ID:223571 发表于 2017-12-5 11:34 | 显示全部楼层 |阅读模式
]UT0U]C%ASJG8[ISVV0I`8X.png          请问一个困扰很久的问题,在做矩阵按键实验时,采用行列扫描原理编程,假如上电后,我一直按着某个键,那么在读取按键的程序中,三个断点触岂不是有矛盾了,我按键持续了几秒,程序扫描了n多次,在几秒之中的某一些时刻,我人为的按键给端口赋值与软件语句赋值相冲突?

实际下载没问题,怎么理解呀?




回复

使用道具 举报

ID:213173 发表于 2017-12-5 14:04 | 显示全部楼层
你按住某个键不放不是赋值操作,只是改变端口状态,程序读取端口状态与所赋值作比较获取键值。
回复

使用道具 举报

ID:7485 发表于 2017-12-5 20:09 | 显示全部楼层

回帖奖励 +1 黑币

你在按住按键,程序已经固化了,你怎么“赋值”?
回复

使用道具 举报

ID:223571 发表于 2017-12-11 12:00 | 显示全部楼层
ahshmj 发表于 2017-12-5 20:09
你在按住按键,程序已经固化了,你怎么“赋值”?

请你详细解释一下,程序固化怎么理解,是程序停止不运行?
回复

使用道具 举报

ID:223571 发表于 2017-12-11 14:51 | 显示全部楼层
wulin 发表于 2017-12-5 14:04
你按住某个键不放不是赋值操作,只是改变端口状态,程序读取端口状态与所赋值作比较获取键值。

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

这该如何理解呢?
回复

使用道具 举报

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-13 10:17 | 显示全部楼层
wulin 发表于 2017-12-5 14:04
你按住某个键不放不是赋值操作,只是改变端口状态,程序读取端口状态与所赋值作比较获取键值。

再次请教一下:有的人表述为程序是读取端口的状态,有的说是检测寄存器的值。这两者 怎么区分?我该怎么辨别呢?
回复

使用道具 举报

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

这是表述不严谨,端口的电平状态不一定就是端口寄存器的值,端口作为输出,端口的电平通常是与寄存器的值相同,端口作为输入其电平状态是受外接电路的电平状态影响的,端口的电平往往是与寄存器的值不相同。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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