实验十二SOPC的键盘与LCD显示控制实验4页
按键及显示实验
一、实验原理及电路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)读回,如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高.这样就可以通过输出的列码和读取的行码来判断按下的是什么键。
lcd控制实验报告
lcd控制实验报告标题:LCD控制实验报告摘要:本实验旨在探究液晶显示屏(LCD)的控制原理和操作方法。
通过实验,我们成功实现了对LCD的控制,并了解了LCD的基本工作原理和控制方式。
本文将详细介绍实验的步骤、结果和分析。
引言:LCD是一种广泛应用于电子产品中的显示器件,它具有低功耗、高分辨率和薄型轻便等优点,因此得到了广泛的应用。
了解LCD的控制原理和操作方法对于电子工程师和学生来说是非常重要的。
本实验旨在帮助学生掌握LCD的基本控制方法,并加深对LCD工作原理的理解。
实验目的:1. 了解LCD的基本工作原理2. 掌握LCD的控制方法3. 实现对LCD的基本控制实验步骤:1. 连接LCD显示屏和控制器2. 编写控制程序3. 调试程序并观察LCD显示效果4. 分析实验结果实验结果:通过实验,我们成功实现了对LCD的控制。
在编写控制程序并调试后,LCD显示屏能够按照我们的指令显示相应的内容,包括文字、图形等。
实验结果表明,我们掌握了LCD的基本控制方法,并能够灵活地应用于实际项目中。
实验分析:通过本次实验,我们深入了解了LCD的基本工作原理和控制方法。
LCD的显示效果受到控制程序的影响,因此编写高效的控制程序对于实现理想的显示效果至关重要。
此外,LCD的控制还涉及到对显示屏的初始化、数据传输等细节,需要我们仔细调试和优化。
结论:本实验成功实现了对LCD的控制,并加深了我们对LCD的工作原理和控制方法的理解。
通过实验,我们掌握了LCD的基本控制方法,并能够灵活地应用于实际项目中。
这对于我们的学习和工作都具有重要意义。
致谢:感谢实验室的老师和同学们在实验中的帮助和支持。
也感谢本次实验给我们提供了一个很好的学习机会,让我们更加深入地了解了LCD的控制原理和操作方法。
按键及显示实验
一、实验原理及电路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)读回,如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高.这样就可以通过输出的列码和读取的行码来判断按下的是什么键。
键盘、数码管显示综合实验
实验项目名称:键盘、数码管显示综合实验实验室(中心):电子实验室实验完成时间: 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源程序。
单片机键盘显示实验报告
单片机的键盘和显示实验报告㈠实验目的1.掌握单片机I/O的工作方式;2.掌握单片机以串行口方式0工作的LED显示;3.掌握键盘和LED显示的编程方法。
㈡实验器材1.G6W仿真器一台2.MCS—51实验板一台3.PC机一台4.电源一台㈢实验内容及要求实验硬件线路图见附图从线路图可见,8051单片机的P1口作为8个按键的输入端,构成独立式键盘。
四个LED显示器通过四个串/并移位寄存器74LS164接口至8051的串行口,该串行口应工作在方式0发送状态下,RXD端送出要显示的段码数据,TXD则作为发送时钟来对显示数据进行移位操作。
编写一个计算器程序,当某一键按下时可执行相应的加、减、乘、除运算方式,在四个显示器上显示数学算式和最终计算结果。
注:①通过按键来选择加、减、乘、除四种运算方式。
②输入两个数字均为一位十进制数,可预先放在内存中。
㈣实验框图(见下页)㈤思考题1.当键盘采用中断方式时,硬件电路应怎样连接?P1.4~P1.7是键输出线,P1.0~P1.3是扫描输入线。
输入与门用于产生按键中断,其输入端与各列线相连,再通过上拉电阻接至+5 V电源,输出端接至8051的外部中断输入端。
2.74LS164移位寄存器的移位速率是多少?实验中要求计算的式子和结果之间相差一秒,移位寄存器的移位速率应该是每秒一位吧。
其实这个问题确实不知道怎么回答。
LED 显示用的段码与教科书所提供的不同,本实验采用如下段码:显示数符段码显示数符段码0BBH A DBH109H B F1H2EAH C B2H36BH D E9H459H E F2H573H F D2H否有否P1口置输入读P1口开 始显示“0000”是否有键按下?延迟消抖是否有键按下?是读键码加法运算减法运算除运算6F3H—40H70BH.04H8FBH┗┛A1H97BH┗┛1AH灭00H P DAH实验代码:ORG 0000HAJMP MAINORG 0030HMAIN:MOV 41H,#0BBH ;对几个存放地址进行初始化MOV 42H,#0BBHMOV 43H,#0BBHMOV 44H,#0BBHMOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0 LCALL DISPLAY ;初始化显示KEY:MOV R3,#08H;用来存放两个数据MOV R4,#02HMOV P1,#0FFH ;初始化P1口MOV A,P1 ;读取按键状态CPL A ;取正逻辑,高电平表示有键按下JZ KEY ;A=0时无键按下,重新扫描键盘LCALL DELAY1;消抖MOV A,P1 ;再次读取按键状态CPL AJZ KEY ;再次判别是否有键按下PUSH AKEY1:MOV A,P1CPL AANL A,#0FH ;判别按键释放JNZ KEY1 ;按键未释放,等待LCALL DELAY1;释放,延时去抖动POP AJB ACC.0,ADD1 ;K1按下转去ADD1JB ACC.1,SUB1 ;K1按下转去SUB1JB ACC.2,MUL1 ;K1按下转去MUL1JB ACC.3,DIV1 ;K1按下转去DIV1LJMP KEYADD1:LCALL BUFFER ;显示加数和被加数MOV 43H,#049HLCALL DISPLAY ;显示加号MOV A,R3ADD A,R4DA AMOV R3,A ;相加结果放入R6ANL A,#0FHMOV R4,A ;结果个位放入R7MOV A,R3SWAP A ;半字节交换,高四位放入低四位ANL A,#0FHMOV R3,A ;结果的高位放入R6LCALL L;显示缓存区设置LCALL DELAY2;延时一秒后显示LCALL DISPLAYLJMP KEYSUB1:LCALL BUFFER ;显示减数和被减数MOV 43H,#40HLCALL DISPLAY ;显示减号MOV A,R3CLR CY ;CY清零SUBB A,R4 ;做减法PUSH ARLC A ;带进位循环左移,最高位放入CYJC F ;判断最高位,若为1则跳转到负数ZHENG: POP AMOV R4,AMOV R3,#00H ;高位清零SJMP OUTFU:POP ACPL A ;取绝对值INC AMOV R4,AMOV R3,#11H ;显示负号OUT: LCALL L ;显示缓存区设置LCALL DELAY2 ;延时1s后显示LCALL DISPLAYLJMP KEYMUL1:LCALL BUFFER ;显示两位乘数MOV 43H,#99HLCALL DISPLAY ;显示乘号MOV A,R3MOV B,R4MUL AB ;结果放入AB,A中是低8位,B中是高8位MOV B,#0AHDIV AB ;十进制转换MOV R4,B ;结果个位放入R7MOV R3,A ;结果的十位放入R6LCALL LLCALL DELAY2LCALL DISPLAY ;延时1s后显示LJMP KEYDIV1:LCALL BUFFER ;显示除数和被除数MOV 43H,#62HLCALL DISPLAY ;显示除号MOV A,R3MOV B,R4DIV AB ;A除以BMOV R4,B ;余数放在R4中MOV R3,A ;商放在R3中MOV A,R4MOVC A,@A+DPTR ;调用段选号MOV 41H,A ;显示余数MOV A,R3MOVC A,@A+DPTRMOV 43H,A ;显示商MOV 42H,#00HMOV 44H,#00HLCALL DELAY2 ;延时1S后显示LCALL DISPLAYLJMP KEYBUFFER: MOV 41H,#22H ;显示初始化,在做计算之前显示两个操作数,显示等号MOV DPTR,#TABLMOV A,R4MOVC A,@A+DPTRMOV 42H,AMOV A,R3MOVC A,@A+DPTRMOV 44H,ARETDISPLAY:MOV R5,#04H;共四位需要显示MOV R0,#41HDISPLAY1:MOV A,@R0MOV SBUF,ADISPLAY2:JNB TI,DISPLAY2;是否传完了CLR TIINC R0DJNZ R5,DISPLAY1RETL:MOV A,R4MOVC A,@A+DPTRMOV 41H,A ;R4对应的段码MOV A,R3MOVC A,@A+DPTRMOV 42H,A ;R3对应的段码MOV 43H,#00HMOV 44H,#00HRETDELAY1: ;普通延时MOV R1,#20HDS1:MOV R2,#0FFHDS2:DJNZ R2,DS2DJNZ R1,DS1RETDELAY2:MOV R6,#14H ;定时1SMOV TMOD,#01HDS3:MOV TH0,#3CHMOV TL0,#0B0H ;50msSETB TR0LOOP:JNB TF0,LOOPCLR TF0CLR TR0DJNZ R6,DS3 ;1s到,中断返回RETTABL:DB 0BBH 09H 0EAH 6BH ;段码表DB 59H 73H 0F3H 0BHDB 0FBH 7BH 00H 0DBHDB 0F1H 0B2H 0E9H 0F2HDB 0D2H 40H实验结果及分析按键1:8+2= 结果:10按键2:8-2= 结果: 6按键3:8*2= 结果:16按键4:8/2= 结果:4从上面的结果可以看出,本次实验基本完成了实验要求。
实验三、键盘及LCD显示实验(2015)
实验三、键盘及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实验平台,通过单步、断点、全速等多种调试方式运行程序并查看运行结果。
键盘显示实验报告
键盘显示实验报告键盘显示实验报告一、引言键盘是我们日常生活中常用的输入设备之一,它通过按下不同的按键来输入字符和命令。
在计算机科学领域,键盘显示是一项重要的实验,它涉及到了计算机硬件和软件的相互配合。
本文将介绍一个键盘显示实验的设计和结果分析。
二、实验设计1. 实验目的本实验的目的是通过键盘输入字符,并在计算机屏幕上进行显示。
通过这个实验,我们可以深入了解键盘的工作原理和计算机输入输出的基本知识。
2. 实验材料本实验所需的材料包括:计算机、键盘、显示器和相应的连接线。
3. 实验步骤(1) 将键盘与计算机通过连接线连接好。
(2) 打开计算机,并启动相应的键盘显示程序。
(3) 在键盘上按下不同的按键,观察计算机屏幕上的显示效果。
(4) 分析和记录实验结果。
三、实验结果在本次实验中,我们按下了键盘上的不同按键,并观察了计算机屏幕上的显示效果。
实验结果表明,键盘输入的字符能够准确地显示在屏幕上,并且显示的速度非常快。
四、结果分析1. 键盘工作原理键盘是一种输入设备,它通过按下不同的按键来输入字符和命令。
当我们按下键盘上的某个按键时,键盘会发送一个信号给计算机,计算机通过解读这个信号来确定我们按下的是哪个按键,并将相应的字符显示在屏幕上。
2. 计算机输入输出键盘显示实验涉及到了计算机的输入输出过程。
输入是指将外部信息传递给计算机的过程,而输出是指将计算机处理后的信息传递给外部的过程。
在本实验中,键盘是输入设备,它将我们按下的按键信息传递给计算机;而显示器是输出设备,它将计算机处理后的字符信息显示在屏幕上。
3. 键盘显示的应用键盘显示技术在计算机领域有着广泛的应用。
无论是在日常办公还是在专业领域,键盘输入都是必不可少的。
通过键盘,我们可以输入文字、命令、密码等信息,实现与计算机的交互。
键盘显示技术的发展也为计算机的普及和应用提供了方便。
五、实验总结通过本次键盘显示实验,我们深入了解了键盘的工作原理和计算机输入输出的基本知识。
基于SOPC的ps2-lcd控制器
基于SOPC的键盘及lcd控制器学院:电子工程学院专业班级:电路11级03班姓名:朱潮勇学号:05116079完成日期:2014年6月20日一、设计要求 (1)二、规范说明 (1)三、顶层设计结构图 (1)四、模块详细设计 (2)1 功能说明 (2)2 端口定义 (2)3 设计代码 (2)4 激励代码 (10)5 仿真结果 (17)五、结论和问题: (17)六、团队成员分工:..................................................................................... 错误!未定义书签。
一、设计要求编写verilog程序以及c语言程序实现标准键盘到LCD显示器的通信。
二、规范说明将标准键盘输入的阿拉伯数字以及26个大写字母显示在LCD上。
要求采用FPAG数字逻辑接收键盘串口数据,并转换成并口数据。
NiosII处理器IO口读取此数字或大写字母,需要9bit输入口,8bit为数据,1bit表示状态(是否有新数据?复位时此位为0,键盘有新数据并转换成并口数据此位置1,产生上升沿,并在sopc中定义该标志为外部中断,NiosII判断中断来临、读取数据,并将此位清0)。
读取键盘值、判断状态为和LCD显示,均由NiosII完成。
每次可以连续键入16个数字或大写字母,并具备手动清屏功能。
三、顶层设计结构图四、模块详细设计1 功能说明串并转换模块将标准键盘的串行数据转换成8位并行数据Key_to_lcd模块是nios核,将按键码值转换成lcd显示。
2 端口定义3 设计代码Verilog代码`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 19:42:30 04/16/2014// Design Name:// Module Name: PS2_key// Project Name:// Target Devices:// Tool versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://////////////////////////////////////////////////////////////////////////////////// module key_lcd(input clk,input rst_n,input ps2_clk,input ps2_data,output [7:0] LED,output reg key_pressed,output lcd_rw,output lcd_rs,output lcd_en,output lcd_on,output lcd_blon,output [7:0] lcd_data);reg [7:0] ps2_byte;reg [2:0] key_val;reg key_released;reg [3:0] count;reg ps2_clk_r0, ps2_clk_r1;reg [7:0] ps2_data_reg;wire ps2_clk_n = (~ps2_clk_r0) & ps2_clk_r1;assign lcd_blon = 1'b1;assign lcd_on = 1'b1 ;always @ (posedge clk or negedge rst_n)beginif (!rst_n)beginps2_clk_r0 <= 1'b0;ps2_clk_r1 <= 1'b0;endelsebeginps2_clk_r0 <= ps2_clk;ps2_clk_r1 <= ps2_clk_r0;endendalways @ (posedge clk or negedge rst_n) beginif(!rst_n) begincount <= 4'd0;ps2_data_reg <= 8'd0;endelse if(ps2_clk_n) begincase (count)4'd0: count <= count+1'b1;4'd1: begincount <= count+1'b1;ps2_data_reg[0] <= ps2_data;end4'd2: begincount <= count+1'b1;ps2_data_reg[1] <= ps2_data;end4'd3: begincount <= count+1'b1;ps2_data_reg[2] <= ps2_data;end4'd4: begincount <= count+1'b1;ps2_data_reg[3] <= ps2_data;end4'd5: begincount <= count+1'b1;ps2_data_reg[4] <= ps2_data;end4'd6: begincount <= count+1'b1;ps2_data_reg[5] <= ps2_data;end4'd7: begincount <= count+1'b1;ps2_data_reg[6] <= ps2_data;end4'd8: begincount <= count+1'b1;ps2_data_reg[7] <= ps2_data;end4'd9: begincount <= count+1'b1;end4'd10: begincount <= 4'd0;enddefault: ;endcaseendendalways @ (posedge clk or negedge rst_n) beginif(!rst_n) beginkey_released <= 1'b0;key_pressed<= 1'b0;endelse if(count==4'd10) beginif(ps2_data_reg == 8'hf0) key_released <= 1'b1;else beginif(!key_released) beginkey_pressed <= 1'b1;ps2_byte <= ps2_data_reg;endelse beginkey_pressed <= 1'b0;key_released<= 1'b0;endendendendassign LED = ps2_byte;key_to_lcd (// 1) global signals:.clk(clk),.reset_n(rst_n),// the_key_data.in_port_to_the_key_data(ps2_byte),// the_key_press.in_port_to_the_key_press(key_released),// the_lcd_data.out_port_from_the_lcd_data(lcd_data),// the_lcd_en.out_port_from_the_lcd_en(lcd_en),// the_lcd_rs.out_port_from_the_lcd_rs(lcd_rs),// the_lcd_rw.out_port_from_the_lcd_rw(lcd_rw)// the_pio_b//.out_port_from_the_pio_b());EndmoduleNios C语言代码/*********************************************************************** ** rs 寄存器选择端1 数据寄存器0 指令寄存器* en 使能端由高到低的调变液晶执行指令* rw 读写信号线高写低读* ***********************************************************************/ //将库函数包含进入#include "system.h"//SOPC生成的系统库函数#include "alt_types.h"//类型定义库函数#include <io.h> //io端口库函数#include "altera_avalon_pio_regs.h"//io端口寄存器库函数#include <unistd.h>#include <sys/alt_irq.h>//中断库函数typedef unsigned char Boolean ;typedef unsigned int uint ;#define KEY_DATA *(alt_u8 *)KEY_DATA_BASE //将按键接口寄存器的按键值取得const Boolean key_data[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a};const Boolean key_table[] = {0x16,0x1E,0x26,0x25,0x2E,0x36,0x3D,0x3E,0x46,0x1C,0x32,0x21,0x23,0x24,0x2B,0x34,0x33,0x4 3,0x3B,0x42,0x4B,0x3A,0x31,0x44,0x4D,0x15,0x2D,0x1B,0x2C,0x3C,0X2A,0x1D,0x22,0x35,0x12}; void LCD_Write_Command(Boolean Command); //写命令void LCD_Write_data(Boolean Data);void Init_LCD(void);static void KEY_OK_ISR( alt_u32 id)//按键中断服务程序。
实验四 键盘及显示实验
实验四键盘及显示实验一、实验目的1、学习自制键盘与单片机的接口及程序处理方法;2、掌握数码管显示电路的构成及程序编制方法。
二、实验仪器设备THGZ—1型单片机·CPLD/FPGA开发综合实验装置1台。
三、实验内容与要求通过键盘输入数据和操作指令,并由LED显示器显示相关数据。
1、独立式键盘与动态LED显示起初显示器全黑,当按KEY1~KEY8任意键后,显示器显示与键号对应的字符(“1”~“8”),每次按键对应字符显示在最右边,前一次的左移一位。
图2-4.1 独立式键盘与动态LED显示实验电路2、矩阵式键盘与动态LED显示①单字符的循环显示起初显示器显示“In ”,按键盘上的“0”~“9”任意键后再按“开始”键,6位LED 显示器马上左循环显示(左移速度0.5s/字符)键入的字符,按“停止”键可以重复以上过程。
图2-4.2 单字符的循环显示实验电路②延时函数的时间测量用定时器/计数器0测量如下延时函数的延时时间。
delaytest(unsigned int time){ unsigned int i,j;for (i=0;i<time;i++)for (j=0;j<65535;j++);}开机显示“good”;按“测量”键后显示“InPArA”表明要通过键盘输入延时函数的实参值,输入实参值并显示该值;按“测量”键后以ms为单位显示测量结果;再按“测量”键将重复以上过程。
图2-4.3 延时函数的时间测量实验电路四、思考题1、比较独立式键盘与矩阵式键盘的异同。
2、键盘处理程序包括哪些过程?2、如何识别键盘上的各键?键值有何意义?3、何为消抖?有何意义?如何实现?实验四源程序清单TEST4-1.C#include <reg51.h>#define KeyISegCodeO P1 /*定义键盘输入口/动态LED显示器段码输出口*/#define BitCtrO P2 /*定义动态LED显示器位控码输出口*/unsigned char DispBuf[6]={10,10,10,10,10,10}; /*显示数组,初始化为不显示*/void delay(unsigned char time) /*延时函数*/{ unsigned char i,j;for (i=0;i<time;i++)for (j=0;j<255;j++);}unsigned char KeyBoardScan() /*键盘扫描函数*/{ unsigned char KeyV alue=0; /*键值,无键按下为0*/BitCtrO=0; /*关闭显示*/KeyISegCodeO=0xff; /*由输出转为输入*/if (KeyISegCodeO!=0xff){ delay(12); /*消抖延时约10ms(fosc=12MHz)*/if (KeyISegCodeO!=0xff){ switch (KeyISegCodeO){ case 0xfe: KeyV alue=1;break; /*KEY1按下,键值为1*/case 0xfd: KeyV alue=2;break; /*KEY2按下,键值为2*/case 0xfb: KeyV alue=3;break; /*KEY3按下,键值为3*/case 0xf7: KeyV alue=4;break; /*KEY4按下,键值为4*/case 0xef: KeyV alue=5;break; /*KEY5按下,键值为5*/case 0xdf: KeyV alue=6;break; /*KEY6按下,键值为6*/case 0xbf: KeyV alue=7;break; /*KEY7按下,键值为7*/case 0x7f: KeyV alue=8;break; /*KEY8按下,键值为8*/}while (KeyISegCodeO!=0xff); /*等待键释放*/}}return(KeyV alue); /*返回键值*/}void display(unsigned char NumLED) /*显示函数*/{ unsigned char code SegCode[16]={63,6,91,79,102,109,125,7,127,111,0}; /*0~9、显黑共阴极段码*/ unsigned char i;BitCtrO=1; /*指向显示器末位*/for (i=0;i<NumLED;i++){ KeyISegCodeO=SegCode[DispBuf[i]]; /*显示当前位*/delay(5); /*延时约4ms(fosc=12MHz)*/BitCtrO=BitCtrO<<1; /*指向前一位*/}}main(){ unsigned char KeyV alue,i;while(1){ KeyV alue=KeyBoardScan(); /*扫描键盘获得键值*/if (KeyV alue!=0){ /*显示缓冲区刷新*/for (i=5;i>0;i--)DispBuf[i]=DispBuf[i-1];DispBuf[0]=KeyV alue;}display(6); /*显示(6位)*/}}TEST4-2.1.C#include <reg51.h>#include <intrins.h>#define KeyROCISegCodeO P1 /*定义键盘行输出列输入/段码输出口*/#define BitCtrO P2 /*定义动态LED显示器位控码输出口*/#define NumRow 3 /*定义键盘行数为3*/#define NumColumn 4 /*定义键盘列数为4*/unsigned char DispBuf[6]={10,10,10,10,11,1}; /*显示数组,初始化为显示"In "*/unsigned char c_50ms=1; /*50毫秒计数*/void delay(unsigned char time) /*延时函数*/{ unsigned char i,j;for (i=0;i<time;i++)for (j=0;j<255;j++);}unsigned char KeyBoardScan() /*键盘扫描函数*/{ unsigned char row=NumRow,RowCode,column=NumColumn,ColumnState; /*行循环、行码、列循环、列状态*/BitCtrO=0; /*关闭显示*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*有键按下*/delay(12); /*消抖延时约10ms(fosc=12MHz)*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*确实有键按下,寻找是哪个键*/RowCode=0xfe; /*指向第1行*/for(row=0;row<NumRow;row++) /*扫描共NumRow行*/{ KeyROCISegCodeO=RowCode; /*当前行*/ColumnState=KeyROCISegCodeO|0x0f; /*获取列状态*/for(column=0;column<NumColumn;column++) /*查询共NumColumn列的状态*/if ((ColumnState|0x7f)==0x7f){ while ((KeyROCISegCodeO|0x0f)!=0xff); /*等待键释放*/return(row*NumColumn+column); /*返回键值*/}elseColumnState=_crol_(ColumnState,1); /*指向下一列*/RowCode=_crol_(RowCode,1); /*指向下一行*/}}}return(NumRow*NumColumn); /*返回无键值*/}void display(unsigned char NumLED) /*显示函数*/{ unsigned char code SegCode[12]={63,6,91,79,102,109,125,7,127,111,0,84}; /*0~9、黑、n共阴极段码*/ unsigned char i;BitCtrO=1; /*指向显示器末位*/for (i=0;i<NumLED;i++){ KeyROCISegCodeO=SegCode[DispBuf[i]]; /*显示当前位*/delay(6); /*延时约5ms(fosc=12MHz)*/BitCtrO=BitCtrO<<1; /*指向前一位*/}}main(){ unsigned char i,KeyV alue,lock=0; /*循环,键值,键联锁:0:"停止"键有效、1:数字键有效、2:"开始"键有效*/TMOD=1; /*定时计数器0定时、方式1*/TH0=(65536-50000)/256; /*定时计数器0定时50ms*/TL0=(65536-50000)%256;ET0=1; /*开定时计数器0中断*/EA=1; /*开总中断*/while(1){ KeyV alue=KeyBoardScan(); /*扫描键盘获得键值*/switch (KeyV alue) /*键处理*/{ case 12: break; /*无键按下不处理*/case 11: { if (lock==0){ /*"停止键"有效及处理*/TR0=0; /*关闭T0*/DispBuf[5]=1; /*左边第1个数码管显"I"*/DispBuf[4]=11; /*左边第2个数码管显"n"*/for (i=0;i<4;i++) DispBuf[i]=10; /*后面4个数码管显黑*/lock=1; /*数字键有效*/}} break;case 10: { if (lock==2){ /*"开始"键有效及处理*/TR0=1; /*启动T0*/lock=0; /*"停止"键有效*/}} break;default: { if (lock==1){ /*数字键有效及处理*/DispBuf[0]=KeyV alue; /*右边第1个数码管显键入的字符*/for (i=5;i>0;i--) DispBuf[i]=10; /*其余5个显黑*/lock=2; /*"开始"键有效*/}}}display(6); /*数码管(6个)显示*/}}/**********定时计数器0中断处理程序*********/TC0() interrupt 1 using 1{ unsigned char temp,i;TH0=(65536-50000)/256; /*定时计数器0重新定时50ms*/TL0=(65536-50000)%256;if (c_50ms++>10){ /*0.5s后使键入字符左环移1位*/c_50ms=1;temp=DispBuf[5];for (i=5;i>0;i--) DispBuf[i]=DispBuf[i-1];DispBuf[0]=temp;}}TEST4-2.2.C#include <reg51.h>#include <intrins.h>#define KeyROCISegCodeO P1 /*定义键盘行输出列输入/段码输出口*/#define BitCtrO P2 /*定义动态LED显示器位控码输出口*/#define NumRow 3 /*定义键盘行数为3*/#define NumColumn 4 /*定义键盘列数为4*/unsigned char DispBuf[6]={10,10,13,12,12,9}; /*显示数组,初始化为显示"good "*/unsigned long total; /*T0溢出计数*/void delay(unsigned char time) /*延时函数*/{ unsigned char i,j;for (i=0;i<time;i++)for (j=0;j<255;j++);}void delaytest(unsigned int time) /*延时函数*/{ unsigned int i,j;for (i=0;i<time;i++)for (j=0;j<65535;j++);}unsigned char KeyBoardScan() /*键盘扫描函数*/{ unsigned char row=NumRow,RowCode,column=NumColumn,ColumnState; /*行循环、行码、列循环、列状态*/BitCtrO=0; /*关闭显示*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*有键按下*/delay(12); /*消抖延时约10ms(fosc=12MHz)*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*确实有键按下,寻找是哪个键*/RowCode=0xfe; /*指向第1行*/for(row=0;row<NumRow;row++) /*扫描共NumRow行*/{ KeyROCISegCodeO=RowCode; /*当前行*/ColumnState=KeyROCISegCodeO|0x0f; /*获取列状态*/for(column=0;column<NumColumn;column++) /*查询共NumColumn列的状态*/if ((ColumnState|0x7f)==0x7f){ while ((KeyROCISegCodeO|0x0f)!=0xff); /*等待键释放*/return(row*NumColumn+column); /*返回键值*/ }elseColumnState=_crol_(ColumnState,1); /*指向下一列*/RowCode=_crol_(RowCode,1); /*指向下一行*/ }}}return(NumRow*NumColumn); /*返回无键值*/}void display(unsigned char NumLED) /*显示函数*/{ unsigned char code SegCode[18]={63,6,91,79,102,109,125,7,127,111,0,84,92,94,115,119,80,121}; /*0~9、黑、n、o、d、P、A、r、E共阴极段码*/unsigned char i;BitCtrO=1; /*指向显示器末位*/for (i=0;i<NumLED;i++){ KeyROCISegCodeO=SegCode[DispBuf[i]]; /*显示当前位*/delay(6); /*延时约5ms(fosc=12MHz)*/BitCtrO=BitCtrO<<1; /*指向前一位*/ }}void error(){ DispBuf[5]=17; /*显"E"*/DispBuf[4]=16; /*显"r"*/DispBuf[3]=16; /*显"r"*/DispBuf[2]=12; /*显"o"*/DispBuf[1]=16; /*显"r"*/DispBuf[0]=10; /*显黑*/}main(){ unsigned char temp,NumBit,i,KeyV alue; /*临时、数字位数,循环,键值*/ unsigned long result; /*实参值/测量结果*/bit lock=0 ; /*键联锁:0:"测量"键有效、1:数字键/"确认"键有效*/ TMOD=1; /*定时T0定时方式1*/TH0=0;TL0=0;ET0=1; /*开T0中断*/EA=1; /*开总中断*/while(1){ KeyV alue=KeyBoardScan(); /*扫描键盘获得键值*/switch (KeyV alue) /*键处理*/{ case 12: break; /*无键按下不处理*/case 11: { if (lock==0){ /*"测量键"有效及处理*/DispBuf[5]=1; /*显"I"*/DispBuf[4]=11; /*显"n"*/DispBuf[3]=14; /*显"P"*/DispBuf[2]=15; /*显"A"*/DispBuf[1]=16; /*显"r"*/DispBuf[0]=15; /*显"A"*/NumBit=0; /*无数字输入*/lock=1; /*数字/"确认"键有效*/}} break;case 10: { if (lock){ /*"确认"键有效及处理*/if (NumBit>0) /*限定必须输入至少1位实参值*/{ /*获得有效数字位*/for (i=4;i>0;i--)if (DispBuf[i]==10) DispBuf[i]=0;else break;result=10000*DispBuf[4]+1000*DispBuf[3]+100*DispBuf[2]+10*DispBuf[1]+DispBuf[0]; /*获得实参值*/if (result<65536&&result!=0){ total=0; /*T0溢出计数初值0*/TR0=1; /*启动T0*/delaytest((unsigned int)result);TR0=0; /*关闭T0*/result=(total*65536+TH0+TL0)/1000; /*获得ms为单位的测量结果*/if (result<1000000){ /*显示测量结果*/for (i=0;i<6;i++) /*获得测量结果数字位*/{ DispBuf[i]=result%10;result/=10;}for (i=5;i>0;i--) /*去掉测量结果数字位无效0*/if (DispBuf[i]==0)DispBuf[i]=10 ;else break;}elseerror(); /*结果超出显示范围,提示出错*/}elseerror(); /*实参为0或超出65535,提示出错*/}elseerror(); /*实参为0,提示出错*/lock=0; /*"测量"键有效*/}} break;default: { if (lock){ /*数字键有效及处理*/if (NumBit++<5) /*限定只能输入1~5位实参值*/{ if(NumBit!=1){ /*数字位左移*/temp=DispBuf[5];for (i=5;i>0;i--) DispBuf[i]=DispBuf[i-1];DispBuf[0]=temp;DispBuf[0]=KeyV alue;}else{ if (KeyV alue==0){ /*第1位数字为0,提示出错*/error();lock=0; /*"测量"键有效*/}else{ for (i=5;i>0;i--) DispBuf[i]=10;DispBuf[0]=KeyV alue;}}}else{ error();lock=0; /*"测量"键有效*/}}}}display(6); /*数码管(6个)显示*/}}/*******T0中断处理程序*******/TC0() interrupt 1 using 1{ total++;}。
4-键盘、数码管显示综合实验
单片机原理及应用实验报告
实验项目名称:键盘、数码管显示综合实验
实验日期:2012年12月3日实验成绩:
实验评定标准:
1)实验结果是否正确A()B()C()2)实验结果分析A()B()C()3)实验报告是否按照规定格式A()B()C()
一、实验目的
通过实验,掌握单片机在输入输出口线不够用时,怎样扩展接口的方法来支持8位LED显示和16位键盘集成实现。
熟悉8155、8279等芯片的性能,掌握其编程方法。
掌握键盘子程序调试方法,掌握按一个键值显示出来的编程方法,这是诊断硬件、测试硬件、产品开发、软件编程必须掌握的方法。
二、实验器材
Proteus 软件一套PC一台kile uVsion2.0软件
三、实验内容
(1)编写并调试出一个键盘实验子程序;
(2)用子程序调试方法,分别调用键盘子程序和显示子程序,将按一个键的键值(0-F)在数码管上显示出来;
四、实验结果
(1)在不按键时,运行proteus软件仿真,得到如下图片,是一串字符,显示为012345。
(2)在按键时,数码管按按键显示。
如下图所示:
五、实验结果分析
本实验通过8155芯片的扩展功能,建立描述线与数据线同步功能,加上16个按键,而且按键和位选口选用PB口,同时此处为了节省接口线,直接将显
示输出和扫描输出何用PA口。
按键显示时,分别对应显示0-F。
键盘及LED显示实验
实验三键盘及LED显示实验一、实验内容利用8255可编程并行接口控制键盘及显示器,当有按键按下时向单片机发送外部中断请求(INTO, INT1),单片机扫描键盘,并把按键输入的键码一位LED 显示器显示出来。
二、实验目的及要求(一)实验目的通过该综合性实验,使学生掌握8255扩展键盘和显示器的接口方法及C51 语言的编程方法,进一步掌握键盘扫描和LED显示器的工作原理;培养学生一定的动手能力。
(二)实验要求1.学生在实验课前必须认真预习教科书与指导书中的相关内容,绘制流程图,编写C51语言源程序,为实验做好充分准备。
2.该实验要求学生综合利用前期课程及本门课程中所学的相关知识点,充分发挥自己的个性及创造力,独立操作完成实验内容,并写出实验报告。
三、实验条件及要求计算机,C51语言编辑、调试仿真软件及实验箱50台套。
四、实验相关知识点1. C51编程、调试。
2 .扩展8255芯片的原理及应用。
3.键盘扫描原理及应用。
4.LED显示器原理及应用。
5.外部中断的应用。
五、实验说明本实验仪提供了8位8段LED显示器,学生可选用任一位LED显示器,只要六、实验原理图8255七、连线说明F4 区: CS 、A0、A1A3 区: CS1、A0、A1 B6 区:JP56 (PA 口)F4 区:JP41(C)B6 区:JP53 (PB 口)F4 区:JP42(B) B6 区:JP52 (PC 口)F4 区:JP47(A)A3 区:JP51F4 区:JP92(D) A3 区:P1.6、P1.7A3 区:INT0、INT1注:F4的D 无法与INT0(P3.2)、INT1(P3.3)直接连接,所以使用P1 口桥接。
八、实验参考流程图 1 .主程序流程图DS30LG4041AH123 B 45 6 78SEGB (8255 PB6) / SEGC (8255 PB5)4 SEGD (8255 PB4) —2 SEGE (8255 PB3)—1 SEGA (8255 PB7) 11 SEGH (8255 PB0) JP42 ab ac 口:口gdpdPGND42af「g ]b 口dpGND3am p GND28 adpGND16DS29LG4041AHSEGH 3SEGA 11 SE( SEGC 4 SEGD 2 SEGE 1a b c d e f g dpadd c paGND3aGND2adpGND1GND46 JP41(PA7)(8255 PA6)(8255 PA5) (8255 PA4) (8255 PA3) (8255 PA2) (8255PA1)(8255 PA0)123 ;c6VCC R162 5.1KVCC |R1635.1KU36 DO 34D1 33 D2 32D3 31D4 30D5 29D6 28D7 27 RD 5WR 36 D0 PA0 D1 PA1 D2 PA2 D3 PA3 D4 PA4 D5 PA5 D6 PA6 D7 PA7 RD PB0 WR PB1 A0 PB2 A1 PB3 RESET PB4 CSPB5 PB6 PB7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC74 PA0 3PA1 2PA21PA3 40 ~PA4~ 39 PA5 38 PA6 37 PA7 18 PB019 PB1 20 PB2 21PB3PB4 23 PB5 24 PB6 25 PB714 严 PC015 PC1 16 PC2 '17 PC3 13 PC4 ' 12 PC5 ' 11 PC6 10PC71 2 3 4 5 6 7 8 1 2 3 4 5 6 7 81 2 34 5 6 7 8 JP56JP53JP526 —— 7A ■B ■C ■D —E ■(8255 PC7) (8255 PC6) (8255 PC5) (8255_PC4)_ (8255 PC3) (8255 PC2) (8255 PC1) (8255 PC0)-JP92 1 2 3 5D6 7 8-JP47 1 2 35A6 7 8开始■-0- >按键标志8255初始化(PA, PB, PC 口作输出)0- >8255PC 口定时器0:方式一允许定时器0中断允许外部中断0 (行线0)允许外部中断1 (行线1)外部中断0、1边沿触发允许中断按键标志=11Y /2 •外中断服务程序流程图夕卜部中断0外部中断1■:开始.:■v8255PC 口改为输入关外部中断10->P3.3 (键的行线1)读8255PC 口转化为8..F的键值-> 变量01 !8255的PC 口改为输出1->P3.30->8255PC 口------- N—〈有键按下〉设置定时器0初值(50ms定时)开定时器0键值变量=变量01清外部中断1允许外部中断13. LED 显示程序流程图九、C51语言参考源程序#in elude "reg52.h" un sig ned char KeyResult; un sig ned char buffer[8]; bit bKey;xdata un sig ned char P_8255 _at_ 0xf003; xdata un sig ned char PA_8255 _at_ OxfOOO; xdata un sig ned char PB_8255 _at_ OxfOOl; xdata un sig ned char PC_8255 _at_ 0xf002; code un sig ned char SEG_TAB[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x0};sbit bLi ne0 = P3A 2; sbit bLi ne1 =卩3人3; II 延时1ms void Delay1ms() {un sig ned char i;■'返回II8255 的控制口II8255 的 PA 口II8255 的 PB 口 II8255 的 PC 口 II 段码II 存放键值//显示缓冲区 II 是否有键按下i = 0;while (--i);}// 显示void Display(){unsigned char i = 0x7f; unsignedchar 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;P_8255 = 0x89; bLine0 = 0; // 关外部中断0 //PC 口输入//P3.2 作行输出while (i){if ((PC_8255 & i) == 0)break;KeyResult0++;i >>= 1;}P_8255 = 0x80;PC_8255 = 0;//8255 的PA、PC 口全作输出口IE1 = 0; EX1 = 1; }bLine0 = 1; if (i){TH0 = 60; TL0 = 176; TR0 = 1;KeyResult = KeyResult0;}// 定时中断计数器初值 // 定时 50msIE0 = 0; EX0 =1; } // 清除中断 // 开外部中断 0void Int1Int() interrupt 2 { unsigned char i = 0x80; unsigned char KeyResult0 = 8; EX1 = 0; P_8255 = 0x89; bLine1 = 0; // 关外部中断 0 //PC 口输入 //P3.2 作行输出while (i) { if ((PC_8255 & i) == 0) break;KeyResult0++; i >>= 1;}P_8255 = 0x80;PC_8255 = 0; bLine1 = 1;〃8255 的PA PB PC 口全作输出口if (i){TH0 60;TL0 = 176;TR0 1;}KeyResult = KeyResult0;// 定时中断计数器初值 // 定时 50ms// 清除中断 // 开外部中断 0//50ms 中断服务程序void INT_Timer0(void) interrupt 1{if (((KeyResult < 8) && !bLine0) || ((KeyResult >= 8) && !bLine1)){bKey = 1;}TR0 = 0;}void main(){char i;for (i = 0; i < 8; i++) buffer[i] = 0x10; // TR0 = 1; // bRefurbish = 1;while (1){if (bKey){bKey = 0;RefurbishData(); } Display();}}十、实验实施步骤1 .仔细阅读实验内容及要求,编写 C51 源程序。
键盘、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 引脚锁定方法五、实验感想。
按键控制液晶显示实验
贵州大学实验报告学院:电气工程学院专业:测控技术与仪器班级:测仪101delay(5);lcde=O;delay(5);lcde=1;}void write_data(uchar date){lcdrs=1;lcdrw=0;P0=date;delay(5);lcde=0;delay(5);lcde=1;lcdrs=0;}void in(){lcde=0;write_com(0x01);write_com(0x38);write_com(0x0f);write_com(0x06);}void keysca n1(){if(ze ngjia==O){delay(10);if(ze ngjia==O){if(k==1){a++;if(a==10)a=0;write_com(OxcO);dela y(5) ;write_data(0x30+a);}if(k==2){b++;if(b==1O);b=O;write_com(0xc2);delay(5);write_data(0x30+b); }if(k==3){c++;if(c==10);c=0;write_com(0xc3);dela y(5) ;write_data(0x30+c);}while(!ze ngjia);}}if(jia nshao==0){delay(10);if(jia nshao==0){if(k==1){if(a==0)a=10;a--;write_com(OxcO);dela y(5) ;write_data(0x30+a);}if(k==2){if(b==0)b=10;b--;write_com(0xc2);delay (5) ;write_data(0x30+b);}if(k==3){if(c==0)c=10;c--; write_com(0xc3);delay(5);write_data(0x30+c);}while(!jia nshao);}}if(qued in g==0){delay(10);if(qued in g==0){write_com(0xc4); while(!quedi ng);}}}void keysca n(){if(shezhi==0){delay(10);if(shezhi==O){k++;if(k==4)k=1;if(k==1)write_com(OxcO); delay(500);if(k==2) write_com(0xc2); delay(500);if(k==3) write_com(0xc3); delay(500);}}}void mai n(){in ();write_com(OxcO);for(nu m仁0;nu m1< 4;nu m1++) {write_data(table1[ nu m1]); delay(5);}do{keysca n();delay(5);keysca n1();delay(5);}while(1);}思考:如何用软件消除键盘的机械抖动?答:用延时来消除键盘抖动,如: if(shezhi==O){delay(10); if(shezhi==0)通过本实验,不仅让我更好的了解了所学知识,更多的还提高了我对测控系统一 些相关东西的兴趣,通过实验与理论的集合,让我认识到, 许多高科技的东西, 它的原理原来是这么的有趣!签名:年 月 日LCD1LM016L实 验数据 及 结果4-GND「XTAL1P0.0/AD0 P0.1/AD1 P0.2/AD2 XTAL2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 RST P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 PSEN P2.3/A11 ALE P2.4/A12 EA P2.5/A13 P2.6/A14 P2.7/A15 P1 0/T2 P3 0/RXD P1.1/T2EX P3.1/TXD P1.2 P3.2/INTCT P1.3 P3.3/INT1P1 4 P3 4/T0 P1.5 P3.5/T1 P1 6P3 6AWR P1.7P3.7/RD2 3RP1确定I ----- i实 验 总结 指 导 教 师 意U1C31nF29‘吉X1------ 1 CRYSTALAT89C52VCCGNDRESH A CK -8设置I —2增加 I —■ ■16 减少I:8'。
按键控制实验报告
键控计数值显示一、实验目的(1)熟悉Nios II系统构建,并选择简单、合适的系统(2)学习按键中断的控制方法(3)用HDL文本输入方法建立顶层模块、flash编程(4)能够自行改写程序二、实验设备与器件Quartus II 软件、EP4CE115F29实验箱三、实验方案设计实验可实现的功能本实验要求实时显示计数器输出的0~7F计数值,显示终端为八位LED、七段数码管和LCD显示器。
由KEY1~KEY3三个按键选择显示器件。
长按KEY1键时,只在八位LED上进行显示;长按KEY2键时,只在LCD显示器上进行显示;长按KEY3键时,只在七段数码管上进行显示;无键按下时则不显示, 但计数功能保持;KEY0按下时清零。
硬件系统(HDL文本)//=================================================== ====// This code is generated by Terasic System Builder//=================================================== ====module Test_1(//////// CLOCK //////////CLOCK_50,//////// LED //////////LEDG,//////// KEY //////////KEY,CLR,////////COUNT////////////COUNT,//////// SEG7 //////////HEX0,HEX1,//////// LCD ////////// LCD_BLON,LCD_DATA,LCD_EN,LCD_ON,LCD_RS,LCD_RW,//////// SDRAM ////////// DRAM_ADDR, DRAM_BA,DRAM_CAS_N, DRAM_CKE, DRAM_CLK, DRAM_CS_N, DRAM_DQ,DRAM_DQM, DRAM_RAS_N, DRAM_WE_N,//////// Flash //////////FL_ADDR,FL_CE_N,FL_DQ,FL_OE_N,FL_RST_N,FL_RY,FL_WE_N,FL_WP_N,);//=================================================== ====// PARAMETER declarations//=================================================== ====//=================================================== ====// PORT declarations//=======================================================//////////// CLOCK //////////input CLOCK_50;//////////// LED //////////output [7:0] LEDG;//////////// KEY //////////input [2:0] KEY;input CLR;////////////COUNT/////////////input [7:0] COUNT//////////// SEG7 //////////output [6:0] HEX0;output [6:0] HEX1;//////////// LCD //////////output LCD_BLON; inout [7:0] LCD_DATA;output LCD_ON; output LCD_RS; output LCD_RW;//////////// SDRAM //////////output [12:0] DRAM_ADDR; output [1:0] DRAM_BA; output DRAM_CAS_N; output DRAM_CKE; output DRAM_CLK; output DRAM_CS_N; inout [31:0] DRAM_DQ; output [3:0] DRAM_DQM; output DRAM_RAS_N; output DRAM_WE_N;//////////// Flash //////////output [22:0] FL_ADDR;output FL_CE_N; inout [7:0] FL_DQ; output FL_OE_N;input FL_RY;output FL_WE_N;output FL_WP_N;//=================================================== ====// REG/WIRE declarations//=================================================== ====//////// 7-SEG ////////////////wire[2:0] norkey;wire[7:0] count_in;wire[7:0] data;//=================================================== ====// Structural coding//=======================================================wire reset_n;assign reset_n = 1'b1;kernel kernel_inst(// 1) global signals:.clk_50(CLOCK_50),.reset_n(reset_n),.sdram_clk(DRAM_CLK),.sys_clk(clk_sys), ///////////////////////// the_key.in_port_to_the_key(~KEY),//the_count.in_port_to_the_count(count_in[7:0]),// the_lcd.LCD_E_from_the_lcd(LCD_EN),.LCD_RS_from_the_lcd(LCD_RS),.LCD_RW_from_the_lcd(LCD_RW),.LCD_data_to_and_from_the_lcd(LCD_DA TA),// the_led.out_port_from_the_led(LEDG),// the_sdram.zs_addr_from_the_sdram(DRAM_ADDR),.zs_ba_from_the_sdram(DRAM_BA),.zs_cas_n_from_the_sdram(DRAM_CAS_N ),.zs_cke_from_the_sdram(DRAM_CKE),.zs_cs_n_from_the_sdram(DRAM_CS_N),.zs_dq_to_and_from_the_sdram(DRAM_D Q),.zs_dqm_from_the_sdram(DRAM_DQM),.zs_ras_n_from_the_sdram(DRAM_RAS_N ),.zs_we_n_from_the_sdram(DRAM_WE_N),// the_seg7.out_port_from_the_seg7(data),.out_port_from_the_en_seg(en),// the_tri_state_bridge_flash_avalon_slave.address_to_the_cfi_flash(FL_ADDR),.read_n_to_the_cfi_flash(FL_OE_N),.select_n_to_the_cfi_flash(FL_CE_N),.tri_state_bridge_data(FL_DQ),.write_n_to_the_cfi_flash(FL_WE_N),);clk_div clk_div(.clkin(clk_sys),.clk_1KHz(clk_1KHz),.clk_1Hz(clk_1Hz));mydecoder_7seg yima(.clk(clk_1KHz),.segmenth(HEX1),.segmentl(HEX0),.data(data),.en(en));// .lowdata(data[3:0])); counter couter(.clk(clk_1Hz),.clr(CLR),//anjian qingling.count(count_in[7:0]));// Flash Configassign FL_RST_N = reset_n;assign FL_WP_N = 1'b1;///////////////////////////////////////////// LCD configassign LCD_BLON = 0; // not supportedassign LCD_ON = 1'b1; // alwasy onendmodule系统框图实验程序#include"count.h" //关于LCD的相关定义,控制LCD 的输出格式#include <unistd.h>#include <stdio.h>#include"system.h"#include"altera_avalon_pio_regs.h"#include"alt_types.h"#include"sys/alt_irq.h"volatile int a=0;volatile char b;unsigned char count1,count2,count3;static void KeyDown_interrupts(void* context,alt_32 id) //中断函数{IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE,0);//响应中断后,将中断响应位复位;b=IORD_ALTERA_AVALON_PIO_DATA(KEY_BASE); //读取中断响应值switch(b){case 0x1: //七段数码管显示IOWR_ALTERA_AVALON_PIO_DATA(EN_SEG_BASE,1);//IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x00);count1=IORD_ALTERA_AVALON_PIO_DATA(COUNT_BASE);IOWR_ALTERA_AVALON_PIO_DATA(SEG7_BASE,count1);break;case 0x2: //LCD显示count2=IORD_ALTERA_AVALON_PIO_DATA(COUNT_BASE); printf("%02x", count2);//直接用标准输出函数表示break;case 0x4://LED灯显示IOWR_ALTERA_AVALON_PIO_DATA(EN_SEG_BASE,0);count3=IORD_ALTERA_AVALON_PIO_DATA(COUNT_BASE);IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,count3);break;default: //无按键时,正常计数,但无显示break;}}void InitPIO(void)//中断初始化{IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE,0x7);//开中断,允许后三位开中断IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE,0x0);//中断响应后复位,防止中断一直响应。
SOPC按键控制LED灯亮灭实验报告
课程设计报告设计课题:SOPC按键控制LED灯亮灭按键控制LED灯泡亮灭一、设计任务与要求1.实现按键控制小灯泡的亮灭;2.学习并掌握Quartus II 9.0软件3.学会SOPC和FPGA电路设计方法二、方案设计与论证在Quartus II 9.0软件里利用Nios II完成对软核CPU的设计,设计完成后再搭建外围电路,后在Nios II IDE里完成代码的编写,最后将设计的电路和编写的代码下片后观察实验现象并调试直至成功。
方案一:1.新建一个New Quartus II Project,并命名为led_lab2.选择Cyclone III系列的EP3C25F324C8芯片3.CPU内核的设计:3.1新建一个SOPC Builder System,并命名为lab_led3.2将所要设计的CPU模块添加进来,并选择Nios II/e核心3.3再添加jtag和on-chip memory,并将内存设置为20KB3.4添加两个PIO(并行输入输出),将其中一个设置为Output ports only,并命名为led_pio,用作输出模块,另一个设置为Input ports only,并命名为key_pio,用作输入模块3.5保存好设计编译后无误4.外围电路的设计4.1新建一个Block Diagram/Schematic File文件,并命名为led_lab4.2将上一步设计好的CPU模块添加进来4.3自动生成好管脚后进行编译4.4对输入输出管脚进行分配,完成后再次进行编译5.Nios II代码控制CPU5.1点击Nios II IDE,新建一个lab_led.c文件5.2编写能够实现按键控制LED灯的代码,后编译、调试6.打开SOPC实验箱,将设计好的电路和编写好的代码下片,观察实验现象并调试四、总原理图及子模块结构图1.CPU内核的设计2.外围电路的搭建3.电路管脚的分配4.实验代码的编写及调试五、综合与调试最终实验代码:#include "sys/alt_stdio.h"#include "system.h"#include "altera_avalon_pio_regs.h"#include "alt_types.h"#include<unistd.h>alt_u8 K;int main(void){alt_putstr("\n Lab2_2 - LED key polling!\n");while(1){K= IORD_ALTERA_A VALON_PIO_DATA(KEY_PIO_BASE);IOWR_ALTERA_A VALON_PIO_DA TA(LED_PIO_BASE,K); usleep(10000);}return 0;}六、结果性能分析当按下KEY1后第一个LED点亮,松开后第一个LED熄灭当按下KEY2后第二个LED点亮,松开后第二个LED熄灭当按下KEY3后第三个LED点亮,松开后第三个LED熄灭当按下KEY4后第四个LED点亮,松开后第四个LED熄灭七、设计作品图片[八、结论与心得]因为有了前两次实验的经验和教训,所以这次实验并没有遇到多少障碍。
基于DSP芯片的键盘控制LCD显示
****大学***********学院《课程设计报告》题目:基于DSP芯片的键盘控制LCD显示专业:通信工程班级:一班姓名: *******学号: ************指导教师: ******年月日信息与电气工程学院课程设计任务书20 15 —20 16 学年第一学期专业:学号:姓名:课程设计名称: DSP原理与应用设计题目:基于DSP芯片的键盘控制LCD显示完成期限:自 2015 年 12 月 21 日至 2015 年 12 月 25 日共 1 周设计依据、要求及主要内容(可另加附页):一、设计依据通过4 * 4的行列式键盘,TMS320F2407的8个I / O口与之相连,用扫描法来进行按键识别。
使行线一直处于高电平,在某一时刻只让一条列线处于低电平,而其余列线处于高电平。
那么按下键的那列电平就会拉成低电平,判断出哪列为低电平就可以判断出按键号码。
二、设计要求1.要求正确掌握CCS2000的安装和调试方法,以及DSP实验箱下载调试的步骤;2.要求正确掌握键盘信号的输入和DSP I/O的使用;3.要求键盘信号之间的时序能正确识别和引入。
三、主要内容1.根据行列式键盘的特点,进行键盘控制系统的整体研究与设计;2.熟练掌握CCS2000软件的使用,并能够按要求对设计的电路进行仿真,实现相应的功能;3.LCD液晶显示屏实时显示按键的信息;4.采用软件编程的方法实现按键信息的提取和显示。
指导教师(签字):批准日期:年月日摘要随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,式设施现代化的基础,也是人类通往科技巅峰的直通路。
电子行业的发展从长远来看很重要,但最主要的还是科技问题。
行列式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。
是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。
行列式键盘乃是当今使用最为广泛的键盘模式之一,该系统以8个端口连接控制4*4个按键,即时在LCD数码管上。
实验四 键盘和LED,LCD实验
实验四键盘和LED,LCD实验一实验目的了解数码管、lcd显示基本原理掌握数码管、lcd编程方法掌握键盘扫描程序的编写二实验内容1 数码管的驱动元件清单实验电路:参考程序:2LCD的驱动实验电路:汇编参考程序:(仅包含液晶驱动函数库)#include "intrins.h" //引用其nop()函数//端口定义sbit LcdRs = P2^0;sbit LcdRw = P2^1;sbit LcdEn = P2^2;sbit Lcdbf = P0^7; //LCD忙标志Busy Flagsfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//延时void delay(unsigned char t){ unsigned char i,j;for(i=0;i<t;i++)for(j=0;j<100;j++);}//读忙状态void LCD_Wait(void){LcdRs=0;LcdRw=1;LcdEn=1; _nop_();while(Lcdbf){LcdEn=0; _nop_();LcdEn=1; _nop_();}LcdEn=0;}//写数据0/命令1void LCD_Write(bit style, unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input; _nop_();//注意顺序LcdEn=1; _nop_();//注意顺序LcdEn=0; _nop_();LCD_Wait();}//初始化LCDvoid LCD_Initial(){LcdEn=0;LCD_Write(0,0x38); delay(15); //8位数据端口,2行显示,5*7点阵LCD_Write(0,0x0c); //显示模式LCD_Write(0,0x01); //清屏LCD_Write(0,0x05); //输入模式LCD_Write(0,0x1c); //输入模式}//移动光标到指定位置void GotoXY(unsigned char x, unsigned char y){if(y==0) LCD_Write(0,0x80|x);if(y==1) LCD_Write(0,0xc0|x);}//输出字符串void Print(unsigned char *str){while(*str!='\0')LCD_Write(1,*str++);}3键盘扫描实验电路:参考程序:(仅包含键盘扫描程序和10ms 中断服务程序) unsigned char keyscan(void){P1=0x0f;if((P1&0x0f)!=0x0f){P1=0xef;switch(P1&0x0f){case 0x0e:return('*');case 0x0d:return(7);case 0x0b:return(4);case 0x07:return(1);default: break;}P1=0xdf;switch(P1&0x0f){case 0x0e:return(0);case 0x0d:return(8);case 0x0b:return(5);case 0x07:return(2);default: break;}P1=0xbf;switch(P1&0x0f){case 0x0e:return('#');case 0x0d:return(9);case 0x0b:return(6);case 0x07:return(3);default: break;}while((P1&0x0f)!=0x0f); //等待释放}else return(key);}void timer0(void) interrupt 1 //定时器0方式1,10ms中断一次{TH0=(65536-10000)/256; //10msTL0=(65536-10000)%256;key=keyscan();}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验3 SOPC的键盘与LCD显示控制实验
【实验目的】
1.熟悉矩阵键盘的工作特性。
2.学会使用VHDL语言描述一个矩阵键盘的电路功能。
3.了解字符型液晶显示控制器。
4.掌握1602液晶的操作方法。
5.学会使用VHDL语言描述一个1602液晶控制的电路功能。
【实验内容】
1.使用VHDL语言描述一个矩阵键盘的电路功能,程序实现的功能是测试
4X4矩阵按键;具体的键值通过FPGA核心板上的数码管来显示。
如按下K1,数码管就显示0,按下K16,数码管就显示F。
2.使用VHDL语言描述一个1602液晶显示屏控制的电路功能,使1602液
晶屏可以显示你自己的名字(拼音)。
【实验器材】
1. HS-EDA5.1实验箱
2.USB-BLASTER烧写器
3. Quartus II 8.0
【实验原理】
本实验需要使用VHDL语言描述一个矩阵键盘以及1602液晶控制的电路功能,下面我们先来介绍一下矩阵键盘和1602液晶显示屏。
1.矩阵键盘:键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用
的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机
键盘.而靠软件编程来识别的称为非编码键盘;在一般常用系统中,用的最多的是非编码键盘。
也有用到编码键盘的。
非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。
矩阵键盘结构图如上图
矩阵键盘的读取都经历一个扫描的过程,程序先将L1输出低电平,,即端口输入11111110,
即十六进制0FEH,然后读回端口的数据,此时如果 L1 上的四个按键没有按下,读到的P0 口的数据还是11111110,如按下了按键 8,H2 便被拉成低电平,读回的端口数据11011110(十六进制:0DEH),程序就根据读回的数据来判断某个按键按下了,如果没有按键按下,则再将 L2 输出低电平(P0=11111101,十六进制:0FDH),然后也一样读回端口数据,判断有按键按下否,如此下去,到 L4 的完成,为一个扫描过程。
刚才按键 8 按下读回的数值是 0DEH,如果做为简单的程序,可以直接用0DEH 来认定是8 键的键值码,也可以认为它是一个无名键的键值码,所以上面写的 8 不是特定的,而只是序号,你怎么排列键序都可以,甚至认为是游戏手柄的上下左右出拳踢腿键都没问题,问题是按下某下按键后,你知道读回的键值是多少就可以了,键值才有用。
2.1602液晶显示屏:工业字符型液晶,能够同时显示16x02即32个字符,每个字符是5X7的点阵。
1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H
中的点阵字符图形显示出来,我们就能看到字母“A”。
因为1602识别的是ASCII码,实验可以用ASCII码直接赋值。
管脚说明如下图
时序图
地址映射图
主要时序结构如下图:
【实验步骤】
1.打开Quartus II 软件,建立一个key44的工程.。
并将keyboarddeco.v
和led_disp的文件加入到工程中,并新建一个Block Diagram的文件。
(软件代码过长,程序附在主机上)
2.在Project Navigator框中选择file栏,右键点击keyboarddeco.v
选择create symbol files for current file生成symbol,也对
led_disp.vhdl生成symbol,生成以后我们就能在图形界面编程时就能选择我们自定义的接口程序。
如图:
3.在图形编程中编译如下:
(图中的管脚标注是定义pins后编译在图中生成)
4.点击processing/start compilation编译文件。
定义管脚如下:
5.点击processing/start compilation编译生成文件,下载至FPGA,
具体的键值就能通过板上的数码管来显示。
按下K1就显示0,K2就显示1。
6.建立一个新的工程,并将div_256.v,div16.v ,ps2_keyboard.v和
lcd.v文件加入工程,并create symbol files for current file。
7.建立图形编程界面如下:
8.编译并定义管脚如下图:
9.编译生成文件,下载至FPGA,ps/2键盘输入,稍等可以在lcd1602
上显示输入的字符。
【实验要求】
1.掌握4x4矩阵键盘的扫描方法。
2.掌握1602的操作方式。
3.进一步学习VHDL语言编写程序。
4.完成思考题。
【思考题】
1.分析电路原理图,思考如果要用SOPC板上的ps/2接口,应该如何定义
pins?
2.尝试采用Verilog HDL语言编写程序。
(选做)
3.希望以上资料对你有所帮助,附励志名言3条:
4.1、上帝说:你要什么便取什么,但是要付出相当的代价。
5.2、目标的坚定是性格中最必要的力量源泉之一,也是成功的利器之一。
没有它,天才会在矛盾无定的迷径中徒劳无功。
6.3、当你无法从一楼蹦到三楼时,不要忘记走楼梯。
要记住伟大的成功
往往不是一蹴而就的,必须学会分解你的目标,逐步实施。
7.。