数码管动态显示与矩阵键盘的编程

合集下载

在数码管上动态显示矩阵键盘数字

在数码管上动态显示矩阵键盘数字

/**********************************************程序功能:在数码管上动态显示矩阵键盘数字***********************************************/#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define LED_IN_USE 8//共阴极数码管7位段码:0--fuchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar led_Buf[LED_IN_USE]; // LED显示缓冲区,// 存放要显示数据uchar led_Ctrl;//记录显示位数的全局变量uchar key_Pressed; //按键是否被按下:1--是,0--否uchar key_val; //存放键值uchar key_Flag; //按键是否已放开:1--是,0--否//设置键盘逻辑键值与程序计算键值的映射uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};uchar Dispbuf[2];/******************************************************* * 模块初始化*******************************************************/ void init_LED(void){//uchar tmpv;P5DIR = 0xff; //设置P5的IO方向为输出P3DIR |= 0x18; //设置P3.3 P3.4的IO方向为输出P3OUT &= 0xe7;//设置P3.3 P3.4为0,关闭两锁存器P5OUT = 0x00;//设置P5的输出初值led_Ctrl = 0; // led_Ctrl用于控制哪个LED可显示//for(tmpv=0;tmpv<LED_IN_USE;tmpv++)//{ // 初始化缓冲区,可放入主函数//led_Buf[tmpv] = 0;// }}void led_Display(){//P5DIR = 0xff; //设置P5的IO方向为输出//P3DIR |= 0x18; //设置P3.3 P3.4的IO方向为输出//P3OUT &= 0xe7;//设置P3.3 P3.4为0,关闭两锁存器//P5OUT = 0x00;//设置P5的输出初值P5OUT = scandata[Dispbuf[led_Ctrl]]; // 设置显示值P3OUT |= 0x10; // 打开数据锁存器P3OUT &= 0xef; // 关闭数据锁存P5OUT = ~(1 << (led_Ctrl)); // 设置哪只LED显示P3OUT |= 0x08; // 打开控制锁存P3OUT &= 0xf7; // 关闭控制锁存led_Ctrl++;if(led_Ctrl == 2) led_Ctrl = 0; // 设置下一个要显示的LED}/*******************************************函数名称:Init_Keypad功能:初始化扫描键盘的IO端口参数:无返回值:无********************************************/void Init_Keypad(void){P1DIR = 0xf0; //P1.0~P1.3设置为输入状态, P1.4~P1.7设置为输出状态P1OUT |= 0xf0; // P1.4~P1.7输出高电平key_Flag = 0;key_Pressed = 0;key_val = 0;}/********************************************** Check_Key(),检查按键,确认键值*********************************************//*******************************************函数名称:Check_Key功能:扫描键盘的IO端口,获得键值参数:无返回值:无********************************************/void Check_Key(void){uchar row ,col,tmp1,tmp2;tmp1 = 0x80;for(row = 0;row < 4;row++) //行扫描{P1OUT = 0xf0; //P1.4~P1.7输出全1P1OUT -= tmp1; //P1.4~p1.7输出四位中有一个为0tmp1 >>=1;if ((P1IN & 0x0f) < 0x0f) //是否P1IN的P1.0~P1.3中有一位为0{tmp2 = 0x01; // tmp2用于检测出那一位为0for(col = 0;col < 4;col++) // 列检测{if((P1IN & tmp2) == 0x00) // 是否是该列,等于0为是{key_val = key_Map[row * 4 + col]; // 获取键值return; // 退出循环}tmp2 <<= 1; // tmp2左移1位}}}}/*******************************************函数名称:delay功能:延时约15ms,完成消抖功能参数:无返回值:无********************************************/void delay(){uint tmp;for(tmp = 12000;tmp > 0;tmp--);}/*******************************************函数名称:Key_Event功能:检测按键,并获取键值参数:无返回值:无********************************************/void Key_Event(void){uchar tmp;P1OUT &= 0x00; // 设置P1OUT全为0,等待按键输入tmp = P1IN; // 获取p1INif ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下{key_Pressed = 1; // 如果有按键按下,设置key_Pressed标识delay(); //消除抖动Check_Key(); // 调用check_Key(),获取键值}else if ((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放{key_Pressed = 0; // 清除key_Pressed标识key_Flag = 1; // 设置key_Flag标识}else{_NOP();}}/********************主函数********************/void main(void){WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次IE1 |= WDTIE; // 使能看门狗中断init_LED();_EINT(); //打开全局中断Init_Keypad();while(1){Key_Event();if(key_Flag == 1){key_Flag = 0;Dispbuf[0] = key_val / 10;Dispbuf[1] = key_val % 10;}}// _BIS_SR(GIE);//_BIS_SR(LPM3_bits + GIE); //CPU进入LPM3低功耗模式,同时打开全局中断//_BIS_SR(CPUOFF+ GIE); //进入LPM0//_BIS_SR(LPM0_bits + GIE); //进入LPM0 }/*******************************************函数名称:watchdog_timer功能:看门狗中断服务函数,在这里输出数码管的段选和位选信号参数:无返回值:无********************************************/#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){led_Display();}。

