实验四 8279键盘显示实验
在单片机实验箱上通过8279在8位数码管上从左至右依次显

1.在单片机实验箱上通过8279在8位数码管上从左至右依次显示12345678。
2.在单片机实验箱上通过8279在8位数码管上从左至右依次显示81650000。
3.在单片机实验箱上,每按一次K01键,最左边的数码管加1,显示8后再按键则清0。
4.在单片机实验箱上,按下k13时,在最左边的两位数码管上显示13,按下k14键时,在最左边的两位LED上显示14。
5.在单片机实验箱上,按下k15时,在最右边的两位数码管上显示15,按下k16键时,在最右边的两位LED上显示16。
6.在单片机实验箱上,分别按下k01-k08八个按键时,在最右边的数码管上对应显示1-8,并分别依次点亮LED0-LED7。
7.在单片机实验箱上,每按一次K04键,最右边的数码管加1,显示8后再按键则清0。
8.在EDA实验箱上,在数码管上从左至右依次显示13572468。
9.在EDA实验箱上,在数码管上从左至右依次显示1357,后面4位不显示。
10.在EDA实验箱上实现10进制计数器,并由从左起第三个数码管显示。
11.在EDA实验箱上实现时钟5分频。
12.在单片机实验箱上用1-2相励磁的原理实现步进电机正反转控制。
13.在单片机实验箱上用2相励磁的原理实现步进电机正反转控制。
14.在单片机实验箱上实现LED0间隔时间为1秒的闪烁。
15.在EDA实验箱上实现8进制计数器,并由从左起第四个数码管显示16.在EDA实验箱上实现时钟3分频。
17.在EDA实验箱上实现8个发光二极管从左到右点亮,从右到左渐熄,间隔时间1s。
18.在EDA实验箱上实现一个6进制减法计数器,计数结果在左边第一位显示。
19.在单片机实验箱上,实现按K01一次,P1.0上波形取反一次。
20.在单片机实验箱上实现开机显示5(最右边),其余不显示,按K01键一次减1,至0后又回到5。
8279键盘和显示程序

8279键盘和显示程序#include<at89c52.h>#include<absacc.h>#include<stdio.h>#define COM8279 XBYTE [0xF2FF] //定义8279控制口#define DATA8279 XBYTE [0xF0FF] //定义8279数据口#define uchar unsigned char#define uint unsigned intuint keyval //定义键内码传递参数uint time //定义延时参数void delay(uint time)void key(void)void main(){delay(1300) //开机延时COM8279 = 0xD2 //清除RAM和FIFO delay(1)EA=1EX1=1 //开总中断,开外部中断1;IT1=1 //外部中断1选用下降沿COM8279=0x03 //8279键盘N键巡回,编码扫描,左端入口COM8279=0x2a //时钟分频设置,分频数为10COM8279=0x70 //设置读显示命令COM8279=0x90; //设置写显示命令while(1)}void delay (uint time) //传递参数为time{uchar jwhile (time--) //用time-1来进行循环{for (j=100;j>0;j--) //用j来进行125次循环,大约8us }}}void intsvr1(void) interrupt 2 using 1{keyval=DATA8279key()}//按键确认程序void key(void){switch(keyval){case 0xC3: //0号键赋值{P0=0x3F;DATA8279=P0;break;}case 0xC2: //1号键赋值;{P0=0x06;DATA8279=P0;break;}case 0xC1: //2号键赋值;{P0=0x5B;DATA8279=P0;break;}case 0xc0: //3号键赋值;{P0=0x4F;DATA8279=P0;break;}case 0xCB: //4号键赋值;{P0=0x66;DATA8279=P0;break;}case 0xCC: //5号键赋值;{P0=0x6D;DATA8279=P0;break;}case 0xC9: //6号键赋值;{P0=0x7D;DATA8279=P0;break;}case 0xC8: //7号键赋值;{P0=0x07;DATA8279=P0;break;}case 0xD3: //8号键赋值;{P0=0x7F;DATA8279=P0;break;}case 0xD2: //9号键赋值;{P0=0x6F;DATA8279=P0;break;}case 0xD1: //A号键赋值;{P0=0x77;DATA8279=P0;break;}case 0xD0: //B号键赋值;{P0=0x7C;DATA8279=P0;break;}case 0xE3: //C号键赋值;{P0=0x39;DATA8279=P0;break;}case 0xE1: //D号键赋值;{P0=0x5E;DATA8279=P0;break;}case 0xE2: //E号键赋值;{P0=0x79;DATA8279=P0;break;}case 0xE0: //F号键赋值;{P0=0x71;DATA8279=P0;break;}default:break;}}。
键盘8279

