LCD字符型液晶显示器.docx
- 文档编号:3925814
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:20
- 大小:79.52KB
LCD字符型液晶显示器.docx
《LCD字符型液晶显示器.docx》由会员分享,可在线阅读,更多相关《LCD字符型液晶显示器.docx(20页珍藏版)》请在冰豆网上搜索。
LCD字符型液晶显示器
课程设计报告
院校:
南京林业大学机械电子工程学院
专业:
测控技术与仪器
姓名:
余雷
学号:
080307128
课题名称:
LCD字符型液晶显示器
时间:
2012.2.13—2012.2.17
1.1课题要求
(1)设计采用DS1602液晶显示器和AT89C51单片机。
(2)可以显示星期及时、分、秒,24小时制。
(3)具有校时功能:
可以对小时和分单独校时,对分校时的时候,停止分向小时的进位。
1.2系统设计
以AT89C51为核心,通过按键调试时间。
由按键模块,显示模块组成。
1.2.1框图设计
AT89C51
显示电路
按键电路
1.2.2知识点
本项目通过学习和查阅资料,了解和掌握以下知识:
●电源原理及设计。
●DS1602液晶显示器的特性及使用。
●按键的应用。
●AT89C51单片机引脚。
●单片机C语言及程序设计。
1.3硬件设计
系统的元件清单如下表所示:
元件名称
型号
数量
用途
单片机
AT89C51
1个
控制核心
电解电容
10uF
1个
复位电路
电阻
10kΩ
9个
上拉电阻
液晶显示
DS1602
1个
显示模块
按键
4个
按键电路
电源
+5V/0.5A
1个
提供+5V电源
LED信号灯
LED-RED
1个
整点提醒
系统的原理图为:
PCB图为:
系统的程序为:
#include
#include
#include
sbitRS=P2^4;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^5;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^6;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚
unsignedcharcodetable[]="2012-02-10week5";//初始化液晶显示16
unsignedcharcodetable1[]="12:
59:
32";//12
unsignedcharcount,s1num;
charsecond,minute,hour,day,month,year,week;
sbits1=P3^0;//功能键
sbits2=P3^1;//加键
sbits3=P3^2;//减键
sbits4=P3^3;//保存并退出
sbitP3_4=P3^4;//信号灯
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelay(unsignedcharn)
{
unsignedchari;
for(i=0;i delay1ms(); } /***************************************************** 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙 ***************************************************/ unsignedcharBusyTest(void) { bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0;//将E恢复低电平 returnresult; } /***************************************************** 函数功能: 写指令 入口参数: dictate ***************************************************/ voidWriteInstruction(unsignedchardictate) { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 写数据 入口参数: y(为字符常量) ***************************************************/ voidWriteData(unsignedchary) { while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 对LCD的显示模式进行初始化设置 ***************************************************/ voidLcdInitiate(void) { unsignedcharnum; second=32; minute=59; hour=12; week=3; day=23; month=3; year=11; count=0; s1num=0; E=0; delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38);//显示模式设置: 16×2显示,5×7点阵,8位数据接口 delay(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x38); delay(5); WriteInstruction(0x38);//连续三次,确保初始化成功 delay(5); WriteInstruction(0x0c);//显示模式设置: 显示开,无光标,光标不闪烁 delay(5); WriteInstruction(0x06);//显示模式设置: 光标右移,字符不移 delay(5); WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delay(5); WriteInstruction(0x80); for(num=0;num<16;num++)//让液晶显示日期 { WriteData(table[num]); delay(5); } WriteInstruction(0x80+0x40); for(num=0;num<12;num++)//让液晶显示时间 { WriteData(table1[num]); delay(5); } TMOD=0x01;//定时器中断初始化 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } //-------写年月日--------------- voidwrite_nyr(unsignedcharadd,unsignedchardate) { unsignedchari,j; i=date/10; j=date%10; WriteInstruction(0x80+add); WriteData(0x30+i); WriteData(0x30+j); } //--------写时分秒---------------------- voidwrite_sfm(unsignedcharadd,unsignedchardate) { unsignedchari,j; i=date/10; j=date%10; WriteInstruction(0x80+0x40+add); WriteData(0x30+i); WriteData(0x30+j); } //-------------写星期---------------------------- voidwrite_week(unsignedcharadd,unsignedchardate) { WriteInstruction(0x80+add); WriteData(0x30+date); } //---------------信号灯---------------------------- voidwrite_led() { inti; for(i=0;i<10;i++) { P3_4=0; delay(50); P3_4=1; } } //---------该年是否是闰年-------------------------- bitleap_year() { intleap; if((year%4==0&&year%100! =0)||year%400==0) leap=1;//是闰年 else leap=0;//非闰年 returnleap; } //----------键盘扫描-------------------- voidkeyscan() { if(s1==0)//第一个键是否按下 { delay(5); if(s1==0) { while(! s1); s1num++; if(s1num==1)//第一个键被按一次 { TR0=0; WriteInstruction(0x80+0x40+11); WriteInstruction(0x0f); } if(s1num==2) { WriteInstruction(0x80+0x40+8); } if(s1num==3) { WriteInstruction(0x80+0x40+5); } if(s1num==4) { WriteInstruction(0x80+9); } if(s1num==5) { WriteInstruction(0x80+6); } if(s1num==6) { WriteInstruction(0x80+3); } if(s1num==7) { WriteInstruction(0x80+15); } } } if(s1num! =0)//如果功能键被按下 { if(s2==0)//第二个按下 { delay(5); if(s2==0) { while(! s2); if(s1num==1)//第二个键被按一次,秒钟加一 { second++; if(second==60) second=0; write_sfm(10,second); WriteInstruction(0x80+0x40+11); } if(s1num==2)//第二个键被按二次,分钟加一 { minute++; if(minute==60) minute=0; write_sfm(7,minute); WriteInstruction(0x80+0x40+8); } if(s1num==3)//第二个键被按三次,时钟加一 { hour++; if(hour==24) hour=0; write_sfm(4,hour); WriteInstruction(0x80+0x40+5); } if(s1num==4)//日期加一 { day++; if(day==32) day=1; write_nyr(8,day); WriteInstruction(0x80+9); } if(s1num==5)//月加一 { month++; if(month==13) month=1; write_nyr(5,month); WriteInstruction(0x80+6); } if(s1num==6)//年加一 { year++; if(year==99) year=0; write_nyr(2,year); WriteInstruction(0x80+3); } if(s1num==7)//星期加一 { week++; if(week==8) week=1; write_week(15,week); WriteInstruction(0x80+15); } } } if(s3==0)//第三个键被按下 { delay(5); if(s3==0) { while(! s3); if(s1num==1)//秒减一 { second--; if(second==-1) second=59; write_sfm(10,second); WriteInstruction(0x80+0x40+11); } if(s1num==2)//分减一 { minute--; if(minute==-1) minute=59; write_sfm(7,minute); WriteInstruction(0x80+0x40+8); } if(s1num==3)//时减一 { hour--; if(hour==-1) hour=23; write_sfm(4,hour); WriteInstruction(0x80+0x40+5); } if(s1num==4)//日减一 { day--; if(day==0) day=31; write_nyr(8,day); WriteInstruction(0x80+9); } if(s1num==5)//月减一 { month--; if(month==0) month=12; write_nyr(5,month); WriteInstruction(0x80+6); } if(s1num==6)//年减一 { year--; if(year==-1) year=99; write_nyr(2,year); WriteInstruction(0x80+3); } if(s1num==7)//日期减一 { week--; if(week==0) week=7; write_week(15,week); WriteInstruction(0x80+15); } } } if(s4==0)//保存并退出 { s1num=0; WriteInstruction(0x0c); TR0=1; } } } /********************************************************************** mainfunction ***********************************************************************/ voidmain(void) { LcdInitiate();//调用LCD初始化函数 while (1) { keyscan(); } } /******************************************************* 函数功能: 定时器T0的中断服务函数 ********************************************************/ voidtimer0()interrupt1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count==18) { count=0; second++; if(second==60)//秒计满60,秒归0,分+1 { second=0; minute++; if(minute==60)//分计满60,分归0,时+1 { minute=0; hour++; write_led(); if(hour==24)//时计满24,时归0,星期+1,日+1 { hour=0; week++; day++; if(week==8)week=1;//星期计满7,星期归1 if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//大月三十一天 { if(day==32)//大月天数计满31,日归1,月+1 { day=1; month++; } } if(month==4||month==6||month==9||month==11)//小月三十天 { if(day==31) {//小月天数计满30,日归1,月+1 day=1; month++; } } if(month==2) { if(leap_year()) { if(day==30)//闰年二月29天计满,日归1,月+1 { day=1; month++; } } else { if(day==29)//非闰年二月28天计满,日归1,月+1 { day=1; month++; } } } if(month==13)//月计满12,月归1,年+1 { month=1; year++; if(year==99)//年计满99,年归0 { year==0; } write_nyr(2,year); } write_nyr(5,month); } write_nyr(8,day); write_week(15,week); } write_sfm(4,hour); } write_sfm(7,minute); } write_sfm(10,second); } 系统在proteus中的仿真图为: 1.4系统仿真及调试 (1)硬件调试主要是把电路的各种参数调整到符合设计要求。 先排除硬件电路故障,包括设计性错误和公益性故障。 一般原则是先静态后动态。 利用万用表或逻辑测试仪器,检查电路中的各期间以及引脚的连接是否正确,是否有断路故障。 先要将单片机AT89C51芯片取下,对电路板进行通电检查,通过观察看是否有异常,然后用万用表测试各
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD 字符 液晶显示器