键盘显示实验.docx
- 文档编号:5258239
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:12
- 大小:72.99KB
键盘显示实验.docx
《键盘显示实验.docx》由会员分享,可在线阅读,更多相关《键盘显示实验.docx(12页珍藏版)》请在冰豆网上搜索。
键盘显示实验
一、实验目的
1、掌握8279键盘显示电路的基本功能及编程方法。
2、掌握一般键盘和显示电路的工作原理。
3、进一步掌握定时器的使用和中断处理程序的编程方法。
二、实验内容
1、I/O编程
本实验的实验电路如图。
它做在一块扩展电路板上,用一根20芯扁平电缆线将实验板扩展插头与实验台上的扩展插头J7相连,为扩展电路连接电源及外部总线。
扩展电路板上的数码管、键盘阵列既能由8279控制,也可以由外部电路控制,其实现靠的是若干组短路子组成的控制选择开关K1,K2,K3,K4,KB0,KB1,KB2。
当K1,K3,K4连接在8279一端时,数码管由8279控制,连接在LS273一端时由外部总线通过LS273直接控制。
当K2,KB1,KB2,KB3连接在8279一端时,键盘阵列由8279控制,连接在8255一端时由外接芯片8255控制。
因为本实验为8279控制实验,所以除了连接J1和J7外,还需要将选择开关K1,K2,K3,K4,KB0,KB1,KB2连接在8279一端,以使数码管、键盘阵列由8279芯片控制。
3、编程2:
中断编程
利用实验台上提供的定时器8253和扩展板上提供的8279以及键盘和数码显示电路,设计一个电子钟。
由8253中断定时,小键盘控制电子钟的启停及初始值的预置。
电子钟显示格式如下:
XX.XX.XX.由左向右分别为时、分、秒。
要求具有如下功能:
①、C键:
清除,显示全零。
②、G键:
启动,电子钟计时。
③、D键:
停止,电子钟停止计时。
④、P键:
设置时、分、秒值。
输入时依次为时、分、秒,同时应有判断输入错误的能力,若输入有错,则显示:
E-----。
此时敲P键可重新输入预置值。
⑤、E键:
程序退出。
四、编程2接线方法
1.用一根20芯扁平电缆将实验扩展板与实验台上扩展插头J7相连。
2.实验台上8253CLK0接1MHZ,GATE0和GATE1接+5V,OUT0接CLK1,OUT1接IRQ,CS接280H~287H。
五、程序原理图
六、流程图
七.程序
/***************************/
/*8279键盘显示控制器2*/
/***************************/
#include
#include
#include"ApiEx.h"
#pragmacomment(lib,"ApiEx.lib")
#defineioport0x2b0//8279数据口
#defineioport10x2b1//8279控制口
#definetime0x280//8253定时器0口地址
#definetime10x281//8253定时器1口地址
#definetimec0x283//8253控制口地址
intbuf=0;//计数单元
intsign=1;//计数标志
intsec1=0,sec2=0;//秒高/低位
intmin1=0,min2=0;//分高/低位
inthour1=0,hour2=0;//时高/低位
interr1=0;//出错标志
inthms;//预置时,分,秒标志
intled[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,
0x39,0x5E,0x79,0x71,0x67,0x37,0x73,0x31,0x3E,0x36,0x66,0x80,0x40};
//0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,g,m,P,r,w,x,y,.,-
intkeyin=0;
voidkey();//键盘显示子程序
voiddisp();//显示子程序
voidhigh();//预置时、分、秒高位子程序
voidlow();//预置时、分、秒低位子程序
voidint_proc();//中断处理子程序
voiderror();
voidmain()
{
printf("--------------------EXP29_21_SYB---------------------\n");
printf("1.8253(CLK0)===TPC(1MHz)\n");
printf("2.8253(GATE0,GATE1)===TPC(+5V)\n");
printf("3.8253(OUT0)===8253(CLK1)\n");
printf("4.8253(OUT1)===TPC(IRQ)\n");
printf("5.I/O(280-287)===8253(CS)\n");
printf("6.SYB===J7\n");
printf("Pressanykeytobegin!
\n\n");
getch();
printf("Presssmallkeybord:
\n");
printf("C--CLEARTOZERO;\n");
printf("G--GOAHEAD\n");
printf("D--STOPTHEDISPLY;\n");
printf("P--POSITIONTHEBEGINNINGTIME\n");
printf("E--EXIT\n");
if(!
Startup())/*打开设备*/
{
printf("ERROR:
OpenDeviceError!
\n");
return;
}
PortWriteByte(timec,0x36);//8253初始化
PortWriteByte(time,1000%256);
PortWriteByte(time,1000/256);
PortWriteByte(timec,0x74);
PortWriteByte(time1,100%256);//定时器1每0.1S中断1次
PortWriteByte(time1,100/256);//定时器1每0.1S中断1次
PortWriteByte(ioport1,0xd3);//8279清零
PortWriteByte(ioport1,0x2a);//置8279时钟命令
PortWriteByte(ioport1,0x40);//读FIFO存储器命令
PortWriteByte(ioport1,0x00);//置键盘显示模式
PortWriteByte(ioport1,0x80);//写显示缓冲区命令
RegisterLocalISR(int_proc);/*注册中断程序*/
EnableIntr();/*开中断*/
do{
key();//调键盘显示子程序
if((hour2==0x0a)|(keyin==0x0c))//是否'C'命令
{
sign=0;
hour2=0;
hour1=0;
min2=0;
min1=0;
sec2=0;
sec1=0;
}
if(keyin==0x10)//是否'G'命令
{
sign=0x01;
}elseif(keyin==0x0d)//是否'D'命令
{
sign=0x00;
}elseif(keyin==0x12)//是否'P'命令
{
sign=0x00;//'00'为预置时标志
hms=0x00;
high();
if(err1!
=0x01)
{
low();
if(err1!
=0x01)
{
hms=0x11;//'11'为预置分标志
high();
if(err1!
=0x01)
{
low();
if(err1!
=0x01)
{
hms=0x22;//'22'为预置秒标志
high();
if(err1!
=0x01)
{
low();
}
}
}
}
}
}
}while(!
(keyin==0x0e));//'E'命令,退出程序
DisableIntr();/*关中断*/
Cleanup();/*关闭设备*/
}
voidint_proc()
{
if(sign!
=0)//是否允许计数
{
buf++;//计数单元加1
if(buf==10)
{
buf=0;
sec1++;
if(sec1==10)
{
sec1=0;
sec2++;
if(sec2==6)
{
sec2=0;
min1++;
if(min1==10)
{
min1=0;
min2++;
if(min2==6)
{
min2=0;
hour1++;
if((hour1==4)&(hour2==2))
{
hour2=0;
hour1=0;
}
if(hour1==10)
{
hour1=0;
hour2++;
}
}
}
}
}
}
}
}
voidkey()
{
BYTEdata;
PortWriteByte(ioport1,0xd1);//清显示
Sleep(100);
do{
disp();//调显示子程序
PortReadByte(ioport1,&data);
}while(!
(data&0x07));
PortReadByte(ioport,&data);//读状态
keyin=data&0x07;
data=data&0x38;
data>>=3;
if(data==0)//是否第一行键按下
keyin=keyin+0x08;//第一行,加8
elseif(data!
=1)//是否第二行键按下
keyin=keyin+0x10;//第三行,加10H
}
voiddisp()
{
PortWriteByte(ioport1,0x90);
Sleep(100);
PortWriteByte(ioport,led[sec1]);
PortWriteByte(ioport,led[sec2]);
PortWriteByte(ioport,led[min1]);
PortWriteByte(ioport,led[min2]);
PortWriteByte(ioport,led[hour1]);
PortWriteByte(ioport,led[hour2]);
}
voidhigh()
{
key();
err1=00;
if(hms==0x00)//HMS是预置时、分、秒标志,00预置时
{
if(keyin<=0x02)
{
hour2=keyin;
}else
{
error();
}
}elseif(hms==0x11)//11预置分
{
if(keyin<=0x05)
{
min2=keyin;
}else
{
error();
}
}elseif(keyin<=0x05)//22预置秒
{
sec2=keyin;
}else
{
error();
}
}
voiderror()
{
err1=0x01;
hour2=0x0e;
hour1=0x18;
min2=0x18;
min1=0x18;
sec2=0x18;
sec1=0x18;
}
voidlow()
{
key();
err1=00;
if(hms==0x00)//预置时、分、秒低位
{
if(((keyin<=0x09)&(hour2==0))|((keyin<=0x09)&(hour2==1))|((keyin<=0x03)&(hour2==2)))
{
hour1=keyin;
}else
{
error();
}
}elseif(hms==0x11)//11预置分
{
if(keyin<=0x09)
{
min1=keyin;
}else
{
error();
}
}elseif(keyin<=0x09)//22预置秒
{
sec1=keyin;
}else
{
error();
}
}
8、实验总结
通过本次实验,我初步掌握了keil软件的使用与调整方法。
掌握了单片机与8279接口电路的连接,键盘显示专用芯片8279的编程方法,对单片机应用系统有了一定的了解:
提高了实际动手能力与分析、解决问题的能力。
本次实验是第一次上机,还不熟悉软硬件的结合与调试程序。
本次实验的训练为以后的实验课打下了深厚的基础,起着指导性的作用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 键盘 显示 实验