控制8255完成鍵盤掃描及數碼顯示 鍵盤采用4×4鍵盤,每個數碼管顯示值可為0~F16個數。鍵盤編號為0~F,當按下其中一個按鍵時,將該按鍵對應的編號在一個數碼管上顯示出來,當再按下一個按鍵時,便將這個按鍵的編號在下一個數碼管上顯示出來,數碼管上可以顯示最近6次按下的按鍵編號。
參考程序#include "Absacc.h" #define C8255_A XBYTE[0x7F00] //8255端口地址定義 #define C8255_B XBYTE[0x7F01] #define C8255_C XBYTE[0x7F02] #define C8255_CON XBYTE[0x7F03] //共陰極七段碼 unsigned char a[] = {0x3f, 0x06, 0x5b,0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79,0x71}; unsigned char b[] = {0x00, 0x00, 0x00,0x00};
unsigned char key_down; unsigned char key_value; unsigned char key_count;
void delay(unsigned int time) { unsignedint i; for(i=0;i<time; i++); }
void keyscan() //按鍵掃描函數 { unsignedchar cc; C8255_A= 0x00; //X1~X4置0 cc= C8255_C; //得到Y1~Y4的值 key_down= (~cc) & 0x0f; }
void display() //顯示函數 { unsignedchar i, j = 0xF7; for(i=0;i<4; i++) { C8255_A= j; C8255_B= a[b]; //查表輸出顯示 delay(0x100); j>>= 1; } } void clear() { C8255_B= 0x00; }
void writebuffer() { b[key_count]= key_value; key_count--; if(key_count== -1) key_count= 3; display(); clear(); keyscan(); while(key_down) //鍵盤消抖 { display(); clear(); keyscan(); } }
void getkey() //得到按鍵值 { unsignedchar value; unsignedchar i, j = 0xFE;
for(i=0;i<4; i++) { C8255_A= j; value= C8255_C;
if(!(value& 0x01)) { key_value= i + 0; writebuffer(); return; }
if(!(value& 0x02)) { key_value= i + 4; writebuffer(); return; }
if(!(value& 0x04)) { key_value= i + 8; writebuffer(); return; }
if(!(value& 0x08)) { key_value= i + 12; writebuffer(); return; }
j<<= 1; } }
void main() { C8255_CON= 0x81; //8255初始化
key_count= 3;
while(1) { display(); //顯示 clear(); //清屏 keyscan(); //按鍵掃描 if(key_down) //判是否有鍵按下 { display(); delay(0x100); clear(); keyscan(); if(key_down) { getkey(); //得到按鍵值 } } } }
14.png (23.3 KB, 下載次數: 61)
下載附件
2021-9-29 10:11 上傳
這是我根據程序畫的仿真圖,但是現象出不來,求路過的各路大神幫我看一下程序和電路圖啊!!! |