|
本帖最后由 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; //標志位賦值
}
}
}
}
|
|