|
本帖最后由 H方与圆H 于 2019-9-17 23:34 编辑
新手向大家请教一个关于标志位的问题,当直接给P1口赋值时,无任何问题。当使用标志位时出错,按下按键后0xfe与0xf7交替闪烁,再次按按键停在0xf7。
单片机源程序如下:
#include<reg52.h> //头文件
#define uchar unsigned char //宏定义,定义无符号字符型变量数据
#define uint unsigned int //宏定义,定义无符号字符型变量数据
uchar a,b,c;
void delay(uint z); //带无符号整型变量子函数
void bc();
void key();
void main()
{
P1=0x7f; //P1口赋初值
b=1; //标志位赋初值
c=1; //标志位赋初值
while(1)
{
key();
bc();
}
}
void delay(uint z) //带无符号整型变量延时子函数
{
uint x,y; //声明无符号整型变量
for(x=z;x>0;x--) //求解表达式一;求解表达式二,若为真则执行内部
for(y=110;y>0;y--); //语句,然后求解表达式三,反之则结束跳出
}
void bc()
{
if(b==0) //检测标志位值
P1=0xfe;
if(c==0) //检测标志位值
P1=0xf7;
}
void key()
{
P3=0xfe; //P3口赋初值,扫描P3口
a=P3; //声明,a等于P3,将P3的值赋给a
a=a&0xf0; //“与”运算,检测是否有按键按下
if(a!=0xf0) //“!=”测试a不等于0xf0,再次测试是否有键按下
{
delay(5); //延时五毫秒
a=P3; //将现在的a重新赋给P3
a=a&0xf0; //再次与运算,以确认按键是否被按下
if(a!=0xf0) //检测是否有键按下,若有则执行内部语句若无则结束跳出
{
//P1=0xfe;
b=0; //标志位赋值
}
while(a!=0xf0) //检测按键是否松开
{
a=P3; //赋值
a=a&0xf0; //与运算 if(a==0xf0)
{
// P1=0xf7;
c=0; //标志位赋值
}
}
}
}
|
|