熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2017-12-5 11:34
正文摘要:請(qǐng)問一個(gè)困擾很久的問題,在做矩陣按鍵實(shí)驗(yàn)時(shí),采用行列掃描原理編程,假如上電后,我一直按著某個(gè)鍵,那么在讀取按鍵的程序中,三個(gè)斷點(diǎn)觸豈不是有矛盾了,我按鍵持續(xù) ... |
藍(lán)野 發(fā)表于 2017-12-13 10:17 這是表述不嚴(yán)謹(jǐn),端口的電平狀態(tài)不一定就是端口寄存器的值,端口作為輸出,端口的電平通常是與寄存器的值相同,端口作為輸入其電平狀態(tài)是受外接電路的電平狀態(tài)影響的,端口的電平往往是與寄存器的值不相同。 |
wulin 發(fā)表于 2017-12-5 14:04 再次請(qǐng)教一下:有的人表述為程序是讀取端口的狀態(tài),有的說是檢測(cè)寄存器的值。這兩者 怎么區(qū)分?我該怎么辨別呢? |
藍(lán)野 發(fā)表于 2017-12-11 14:51 端口寄存器的值只能軟件改變,按鍵只是暫時(shí)改變端口電平狀態(tài),不能改變端口寄存器的值,一旦按鍵抬起,端口電平狀態(tài)恢復(fù)為端口寄存器的值。給你一個(gè)4*4矩陣鍵盤程序參考,每句都有注釋,不難理解。 #include <reg52.h> //頭文件 #define uchar unsigned char //宏定義 #define uint unsigned int //宏定義 uchar key=0; //鍵值變量 void key_scan() //矩陣鍵盤掃描函數(shù) { uchar temp1,temp2,temp3; //臨時(shí)變量 static bit sign=0; //按鍵自鎖標(biāo)志 static uchar count=0; //消抖計(jì)數(shù)變量 P3=0xf0; //先給P3賦一個(gè)初值1111 0000 if(P3!=0xf0) //判斷P3不等于所賦初值,說明有健按下 { if(sign==0) //如果按鍵自鎖標(biāo)志為0 { count++; //消抖計(jì)數(shù),摒棄Delay延時(shí)方式 if(count>=250) //估算主循環(huán)周期調(diào)整100~255 { sign=1; //按鍵自鎖標(biāo)志置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; //按鍵自鎖標(biāo)志清0 count=0; //消抖計(jì)數(shù)清0 } } void main() { while(1) { key_scan(); //鍵盤掃描 P1=key; //LED低電平亮顯示鍵值 } } |
wulin 發(fā)表于 2017-12-5 14:04 補(bǔ)充一下:程序前面是#define GPIO_KEY P1 按你的意思賦值是對(duì)寄存器的賦值與端口狀態(tài)的電平不同,第045是賦值,048是讀取寄存器的賦值,如果滿足條件就執(zhí)行下面的程序,那么問題來了:If條件滿足的原因不是按鍵的操作,致使寄存器的值發(fā)成改變嗎? 這該如何理解呢? |
ahshmj 發(fā)表于 2017-12-5 20:09 請(qǐng)你詳細(xì)解釋一下,程序固化怎么理解,是程序停止不運(yùn)行? |
你在按住按鍵,程序已經(jīng)固化了,你怎么“賦值”? |
你按住某個(gè)鍵不放不是賦值操作,只是改變端口狀態(tài),程序讀取端口狀態(tài)與所賦值作比較獲取鍵值。 |
Powered by 單片機(jī)教程網(wǎng)