点阵式字符型LCD显示器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
项目名称:点阵式字符型LCD显示器
班级:09电二姓名:解健学号:09020313
一.实验目的
1.掌握单片机系统扩展点阵式字符型液晶显示器LCD1602电路原理。
2.掌握单片机系统点阵式字符型液晶显示器LCD1602驱动程序的编写。
二.实验电路
元器件编号元器件名称说明
U2 74HC573 8位数据锁存器
U3 74HC00 2输入与非门
U1 AT89C52.BUS AT89C52单片机
LCD1 LM032L 点阵式字符型液晶显示器
四.实验步骤
第一步:先在Proteus软件中设计仿真电路原理图。
第二步:再在Keil C51软件中编写且编译程序,程序后缀必须是.c。然后在打开的“Option for Target‘Target 1’”选项卡,“Target”标签下频率设置为“11.0592”,“Output”标签下,将“Creat HEX File”项打勾选中,设置生成一个.hex文件。
第三步:接着将.hex文件导入原理图中U1芯片。双击U1,打开Edit Component对话框,选择生成的hex文件。
第四步:最后观察设计的电路图是否能得到预想的效果,若不能,进行检查,找到毛病且纠正。
流程图
实验现象:
在LCD1602显示“A T89C52LcdDriver”;显示保持约2s;然后再第二行循环显示ASCII可打印字符。
附:程序
#include
#include
#include
#include
#include
#include
#define byte unsigned char
#define uchar unsigned char
#define word unsigned int
#define uint unsigned int
#define ulong unsigned long
#define BYTE unsigned long
#define WORD unsigned int
#define TRUE 1
#define FALSE 0
void initUart(void);
void time(unsigned int ucMs);
uchar xdata Lcd1602CmdPort _at_ 0x8000;
uchar xdata Lcd1602StatusPort _at_ 0x8001;
uchar xdata Lcd1602WdataPort _at_ 0x8002;
uchar xdata Lcd1602RdataPort _at_ 0x8003;
#define BUSY 0x80
code uchar exampl[]="AT89C52LcdDriver";
void LcdWriteData(char dataW);
void LcdWriteCommand(uchar CMD,uchar AttribC); void LcdReset(void);
void Display(uchar dd);
void DispOneChar(uchar x,uchar y,uchar Wdata); void Putstr(uchar x,uchar y,uchar code *ptr);
void main(void)
{uchar temp;
initUart();
LcdReset();
temp=32;
Putstr(0,0,exampl);
time(2000);
while(1){
temp&=0x7f;
if(temp<32)temp=32;
Display(temp++);
time(400);}}
void Putstr(uchar x,uchar y,uchar code *ptr) {uchar i,l=0;
while (ptr[l]>31){l++;};
for(i=0;i DispOneChar(x++,y,ptr[i]); if(x==16){x=0;y^=1;}}} void Display(uchar dd) {uchar i; for(i=0;i<16;i++){ DispOneChar(i,1,dd++); dd&=0x7f; if(dd<32)dd=32;}} void LocateXY(char posx,char posy) {uchar temp; temp=posx&0xf; posy&=0x1; if(posy)temp|=0x40; temp|=0x80; LcdWriteCommand(temp,0);} void DispOneChar(uchar x,uchar y,uchar Wdata) {LocateXY(x,y); LcdWriteData(Wdata);} void LcdReset(void){ time(400); LcdWriteCommand(0x38,0); while(Lcd1602StatusPort&BUSY); LcdWriteCommand(0x08,1); LcdWriteCommand(0x06,1); LcdWriteCommand(0x0f,1); LcdWriteCommand(0x01,1); } void LcdWriteCommand(uchar CMD,uchar AttribC) {if( AttribC)while(Lcd1602StatusPort&BUSY); Lcd1602CmdPort=CMD;} void LcdWriteData(char dataW) {while(Lcd1602StatusPort&BUSY); Lcd1602WdataPort=dataW;} void delay_5us(void) {_nop_(); _nop_();} void delay_50us(void) {unsigned char i; for(i=0;i<4;i++){ delay_5us(); }} void delay_100us(void) {delay_50us(); delay_50us();} void time(unsigned int ucMs) {unsigned char j; while(ucMs>0){ for(j=0;j<10;j++) delay_100us(); ucMs--; }} void initUart(void) {SCON=0x50; RCAP2H=(65535-(3456/96))>>8; RCAP2L=(65535-(3456/96))%256; T2CON=0x34; TI=1;}