8279示例程序
- 格式:doc
- 大小:24.50 KB
- 文档页数:2
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是一种通用的可编程的键盘/显示器接口器件,可对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。
实验二 8279键盘扫描输入实验一、实验目的1.熟悉INTEL8279键盘、显示器接口与8031的连接方法;2.掌握8279键盘扫描输入程序的编写;二、实验要求编写一个键盘扫描输入程序,把读取到的键值依次存放在8031片内RAM的30H-43H 单元中,超过20个键值时,多余的健值存放在44单元中。
三、芯片应用特性8279是专用键盘、显示控制芯片,能对显示器自动扫描;能识别键盘上按下的键号,可充分提高CPU工作效率,8279与8031的接口方便,由它构成的标准键盘、显示接口在工业控制中得到广泛的应用。
1.关于INTEL 8279无编码器键盘常常采用软件方法,逐行逐列地检查键盘状态,当发现按下的键后,用计算或查表等方法来找到该键的键编码。
而INTEL 8279公司的键盘、显示接口芯片是一种扫描式键盘编码器芯片8279是一种通用可编程键盘显示接口芯片,它能完成键盘输入和显示控制两种功能。
键盘部分提供一种扫描方式,可与64个按键的矩阵键盘连接,能对键盘不断扫描,自动消抖,自动识别按下的键并给出编码,能对双键或n 键同时按下实行保护。
显示部分分为发光二极管、荧光管及其它显示器提供了按扫描方式工作的显示接口,它为显示器提供多路复用信号,可显示多达16个字符或数字。
2. 实验板8279键盘、显示电路介绍:8279采用外部译码操作方式,74LS138输出8位显示器的位控制信号和键盘的行扫描信号。
8279的8位输出线A0-A3和B0-B3与数码管的8个段相对应,经74LS240缓冲后,去驱动各数码管的8个段。
74LS138输出的8根线由74LS240反相后,再经大电流驱动器ULN2003A驱动,成为各数码管的位选择信号,当位选信号有效时(呈0电平),相应数码管被选通,而显示内容则取决于它的各个显示段的电平。
四、实验步骤1.线路连接及注意事项1)线路连接8279键盘键值可采用查询方式读取,也可以采用中断方式读取。
中国地质大学长城学院电气工程及其自动化课程设计题目单片机原理与应用课程设计(8279控制键盘与显示实验)系别信息工程系学生姓名专业电气工程及其自动化学号04309指导教师职称讲师2012年6月19日目录摘要 (1)1. 8279键盘显示 (1)1.1实验准备 (1)1.2实验内容 (1)2.8279的内部功能模块 (1)2.1公用模块 (2)2.2键盘功能模块 (2)2.3显示功能模块 (2)3.8297芯片管脚引线功能及原理图 (2)3.1引线管脚功能 (2)3.2电路图 (3)4. 流程图及源程序 (4)4.1流程图 (4)4.2源程序 (8)5.工作过程及实验步骤 (9)5.1工作过程 (9)5.2实验步骤 (9)6.个人总结 (10)摘要8279芯片是Intel公司生产的通用可编程键盘和显示器I/O接口芯片。
利用8279.可实现对键盘/显示器的自动扫描,并识别键盘上闭合键的键号,这样可以大大节省CPU对键盘/显示器的操作时间,从而减轻CPU的负担,而且显示稳定,程序简单,不会出现错误操作。
8279芯片还可以直接和单片机连接,使用它可简化系统的软件设计,提高CPU的工作效率,在工程设计中日益被设计者采用。
本设计中需要掌握在51系统中扩展8279键盘显示接口方法,并且掌握8279的工作原理和编程方法。
关键词:8279芯片键盘控制八位逻辑数码管显示1. 8279键盘显示1.1实验准备电子设计竞赛实训平台:(1)单片机核心板(2)键盘和数码管显示模块(3)通用转接板(4)串口线(两端均为DB9母孔);1.2实验内容本实验的主要内容是实现用单片机控制6段数码管、4×4矩阵键盘。
程序功能如下:(1)实现单片机驱动键盘和数码管显示模块上的芯片8279,按下按键S1时,数码管循环显示“000000”到“999999”,每按一下加“111111”;(2)按下按键S2时,数码管循环显示“999999”到“00000000”,每按一下减“11111111”;按下按键S3时,数码管显示“012345”(3)按下按键S4时,数码管显示“543210”;2.8279的内部功能模块2.1公用模块数据缓冲器是双向缓冲器,连接内、外总线,用于传送CPU和8279之间的命令或数据;I/O控制线是CPU对8279进行控制的引线。
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;//清标志}}}。
实验5键盘显示控制器8279应用实验实验五键盘显示控制器 9 8279 应用实验一、实验目的 1、掌握 51 系统中,扩展 8279 键盘显示接口的方法。
2、掌握 8279 工作原理和编程方法。
二、预备知识 8279A 是一种通用的可编程键盘/显示器接口器件,可对 64 个开关矩阵组成的键盘进行自动扫描,接收键盘上的输入信息,存入内部的 FIFO 存放器,并在有键输入时,CPU 请求中断。
8279A 内部还有一个 16×8 的显示缓冲器,能对 8 位或 16 位 LED 自动扫描,使显示缓冲器的内容在 LED 上显示出来。
1 1 、引脚功能 DB0~DB7:双向数据总线,以便和 CPU 之间传递命令、数据和状态。
CLK :时钟输入线,以产生内部时钟。
RESET :复位线,高电平有效。
复位后,8279A 置为 16 位显示左边输入,编码扫描键盘,时钟系数为 31。
/CS :片选,低电平有效。
A0 :地址输入线,用以区分数据线传送的是数据还是命令。
A0=0 传送的是数据;A0=1传送的是命令。
/RD :读线,低有效,内部缓冲器信息送 DB0~DB7。
/WR :写线,低有效。
收数据总线上的信息写入内部缓冲区。
IRQ :中断请求输出线,高有效。
当 FIFO RAM 中有键输入数据时,IRQ 升为高电平,向 CPU 请求中断。
CPU 读出 FIFO RAM 时,IRQ 变为低电平,假设 RAM 中数据还有,IRQ 又返回高电平,直至RAM 中为空,IRQ 才保持低电平。
SL0~SL3 :输出扫描线,用以对键盘/传感器矩阵和显示器进行扫描。
RL0~RL7 :键盘/传感器矩阵的行(列)数据输入线。
其内部有拉高电阻,使之保持高电平。
SHIFT :换档输入线,内部有拉高电阻,使之保持高电平。
TL/STB:控制/选通输入线,内部有拉高电阻,使之保持高电平。
OUTA0~OUTA3:四位输出口。
OUTB0~ OUTB3:四位输出口。
本科学年实训论文题目键盘显示控制器8279应用实验院系专业名称自动化年级 2008 级学生姓名指导教师2011年07月18日键盘显示控制器8279应用实验摘要在对8279键盘/显示接口分析的基础上,设计实现8位LED七段数码管显示驱动和16键盘输入电路。
利用可编程8279可实现对键盘/显示的自动扫描,以减轻CUP负担,其工作稳定,不会出现误操作,且程序实现简单。
本系统采用8031 单片机与8279 芯片的显示接口组成对LED 数码管应用系统的显示驱动电路。
具有可靠性高、价格低、使用方便等特点,适合数据显示的计算机应用系统使用。
关键词:8279,键盘,LED显示,扫描,接口8279 KEYBOARD DISPLAY CONTROLLER BASED ON THE APPLICATIONABSTRASTIn 8279 keyboard / display interface based on the analysis, design and implementation 8-digit LED seven segment display driver, and keyboard input circuit 16. 8279 can be realized using programmable keyboard / display automatically scans, to reduce the burden of CUP, their job stability, not to misuse, and the procedure simple. The system uses the 8031 and 8279 chip components on the LED display interface applications, digital display drive circuit. High reliability, low price, easy to use features, the computer application for data display system.KEYWORDS: 8279 , keyboard , LED display , scan , interface目录摘要 (II)ABSTRAST ................................................................................................................ I II 第一章引言.. (1)1.1 实验目的 (1)1.2 实验内容 (1)1.2 实验步骤和要求 (1)第二章8279的介绍 (2)2.1 8279功能介绍 (2)2.1.1 数据线 (2)2.1.2 地址线 (2)2.1.3 控制线 (2)2.2 8279的工作方式 (3)2.2.1 键盘工作方式 (3)2.2.2 显示方式 (3)2.2.3 传感器方式 (3)2.3 8279的命令字及其格式 (4)2.3.1 键盘/显示命令 (4)2.3.2 时钟编程命令 (5)2.3.3 读FIFO/传感器RAM命令 (6)2.3.4 读显示RAM命令 (6)2.3.5 写显示RAM命令 (6)2.3.6 显示器禁止写入/熄灭命令 (6)2.3.7 清除(显示RAM和FIFO中的内容)命令 (7)2.3.8 结束中断/出错方式设置命令 (7)2.4 8279的状态字及其格式 (8)2.5 8279数据输入/输出格式 (8)2.5.1 键盘扫描方式数据输入格式 (8)2.5.2 传感器方式及选通方式数据输入格式 (9)2.6 8279译码和编码方式 (9)第三章硬件电路及描述 (11)3.1 74LS138译码器 (11)3.1.1 74LS138集成译码器逻辑图及工作原理 (11)3.1.2 74LS138译码器引脚图和逻辑符号 (12)3.1.3 74LS138译码器的真值表 (13)3.2 74LS244 (14)3.2.1 74LS244引脚图 (14)3.2.2 74LS244的工作极限值 (14)3.2.3 功能表 (14)3.3 4*4矩阵键盘 (14)3.3.1 矩阵键盘的电路 (14)3.3.2 矩阵键盘的工作原理 (15)3.4 数码管动态扫描显示电路 (16)第四章软件设计流程及描述 (17)4.1软件设计流程 (17)4.2 keil软件的介绍和应用 (19)4.2.1 系统概述 (19)4.2.2 Keil C51单片机软件开发系统的整体结构 (19)4.2.3 Keil的优点 (20)第五章总结 (21)参考文献 (22)附录一源程序代码 (23)附录二实验中的软件和硬件记录 (26)第一章引言1.1 实验目的1、掌握8031系统中,扩展8279键盘显示接口的方法。
8279键盘和显示程序
Z8279 EQU 08701H //8279状态/命令口地址 D8279 EQU 08700H //8279 数据口地址
LEDMOD EQU 10H //左端输入八位字符显示 //外部译码键扫描方式,双键互锁
LEDFEQ EQU 38H //扫描速率 LEDCLS EQU 0D1H //清除
LEDWR0 EQU 80H //设定的将要写入的显示RAM地
址 ORG 0000H AJMP START ORG 0040H START: MOV SP,#60H
LCALL INIT8279 //初始化8279 W AIT:
MOV DPTR,#Z8279 MOVX A,@DPTR ANL A,#0FH JZ WAIT MOV A,#40H MOVX @DPTR,A MOV DPTR,#D8279 MOVX A,@DPTR
ANL A,#3FH MOV R4,#00H MOV R5,A LCALL DISLED SJMP W AIT
INIT8279: //8279初始化子程序 PUSH DPH //保存现场 PUSH DPL PUSH ACC
LCALL DELAY //延时 MOV DPTR ,#Z8279
MOV A,#LEDMOD //置8279工作方式 MOVX @DPTR,A
MOV A,#LEDFEQ //置键盘扫描速率 MOVX @DPTR,A
MOV A,#LEDCLS //清除 LED 显示 MOVX @DPTR,A
LCALL DELAY //延时 MOV DPTR,#Z8279 MOV A,#90H MOV DPTR,#D8279 MOV A,
#40H MOVX @DPTR,A MOV A,#40H
MOVX @DPTR,A MOV A,#0H MOVX @DPTR,A MOV A,#0H MOVX @DPTR,A MOV A,
#0EFH MOVX @DPTR,A MOV A,#27H MOVX @DPTR,A MOV A,#5BH MOVX @DPTR,A MOV A,
#7FH MOVX @DPTR,A
POP ACC //恢复现场 POP DPL POP DPH RET
显示字符子程序
输入:R4,位置:R5 DISLED:
PUSH DPH //保存现场 PUSH DPL PUSH ACC
MOV A,#LEDWR0 //置显示起始地址
ADD A,R4 //加位置偏移量 MOV DPTR,#Z8279
MOVX @DPTR,A //设定显示位置 MOV DPTR,#LEDSEG //置显示常数表起始位置 MOV A,R5 MOVC A,@A+DPTR //查表 MOV DPTR,#D8279
MOVX @DPTR,A //显示数据 POP ACC //恢复现场 POP DPL POP DPH RET DELAY: //延时子程序 PUSH 0 //保存现场 PUSH 1 MOV 0,
#0H DELAY1: MOV 1,#0H DJNZ 1,$ DJNZ 0,DELAY1
POP 1 //恢复现场 POP 0 RET LEDSEG:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
DB 6DH,02H,08H,00H,59H,0FH,76H;'U,-,_,I,O,P' END。