51 單片機(jī)使用串入并出芯片 164 以及矩陣鍵盤
硬件:74HC164驅(qū)動(dòng)四個(gè)數(shù)碼管,矩陣鍵盤。
設(shè)計(jì)要求:
第一次按按鍵1顯示1- - -、按按鍵2顯示2- - -,以此類推,按1~9都是這樣顯示。
第二次按按鍵(如果第一次按的是1)(第二次按的是2)顯示12-- ;
第三次按按鍵(如果第一次是1第二次是2第三次試3)顯示123-;
按鍵第四次(如果第一次是1第二次是2第三次是3第四次是4)顯示1234。
C語言編程如下:
//=======================================================
#include 51.H>
char disp_buff [4] = {0}; //顯示緩沖單元.
//-------------------------------------------------------
delay(unsigned int t) //1ms延時(shí)函數(shù)
{
unsigned int i, j;
for(i = 0; i < t; i++) for(j = 0; j < 120; j++);
}
//-------------------------------------------------------
void display(void) //顯示函數(shù)
{
char code table[] = { //共陽段碼 0 ~ 9
0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
char i;
for (i = 0; i < 4; i++) {
SBUF = table[disp_buff [i]];//輸出段碼
while(!TI);
TI = 0;
}
}
//-------------------------------------------------------
unsigned char keyboard(void) //掃描鍵盤函數(shù)
{
unsigned char i, tmp1, tmp2;
for(i = 0; i < 4; i++) {
P1 = ~(1 << i); //i = 0 : P1 = 1111 1110
tmp1 = P1 & 0xF0;
if(tmp1 != 0xF0) { //有鍵按下
delay(10); //延時(shí)
tmp2 = P1 & 0xF0; //再讀
if(tmp1 == tmp2) { //兩次相等,即不是抖動(dòng)
if (tmp1 == 0x70) return i * 4 + 0; //鍵值
if (tmp1 == 0xb0) return i * 4 + 1;
if (tmp1 == 0xd0) return i * 4 + 2;
if (tmp1 == 0xe0) return i * 4 + 3;
} } }
return 16; //沒有鍵按下
}
//-------------------------------------------------------
void main(void)
{
unsigned char key;
display(); //初始顯示.
while(1) { //無限循環(huán).
key = keyboard(); //讀出一遍鍵盤.
if (key < 10) { //如果0~9
//--------------------進(jìn)行按鍵處理.
disp_buff [3] = disp_buff [2];
disp_buff [2] = disp_buff [1];
disp_buff [1] = disp_buff [0];
disp_buff [0] = key;
display(); //顯示.
//--------------------處理結(jié)束,去等待按鍵釋放.
while(key < 16) key = keyboard();//等待按鍵釋放.
} } //無限循環(huán).
}
//=======================================================
仿真截圖如下: