单片机矩阵键盘扫描程序c语言,51单片机矩阵键盘扫描程序(源代码)
//小菜出品---嚴禁抄襲,轉載請注明出處
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar idata? x,y;
uchar code disp_code[] =
{
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90,
// 0-9????? 0 1 2 3 4 5 6 7 8 9
0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,
// 10-15??? a b c d e f
0x7F, 0xBF, 0x9C, 0xFF
// 16-19??? . - 。null
};??? //數碼管顯示值列表
void delay(uchar c)??????????????????????? //延時函數
{
char a,b;
for(a=c;a>0;a--)
for(b=110;b>0;b--);
}
uchar key_scan()??????????????????????? //鍵盤掃描函數
{
uchar k;
uchar z;
x=0x00;
y=0x00;
P3=0xf0;??????????????????????????? //先給P3賦一個初值
if(P3!=0xf0)??????????????????????? //判斷P3不等于所賦初值,說明有健按下
{
delay(10);????????????????????? //消除鍵盤抖動? 延時10ms
if(P3!=0xf0)
{
x=P3;??????????????????? /*這里稍作解釋:起初我們已經給P3賦了一個0xf0的值,如果有鍵按下,P3便一定不再是0xf0 ,
如果我們這時查看P3的值我們就能知道是哪一列的鍵按下了(說明一下,我的開發板上P3.0-P3.3接的是列)
但這時我們先不看P3的值,這時我們先把P3的值賦給x,再給P3賦一個0x0f的值,由于這兩條語句執行的速度是
很快的,是us級的,而我們按一個按鍵怎么也得幾十到上百ms,盡管我們在前面已經做過一個10ms的延時,但是
在我們給P3重新賦值后,按鍵一定還是閉合的,所以P3被賦0xof后由于有按鍵閉合,故P3的值又變了,這時候我們
查看P3的值就可以判斷出來是是哪一行的按鍵按下了.然后我們把這時的P3值賦給y,再用x或上y,把他們的值賦給z
然后判斷z的值就可以知道是具體哪一個鍵被按下了!(行和列都確定了,具體是哪一個鍵自然就確定了) */
P3=0x0f;
y=P3;
z=x|y;
switch(z)
{
case 0xee: k=0; break;
case 0xed: k=1; break;
case 0xeb: k=2; break;
case 0xe7: k=3; break;
case 0xde: k=4; break;
case 0xdd: k=5; break;
case 0xdb: k=6; break;
case 0xd7: k=7; break;
case 0xbe: k=8; break;
case 0xbd: k=9; break;
case 0xbb: k=10;break;
case 0xb7: k=11;break;
case 0x7e: k=12;break;
case 0x7d: k=13;break;
case 0x7b: k=14;break;
case 0x77: k=15;break;
}
}
}
return(k);
}
void main()
{
uchar dat;
while(1)
{
P3=0xf0;
while(P3!=0xf0)
{
dat=key_scan();
P1=0;
P0=disp_code[dat];
}
}
}
我感覺一般初學者會有疑問的地方 已經做出了詳細的解釋
如果還有弄不明白的地方 可以回帖提問? 我會盡量做出解答
以期共同進步
總結
以上是生活随笔為你收集整理的单片机矩阵键盘扫描程序c语言,51单片机矩阵键盘扫描程序(源代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机应用基础0006 19秋在线作业2
- 下一篇: angular的性能分析 -随记