|
|
mcu 是stc8a8k64s4a12單片機(jī),矩陣鍵盤是帶上拉電阻的真實(shí)鍵盤,P1口連接,采用反轉(zhuǎn)法掃描。1.必須設(shè)置成開漏模式才能采集到數(shù)據(jù)。其它模式都不行,不知道啥原因。2.第一次置P1=0xf0,可以正確設(shè)置,且能正確采集回按鍵情況;第二次反轉(zhuǎn) 設(shè)置P1=0x0f,然后采集p1口的數(shù)據(jù)完全是錯(cuò)的,比如只采集p1一次,得到的數(shù)據(jù)是第一次(反轉(zhuǎn)設(shè)置之前)的數(shù)據(jù);比如重復(fù)寫一次采集數(shù)據(jù)(連續(xù)采集兩次),得到的數(shù)據(jù)跟采集一次的又完全不同,且還發(fā)現(xiàn)低電平被拉高了(本來應(yīng)該是高電平被拉低)。
沒招數(shù)了。請(qǐng)大神指點(diǎn)下迷津。
P1為KEY_ScanPort 要設(shè)置這個(gè) 初始化 P1M1=0xff;P1M0=0xff;才能讀回?cái)?shù)據(jù)
KEY_ScanPort=0xF0; //列線為輸入,行線為輸出,并置行線輸出全為0
temp=KEY_ScanPort; //讀P1口 能正確得到數(shù)據(jù)
temp=temp&0xF0;
temp=~((temp>>4)|0xF0);
if(temp==1)
key=0;
else if(temp==2)
key=1;
else if(temp==4)
key=2;
else if(temp==8)
key=3;
KEY_ScanPort=0xFF;//for read 這一句可有可不有,但proteus里那鍵盤keypad仿真必須得有這個(gè),否則無法采集
KEY_ScanPort=0x0F; //設(shè)置反轉(zhuǎn),行線為輸入,列線為輸出,并置列線輸出全為0
MDelay(3); //懷疑引腳電平反轉(zhuǎn)起效果時(shí)有一個(gè)較長的時(shí)間延遲
temp=KEY_ScanPort; //讀P1口 讀出來跟沒有反轉(zhuǎn)之前的采集情況一樣,就是高四位有3個(gè)1
temp=KEY_ScanPort; //重復(fù)采集一下發(fā)現(xiàn)低四位有4個(gè)1 高四位有1~2個(gè)1,低電平反而被拉高了。
temp=KEY_ScanPort; //再重復(fù)采集一下發(fā)現(xiàn)低四位有4個(gè)1,高四位是4個(gè)0,不動(dòng)了,按鍵沒效果。反正反轉(zhuǎn)后無法采集到正確信息
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1)
key=key+0;
else if(temp==2)
key=key+4;
else if(temp==4)
key=key+8;
else if(temp==8)
key=key+12;
|
|