3X3键盘扫描
一、 任务
利用8255的PC口实现3X3键盘扫描(硬件电路参见3X3KEY_8255.DSN)。当1~8号键独立按下时,连接在PA口对应的LEDx点亮(即1号键按下时LDE1亮,2号键按下时LDE2亮),当9号键按下时,所有LED点亮,当没有键按下时,所有LED熄灭。
二、 设计参考:
① 8255控制字格式:
② 8255端口地址分配:
PA 0000H
PB 0400H
PC 0800H
控制口 0C00H
#include<absacc.h> #include<reg51.h> #define uchar unsigned char #define init_8255 XBYTE[0x7fff] #define PA XBYTE[0x73ff] #define PB XBYTE[0x7bff] uchar key_date=9,key,key_temp; uchar keytab[]={0xdb,0xdd,0xde,0xbb,0xbd,0xbe,0x7b,0x7d,0x7e}; void delay(uchar date) { uchar i,j; for(i=date;i>0;i--) for(j=110;j>0;j--); } void disply(uchar date) { switch(date) { case 0: PA = 0xfe; break; case 1: PA = 0xfd; break; case 2: PA = 0xfb; break; case 3: PA = 0xf7; break; case 4: PA = 0xef; break; case 5: PA = 0xdf; break; case 6: PA = 0xbf; break; case 7: PA = 0x7f; break; case 8: PA = 0x00; break; default : PA = 0xff; break; } } void keyfun() { uchar code_h,code_l,i; PB=0xf0; code_l=PB; code_l = code_l&0xf0; if(code_l!=0xf0) { delay(10); code_l=PB; code_l = code_l&0xf0; if(code_l!=0xf0) { code_h = 0xfe; for(i=0;i<3;i++) { PB = code_h; code_l = PB; code_l = code_l&0xf0; if(code_l == 0xf0) { code_h=(code_h<<1)|0x01; } else break; } code_h=code_h&0x0f; key=code_h+code_l; for(key_date=0;key_date<9;key_date++) { if(key==keytab[key_date]) { break; } } PB = 0xe8; key_temp = PB; while(key_temp!=0xe8) { key_temp = PB; disply(key_date); } } } } void main() { init_8255 = 0x80; while(1) { keyfun(); PA = 0xff; } }
自己参考一下哈哈 双一流班长写的本人没有仿真过,因为仿真坏了。大家自行参考,可能会有点问题,源码不行的话,可以试着修改宏定义中几个值的地址口,改成题目给出的地址再试试。完了