8279是一种通用的可编程的键盘/显示器接口器件,可对64个开关组成的键盘矩阵进行自动扫描,接收键盘上的输入信息,并在有键输入时向单片机请求中断,还能对8位或16位LED自动扫描,使显示缓冲器的内容在LED上显示出来。
利用8279对键盘/显示器的自动扫描,可以减轻CPU负担,具有显示稳定、程序简单、不会出现误动作等特点。
本实验系统中8279的状态/命令口地址为8041H,数据口地址为8040H,程序开始部分是完成8279的初始化,设定8279的键盘及显示方式,并显示“8279--”,然后等待键盘输入,一旦有键盘输入,8279会向CPU申请中断,在中断服务程序中读取FIFO/传感器RAM,根据读得的键值判断是哪一个键,再调用键的显示程序将该键显示出来。
8279控制的键盘的键值表8279控制的键盘的键值表键名键值键名键值键名键值K010C0H SHIFT+ K0180H CRTL+ K0140H K020C8H SHIFT+ K0288H CRTL+ K0248H K030D0H SHIFT+ K0390H CRTL+ K0350H K040D8H SHIFT+ K0498H CRTL+ K0458H K050C1H SHIFT+ K0581H CRTL+ K0541H K060C9H SHIFT+ K0689H CRTL+ K0649H K070D1H SHIFT+ K0791H CRTL+ K0751H K080D9H SHIFT+ K0899H CRTL+ K0859H K090C2H SHIFT+ K0982H CRTL+ K0942H K100CAH SHIFT+ K108AH CRTL+ K104AH K110D2H SHIFT+ K1192H CRTL+ K1152H K120DAH SHIFT+ K129AH CRTL+ K125AH K130C3H SHIFT+ K1383H CRTL+ K1343H K140CBH SHIFT+ K148BH CRTL+ K1448H K150D3H SHIFT+ K1593H CRTL+ K1553H K160DBH SHIFT+ K169BH CRTL+ K165BH。
键盘扫描及动态LED 显示实验报告

//P0=num;
for(i=0;i<16;i++){
if(jianpan==bianma[i]){//等于判断一定是双等于号
num=i;
break;
}
}
send_byte(0xa1);
write7279(0xc8,num);
while(key==0);
//***变量及I/O口定义***
unsigned char digit[5];
unsigned char key_number, j, k,mk; //mk为按键次数计数值
unsigned int tmr;
unsigned long wait_cnter;
sbit cs=P1^0;// cs at P1.0
sbit clk=P1^1;// clk连接于P1.1
sbit dat=P1^2;// dat连接于P1.2
sbit key=P1^3;// key连接于P1.3
void write7279(unsigned char cmd, unsigned char dta)
{
send_byte (cmd);
}
dat=0;
}
unsigned char receive_byte(void)
{
unsigned char i, in_byte;
dat=1;// set to input mode
long_delay();
for (i=0;i<8;i++)//分8次读入数据高位在前
{
clk=1;
short_delay();
cs=0;//芯片使能
8279键盘

一、实验目的1、掌握8279的工作原理。
2、熟悉8279与键盘接口的方法。
3、学习、了解键盘扩展方法。
二、实验内容将每次按键产生的键码显示在LED数码管。
三、实验原理介绍实验原理图见8279键盘显示电路。
四、实验步骤1、实验接线:将8279的RL0~RL7分别与键盘的RL10~RL17相连。
2、将8279的KA0~KA2分别与键盘的KA10~KA12相连。
3、用查询法编程4、全速运行程序,按动按键,观察显示键值的变化。
五、实验提示1、8279的I/O地址已连好,为490的偶地址,即:数据口为490H,状态口为492H。
2、8279外部输入时钟已连好,时钟频率为1MHZ。
3、8279所以,D5 D4 D3表示按下键所在的列号,D2 D1 D0表示按下的键所在的行号。
采用8279可以识别最大达8x8的矩阵键盘。
六、实验结果第一行键值从左至右依次为:C0—C5;第二行键值从左至右依次为:C6—CB;第三行键值从左至右依次为:CC—D1;第四行键值从左至右依次为:D2—D7;七、实验程序框图(实验程序名:T8279.asm)八、程序源代码清单con8279 equ 0492hdat8279 equ 0490hassume cs:codecode segment publicorg 100hstart: jmp start1segcod db3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h start1: mov dx,con8279mov al,10hout dx,al ;编码扫描键盘,双键锁定mov al,2ah ;10分频得到100KHzout dx,alcall blackrkey: mov dx,con8279disla2: in ax,dx ;读入状态字and ax,07hjz disla2 ;没有按键则等待!mov dx,dat8279in ax,dx ;读入键值and ax,0ffhmov bx,axnop ;设断点观察键值call black ;总清显示RAMnopdisp:mov di,offset segcodmov ax,08h ;工作方式,16位,左入mov dx,con8279out dx,axmov ax,90hmov dx,con8279out dx,ax ;写显示RAM命令,地址自增 mov dx,dat8279push bxand bx,0f0hmov cl,4shr bx,cladd di,bxmov al,cs:[di]mov ah,0out dx,ax ;写RAM0nopnopmov di,offset segcodpop bxand bx,0fhadd di,bxmov al,cs:[di]mov ah,0out dx,ax ;写RAM1nopnoppush cxjmp rkeyblack: mov dx,con8279mov ax,0d1hout dx,ax ;显示RAM全部清零mov cx,80h ;循环次数clsb: nopnoploop clsbretcode endsend start。
单片机8279键盘显示

集美大学计算机工程学院实验报告课程名称单片机应用技术实验名称8279键盘显示实验实验类型设计型姓名学号日期地点成绩教师第1页共5页1. 实验目的与要求1)解8279芯片的结构、工作原理;了解8279与单片机的接口逻辑;掌握对8279 的编程方法,掌握了解8279扩展键盘、显示器的方法2)认真预习本节实验内容,尝试自行编写程序,填写实验报告。
2. 实验设备STAR系列实验仪、PC机、星研集成软件环境3. 实验内容1编写程序:使用8279实现对G5区的键盘扫描,将键盘显示与8为数码管上2按图连线,运行程序,观察实验结果,能熟练运用8279扩展显示器和键盘4. 实验硬件电路及接线4.1电路设计如下图4.2实验装置的连线说明G5 区 A0、CS-------------A3区 A0、CS5E5区:CS,A0-------------CS5,A0E5区: CLK---------------B2区2ME5区: B,C---------------G5区LED:B,CProtues连线图:5,程序流程图流程图:NY NY开始初始化8279,设置8279分频系数(20分频)8*8字符显示,左边输入,外部译码键扫描方式清显示,从第一个数码管开始移位显示。
有按键 安满8 次键 清显示 将键值转换为0..F 键号 将键值写入82796,程序源代码BUFFER DATA 30H ;键盘输入缓冲区首地址BUFFER1 DATA 40H ;8字节显示缓冲区在首地址CMD8279 XDATA 0BF01H ;8279命令/状态字地址DATA8279 XDATA 0BF00H ;8279读写数据口地址KEYCOUNT DATA 50HORG0000HLJMP MAINORG0100HMAIN:RUN8279: ACALL INIT ;8279初始化MOV KEYCOUNT,#0 ;按键个数计数STAR1: LCALL SCAN_KEY ;键扫描JNC STAR1 ;无按键则循环XCH A,KEYCOUNTINC ACJNE A,#9,STAR2 ;MOV KEYCOUNT,#0LCALL INIT8279_1SJMP STAR1STAR2: XCH A,KEYCOUNTLCALL KEY_NUMMOV DPTR,#LED_TABMOVC A,@A+DPTRLCALL WRITE_DATASJMP STAR1;8279初始化INIT: MOV A,#34H ;命令字:分频系数20分频MOV DPTR,#CMD8279MOVX @DPTR,AMOV A,#10HMOVX @DPTR,AINIT8279_1: LCALL CLEAR ;清显示MOV A,#90H ;从最后一个数码管开始显示移位MOVX @DPTR,ARET; 清显示CLEAR: MOV A,#0DEH ;清屏命令MOV DPTR,#CMD8279MOVX @DPTR,AWAIT11: MOVX A,@DPTRJB ACC.7,WAIT11 ;显示RAM清除完毕否?RET; 键盘扫描SCAN_KEY: MOV DPTR,#CMD8279 ;读状态字MOVX A, @DPTRREAD_FIFO: ANL A,#7JZ NO_KEY ;判定是否有键按下READ: MOV A,#40HMOVX @DPTR,A ;读FIFO RAM 命令字MOV DPTR,#DATA8279MOVX A,@DPTRSETB C ;有键按下SCAN_KEY1: RETNO_KEY: CLR C ;无键按下SJMP SCAN_KEY1;键盘数据判定KEY_NUM: ANL A,#3FHRET;写数据WRITE_DATA: MOV DPTR,#DATA8279MOVX @DPTR,ARETLED_TAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH END。
在单片机实验箱上通过8279在8位数码管上从左至右依次显

