当前位置:文档之家› 根据C51单片机的键盘及LCD显示

根据C51单片机的键盘及LCD显示

基于C51单片机的键盘及LCD显示一、实验目的1.掌握矩阵式键盘的数字键和功能键的编程方法。

2.掌握LCD的接口技术和编程方法。

3.掌握仪器监控程序设计和调试方法。

二、预习与参考1. 结合ST7920 控制器系列中文图形液晶模块有关资料手册,详细了解ST7920接口设计技术。

2. 参考资料1)实验板说明书2)ST7920 控制器系列中文图形液晶模块资料手册三、设计指标利用实验板上提供的键盘电路,LCD显示电路,设计一人机界面,能实现以下功能:1.LCD上显示“重庆科技学院”2.按键至少包括0-9的数字键3.LCD显示按键值4.电子钟显示:时,分,秒(选作)四、实验要求1.以单片机为核心,设计4*4非编码键盘及LCD的硬件电路,画出电路原理图。

2.设计4*4非编码键盘及LCD的控制软件,画出流程图,编写控制程序。

五、实验仪器设备和材料清单单片机实验板、连接导线、ST7920图形液晶模块、PC机;Keil c51软件六、实验设计及实施的指导1.实验课前布置实验任务,提出实验要求,预习相关资料,完成硬件草图设计和软件流程图备查。

2.经指导教师检查,预习达到要求者进入实验室实验。

3.按照设计的电路连线,构建键盘及显示系统,经检查无误方可进入下一步。

4.在指导教师指导下调试LCD显示程序。

5.在指导教师指导下调试按键程序。

6.综合调试直到满足设计要求。

七、实验成绩评定方法实验成绩包括预习、实验完成质量、实验报告质量4部分组成,各部分所占比例分别为30%、30%、40%。

八、实验报告要求1.实验报告格式:一.实验名称二.实验目的三.实验内容四.设计思想五.硬件设计六.程序代码七.参考文献2.硬件电路原理图用PROTEL等软件画出。

附录:程序源代码:附录1#include "reg51.h"#include "intrins.h"#define THCO 0xee#define TLCO 0x0#define uchar unsigned charsbit CS =P1^0;sbit SID=P1^1;sbit SCLK=P1^2;sbit B_light=P2^7; //背光uchar tab[1] ={'0'} ;int flag=0;unsigned char Hour=0,Min=0,Sec=0;void delay(unsigned int j){unsigned char i;do{}while(j--);}void send_command(unsigned char command_data) //发送命令{unsigned char i;unsigned char i_data,temp_data1,temp_data2;i_data=0xf8; //操作命令,控制指令delay(10);CS=1;SCLK=0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0; //送高{SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data; //送低//temp_data1=i_data&0xf0; temp_data2=i_data&0x0f;//temp_data1>>=4;temp_data2<<=4;//i_data=temp_data1|temp_data2; i_data=temp_data2;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;}void send_data(unsigned char command_data) //发送数据{unsigned char i;unsigned char i_data,temp_data1,temp_data2;i_data=0xfa; //操作命令,显示数据delay(10);CS=1;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;//temp_data1=i_data&0xf0;temp_data2=i_data&0x0f;//temp_data1>>=4;temp_data2<<=4;//i_data=temp_data1|temp_data2;i_data= temp_data2;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;}void InitLCD() //液晶初始化{send_command(0x30); //功能设置:一次送8位数据,基本指令集send_command(0x06); //点设定:显示字符/光标从左到右移位,DDRAM地址加1 send_command(0x0c); //显示设定:开显示,显示光标,当前显示位反白闪动send_command(0x04); //显示设定:开显示,显示光标,当前显示位反白闪动send_command(0x01); //清DDRAMsend_command(0x02); //DDRAM地址归位send_command(0x80); //把显示地址设为0X80,即为第一行的首位}void DispHanzi(unsigned char x,unsigned char y,unsigned char how,unsigned char *stri){unsigned char hi=0; //汉字显示if(x==0) send_command(0x80+y); //else if(x==1) send_command(0x90+y);else if(x==2) send_command(0x88+y);else if(x==3) send_command(0x98+y);for(hi=0;hi<how;hi++){send_data(*(stri+hi*2));send_data(*(stri+hi*2+1));}}void DispZimu(unsigned char x,unsigned char y,unsigned char how,unsigned char *stri){unsigned char hi=0; uchar temp_pin ; //字母显示if(x==0) send_command(0x80+y);else if(x==1) send_command(0x90+y);else if(x==2) send_command(0x88+y);else if(x==3) send_command(0x98+y);for(hi=0;hi<how;hi++){send_data(*(stri+hi));}}void key(void){unsigned char temp_pin ;P0=0xf0; //低四位接键盘行,高四位为键盘的列线if((P0&0xf0)!=0xf0){delay(10);if((P0&=0xf0)!=0xf0) //消抖{P0=0xfe;temp_pin=(P0&0xf0);switch (temp_pin) //对按下的键进行判断{case 0xe0:tab[0]='F';break;case 0xd0:tab[0]='E';break;case 0xb0:tab[0]='D';break;case 0x70:tab[0]='C';break;default:break;}P0=0xfd;temp_pin=(P0&0xf0);switch (temp_pin){case 0xe0:tab[0]='B';break;case 0xb0:tab[0]='9';break;case 0x70:tab[0]='8';break;default:break;}P0=0xfb;temp_pin=(P0&0xf0);switch (temp_pin){case 0xe0:tab[0]='7';break;case 0xd0:tab[0]='6';break;case 0xb0:tab[0]='5';break;case 0x70:tab[0]='4';break;default:break;}P0=0xf7;temp_pin=(P0&0xf0);switch (temp_pin){case 0xe0:tab[0]='3';break;case 0xb0:tab[0]='1';break;case 0x70:tab[0]='0';break;default:break;}}}}main(){ unsigned char time[8]={"00:00:00"};TMOD=0x11;TH0=THCO;TL0=TLCO;TR0=1;ET0=1;EA=1;InitLCD();B_light=0;DispHanzi(0,1,6,"重庆");DispHanzi(2,2,4,"北京时间");DispZimu(3,2,8,time);while(1){ key();DispZimu(1,4,1,tab);if(flag==1){flag=0;time[0]=Hour/10+0x30;//数字转为ASCCII值进行显示time[1]=Hour%10+0x30;time[3]=Min/10+0x30;time[4]=Min%10+0x30;time[6]=Sec/10+0x30;time[7]=Sec%10+0x30;DispZimu(3,2,8,time);}}}void timer0() interrupt 1{static unsigned char count=0 ;TH0=THCO;TL0=TLCO;count++;if(count>=200) //秒计时,定时器定时5ms,计200次为一秒{count=0;Sec++; flag=1;if(Sec>=60) //分计时{Sec=0;Min++;if(Min>=60) //时计时{Min=0; Hour++;if(Hour>=24)Hour=0;}}}}。

相关主题