按鍵控制移位顯示
應邀寫個“按鍵移位”的程序。
要求使用4×4矩陣鍵盤,數(shù)碼顯示器。鍵盤接在P1,數(shù)碼顯示器接在P0、P2口。
電路、以及運行后的顯示效果如下:
C語言的控制程序如下:
//=======================================================
#include
char disp_buff [] ={0, 0, 0, 0, 0, 0, 0, 0};//顯示緩沖單元
//-------------------------------------------------------
delay1ms(unsigned int t) //1ms延時函數(shù)
{
unsigned int i, j;
for(i = 0; i < t; i++) for(j = 0; j < 120; j++);
}
//-------------------------------------------------------
void display(void) //顯示函數(shù)
{
char code table[] = { //共陰數(shù)碼管的段碼
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
char code wei[] = {128, 64, 32, 16, 8, 4, 2, 1};//位選代碼
char i;
for (i = 0; i < 8; i++) {
P2 = 0; //先消隱
P0 = ~table[disp_buff [i]]; //取反,用于共陽數(shù)碼管
P2 = wei[i];
delay1ms(2);
}
}
//-------------------------------------------------------
unsigned char keyboard(void) //掃描鍵盤函數(shù)
{
char i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j = 0; j < 4; j++) { //循環(huán)掃描四行
P1 = Buffer[j]; //在高四位分別輸出一個低電平
temp = 0x01; //計劃先判斷第0位
for(i = 0; i < 4; i++) { //循環(huán)掃描四列
if(!(P1 & temp)) //從低四位,截取1位
return (i + j * 4); //如果為0就返回按鍵值
temp <<= 1; //判斷的位,左移一位
} }
return 16; //判斷結束,沒有鍵按下,返回16
} //呵呵,實質性的語句不過8行,就是這么簡練!
//-------------------------------------------------------
void main(void)
{
unsigned char i, key;
while(1) { //無限循環(huán)
display(); //顯示一遍
key = keyboard(); //讀出一遍鍵盤
if (key < 16) { //如果有人按鍵
//--------------------進行按鍵處理
disp_buff [7] = disp_buff [6];
disp_buff [6] = disp_buff [5];
disp_buff [5] = disp_buff [4];
disp_buff [4] = disp_buff [3];
disp_buff [3] = disp_buff [2];
disp_buff [2] = disp_buff [1];
disp_buff [1] = disp_buff [0];
disp_buff [0] = key;
//--------------------處理結束,去等待按鍵釋放
for (i = 0; i < 20; i++) display();//稍稍延時
while(key < 16) { //等待按鍵釋放
key = keyboard(); //再讀
display(); //別忘了顯示
} } } //無限循環(huán)
}
//=======================================================