1.在单片机实验箱上通过8279在8位数码管上从左至右依次显示12345678。
2.在单片机实验箱上通过8279在8位数码管上从左至右依次显示81650000。
3.在单片机实验箱上,每按一次K01键,最左边的数码管加1,显示8后再按键则清0。
4.在单片机实验箱上,按下k13时,在最左边的两位数码管上显示13,按下k14键时,在最左边的两位LED上显示14。
5.在单片机实验箱上,按下k15时,在最右边的两位数码管上显示15,按下k16键时,在最右边的两位LED上显示16。
6.在单片机实验箱上,分别按下k01-k08八个按键时,在最右边的数码管上对应显示1-8,并分别依次点亮LED0-LED7。
7.在单片机实验箱上,每按一次K04键,最右边的数码管加1,显示8后再按键则清0。
8.在EDA实验箱上,在数码管上从左至右依次显示13572468。
9.在EDA实验箱上,在数码管上从左至右依次显示1357,后面4位不显示。
10.在EDA实验箱上实现10进制计数器,并由从左起第三个数码管显示。
11.在EDA实验箱上实现时钟5分频。
12.在单片机实验箱上用1-2相励磁的原理实现步进电机正反转控制。
13.在单片机实验箱上用2相励磁的原理实现步进电机正反转控制。
14.在单片机实验箱上实现LED0间隔时间为1秒的闪烁。
15.在EDA实验箱上实现8进制计数器,并由从左起第四个数码管显示16.在EDA实验箱上实现时钟3分频。
17.在EDA实验箱上实现8个发光二极管从左到右点亮,从右到左渐熄,间隔时间1s。
18.在EDA实验箱上实现一个6进制减法计数器,计数结果在左边第一位显示。
19.在单片机实验箱上,实现按K01一次,P1.0上波形取反一次。
20.在单片机实验箱上实现开机显示5(最右边),其余不显示,按K01键一次减1,至0后又回到5。
电子时钟

