实验三、键盘及LCD显示实验(2015)
实验3——键盘与显示
计算机学院学院计算机科学与技术专业10班__组学号10姓名协作者______________ 教师评定_______________实验题目键盘与显示一、实验目的1. 学习并掌握行列式键盘的设计方法和工作原理。
2. 掌握单片机系统行列式键盘驱动程序的编写方法。
3. 学习并掌握LED数码管的接口设计。
4. 掌握多位LED数码管动态扫描显示驱动程序的编写方法。
二、实验内容1. 打开ISIS 7 Professional,参照“二、实验电路”设计仿真电路原理图。
2. 编写程序实现:(1). 两步扫描判别法识别16个按键,并将获取的键值在数码管上显示。
(2). 将16个键盘的13个定义为:0~9、取消、设置|却仍。
设单片机所用晶振为12MHz,编写程序实现电子钟,上电启动后初始始终为09年3月20日。
用户可自由修改始终,写该方法如下:按【设置】键,然后依次输入时分秒(HHMMSS)。
按【确认】键确认修改,之前任何一步按【取消】键,退出修改。
三、实验电路4、实验源程序#include<reg51.h>#include"code.h"#define uint unsigned int#define uchar unsigned charuchar date[]={2,0,1,2,1,2,0,2};//定义日期uchar code extra_date[]={2,0,1,2,1,2,0,2};//辅助日期数组uint i,j = 0,key = 16,label = 0;//--------------------------//延时函数xms//--------------------------void delayms(uint xms){uint i,j;for(i = xms;i > 0;i--)for(j = 110;j > 0;j--);}//--------------------------//年月日显示函数//--------------------------void display_date(uint i,uint num){ unsigned chartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};P2 = table[i];P0 = table[num];delayms(5);}//---------------------------//键盘控制函数//---------------------------void key_scan() //定位每一个按键值{uchar temp;//列扫描P1 = 0xf0;delayms(1);temp = P1 >> 4 ^ 0x0f;switch(temp){case 1: key = 0;break;case 2: key = 1;break;case 4: key = 2;break;case 8: key = 3;break;default: key = 16;}//行扫描P1 = 0x0f;delayms(1);temp = P1 ^ 0x0f;switch(temp){case 1: key += 0;break;case 2: key += 4;break;case 4: key += 8;break;case 8: key += 12;break;}}//---------------------------//主函数//---------------------------void main(){while(1){//数码管显示for(i = 0;i< 8;i++){display_date(i,date[i]);}//扫描键盘获取按键序号keyP1 = 0xf0;if(P1 != 0xf0) key_scan();switch(key){case 0: if(label == 1) date[j++] = 7;delayms(200);break;case 1: if(label == 1) date[j++] = 8;delayms(200);break;case 2: if(label == 1) date[j++] = 9;delayms(200);break;case 4: if(label == 1) date[j++] = 4;delayms(200);break;case 5: if(label == 1) date[j++] = 5;delayms(200);break;case 6: if(label == 1) date[j++] = 6;delayms(200);break;case 7 : if(j == 0) { date[0] = extra_date[0];}else {date[j--] = extra_date[j];date[j] = 10;} delayms(200);break;case 8: if(label == 1) date[j++] = 1; delayms(200);break;case 9: if(label == 1) date[j++] = 2; delayms(200);break;case 10: if(label == 1) date[j++] = 3; delayms(200);break;case 11: date[j] = 10;j = 0;label = 1; delayms(200);break;case 12: if(label == 1) date[j++] = 0; delayms(200);break;case 15: j = 0;label = 0;delayms(200);break;}if(label==1 && j != 0) date[j] = 10;key = 16;}}五、实验总结通过这次实验,我掌握了行列式键盘的工作原理和数码管的接口设计,掌握了多位LED数码管动态扫描显示驱动程序的编写,不过,在这次实验中,编写代码时还是花费了很长时间,通过与同学们一起讨论调试,后来,终于成功的完成了实验,我发现我在这方面还有欠缺,以后一定要继续学习,不断进步。
按键及显示实验
一、实验原理及电路1、LCD显示器是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。
因此,LCD的驱动控制归于对每个液晶单元通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使用光线通过(也有刚好相反的,即不通电时光线通过,通电时光线不通过)。
,2、由于LCD已经带有驱动硬件电路,因此模块给出的是总线接口,便于与单片机的总线进行接口。
驱动模块具有八位数据总线,外加一些电源接口和控制信号。
而且还自带显示缓存,只需要将要显示的内容送到显示缓存中就可以实现内容的显示。
由于只有八条数据线,因此常常通过引脚信号来实现地址与数据线复用,以达到把相应数据送到相应显示缓存的目的。
实验电路图二、功能说明设计并实现一4×4键盘的接口,键盘与1602显示单元连接,编写实验程序扫描键盘输入,并将扫描结果送1602显示,键盘采用4×4键盘。
将键盘进行编号记作0—F当按下其中一个按键时将该按键对应的编号在一个1602显示出来,当按下下一个按键时便将这个按键的编号1602上显示出来实验框图四、实验代码#include <reg51.h>#define uchar unsigned char#define uint unsigned int#define lcd_data P3sbit lcd_EN=P2^2;sbit lcd_RW=P2^1;sbit lcd_RS=P2^0;uchar key,a;uchar sys_time1[]="good";uchar sys_time2[]="morning!";uchar sys_time3[]="play";uchar sys_time4[]="basketball!";uchar sys_time5[]="study";uchar sys_time6[]="hard!";unsigned char code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xB7,0x77 };void delayms(uint ms){uchar t;while(ms--){for(t=0;t<120;t++);}}void delay_20ms(void){uchar i,temp;for(i = 20;i > 0;i--){temp = 248;while(--temp);temp = 248;while(--temp);}}void delay_38us(void){ uchar temp;temp = 18;while(--temp);}void delay_1520us(void){ uchar i,temp;for(i = 3;i > 0;i--){temp = 252;while(--temp);}}uchar lcd_rd_status( ) /*读取lcd1602的状态,主要用于判断忙*/{uchar tmp_sts; //声明变量tmp_stslcd_data = 0xff; //初始化P3口lcd_RW = 1; //RW =1 读lcd_RS = 0; //RS =0 命令,合起来表示读命令(状态)lcd_EN = 1; //EN=1,打开EN,LCD1602开始输出命令数据,100nS 之后命令数据有效tmp_sts = lcd_data; //读取命令到tmp_stslcd_EN = 0; //关掉LCD1602lcd_RW = 0; //把LCD1602设置成写return tmp_sts; //函数返回值tmp_sts}void lcd_wr_com(uchar command ) /*写一个命令到LCD1602*/{while(0x80&lcd_rd_status()); //写之前先判断LCD1602是否忙,看读出的命令的最高位是否为1,为1表示忙,继续读,直到不忙lcd_RW = 0;lcd_RS = 0; //RW=0,RS=0 写命令lcd_data = command; //把需要写的命令写到数据线上lcd_EN = 1;lcd_EN = 0; //EN输出高电平脉冲,命令写入}void lcd_wr_data(uchar wdata ) /*写一个显示数据到lcd1602*/{while(0x80&lcd_rd_status()); //写之前先判断lcd1602是否忙,看读出的命令的最高位是否为1,为1表示忙,继续读,直到不忙lcd_RW = 0;lcd_RS = 1; //RW=0,RS=1 写显示数据lcd_data = wdata ; //把需要写的显示数据写到数据线上lcd_EN = 1;lcd_EN = 0; //EN输出高电平脉冲,命令写入lcd_RS = 0;}void Init_lcd(void) /*初始化lcd1602*/{delay_20ms(); //调用延时lcd_wr_com(0x38); //设置16*2格式,5*8点阵,8位数据接口delay_38us(); //调用延时lcd_wr_com(0x0c); //开显示,不显示光标delay_38us(); //调用延时lcd_wr_com(0x01); //清屏delay_1520us(); //调用延时lcd_wr_com(0x06); //显示一个数据后光标自动+1}void show(){uchar i;Init_lcd(); //调用LCD初始化函数for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0x80+i); //设置显示的位置if(sys_time1[i]==0x00) //字符串是否结束break;lcd_wr_data(sys_time1[i]);//送显示数据}for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0xc0+i); //设置显示的位置if(sys_time2[i]==0x00) //判断第二行显示break;lcd_wr_data(sys_time2[i]); //送显示数据}}void show1(){uchar i;Init_lcd(); //调用LCD初始化函数for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0x80+i); //设置显示的位置if(sys_time3[i]==0x00) //字符串是否结束break;lcd_wr_data(sys_time3[i]);//送显示数据}for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0xc0+i); //设置显示的位置if(sys_time4[i]==0x00) //判断第二行显示break;lcd_wr_data(sys_time4[i]); //送显示数据}}void show2(){uchar i;Init_lcd(); //调用LCD初始化函数for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0x80+i); //设置显示的位置if(sys_time5[i]==0x00) //字符串是否结束break;lcd_wr_data(sys_time5[i]);//送显示数据}for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0xc0+i); //设置显示的位置if(sys_time6[i]==0x00) //判断第二行显示break;lcd_wr_data(sys_time6[i]); //送显示数据}}uchar rdkey() //键盘扫描函数{uchar scan1,scan2,keycode,j;P1=0x0f; //列线置低电平,行线输入状态scan1=P1; //读入行值if((scan1&0x0f)!=0x0f) //判断是否有按键按下{delayms(30); //调用延时程序去抖动scan1=P1; //读入行值if((scan1&0x0f)!=0x0f) //二次判断是否有按键按下{P1=0xf0; //列线作输入,行线置低电平scan2=P1; //读入列值keycode=scan1|scan2; //组合成键编码for(j=0;j<=15;j++) //循环16次{if(keycode== key_code[j])//查表得键值{key=j; //算出最后键值return(key); //返回键值}}}}else P1=0xff;return (16);}void main(){while(1){P1=0x0f;if((P1&0x0f)!=0x0f) //判断是否有键按下{a=rdkey(); //调用键盘扫描函数switch (a){case 0: show(); break;case 1: show1();break;case 2: show2();break;}}}}五、实验过程本实验仪提供了一个4×4的小键盘,向列扫描码地址(0e101H)逐列输出低电平,然后从行码地址(0e103H)读回,如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高.这样就可以通过输出的列码和读取的行码来判断按下的是什么键。
按键及显示实验
一、实验原理及电路1、LCD显示器是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。
因此,LCD的驱动控制归于对每个液晶单元通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使用光线通过(也有刚好相反的,即不通电时光线通过,通电时光线不通过)。
,2、由于LCD已经带有驱动硬件电路,因此模块给出的是总线接口,便于与单片机的总线进行接口。
驱动模块具有八位数据总线,外加一些电源接口和控制信号。
而且还自带显示缓存,只需要将要显示的内容送到显示缓存中就可以实现内容的显示。
由于只有八条数据线,因此常常通过引脚信号来实现地址与数据线复用,以达到把相应数据送到相应显示缓存的目的。
实验电路图二、功能说明设计并实现一4×4键盘的接口,键盘与1602显示单元连接,编写实验程序扫描键盘输入,并将扫描结果送1602显示,键盘采用4×4键盘。
将键盘进行编号记作0—F当按下其中一个按键时将该按键对应的编号在一个1602显示出来,当按下下一个按键时便将这个按键的编号1602上显示出来实验框图四、实验代码#include <reg51.h>#define uchar unsigned char#define uint unsigned int#define lcd_data P3sbit lcd_EN=P2^2;sbit lcd_RW=P2^1;sbit lcd_RS=P2^0;uchar key,a;uchar sys_time1[]="good";uchar sys_time2[]="morning!";uchar sys_time3[]="play";uchar sys_time4[]="basketball!";uchar sys_time5[]="study";uchar sys_time6[]="hard!";unsigned char code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xB7,0x77 };void delayms(uint ms){uchar t;while(ms--){for(t=0;t<120;t++);}}void delay_20ms(void){uchar i,temp;for(i = 20;i > 0;i--){temp = 248;while(--temp);temp = 248;while(--temp);}}void delay_38us(void){ uchar temp;temp = 18;while(--temp);}void delay_1520us(void){ uchar i,temp;for(i = 3;i > 0;i--){temp = 252;while(--temp);}}uchar lcd_rd_status( ) /*读取lcd1602的状态,主要用于判断忙*/{uchar tmp_sts; //声明变量tmp_stslcd_data = 0xff; //初始化P3口lcd_RW = 1; //RW =1 读lcd_RS = 0; //RS =0 命令,合起来表示读命令(状态)lcd_EN = 1; //EN=1,打开EN,LCD1602开始输出命令数据,100nS 之后命令数据有效tmp_sts = lcd_data; //读取命令到tmp_stslcd_EN = 0; //关掉LCD1602lcd_RW = 0; //把LCD1602设置成写return tmp_sts; //函数返回值tmp_sts}void lcd_wr_com(uchar command ) /*写一个命令到LCD1602*/{while(0x80&lcd_rd_status()); //写之前先判断LCD1602是否忙,看读出的命令的最高位是否为1,为1表示忙,继续读,直到不忙lcd_RW = 0;lcd_RS = 0; //RW=0,RS=0 写命令lcd_data = command; //把需要写的命令写到数据线上lcd_EN = 1;lcd_EN = 0; //EN输出高电平脉冲,命令写入}void lcd_wr_data(uchar wdata ) /*写一个显示数据到lcd1602*/{while(0x80&lcd_rd_status()); //写之前先判断lcd1602是否忙,看读出的命令的最高位是否为1,为1表示忙,继续读,直到不忙lcd_RW = 0;lcd_RS = 1; //RW=0,RS=1 写显示数据lcd_data = wdata ; //把需要写的显示数据写到数据线上lcd_EN = 1;lcd_EN = 0; //EN输出高电平脉冲,命令写入lcd_RS = 0;}void Init_lcd(void) /*初始化lcd1602*/{delay_20ms(); //调用延时lcd_wr_com(0x38); //设置16*2格式,5*8点阵,8位数据接口delay_38us(); //调用延时lcd_wr_com(0x0c); //开显示,不显示光标delay_38us(); //调用延时lcd_wr_com(0x01); //清屏delay_1520us(); //调用延时lcd_wr_com(0x06); //显示一个数据后光标自动+1}void show(){uchar i;Init_lcd(); //调用LCD初始化函数for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0x80+i); //设置显示的位置if(sys_time1[i]==0x00) //字符串是否结束break;lcd_wr_data(sys_time1[i]);//送显示数据}for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0xc0+i); //设置显示的位置if(sys_time2[i]==0x00) //判断第二行显示break;lcd_wr_data(sys_time2[i]); //送显示数据}}void show1(){uchar i;Init_lcd(); //调用LCD初始化函数for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0x80+i); //设置显示的位置if(sys_time3[i]==0x00) //字符串是否结束break;lcd_wr_data(sys_time3[i]);//送显示数据}for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0xc0+i); //设置显示的位置if(sys_time4[i]==0x00) //判断第二行显示break;lcd_wr_data(sys_time4[i]); //送显示数据}}void show2(){uchar i;Init_lcd(); //调用LCD初始化函数for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0x80+i); //设置显示的位置if(sys_time5[i]==0x00) //字符串是否结束break;lcd_wr_data(sys_time5[i]);//送显示数据}for(i=0;i<16;i++) //显示液晶的第一行{lcd_wr_com(0xc0+i); //设置显示的位置if(sys_time6[i]==0x00) //判断第二行显示break;lcd_wr_data(sys_time6[i]); //送显示数据}}uchar rdkey() //键盘扫描函数{uchar scan1,scan2,keycode,j;P1=0x0f; //列线置低电平,行线输入状态scan1=P1; //读入行值if((scan1&0x0f)!=0x0f) //判断是否有按键按下{delayms(30); //调用延时程序去抖动scan1=P1; //读入行值if((scan1&0x0f)!=0x0f) //二次判断是否有按键按下{P1=0xf0; //列线作输入,行线置低电平scan2=P1; //读入列值keycode=scan1|scan2; //组合成键编码for(j=0;j<=15;j++) //循环16次{if(keycode== key_code[j])//查表得键值{key=j; //算出最后键值return(key); //返回键值}}}}else P1=0xff;return (16);}void main(){while(1){P1=0x0f;if((P1&0x0f)!=0x0f) //判断是否有键按下{a=rdkey(); //调用键盘扫描函数switch (a){case 0: show(); break;case 1: show1();break;case 2: show2();break;}}}}五、实验过程本实验仪提供了一个4×4的小键盘,向列扫描码地址(0e101H)逐列输出低电平,然后从行码地址(0e103H)读回,如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高.这样就可以通过输出的列码和读取的行码来判断按下的是什么键。
按键显示电路实验报告(3篇)
第1篇一、实验目的1. 熟悉按键电路的基本原理和设计方法。
2. 掌握按键电路的搭建和调试方法。
3. 了解按键电路在实际应用中的重要性。
4. 提高动手实践能力和电路分析能力。
二、实验原理按键显示电路是一种将按键输入转换为数字信号,并通过显示设备进行显示的电路。
本实验主要涉及以下原理:1. 按键原理:按键通过机械触点实现电路的通断,当按键被按下时,电路接通,产生一个低电平信号;当按键释放时,电路断开,产生一个高电平信号。
2. 译码电路:将按键输入的信号转换为相应的数字信号,以便后续处理。
3. 显示电路:将数字信号转换为可视化的信息,如LED灯、数码管等。
三、实验器材1. 电路板2. 按键3. 电阻4. LED灯5. 数码管6. 电源7. 基本工具四、实验步骤1. 按键电路搭建(1)根据电路原理图,在电路板上焊接按键、电阻、LED灯等元器件。
(2)连接电源,确保电路板供电正常。
2. 译码电路搭建(1)根据电路原理图,在电路板上焊接译码电路所需的元器件。
(2)连接译码电路与按键电路,确保信号传输正常。
3. 显示电路搭建(1)根据电路原理图,在电路板上焊接显示电路所需的元器件。
(2)连接显示电路与译码电路,确保信号传输正常。
4. 电路调试(1)检查电路连接是否正确,确保无短路、断路等问题。
(2)按下按键,观察LED灯或数码管显示是否正常。
(3)根据需要调整电路参数,如电阻阻值、电源电压等,以达到最佳显示效果。
五、实验结果与分析1. 实验结果通过实验,成功搭建了一个按键显示电路,按下按键后,LED灯或数码管能够正确显示数字信号。
2. 结果分析(1)按键电路能够正常工作,实现电路通断。
(2)译码电路能够将按键输入转换为相应的数字信号。
(3)显示电路能够将数字信号转换为可视化的信息。
六、实验总结1. 通过本次实验,掌握了按键电路的基本原理和设计方法。
2. 提高了动手实践能力和电路分析能力。
3. 了解了按键电路在实际应用中的重要性。
键盘、数码管显示综合实验
实验项目名称:键盘、数码管显示综合实验实验室(中心):电子实验室实验完成时间: 09 年11 月 5 日1一.实验目的与要求通过实验,掌握单片机在输入输出口线不够用时,怎样扩展接口的方法来支持8位LED 显示和16键盘集成实现。
熟悉8155、8279等芯片性能;掌握其编程方法。
掌握键盘子程序调试方法,掌握按一个键并将键值显示出来的编程方法,这是诊断硬件、测试硬件、产品开发、软件编程必须掌握的方法。
二.实验原理及实验线路(1)通过8155芯片的扩展功能,建立描述线与数据线同步功能,如图三.实验内容①编写并调试出一个键盘实验子程序;②用子程序调用方法,分别调用键盘子程序和显示子程序,将按一个键的键值(0-F),在数码管上显示出来。
四.实验器材表2.4.5(1):以8155为扩展方式的器件80C51.BUS CRYSTAL PHYC0402NP022P7404 7SEG-MPX6-CC-BLUE RESPACK-88155 HITEMP10U50VBUTTON MINRES10K五、实验程序流程图六.实验步骤1)仿真实验过程:打开Keil程序,执行菜单命令“Project”→“New Project”创建“键盘数码管显示综合实验”项目,并选择单片机型号为AT89C52.BUS。
执行菜单命令“File”→“New”创建文件,输入源程序,保存为“键盘数码管显示综合实验.A51或键盘数码管显示综合实验.c”。
在“Project”栏的File项目管理窗口中右击文件组,选择“Add Files to Group ‘Source Group1’”将源程序“键盘数码管显示综合实验.A51或键盘数码管显示综合实验.c”添加到项目中。
执行菜单命令“Project”→“Options for Target ‘Target 1’”,在弹出的对话框中选择“Output”选项卡,选中“Greate HEX File”。
执行菜单命令“Project”→“Build Target”,编译源程序。
键盘及LED显示实验
实验三键盘及LED显示实验一、实验内容利用8255可编程并行接口控制键盘及显示器,当有按键按下时向单片机发送外部中断请求(INT0,INT1),单片机扫描键盘,并把按键输入的键码一位LED 显示器显示出来。
二、实验目的及要求(一)实验目的通过该综合性实验,使学生掌握8255扩展键盘和显示器的接口方法及C51语言的编程方法,进一步掌握键盘扫描和LED显示器的工作原理;培养学生一定的动手能力。
(二)实验要求1.学生在实验课前必须认真预习教科书与指导书中的相关内容,绘制流程图,编写C51语言源程序,为实验做好充分准备。
2.该实验要求学生综合利用前期课程及本门课程中所学的相关知识点,充分发挥自己的个性及创造力,独立操作完成实验内容,并写出实验报告。
三、实验条件及要求计算机,C51语言编辑、调试仿真软件及实验箱50台套。
四、实验相关知识点1.C51编程、调试。
2.扩展8255芯片的原理及应用。
3.键盘扫描原理及应用。
4.LED显示器原理及应用。
5.外部中断的应用。
五、实验说明本实验仪提供了8位8段LED显示器,学生可选用任一位LED显示器,只要按地址输出相应的数据,就可以显示所需数码。
六、实验原理图P1口桥接。
八、实验参考流程图1.主程序流程图2.外中断服务程序流程图外部中断0 外部中断1定时器0中断程序,用于消抖动:3.LED显示程序流程图九、C51语言参考源程序#include "reg52.h"unsigned char KeyResult; //存放键值unsigned char buffer[8]; //显示缓冲区bit bKey; //是否有键按下xdata unsigned char P_8255 _at_ 0xf003; //8255的控制口xdata unsigned char PA_8255 _at_ 0xf000; //8255的PA口xdata unsigned char PB_8255 _at_ 0xf001; //8255的PB口xdata unsigned char PC_8255 _at_ 0xf002; //8255的PC口code unsigned char SEG_TAB[] = { //段码0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x0};sbit bLine0 = P3^2;sbit bLine1 = P3^3;//延时1msvoid Delay1ms(){unsigned char i;i = 0;while (--i);}//显示void Display(){unsigned char i = 0x7f;unsigned char j;for (j = 0; j < 8; j++){PA_8255 = i; //扫描PB_8255 = SEG_TAB[buffer[j]]; //段数据i = i / 2 + 0x80;Delay1ms();}}//更新显示缓冲区数据void RefurbishData(){char i;for (i = 7; i >0; i--)buffer[i] = buffer[i-1];buffer[0] = KeyResult;}void Int0Int() interrupt 0{unsigned char i = 0x80;unsigned char KeyResult0 = 0x0;EX0 = 0; //关外部中断0P_8255 = 0x89; //PC口输入bLine0 = 0; //P3.2作行输出while (i){if ((PC_8255 & i) == 0)break;KeyResult0++;i >>= 1;}P_8255 = 0x80; //8255的PA、PB、PC口全作输出口PC_8255 = 0;bLine0 = 1;if (i){TH0 = 60; //定时中断计数器初值TL0 = 176; //定时50msTR0 = 1;KeyResult = KeyResult0;}IE0 = 0; //清除中断EX0 = 1; //开外部中断0}void Int1Int() interrupt 2{unsigned char i = 0x80;unsigned char KeyResult0 = 8;EX1 = 0; //关外部中断0P_8255 = 0x89; //PC口输入bLine1 = 0; //P3.2作行输出while (i){if ((PC_8255 & i) == 0)break;KeyResult0++;i >>= 1;}P_8255 = 0x80; //8255的PA、PB、PC口全作输出口PC_8255 = 0;bLine1 = 1;if (i){TH0 = 60; //定时中断计数器初值TL0 = 176; //定时50msTR0 = 1;KeyResult = KeyResult0;}IE1 = 0; //清除中断EX1 = 1; //开外部中断0}//50ms中断服务程序void INT_Timer0(void) interrupt 1{if (((KeyResult < 8) && !bLine0) ||((KeyResult >= 8) && !bLine1)){bKey = 1; //有键按下,键值在KeyResult中}TR0 = 0;}void main(){char i;bKey = 0; //没有键按下TMOD = 1; //定时器0:方式一P_8255 = 0x80; //8255的PA、PB、PC口全作输出口PC_8255 = 0x0;ET0 = 1; //开定时器0中断EX0 = 1; //开外部中断0EX1 = 1; //开外部中断1IT0 = 1; //边沿触发IT1 = 1; //边沿触发EA = 1; //允许中断for (i = 0; i < 8; i++)buffer[i] = 0x10;// TR0 = 1; //开定时器T0// bRefurbish = 1;while (1){if (bKey){bKey = 0;RefurbishData();}Display(); //调用显示}}十、实验实施步骤1.仔细阅读实验内容及要求,编写C51源程序。
LCD图片显示器实验报告
LCD图片显示器实验报告
实验目的
1、了解LCD显示的基本原理。
2、了解LCD的接口与控制方法
3、掌握LCD显示图形的方法
4、学习键盘接口的原理
5、掌握通过I/O端口扩展键盘的方法
实验内容
编写图形显示函数,能在LCD上显示图形,同时,能够通过键盘控制显示特定图片内容,例如:按下键盘键“1”,LCD上显示一张图片,按下键盘键“2”,LCD上显示另一张图片,按下键盘键“3”,LCD上再显示一张图片。
设计原理与硬件电路
1、键盘的基本原理(p134)
2、LCD原理(p138)
3、LCD的图形显示方式(p140)
4、硬件电路图(p139)
程序流程图(p137图改一下)
获取键码->判断键码值->调用相应条件下的图形显示函数->在LCD上显示图片->ROW++... 程序代码(复制一部分关键代码即可)
程序及硬件系统调试情况(截图,照相)
设计总结与体会
通过本次课程设计,我了解了LCD显示的基本原理,初步尝试了LCD的接口与控制编程实现,初步掌握了LCD显示图形的方法,我是采用最直观的图形显示方式,将图形中的颜色信息一个点一个点地输出到LCD的相应位置。
另外,我也学习了键盘接口的相关知识了解了键盘接口的原理,初步编程实现了通过键盘控制图形在LCD上的显示。
参考文献
《ARM9嵌入式技术及Linux高级实践教程》。
键盘与数码管显示实验
R72 10K
S14 SW-PB S18 SW-PB S22 SW-PB S26 SW-PB
R73 10K
S15 SW-PB S19 SW-PB S23 SW-PB S27 SW-PB
D2 Diode
D3 Diode
D4 Diode
D5 Diode
J33 1 2 3 4 5 6 7 8
Header 8
R94
R95
Res1
Res1
Res1
Res1
Res1
Res1
Res1
Res1
330R
330R
330R
330R
330R
330R
330R
330R
DS1
11 7 4 2 1 10 5 3
a b DIG1 c d e f g DP
HDSP-B09G
DIG2 DIG3
DP3
DP2
K1 DIG4 K2
K3 K4
9 GND COM D 10
ULN2803A GND
VCC
Pad_DS_K1 Pad_DS_K2 Pad_DS_K3 Pad_DS_K4
Pad_DS_K5
Pad_DS_K6
Pad_DS_K7
Pad_DS_K8 J37
S8550
R80 Res1 10K Q20
S8550
R81 Res1 10K Q21
键盘与数码管显示
一、4X4键盘 二、LED显示器的基本结构 三、实验箱原理图 四、STC15 I/O口 工作模式配置 五、实验要求
一、4X4键盘
5V
行线(输出)
•键特征值的判断
列线(输入)
•键盘控制方式:扫描、中断
键盘扫描及动态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;//芯片使能
实验三 键盘扫描及静态串行显示实验
实验三 键盘扫描及静态串行显示实验一、实验目的1、掌握数字、字符转换成显示段码的软件译码方法2、静态显示的原理和相关程序的编写3、键盘扫描方法二、实验电路1、静态显示,电路如电路图所示。
显示器由4个共阴极LED 数码管组成。
输入只有两个信号,它们是串行数据线DIN 和移位信号CLK 。
1个串入/并出移位寄存器芯片74LS164连接显示器各数码管的各段,为选信号由CPU 的P2.0~P2.3提供。
74LS164的引脚图如图所示。
74LS164为8位串入并出移位寄存器,1、2为 串行输入端,Q0~Q7为并行输出端,CLK 为移位时钟脉冲,上升沿移入一位;MR为清零端,低电平时并行输出为零。
三、实验内容及步骤单片机的P3.0作数据串行输出,P3.1作移位脉冲输出,串口通讯方式采用方式0,即8位移位寄存器方式。
输出的字形码通过串口通信方式输入到74LS164芯片,该芯片并行输出8位字形码,驱动数码管显示。
需要显示的字符来自于键盘输入。
键盘扫描子程序不停地扫描键盘是否有按键按下,如果有按键按下,扫描程序返回按键的行和列号。
键码获取子程序根据键盘编号而获得各键码的字形符。
按键的字符按从左到右的次序依次显示,即首先按下的字符显示在最左边,当另有按键按下时,前一个字符向右移一位,当前字符显示在最左端,以此类推。
1、使用单片机最小应用系统1模块,用导线连接RXD 、TXD 到串行静态显示模块的DIN 、CLK 端。
2、安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,打开仿真器电源。
3、启动计算机,打开伟福仿真软件,进入仿真环境。
选择仿真器型号、仿真头型号、CPU 类型;选择通信端口,测试串行口。
4、编写自己的程序,并进行编译链接,通过硬件仿真的方法达到实验要求。
四、流程图及源程序1、流程图串口发送程序参考教材P194的例7.1;键盘扫描程序参考教材P201的例7.4五、电路图74LS164。
键盘显示实验报告
键盘显示实验报告键盘显示实验报告一、引言键盘是我们日常生活中常用的输入设备之一,它通过按下不同的按键来输入字符和命令。
在计算机科学领域,键盘显示是一项重要的实验,它涉及到了计算机硬件和软件的相互配合。
本文将介绍一个键盘显示实验的设计和结果分析。
二、实验设计1. 实验目的本实验的目的是通过键盘输入字符,并在计算机屏幕上进行显示。
通过这个实验,我们可以深入了解键盘的工作原理和计算机输入输出的基本知识。
2. 实验材料本实验所需的材料包括:计算机、键盘、显示器和相应的连接线。
3. 实验步骤(1) 将键盘与计算机通过连接线连接好。
(2) 打开计算机,并启动相应的键盘显示程序。
(3) 在键盘上按下不同的按键,观察计算机屏幕上的显示效果。
(4) 分析和记录实验结果。
三、实验结果在本次实验中,我们按下了键盘上的不同按键,并观察了计算机屏幕上的显示效果。
实验结果表明,键盘输入的字符能够准确地显示在屏幕上,并且显示的速度非常快。
四、结果分析1. 键盘工作原理键盘是一种输入设备,它通过按下不同的按键来输入字符和命令。
当我们按下键盘上的某个按键时,键盘会发送一个信号给计算机,计算机通过解读这个信号来确定我们按下的是哪个按键,并将相应的字符显示在屏幕上。
2. 计算机输入输出键盘显示实验涉及到了计算机的输入输出过程。
输入是指将外部信息传递给计算机的过程,而输出是指将计算机处理后的信息传递给外部的过程。
在本实验中,键盘是输入设备,它将我们按下的按键信息传递给计算机;而显示器是输出设备,它将计算机处理后的字符信息显示在屏幕上。
3. 键盘显示的应用键盘显示技术在计算机领域有着广泛的应用。
无论是在日常办公还是在专业领域,键盘输入都是必不可少的。
通过键盘,我们可以输入文字、命令、密码等信息,实现与计算机的交互。
键盘显示技术的发展也为计算机的普及和应用提供了方便。
五、实验总结通过本次键盘显示实验,我们深入了解了键盘的工作原理和计算机输入输出的基本知识。
键盘输入与LCD显示原理
200Ω×8
g
d
dp
b
e
c
8155
0
1
2
3
4
a 5
f
6
PA0~PA7
电路的接法决定了必须采用逐位扫描显示方式。 即从段选口送出某位LED的字型码,然后选通该位LED, 即从段选口送出某位LED的字型码,然后选通该位LED, 并 保持一段延时时间。然后选通下一位,直到所有位扫描完。
要注意的两个问题:
1.字型码通常通过查表指令MOVC来求得. 1.字型码通常通过查表指令MOVC来求得. 2.换位显示时通常要加一段程序使所有的LED全灭. 2.换位显示时通常要加一段程序使所有的LED全灭.
com
com
例:模拟产品计数显示电路
段 显
编 程
ORG 1000H STAR:MOV TMOD,#60H ;定时器T1工作在方式2计数 MOV TH1,#00H ;T1置初值 MOV TL1,#00H MAIN:MOV P1,#0C0H ;数码管显示0 DISP:JB P3.3,DISP ;监测按键信号 ACALLDELAY ;消抖延时 JB P3.3,DISP ;确认低电平信号 DISP1:JNB P3.3,DISP1 ;监测按键信号 ACALLDELAY ;消抖延时 JNB P3.3,DISP1 ;确认高电平信号 SETB TR1 ;启动计数器 DISP2:MOV A,TL1 MOVC A,@A+DPTR ;查表获取数码管显示值 MOV P1,A ;数码管显示计数值 CJNE A,#8E,DISP2 LJMP STAR TAB:0C0H,0F9H,0A4H … … DELAY:MOV R2,#14H DELAY1:MOV R3,#0FAH DJNZ R3,$ DJNZ R2,DELAY1 RET END
键盘、LED发光实验报告
EDA设计课程实验报告实验题目:键盘、LED发光实验学院名称:专业:班级:姓名:高胜学号小组成员:指导教师:一、实验目的通过实验让同学们进一步了解、熟悉和掌握FPGA开发软件的使用方法及Verilog HDL 的编程方法,并熟悉以Verilog HDL文件为顶层模块的设计;学会和体会分支条件语句case 的使用方法及FPGA I/O口的输出控制。
二、设计任务及要求smartSOPC试验箱上有八个按键KEY1~KEY8和八个发光二极管LED1~LED8。
在smartSOPC试验箱上有KEY1~KEY8通过跳线JP6的KEY1~KEY8分别与芯片的121~124、143、141、158、和156引脚相连(QuickSOPC芯片板上的KEY1~KEY4与SmartSOPC试验箱上KEY1~KEY4是并接的)。
本试验的内容是要求在SmartSOPC试验箱上完成对8个键盘KEY1~KEY8进行监控,一旦有键输入则判断其键值,并点亮相应个发光二极管。
三、系统设计1、整体设计方案FPGA的所有I/O控制块允许每个I/O引脚单独配置为输入口,不过这种配置是系统自动完成的。
当这种I/O口被设置为输入口使用时(如定义key0为输入引脚:input key0;),该I/O控制模块将直接使三态缓冲区的控制端接地,使得该I/O引脚对外呈高阻态,这样该I/O引脚可作为专用输入引脚。
正确分配并锁定引脚后,一旦在KEY1~KEY8中有键输入,即可判断其键值并作出相应的处理。
2、功能模块电路设计(1)输入输出模块框图(见图1)图1(键盘led发光模块图)(2)模块逻辑表达(见表1)表1(按键led发光真值表)(3)算法流程图(见图2)(4)Verilog源代码module ledkey(key,led); //模块名ledkeyinput [7:0]key; //输入按键状态output [7:0]led; //输出led发光状态reg [7:0]k; //定义8位按键状态寄存器k reg [7:0]l; //定义8位led状态寄存器lassign led=l; //输出led发光状态选择always @(key) //定义按键信号变化触发begink=key; //按键状态选择case (k)8'b11111110:l=8'b11111110; //亮一盏led8'b11111101:l=8'b11111100; //亮二盏led8'b11111011:l=8'b11111000; //亮三盏led8'b11110111:l=8'b11110000; //亮四盏led8'b11101111:l=8'b11100000; //亮五盏led8'b11011111:l=8'b11000000; //亮六盏led8'b10111111:l=8'b10000000; //亮七盏led8'b01111111:l=8'b00000000; //亮八盏leddefault:l=8'b11111111; //不亮endcaseendendmodule四、系统调试1、仿真调试(1)仿真代码`timescale 1ns/1nsmodule ledkey_tp;reg [7:0]key;wire [7:0]led;ledkey u1(key,led);initialbegin#100 key=8'b11111110;#100 key=8'b11111101;#100 key=8'b11111011;#100 key=8'b11110111;#100 key=8'b11101111;#100 key=8'b11011111;#100 key=8'b10111111;#100 key=8'b01111111;#100 key=8'b00111111;#100 $finish;endinitial $monitor($time,,,"%b,%b",key,led);endmodulemodule ledkey(key,led);input [7:0]key;output [7:0]led;reg [7:0]k;reg [7:0]l;assign led=l;always @(key)begink=key;case (k)8'b11111110:l=8'b11111110;8'b11111101:l=8'b11111100;8'b11111011:l=8'b11111000;8'b11110111:l=8'b11110000;8'b11101111:l=8'b11100000;8'b11011111:l=8'b11000000;8'b10111111:l=8'b10000000;8'b01111111:l=8'b00000000;default:l=8'b11111111;endcaseendendmodule(2)仿真波形图(见图3)图3(3)波形分析# 0 xxxxxxxx,xxxxxxxx # 100 11111110,11111110 # 200 11111101,11111100# 300 11111011,11111000 # 400 11110111,11110000 # 500 11101111,11100000 # 600 11011111,11000000 # 700 10111111,10000000 # 800 01111111,00000000 # 900 00111111,11111111 (4)引脚图表2-1 引脚锁定方法五、实验感想。
实验三 LCD显示实验
实验三LCD显示实验实验学时:2实验类型:设计实验要求:必修一、实验目的通过本实验的学习,使学生熟悉LCD1602,了解液晶显示屏的使用及其电路设计方法,初步掌握液晶的控制方式和显示的方法;二、实验内容采用LCD1602进行电路设计,并编写程序实现LCD显示。
三、实验原理、方法和手段1.液晶显示屏液晶显示屏(LCD,Liquid Crystal Display)主要用于显示文本及图形信息。
液晶显示屏具有轻薄、体积小、耗电量低、无辐射危险、平面直角显示以及影像稳定不闪烁等特点;因此,在许多电子应用系统中,常使用液晶显示屏作为人机界面。
本实验采用的1602液晶模块是2行16个字的显示模块,其内部有80*8位的RAM数据缓冲区。
2.主要技术参数3.1602引脚介绍1602采用标准的16脚接口,其中:第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15~16脚:空脚1602液晶显示模块可以和单片机A T89C51直接接口,电路如图所示(仅供参考):4.1602字符代码对应关系1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(xxH),显示时模块把地址xxH中的点阵字符图形显示出来,我们就能看到字母“A”5.1602指令1602液晶模块内部的控制器共有11条控制指令,如表2所示,它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
3 综合实验2-键盘和显示★★★
;-----综合实验2 键识别和显示程序-----------------CODE SEGMENTASSUME CS:CODE,DS:CODE,ES:CODEORG 3000HSTART1: JMP STARTTABLE DB 66H, 65H, 63H, 56H, 55H, 53H, 36H, 35H, 33HLED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H ;---------8155 端口定义-------------------PCON EQU 0FFE8HPA EQU 0FFE9HPB EQU 0FFEAHPC EQU 0FFEBH;-----显示缓冲区----------------BUF DB ?, ?, ?, ?, ?, ?;----------------主程序-----------------------START: CALL WPMOV AL, 03HMOV DX, PCONOUT DX, AL ;8155初始化MOV AL, 80HMOV DX, PD8255OUT DX, AL ;8255初始化MOV AL, 16HMOV DX, PCON8253OUT DX, AL ;8253初始化L1: CALL SCANCALL DISPJMP L1;--------下面开始是子程序-----------------;-------键扫描程序--------------------------SCAN: MOV AL, 00HMOV DX, PBOUT DX, AL ;行MOV DX, PCIN AL, DXOR AL, 0F8HCMP AL, 0FFHJZ P3;无键按下时,不需要刷新BUFCALL DELAYMOV CX, 3MOV AH, 0FEHP1: MOV AL, AHOUT DX, ALMOV DX, PCIN AL, DXOR AL, 0F8HCMP AL, 0FFHJNZ YEROL AH, 1LOOP P1JMP P3;如果没正确识别,则退出YE: AND AH, 07HAND AL, 07HMOV CL, 4SHL AL, CLOR AL, AHMOV SI, OFFSET TABLE+08HMOV BL, 08HLP1: CMP AL, [SI]JZ P2DEC SIDEC BLJMP LP1P2: NOPMOV BUF+3, BLP3:RET;----初始化显示缓冲区-----------------WP: MOV BUF, 11HMOV BUF+1, 11HMOV BUF+2, 10HMOV BUF+3, 08HRET;-------4位LED显示程序----------------DISP: MOV CL, 80H ;从最高位D5开始即D5=1 MOV BX, OFFSET BUFDISP1: MOV AL, [BX]PUSH BXMOV BX, OFFSET LEDXLAT ;查表得到显示字符的编码POP BXMOV DX, PAOUT DX, ALMOV AL, CLMOV DX, PB;---延时程序-----PUSH CXMOV CX, 0100HDELY: LOOP $POP CXCMP CX, 10H ;判断是否显示到最低位,如是,则退出JZ L4INC BXSHR CL, 1JMP DISP1L4: MOV AL, 00HMOV DX, PBOUT DX, ALRET;------小延时程序--------------DELAY: PUSH CXMOV CX, 0100HDELY1: LOOP $POP CXRETCODE ENDSEND START1_______________以上程序由任雯箐同学提供;-----综合实验2 键识别和显示程序-----------------CODE SEGMENTASSUME CS:CODE,DS:CODE,ES:CODEORG 3400HSTART1: JMP START;-----字符LED显示编码---------------------------------LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HDB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3HKEYTAB DB 66H,65H,63H,56H,55H,53H,36H,35H,33H ;键值表;键值对应的键名0 1 2 3 4 5 6 7 8 其实就是键值的顺序KEY DB 66H ;当前读入的键值NUM DB 4 ;用于记录当前使用的是BUF中的第几个字节,初始值设为4 BUF DB 10H,10H,10H,10H ;显示缓冲区,并赋初值,作为初始化PORT0 EQU 0FFE8H ;8155 命令口PORTA EQU 0FFE9H ;字符编码端口PORTB EQU 0FFEAH ;高4位字位口/第3位键扫描口PORTC EQU 0FFEBH ;键入口;--注意下面端口的定义方式-----ZXK EQU PORTA ;字符编码端口ZWK EQU PORTB ;字符位端口START: ; 初始化8155MOV AL, 03HMOV DX, PORT0OUT DX, ALJM0:CALL CHECK ;键盘扫描程序CALL CHANGE ;将得到的键值转化成键名,并放入相应的BUF;连续调用显示程序40次(试出来的),延时的时间约比按键一次的时间略长MOV CX, 40LP0:PUSH CXCALL DISP;显示程序POP CXLOOP LP0JMP JM0;---键盘扫描子程序-------CHECK:WT1: XOR AX, AXMOV DX, PORTBOUT DX, ALMOV DX, PORTCIN AL, DXAND AL, 07HCMP AL, 07HJZ EXIT;若未按键,则退出MOV CL, 4SHL AL, CLPUSH AX ;将列值左移4位并保存MOV CX, 10LP11: LOOP LP11 ; 延时防抖动MOV CX, 3MOV BL, 4 ;0100H ,BL记录当前扫描的是哪一行(1表示)LP12:MOV AL, BLNOT AL ; 取反得到应输出的行值MOV DX, PORTBOUT DX, ALMOV DX, PORTCIN AL, DXAND AL, 07HCMP AL, 07HJNZ GO1 ; 若此行有键按下,则推出SHR BL, 1LOOP LP12;逐行扫描GO1:MOV AL, BLNOT AL ;取反得行值POP BXAND BL,070HAND AL,07HOR BL, ALMOV KEY, BL ; 得键值,放入KEYMOV AL, NUMINC ALCMP AL, 5JNZ GO01MOV AL, 1GO01:MOV NUM, AL;修改NUM值,确定由BUF中的哪一位显示新输入的键号EXIT:RET;----根据键值查表求相应的键名,并放入相应的BUF--CHANGE:MOV AL, KEYMOV DI, OFFSET KEYTABXOR CX, CXLP2:CMP AL, [DI]JZ GO2INC CLINC DIJMP LP2 ;得键号GO2:MOV SI, OFFSET BUFMOV AL, NUMXOR AH, AHADD SI, AXDEC SIMOV [SI], CL ;将键号放入相应的BUF中EXIT1: RET;-------------显示程序---------------------------DISP: MOV CL, 80H ;从最高位7开始,PORTB中的高4为字型口MOV BX, OFFSET BUFDISP1: MOV AL, [BX]PUSH BXMOV BX, OFFSET LEDXLAT ;查表得到显示字符的编码POP BXMOV DX, ZXKOUT DX, ALMOV AL, CLMOV DX, ZWKOUT DX, AL;---延时程序-----PUSH CXMOV CX, 0100HDELY: LOOP $POP CXCMP CX, 10H ;判断是否显示到最低位,如是,则退出JZ L4INC BXSHR CL, 1JMP DISP1L4: MOV AL, 00HMOV DX, ZWKOUT DX, ALRETCODE ENDSEND START1_______________以上程序由温媛媛同学提供。
实验三键盘与显示
定时器实验
实验内容
例程 动态数码显示模块显示“168168” 。
画出实验例程的流程图。 修改程序,实现八位LED数码管只显示其中的 两位。 将显示改成闪烁显示模式,频率约1显示器的接口方法和编程方法; 掌握键盘和八段码显示器的工作原理; 掌握静态显示的原理和相关程序的编写;
实验说明
实验箱提供了8个按钮的小键盘,可接到单片机的 并行口,如果有键按下,则相应输出为低,否则输出 为高。单片机通过识别,判断按下什么键。有键按下 后,要有一定的延时,防止由于键盘抖动而引起误操 作。
音频驱动实验
实验内容:
例程 在查询式键盘模块上按下某个键,观察数
码管显示是否与按键值一致,键值从右至左为 0~7。 设计长按功能,当按键时间长于3秒时,个位上 的数字以一定速率增加,直至按键释放。
实验三 键盘与显示
动态扫描显示(实验四) 查询式键盘(实验五)
动态扫描显示实验
实验目的
掌握数字、字符转换成显示段码的软件译码方法; 动态显示的原理和相关程序的编写;
实验说明
动态显示,也称扫描显示。显示器由8个共阴极 LED数码管构成。单片机P0口输出显示段码,经由一 片74LS245驱动输出给LED管,由P1口输出位码,经 由74LS06输出给LED管。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三、键盘及LCD显示实验
1、实验目的
熟悉Freescale 68HC08 MCU的程序设计和调试方法,掌握CodeWarrior ID E、ProEmulator、DP-01多MCU实验平台等开发工具的使用,理解行列式键盘和点阵字符型LCD显示的基本原理和实现方法。
2、实验环境
PC机
DP-01多MCU实验平台
CodeWarrior 集成开发环境
ProEmulator模拟软件
3、硬件接线
(1)PTA7-0接4x4行列键盘模块,即实验平台A2区的J61插口(B0~B7)与键盘模块用8位排线相连(注意键盘模块端的连接方向)。
(2)在实验平台B3区的J106插座插入TC1602A字符型液晶模块,完成电源、数据线等默认连接(LCD的DB0-7与MCU的PTB0-7连接)。
(3)LCD模块的RS、R/W、E与MCU的PTC0、PTC1、PTC2连接,即实验平台B3区的A0、A1、/CS分别连接到A2区的A11(PTC0)、A12(PTC1)、A13(PTC2)。
(4)用A2区的C6(PTD1)、C7(PTD2)模拟WR、RD信号,只要C6、C7中任一引脚输出为低电平即可(在程序中设定、无需外接连线);也可把C6或C7
直接接地(外接连线)。
4、实验内容
根据硬件连线,利用汇编语言编写实现键盘(中断方式)和点阵字符型LCD 显示功能的程序,具体要求以下:
(1)在LCD上排显示"TJ EIE12 xxxxxxx",其中xxxxxx表示学号;下排置中显示"Tongji2015",下排左端显示按键的键号。
(2)* 键对LCD下排右端显示的内容进行加1操作,# 键对下排右端显示的内容进行减1操作,数的初始值为5,变化范围在0~9之间。
5、实验要求
(1)通过CW IDE或ProEmulator调试程序并查看运行结果。
(预习时完成)(2)利用CW IDE Mon08接口把程序下载到DP-01多MCU实验平台,通过单步、断点、全速等多种调试方式运行程序并查看运行结果。
(3)完成实验报告的撰写。
6、思考题(选做内容)
(1)如何实现*和# 键按住不放时,对下排右端显示内容的连续加减操作?
(2)如何利用HC08 MCU C语言编程完成实验内容?
(3)如何在MSP430、MCS-51和PIC16F87x MCU上实现实验内容?(4)如何使用Proteus仿真调试实验内容?
(5)如何设计一个具有一位加减乘除功能的简易计算器?
7、参考
《微控制器原理与应用》328页 7.3 键盘模块与键盘中断
《微控制器原理与应用实验教程》1-66页第一、二章相关内容《微控制器原理与应用实验教程》189页 4.3.2 字符型液晶显示键盘及LCD显示编程范例
/blog-557776-64330.html
HC08 C语言示例1_LCD显示
/blog-557776-53620.html
MC68HC908GP32 - Data Sheet (REV 10)。