4×4矩阵键盘数码管显现按键值程序

4×4矩阵键盘数码管显现按键值程序

4×4矩阵键盘数码管显现按键值程序4;x;4矩阵键盘数码管显现按键值程序//电路阐明如下。

//单片机:运用51系列兼容的即可;//4;x;4矩阵键盘:接在P1口;//两位数码显现器:P0口输出七段码,P2口输出位选码。

//===================================================== =========//C言语程序如下。

/****************************************************** ********文件名:KEY_LED.c*功用:对4;x;4矩阵键盘进行输出,在数码管后两位显现按键值。

******************************************************* *******/#includelt;reg51.h#includelt;intrins.h#defineuintunsignedint#defineucharunsignedchar//ucharcodetable[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x 01,0x09};ucharcodetable[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x8 0,0x90};/****************************************************** *********称谓:Delay_1ms()*功用:延时子程序,延时时刻为1ms*x*输入:x(延时一毫秒的个数)*输出:无******************************************************* ********/voidDelay_1ms(uintx){uinti;ucharj;for(i=0;ilt;x;i++)for(j=0;jlt;=148;j++);}/*******************************************************称谓:Keyscan()*功用:P1外接4;x;4按键,依照扫描法读出键值*输出:按键值0~15/如无键按下,回来16******************************************************* ********/ucharKeyscan(void){uchari,j,temp,Buffer[4]={0xef,0xdf,0xbf,0x7f};for(j=0;jlt;4;j++){//循环四次P1=Buffer[j];//在P1高四位别离输出一个低电平temp=0x01;//方案先判别P1.0位for(i=0;ilt;4;i++){//循环四次if(!(P1temp))//从P1低四位,截取1位return(i+j*4);//回来获得的按键值templt;lt;=1;//判别的位,左移一位}}return16;//判别完毕,没有键按下,回来16}//哈哈,实质性的句子不过8行,即是这么简练!/*******************************************************称谓:Display(uchark)*功用:将参数分红十位、个位别离显现*输入:k(键盘数值)*输出:P0口输出七段码,P2口输出位选码******************************************************* ********/voidDisplay(uchark){P2=0;//消隐P0=table[k/10];P2=0x02;Delay_1ms(5);//显现5ms十位P2=0;//消隐P0=table[k%10];P2=0x01;Delay_1ms(5);//显现5ms个位}/****************************************************** *********称谓:Main()*功用:主函数******************************************************* ********/voidMain(void){ucharKey_Value=16,Key_Temp1,Key_Temp2;//两次读出的键值while(1){//---------以下读入按键、消抖、等候按键开释P1=0xff;Key_Temp1=Keyscan();//先读入按键if(Key_Temp1!=16){//假如有键按下//Delay_1ms(10);//延时一下Display(Key_Value);//可用显现替代延时Key_Temp2=Keyscan();//再读一次按键if(Key_Temp1==Key_Temp2){//有必要是两次持平Key_Value=Key_Temp1;//才保留下来,这即是消除颤动while(Keyscan()lt;16)//等候按键开释Display(Key_Value);//等候时期显现键值//---------以下是对按键的处理Display(Key_Value);//显现键值}}Display(Key_Value);//没有按键按下,也显现键值}}//用PROTEUS仿真作业时的屏幕截图如下:。

