连线图:
; DB0---DPROT.0 DB4---DPROT.4 RS-------------P1.2
; DB1---DPROT.1 DB5---DPROT.5 RW-------------P1.3
; DB2---DPROT.2 DB6---DPROT.6 E--------------P1.4
; DB3---DPROT.3 DB7---DPROT.7 VLCD接10K可调电阻到GND*
#include "reg52.h"//头文件
#include "intrins.h"
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
sbit RS=P1^2;//定义I/O的硬件接口
sbit RW=P1^3;
sbit E=P1^4;
sbit LED_1=P1^7;//;;;LED秒闪烁
uchar Hours=0;//定义小时
uchar Minutes=0;//定义分钟
uchar Seconds=0;//定义秒
bit Seconds_Scintillation=1;//定义秒闪烁标志
#define DPDR P0//并行数据接口定义
uchar code DispTab_1[]={'0','1','2','3','4','5','6','7','8','9'};//1602:0-9 数字
uchar code DispTab_2[]={'A','B','C','D','E','a','b','c','d','e'};//1602:A-e 字母
uchar DispBuf[8]; //8字节的显示缓冲区
char char_char_1[]={" www.mdizi.com "};//定义字符串
char char_char_2[]={" "};//定义空字符串
void delay(uint z)//1ms延时
{
uchar x,x1;
for(;z>0;z--)
{
for(x=0;x<114;x++)
{
for(x1=0;x1<1;x1++);
}
}
}
void Timer0() interrupt 1
{
statIC uchar Count_50;//
uchar temp;
TH0=0xb7;
TL0=0xff;//定时时间为20ms,每20ms中断一次
Count_50++;
if(Count_50==50)//20ms*50=1秒
{ Seconds_Scintillation=~Seconds_Scintillation;
led_1=~led_1;
Count_50=0;
Seconds++;
if(Seconds==60)
{
Seconds=0;
Minutes++;
if(Minutes==60)
{
Minutes=0;
Hours++;
if(Hours==24)
{
Hours=0;
}
}
}
}
if(Seconds_Scintillation==1)//秒闪烁标志判断
DispBuf[6]=':';
else
DispBuf[6]=' ';
DispBuf[0]=Hours/10;//转换成10进制显示
DispBuf[1]=Hours%10;
DispBuf[2]=Minutes/10;
DispBuf[3]=Minutes%10;
DispBuf[4]=Seconds/10;
DispBuf[5]=Seconds%10;
temp=DispBuf[0];
DispBuf[0]=DispTab_1[temp];//查表取字符
temp=DispBuf[1];
DispBuf[1]=DispTab_1[temp];
temp=DispBuf[2];
DispBuf[2]=DispTab_1[temp];
temp=DispBuf[3];
DispBuf[3]=DispTab_1[temp];
temp=DispBuf[4];
DispBuf[4]=DispTab_1[temp];
temp=DispBuf[5];
DispBuf[5]=DispTab_1[temp];
}
void write_Directive(uchar a)//写指令
{
RS=0;
RW=0;
delay(1);
E=0;
DPDR=a;
delay(1);
E=1;
delay(1);
E=0;
delay(1);
}
void write_Data(uchar a)//写数据
{
RS=1;
RW=0;
delay(1);
E=0;
DPDR=a;
delay(1);
E=1;
delay(1);
E=0;
delay(1);
}
void init()//初始化
{ uchar i;
TMOD=0x01;
TH0=0xb7;
TL0=0xff;//定时时间为20ms,每20ms中断一次
ET0=1; //开T0中断
EA=1; //开总中断
TR0=1; //T0开始运行
DispBuf[6]=':';
delay(15);
write_Directive(0x38);
delay(5);
write_Directive(0x38);
delay(5);
write_Directive(0x38);
write_Directive(0x01);
write_Directive(0x02);//初始化后数据地址为0x80;即第一行,第一个位置
write_Directive(0x0c);//不显示光标
write_Directive(0x80+0x40);//第二行第一位地址
for(i=0;i<16;i++)
{
write_Data(char_char_1[i]);//显示字符串" www.mdizi.com "
}
}
void write_Data_String()//显示时间函数
{
write_Directive(0x80+0x04);//第一行,第五个位置地址
write_Data(DispBuf[0]);//第一行,第五个位置
write_Data(DispBuf[1]);//第一行,第六个位置
write_Data(DispBuf[6]);//第一行,第七个位置
write_Data(DispBuf[2]);//第一行,第八个位置
write_Data(DispBuf[3]);//第一行,第九个位置
write_Data(DispBuf[6]);//第一行,第十个位置
write_Data(DispBuf[4]);//第一行,第十一个位置
write_Data(DispBuf[5]);//第一行,第十二个位置
}
void main()
{
init();
while(1)
{
write_Data_String();//调用写连续的 16 个字符,1表示第一行;2表示第二行
delay(100);//延时 100ms,扫描一次
}
}
液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。
这里介绍的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,这里以常用的2行16个字的DM-162液晶模块来介绍它的编程方法。
DM-162采用标准的14脚接口,其中VSS为地电源,VDD接5V正电源,V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。D0~D7为8位双向数据线。
DM-162液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”
DM-162液晶模块内部的控制器共有11条控制指令,如表2所示,
它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平) 指令1:清显示,指令码01H,光标复位到地址00H位置 指令2:光标复位,光标返回到地址00H 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁 指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符 指令7:字符发生器RAM地址设置 指令8:DDRAM地址设置 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10:写数据 指令11:读数据
DM-162液晶显示模块可以和 单片机 AT89C51直接接口,电路如图1所示。
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表3是DM-162的内部显示地址.
上一篇:PDIUSBD12 USB 驱动程序
下一篇:24C32~24C512的51单片机读写程序
推荐阅读最新更新时间:2024-03-16 15:52