蓝野 发表于 2017-12-13 10:17 这是表述不严谨,端口的电平状态不一定就是端口寄存器的值,端口作为输出,端口的电平通常是与寄存器的值相同,端口作为输入其电平状态是受外接电路的电平状态影响的,端口的电平往往是与寄存器的值不相同。 |
wulin 发表于 2017-12-5 14:04 再次请教一下:有的人表述为程序是读取端口的状态,有的说是检测寄存器的值。这两者 怎么区分?我该怎么辨别呢? |
蓝野 发表于 2017-12-11 14:51 端口寄存器的值只能软件改变,按键只是暂时改变端口电平状态,不能改变端口寄存器的值,一旦按键抬起,端口电平状态恢复为端口寄存器的值。给你一个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低电平亮显示键值 } } |
wulin 发表于 2017-12-5 14:04 补充一下:程序前面是#define GPIO_KEY P1 按你的意思赋值是对寄存器的赋值与端口状态的电平不同,第045是赋值,048是读取寄存器的赋值,如果满足条件就执行下面的程序,那么问题来了:If条件满足的原因不是按键的操作,致使寄存器的值发成改变吗? 这该如何理解呢? |
ahshmj 发表于 2017-12-5 20:09 请你详细解释一下,程序固化怎么理解,是程序停止不运行? |
你在按住按键,程序已经固化了,你怎么“赋值”? |
你按住某个键不放不是赋值操作,只是改变端口状态,程序读取端口状态与所赋值作比较获取键值。 |