实验 基于 HD7279 的键盘显示接口实验一、实验目的1 掌握7279的工作原理和编程方法2 掌握在MCS51系统中扩展7279键盘显示接口的方法二、实验要求编写程序,利用7279及键盘显示接口电路,编程实现按键的读取,并将按键值显示在数码管上三、芯片资料HD7279A 是一片具有串行接口的,可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能HD7279A内部含有译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式,此外,还具有多种控制指令,如消隐、闪烁、左移、右移、段寻址等HD7279A具有片选信号,可方便地实现多于8位的显示或多于64键的键盘接口程序:#include void long_delay(void); void short_delay(void); void delay(unsigned char); void write(unsigned char, unsigned char); unsigned char read(unsigned char); void send_byte(unsigned char); unsigned char receive_byte(void); unsigned char j, k;unsigned int tmr;sbit cs=P1^4; sbit clk=P1^5; sbit dat=P1^2; sbit key=P3^2; #define RESET 0xa4#define TEST 0xbf#define DECODE0 0x80 //下载数据方式0#define DECODE1 0xc8 //下载数据方式1#define READ 0x15#define UNDECODE 0x90#define RTL_CYCLE 0xa3#define RTR_CYCLE 0xa2#define RTL_UNCYL 0xa1#define RTR_UNCYL 0xa0#define ACTCTL 0x98 //xiaoyin#define SEGON 0xe0 //duanliang#define SEGOFF 0xc0#define BLINKCTL 0x88void main(){ send_byte(TEST); for (j=0;j<3;j++) { delay(100); } send_byte(RESET); IP=0x01; //外部中断0高优先级 EA=1; IT0=1; //外部中断0为下降沿触发 EX0=1; while (1); { }}void T0ISR() interrupt 0 { unsigned char k ,s,g,z; for (tmr=0;tmr<0x2000;tmr++); send_byte(RESET); k=read(READ); g=k%10; s=k/10; send_byte(0x87); send_byte(s); send_byte(0x86); send_byte(g); delay(50); switch(k) { case 0x01: for (tmr=0;tmr<0x2000;tmr++); send_byte(RESET); write(UNDECODE+7,0x37); // 不译码显示'H' delay(80); for (j=0;j<23;j++) { send_byte(RTR_CYCLE); // 循环右移 delay(12); } break; case 0x02: for (tmr=0;tmr<0x2000;tmr++); send_byte(RESET); write(UNDECODE,0x37); delay(80); for (j=0;j<23;j++) { send_byte(RTL_CYCLE); // 循环zuo移 delay(12); } break; case 0x03: for (tmr=0;tmr<0x2000;tmr++); send_byte(RESET); for (j=0;j<16;j++) { send_byte(RTL_UNCYL); write(DECODE0,j); delay(50); } break; case 0x09: for (tmr=0;tmr<0x2000;tmr++); send_byte(RESET); for (j=0;j<16;j++) { send_byte(RTR_UNCYL); write(DECODE1+7,j); delay(50); } delay(100); break; case 0x0a: for (tmr=0;tmr<0x2000;tmr++); send_byte(RESET); for (j=0;j<16;j++) { send_byte(RTR_UNCYL); write(DECODE1+7,j); delay(50); } delay(150); z=0xff; for (j=0;j<6;j++) { z=z/2; write(ACTCTL,z); // 加一个消隐位 delay(100); } write(ACTCTL,0xff); break; case 0x11: for (tmr=0;tmr<0x2000;tmr++); send_byte(RESET); for (j=0;j<64;j++) { write(SEGON,j); // 将64个显示段逐个点亮 delay(20); } break; case 0x12: for (tmr=0;tmr<0x2000;tmr++); send_byte(RESET); for (j=0;j<64;j++) { write(SEGON,j); // 将64个显示段逐个点亮 delay(20); } for (j=0;j<64;j++) { write(SEGOFF,j); // 将前一个显示段关闭 delay(20); } break; default: break; } } void write(unsigned char cmd, unsigned char dta){ send_byte (cmd); send_byte (dta);} unsigned char read(unsigned char command){ send_byte(command); return(receive_byte());}void send_byte( unsigned char out_byte){ unsigned char i; cs=0; long_delay(); //最少25微秒 for (i=0;i<8;i++) { if (out_byte&0x80) { dat=1; } else { dat=0; } clk=1; short_delay(); clk=0; short_delay(); out_byte=out_byte*2; } dat=0;}unsigned char receive_byte(void){ unsigned char i, in_byte; dat=1; long_delay(); for (i=0;i<8;i++) { clk=1; short_delay(); //输出键盘数据建立时间 in_byte=in_byte*2; 。