控制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(); //得到按键值 } } } }
这是我根据程序画的仿真图,但是现象出不来,求路过的各路大神帮我看一下程序和电路图啊!!! |