单片机入门-矩阵键盘控制数码管显示

单片机入门-矩阵键盘控制数码管显示

} } }
t=P2; t=t&0xf0;
单片机晶振复位电路:
锁存器、上拉电阻:
4x4矩阵键盘:
代码实现:
void key44scan(void)//键盘扫描函数 {
uint t; P2=0xfe; t=P2; t=t&0xf0; if(t!=0xf0) {
delay(); t=P2;
switch(t) {
case 0xee:keynum=1; break; case 0xde:keynum=5; break; case 0xbe:keynum=9; break; case 0x7e:keynum=13; break; } P0=table[keynum]; while(t!=0xf0) { t=P2; t=t&0xf0; } }
t=P2; t=t&0xf0; } }
P2=0xf7; t=P2; t=t&0xf0; if(t!=0xf0) {
delay(); t=P2;
switch(t) {
case 0xe7:keynum=4; break; case 0xd7:keynum=8; break; case 0xb7:keynum=12; break; case 0x77:keynum=0; break; } P0=table[keynum]; while(t!=0xf0) {
} P0=table[keynum]; while(t!=0xf0) {
t=P2; t=t&0xf0; } }
P2=0xfb; t=P2; t=t&0xf0; if(t!=0xf0) {
delay(); t=P2;
switch(t) {
case 0xeb:keynum=3; break; case 0xdb:keynum=7; break; case 0xbb:keynum=11; break; case 0x7b:keynum=15; break; } P0=table[keynum]; while(t!=0xf0) {

单片机实验报告——矩阵键盘数码管显示

单片机实验报告——矩阵键盘数码管显示

单片机实验报告信息处理实验实验二矩阵键盘专业:电气工程及其自动化指导老师:***组员:明洪开张鸿伟张谦赵智奇学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日矩阵键盘一、实验内容1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。

按其它键没有结果。

二、实验目的1、学习独立式按键的查询识别方法。

2、非编码矩阵键盘的行反转法识别方法。

3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。

4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。

5、掌握利用Keil51软件对程序进行编译。

6、会根据实际功能,正确选择单片机功能接线,编制正确程序。

对实验结果能做出分析和解释,能写出符合规格的实验报告。

三、实验原理1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。

2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。

3、识别键的闭合,通常采用行扫描法和行反转法。

行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。

行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。

然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。

这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。

由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。

阐述数码管显示对应矩阵键盘值

阐述数码管显示对应矩阵键盘值

阐述数码管显示对应矩阵键盘值
数码管显示和矩阵键盘值之间的关系是通过数字信号的传递和编码来实现的。

在数码管显示中,每个数码管都有七个LED灯,可以分别控
制其显示数字的不同部分。

这七个LED灯对应的位置被编码
为数字的七位二进制数。

例如,数字“0”的编码为“00111111”,其中每个1代表一个LED灯亮起来,每个0代表一个LED灯
灭掉。

在矩阵键盘中,每个按键都与一个特定的行和列相连。

当用户按下一个按键时,该按键所在的行和列的电路之间会形成一个连接,并产生一个特定的数字信号,该信号代表了该按键所对应的数值。

因此,通过将数码管和矩阵键盘连接起来,可以根据按键的行列位置,将相应的数字信号解码并显示在数码管上。

这使得用户可以直接通过矩阵键盘输入数字,并看到其相应的显示和输出。

51单片机数码管显示及矩阵键盘扫描程序

51单片机数码管显示及矩阵键盘扫描程序

51单片机数码管显示及矩阵键盘扫描程序硬件实验十一八段数码管实验一、实验任务1、在静态数码管上轮流显示数字0-9。

2、在两个4位数码管上动态显示数字0-9二、流程图及程序静态显示:流程图:程序代码:#include#define uchar unsigned chucharcodevalue[10]={0xC0,0xF9,0xA4,0xB0,0X99,0x92,0x82,0xF8,0 x80,0x90};//0 -9数码管显示段码void delay(char x) //延时子程序{uchar i;for(i=0;i<200;i++);}main() //主函数{int i;while(1){for(i=0;i<10;i++) //显示0-9{P0=codevalue[i];delay(500); //延时1秒}}}动态显示:#include#includetab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,0x7f,0x6f}; //数码管显示数字字段unsigned char tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//片选字段unsigned char i,k,j,x;void delay(x); //声明延时子函数void main() //主函数{while(1){for(i=0;i<8;i++) //显示0-7{ P1=tab1[i];P0=tab2[i];delay(5); //延时}P1=tab1[8]; P0=tab2[0]; delay(5); //显示8-9P1=tab1[9]; P0=tab2[1]; delay(5);}}void delay(x) //延时函数定义{do{for(j=0;j<250;j++)for(k=0;k<250;k++);}}硬件实验十二矩阵键盘扫描显示一、实验任务1、把矩阵键盘上的按键输入的键码在静态数码管上显示出来。

实验五 矩阵式键盘按键值的数码管显示

实验五 矩阵式键盘按键值的数码管显示

实验五矩阵式键盘按键值的数码管显示一实验目的将矩阵键盘的键值采用LED数码管显示出来(分别考虑用动态显示、静态显示)二实验内容与具体任务描述任务1:行列式键盘接口,扫描实现LED动态显示键盘被按下。

将图中的动态显示改成静态显示。

:修改代码及图,2任务三设计的电路图与描述P1口控制键盘,P0口控制LED显示器。

四程序清单任务1:#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字的段码0~9.unsigned char keyval; //定义变量储存按键值/**************************************************************函数功能:数码管动态扫描延时**************************************************************/ void led_delay(void){unsigned char j;for(j=0;j<200;j++);}/************************************************************** 函数功能:按键值的数码管显示子程序**************************************************************/ void display(unsigned char k){P2=0xbf; //点亮数码管DS6P0=Tab[k/10]; //显示十位led_delay(); //动态扫描延时P2=0x7f; //点亮数码管DS7P0=Tab[k_x0010_]; //显示个位led_delay(); //动态扫描延时}/************************************************************** 函数功能:软件延时子程序**************************************************************/ void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值TR0=1; //启动定时器T0按键值初始化为// keyval=0x00;while(1) //无限循环{display(keyval); //调用按键值的数码管显示子程序}}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1{TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平“0”(P1.1出低电平“0”)if(P14==0) keyval=1; //可判断是S1键被按下if(P15==0) keyval=2; //可判断是S2键被按下if(P16==0) keyval=3; //可判断是S3键被按下if(P17==0) keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平“0”(P1.1出低电平“0”)if(P14==0) keyval=5; //可判断是S5键被按下if(P15==0) keyval=6; //可判断是S6键被按下if(P16==0) keyval=7; //可判断是S7键被按下if(P17==0) keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)if(P14==0) keyval=9; //可判断是S9键被按下if(P15==0) keyval=10; //可判断是S10键被按下if(P16==0) keyval=11; //可判断是S11键被按下if(P17==0) keyval=12; //可判断是S12键被按下P1=0xf7;if(P14==0) keyval=13; //可判断是S13键被按下if(P15==0) keyval=14; //可判断是S14键被按下if(P16==0) keyval=15; //可判断是S15键被按下if(P17==0) keyval=16; //可判断是S16键被按下}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值}任务2:#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 数字// 0~9的段码//定义变量储存按键值unsigned char keyval;/**************************************************************函数功能:数码管动态扫描延时**************************************************************//*void led_delay(void){unsigned char j;for(j=0;j<20;j++);}/**************************************************************函数功能:按键值的数码管显示子程序**************************************************************/void display(unsigned char k){DS6 点亮数码管// P2=0x3f;P0=Tab[k/10]; //显示十位//动态扫描延时//led_delay();DS7 //点亮数码管//P2=0x7f;显示个位// P3=Tab[k_x0010_];//led_delay(); //动态扫描延时}/**************************************************************函数功能:软件延时子程序**************************************************************/void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0 的高8位赋初值TR0=1; //启动定时器T0keyval=0x00; //按键值初始化为0while(1) //无限循环{display(keyval); //调用按键值的数码管显示子程序}}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1{TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平ぜ,所有列线置为高电平if((P1&0xf0)!=0xf0) //列线中有一位为低电平ぜ,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平ぜ(P1.1 出低电平ぜ)if(P14==0) keyval=1; //可判断是S1键被按下if(P15==0) keyval=2; //可判断是S2键被按下if(P16==0) keyval=3; //可判断是S3键被按下if(P17==0) keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平ぜ(P1.1出低电平ぜ)if(P14==0)keyval=5; //可判断是S5键被按下if(P15==0) keyval=6; //可判断是S6键被按下if(P16==0) keyval=7; //可判断是S7键被按下if(P17==0) keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平ぜ(P1.2输出低电平ぜ)if(P14==0) keyval=9; //可判断是S9键被按下if(P15==0) keyval=10; //可判断是S10键被按下if(P16==0) keyval=11; //可判断是S11键被按下if(P17==0) keyval=12; //可判断是S12键被按下P1=0xf7;键被按下S13可判断是// keyval=13; if(P14==0)if(P15==0) keyval=14; //可判断是S14键被按下if(P16==0) keyval=15; //可判断是S15键被按下if(P17==0) keyval=16; //可判断是S16键被按下}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值}五运行结果任务1:两个LED显示器动态显示被按下键盘号。

实验四 动态显示与矩阵式键盘实验 计科17-3BJ 李浩葳

实验四 动态显示与矩阵式键盘实验 计科17-3BJ 李浩葳
动态显示共8个共阴极数码管,采用两片74LS573进行驱动,74LS573与74LS373都是8D锁存器,只是573引脚排列更易于布线。其引脚功能为:D1-D8为数据输入端;Q1-Q8为数据输出端;LE为数据输入锁存端,LE=1数据输入D锁存器,LE=0数据不能输入D锁存器,即LE下降沿锁存当前输入数据; 地址输出允许端, =0输出锁存数据, =1输出高阻。
数码管的显示:T0每500us中断1次,在T0中断中点亮一个数码管。在T0中断函数中,①P1.3(OE)=1,U3、U4输出高阻;②P1.4(LE1)=1,P0口输出段码,P1.4=0,U3锁存输入的段码;③P1.5(LE2)=1,P0口输出位选码,P1.5=0,U4锁存输入的位选码;④P1.3=0,U3、U4同时输出段码和位选码,进行显示。
inputNum(7);
while(P2==N[1]);
}
if(P2==N[2]) { //数字8N2
inputNum(8);
while(P2==N[2]);
}
if(P2==N[3]) { //数字9N3
inputNum(9);
while(P2==N[3]);
}
if(P2==N[4]) { //无效键N4
2、定时器T0中断函数:
//定时器T0中断,刷新数码管
void refresh() interrupt 1 {
if(int_mark==9) {//位选计数溢出清零
int_mark=1;
}
//外部中断0模式:动态显示
if(EX0&&strKey!=2) {
display(str[strKey][int_mark-1],int_mark);
uห้องสมุดไป่ตู้nt i;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四综合应用设计——数码管动态显示与矩阵键盘的编程
一、实验目的:
1、掌握单片机I/O技术和子程序设计等综合知识。

2、了解矩阵式键盘的内部结构和数码管显示的基本原理,掌握至少一种常用的按键识别方法。

3、熟练掌握数码管动态显示和矩阵键盘识别的综合应用。

二、实验内容:
设计一个矩阵键盘的识别和动态显示综合的系统,控制8个8段数码管动态扫描显示4*4矩阵键盘上按下的按键所对应的值。

三、实验要求:
给定一个4*4的矩阵键盘,16个按键对应显示0123456789ABCDE,第1次按下某按键在第一个8段数码管上显示对应的值,第2次在第二个数码管上显示,以此类推,第9次又在第一个数码管上显示,以此循环下去。

其中ABCDE在数码管上无法表达,可以用其它代替,例如:B用8表示,D用0表示,E用H表示等。

四、实验设备及实验耗材:
计算机一台,W A VE6000软件模拟器,完成ISP下载的XLISP软件,XL1000单片机综合仿真试验仪一台(8个8段数码管,4*4矩阵键盘一个,89S51一片,9针对9针的串口线一条,5V稳压电源线一条)
五、实验基本原理与方法:
查阅相关资料掌握矩阵式键盘的内部结构,8段数码管动态显示原理和常用的按键识别方法,建议使用按键识别方法中最常用的“行扫描法”编写程序。

结合动态显示技术和矩阵键盘识别技术。

六、实验方案设计:
1、采用哪些I/O口完成通信,采用何种按键识别的方法,如何综合动态显示技术和矩
阵键盘识别技术。

2、说明该程序的功能。

3、硬件连接原理图。

七、实验步骤:
1.弄清实验内容和实验要求。

2.学习相关理论知识,提出实验方案,画出程序流程图。

软件流程图
3.编写软件程序,作相关的程序注释,便于查看和调试。

4.编译和调试。

伟福软件:
1.打开伟福W A VE V3.20软件,采用伟福默认的仿真器就可以了。

文件——新建
文件,在弹出的窗口中输入实验程序,保存为“文件名.asm”文件,若窗口内
的部分程序字体颜色发生改变,表示保存成功。

2.文件——新建项目
加入模块文件:打开刚才已经保存的文件“文件名.asm”
加入包含文件:取消
保存项目“文件名.PRJ”,在项目窗口里可以看到。

3.确保仿真器——仿真器设置——目标文件里“生成HEX文件”和“生成BIN
文件”被勾选上。

4.项目——编译,调试,编译成功后就会生成“文件名.HEX”文件。

5.软件调试成功后,完成硬件连接。

接线方法:
1、用一条8PIN数据排线,把矩阵按键部份的JP50,接到CPU部份的P1口JP44。

2、接8位数码管的数据线。

将数码管部份的数据口JP5接到CPU部份的P0口JP51。

3、接8位数码管的显示位线。

将数码管部份的显示位口JP8接到CPU部份的P2口
JP52。

键盘口P1,数码管显示p2, 数码管段位p0口
6.将程序烧写到单片机上,试运行。

若出现问题,修改程序,重新编译和调试,直至
运行成功。

ISP下载烧写程序:
确保试验仪与计算机的串口和USB口都连接上后,打开软件XLISP,注意串口设置,计算机和试验仪采用的是哪个串口连接,不同的计算机可能会不同,有的
是COM1,有的是COM3等,可以采用自动检测功能查找。

也可以在打开软件后,选项—串口,更改串口设置。

如果串口选择错误,实验将无法进行。

打开(打开生成的HEX文件)——智能一键通。

即可看到运行结果。

重新烧写程序时应该先擦除上一个的再烧写。

实验结果:在4*4键盘上第一次按下任一个键,在第一个数码管上显示对应的键
值,显示后该数码管熄灭,若希望能显示时间稍微长一点,可以在每一个撤销选中
关显示(SETB P2.x)的后面加入一个延时程序。

第二次按下的,在第二个数码管
上显示,依次类推,第八次按下在第八个数码管上显示。

第九次按下又重新在第一
个数码管上显示。

K00:0 K01:1 K02:2 K03:3 K04:4 K05:5
K06:6 K07:7 K08:8 K09:9
K0A: K0B: K0C: K0D: K0E: K0F:
八、实验报告要求:
1.说明实验基本原理与方法;
2.简述实验方案设计;
3.分析程序,说出程序的功能,画出软件流程图。

4.源程序加注释。

5.画出硬件接口原理电路图。

6. 实验小结(包括理论知识的总结和实验结果的分析)。

相关文档
最新文档