8279键盘显示实验(电子秒表)一.实验要求利用实验机上提供的8279键盘电路,数码显示电路,设计一个电子钟(日历),用小键盘控制电子钟(日历)的启停及初始值的预值。
电子钟做成如下两种格式(按F键两种格式可以切换):XX -XX-XX 由左向右分别为: 时、分、秒XX -XX-XX 由左向右分别为: 年、月、日1.C键:清除,显示00-00-00.2.A键:启动,电子钟(日历)计时3.D键:停止,电子钟(日历)停止计时4.B键:设置初值:由左向右依次输入预置的时、分、秒(年、月、日)值,同时应具有判断输入错误的能力,若输入有错,则显示: 00-00-00按B键即可重新输入预置值:5.F键:实现电子钟和日历的切换5.E键:程序退出。
二试验程序//---8279键盘显示实验(电子秒表)---//-----头文件引用------#include<reg51.h>#include<absacc.h>#include<intrins.h>//-----宏声明-----#define D8279 XBYTE[0xF238] //8279 数据口地址#define C8279 XBYTE[0xF239] //8279 状态/命令口地址#define uchar unsigned char#define uint unsigned int#define TimeDisp 1#define DateDisp 0//-----变量定义-----uchar idata time[] = {0,0,0,12}; //10毫秒,秒,分,十uchar idata day[3] = {18,6,8};uchar idata diss[8]={0x20,0x20,0,0,0,0,0,0};//显示缓冲区uchar code ledseg[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5E,0x79,0x71,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1,0x00,0x40};// LED显示常数表bit bdata sbz,wbz,kbz; //定义秒标志、键值合法标志、读键标志bit bdata flag = TimeDisp;//-----取键值函数-----uchar getkey(){uchar key;if((C8279&0x07)==0x00){kbz=0;} //无键按下,置标志else{kbz=1;C8279=0x40; //读FIFO RAM命令key=D8279;key=(key&0x3f); //取键盘数据低6位 return(key);}}//-----显示函数-----void disled(d)uchar idata *d;{uchar i;C8279=0x90;for(i=0;i<8;i++){C8279=i+0x80;D8279=ledseg[*d];d++;}}//-----显示缓冲区内容显示-----void disp(void){disled(diss);}//----8279初始化子程序-----void init8279(){C8279=0; //置8279工作方式C8279=0x2f; //置键盘扫描速率C8279=0xc1; //清除LED 显示//while(com&0x80);//等待清除结束}//-----毫秒显示-----void disms(){diss[0]=time[0]%10;diss[1]=time[0]/10;disp();}//-----显示处理-----void display(){if(flag == 1){diss[0]=time[1]%10;diss[1]=time[1]/10;diss[2]=33;diss[3]=time[2]%10;diss[4]=time[2]/10;diss[5]=33;diss[6]=time[3]%10;diss[7]=time[3]/10;}else{diss[0]=day[0]%10;diss[1]=day[0]/10;diss[2]=33;diss[3]=day[1]%10;diss[4]=day[1]/10;diss[5]=33;diss[6]=day[2]%10;diss[7]=day[2]/10;}disp();}//-----初始化-----void first(void){init8279(); //初始化8279 sbz=1; //标志TMOD=0x10;TH1=0xdc; //10毫秒的时间常数 TL1=0x00;disms();ET1=1;EA=1; //允许中断}//-----INT_T1中断服务子程序----- void Int_T1(void) interrupt 3{TR1=0;TH1=0xdc; //10毫秒定时常数TL1=0x00;TR1=1;time[0]=time[0]+1; //10毫秒数加 1 if(time[0]==100) //判断10毫秒=100 {time[0]=0;sbz=1; //置秒标志}//disms();if(time[0]==0){time[1]=time[1]+1; //秒加1if(time[1]==60) //判断秒=60{time[1]=0;time[2]=time[2]+1;//分加1if(time[2]==60) //判断分=60{time[2]=0;time[3]=time[3]+1;//时加1if(time[3]==24)//判断时=23{time[3]=0;day[0] += 1;if(day[0] == 30){day[0] = 0;day[1] += 1;if(day[1] == 12){day[1] = 0;day[2]++;}}}}}}}//-----读数子程序-----void getword(){uchar i;for(i=8;i>0;i--){do{getkey(); //读键盘}while(kbz==0);//无键输入,则再读if((getkey()>9)||(getkey()<0))//判断输入是否大于9,小于0 {wbz=0; //置非法输入标志return;}else{wbz=1; //置合法输入标志if((i == 6)||(i == 3)){i--;diss[i-1]=getkey();disp(); //显示输入的字符}else{diss[i-1]=getkey();disp(); //显示输入的字符}}}}//-----时间清零子程序-----void cleart(){TR1=0; //关计数器time[0]=0; //10毫秒清零time[1]=0; //秒清零time[2]=0; //分钟清零time[3]=0; //小时清零disms(); //显示毫秒sbz=1; //置秒标志}//-----设置初值子程序-----void sett(){getword(); //读数if(wbz==1) //判断输入合法性{if(flag == 1){time[3]=(diss[7]*10+diss[6]);if(time[3]<24)//判断输入小时值< 24 {time[2]=(diss[4]*10+diss[3]);if(time[2]<60)//判断输入分钟数< 60{time[1]=(diss[1]*10+diss[0]);if(time[1]<60)//判断输入秒值< 60{;}else{cleart();} //时间清零}else{cleart();} //时间清零}else{cleart();} //时间清零}else{day[2]=(diss[7]*10+diss[6]);if(day[2]<32)//判断输入小时值< 24{day[1]=(diss[4]*10+diss[3]);if(day[1]<13)//判断输入分钟数< 60{day[0]=(diss[1]*10+diss[0]);if(day[0]<100)//判断输入秒值< 60{;}else{cleart();} //时间清零}else{cleart();} //时间清零}else{cleart();} //时间清零}}else{cleart();} //时间清零display();//显示时间}//-----主程序-----void main(){uint counter = 0;first(); //初始化while(1) //循环{counter++;if(counter == 10000 ){//flag = !flag;counter = 0;}getkey(); //读键盘if(kbz==1) //判断是否有键输入{switch(getkey()){case 0x0c: cleart();//输入键是'C',转CLEART break;case 0x0a: TR1=1; //输入键是'A',电子钟计时break;case 0x0d: TR1=0; //输入键是'D',电子钟停止计时break;case 0x0b: TR1=0; //输入键是'B',转SETTsett();break;case 0x0e: _nop_();//输入键是'E',case 0x0f: flag = !flag;break;while(1)//等待回到监控{}}}else if(sbz==1){display();//显示时间sbz=0;//清标志}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(0F000H)CS1 A0
(B2)2M
VCC
OE1
1
A1
2
A2
4
A3
6
A4
8
Y4
12
Y3
14
Y2
16
Y1
18
Y8
3
Y7
5
GND
10
Y6
7
Y5
9
A5
11
VCC
20
OE2
19
A6
13
A8
17
A7
15
SN74LS240P
U40
OUTA0
27
OUTB0
31
OUTA1
26
OUTB1
30
OUTA2
25
OUTB2
29
OUTA3
24
OUTB3
28
DB0
12
BD
23
DB1
13
DB2
14
SL0
32
DB3
15
SL1
33
DB4
16
SL2
34
DB5
17
SL3
35
DB6
18
DB7
19
RL0
38
RL1
39
IRQ
4
RL2
1
RL3
2
CS
22
RL4
5
RD
10
RL5
6
WR
11
RL6
7
A0
21
RL7
8
CLK
3
SHIFT
36
RESET
9
CNTL/S
37
8279
U37
D0
D1
D2
D3
D4
D5
D6
D7
RST
WR
RD
8279
1
2
3
4
5
6
7
8
JP62
A
1
B
2
C
3
OE2A
4
OE2B
5
OE1
6
Y7
7
GND
8
Y6
9
Y5
10
Y4
11
Y3
12
Y2
13
Y1
14
Y0
15
VCC
16
SN74LS138N
U39
VCC
VCC
12345678
JP93
a
b
c
d
f
g
dp
e
CLK
A0
INT
OE1
1
A1
2
A2
4
A3
6
A4
8
Y4
12
Y3
14
Y2
16
Y1
18
Y8
3
Y7
5
GND
10
Y6
7
Y5
9
A5
11
VCC
20
OE2
19
A6
13
A8
17
A7
15
SN74LS240P
U40
1
2
3
4
5
6
7
8
JP78
a
b
c
d
f
g
dp
e
VCC
1
2
3
4
5
6
7
8
9
10K
R123
VCC
CS
1
2
3
4
5
6
7
8
JP77
C
D
B
A
LJMP STAR
ORG 0100H
STAR: MOV SP,#60H
ACALL INIT8279 ;初始化子程序
MOV KeyCount,#0
STAR1: CALL SCAN_KEY ;键扫描
JNC STAR1 ;没有按键
XCH A,KeyCount
INC A
CJNE A,#9,STAR2
MOV KeyCount,#0
ACALL INIT8279_1 ;8个数码块全有字符显示后,再按键,清除显示
SJMP STAR1
STAR2: XCH A,KeyCount
CALL KEY_NUM ;键值转换为键号
MOV DPTR,#LED_TAB ;字型码表
MOVC A,@A+DPTR
CALL WRITE_DATA
SJMP STAR1
;8279初始化
INIT8279: MOV A,#34H ;可编程时钟设置,设置分频系数(20分频) MOVX @DPTR,A
CLR A ;8*8字符显示,左边输入, 外部译码键扫描方式
MOV DPTR,#CMD_8279
MOVX @DPTR,A
INIT8279_1: CALL CLEAR ;清显示
MOV A,#90H ;从最后一个数码管开始移位显示
MOVX @DPTR,A
RET
CLEAR: MOV A,#0DEH ;清除命令
MOV DPTR,#CMD_8279
MOVX @DPTR,A
WAIT1: MOVX A,@DPTR
JB ACC.7,WAIT1 ;显示RAM清除完毕吗?
RET
SCAN_KEY: MOV DPTR,#CMD_8279
MOVX A,@DPTR ;读状态
READ_FIFO: ANL A,#7
JZ NO_KEY ;是否有键按下
READ: MOV A,#40H
MOVX @DPTR,A ;读FIFO RAM
MOV DPTR,#DATA_8279
MOVX A,@DPTR
SETB C ;有键
SCAN_KEY1: RET
NO_KEY: CLR C ;无键按下,清CY
SJMP SCAN_KEY1
KEY_NUM: ANL A,#3FH
RET
WRITE_DATA: MOV DPTR,#DATA_8279
MOVX @DPTR,A
RET
LED_TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH
END
七、实验扩展及思考
重新编写实验三双字节BCD码加法,自己编写键扫描、显示程序。