16×2字符型液晶显示实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【实例40】16×2字符型液晶显示实例
/*---------------
文件名称: 1602_test.C
功能 :SMC1602A的C51驱动程序
说明 :在 SMC1602A上显示字符
----------------*/
#include <reg51.h>
#include<intrins.h>
//变量类型标识的宏定义
#define Uchar unsigned char
#define Uint unsigned int
// 控制引脚定义
sbit RS = P2^0; //数据/命令选择,高电平表示传送的是数据,低电平则表示是命令
sbit RW = P2^1; // 读写选择,高电平表示从1602读数据,低电平则表示写数据到1602
sbit Elcm = P2^6; //使能信号
#define Data P0 //定义数据端口
#define By 0x80
code char emp[]="For an example";
void Delay400Ms(void);
void Delay5Ms(void);
void WaitEnable( void );
void WriteLcdData( char dataW );
void WriteLcdCommand( Uchar CMD,Uchar AttribC );
void LcdReset( void );
void Display( Uchar dd );
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
//主程序
void main(void)
{
Uchar temp;
Delay400Ms();
LcdReset();
temp = 32;
ePutstr(0,0,emp); // 显示一个预定字符串“For an example”
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
while(1)
{
temp &= 0x7f; // 只显示ASCII字符
if (temp<32)temp=32; // 屏蔽控制字符,不予显示
Display( temp++ );
Delay400Ms();
}
}
/********************************
函数名称: void ePutstr(Uchar x,Uchar y, Uchar code *ptr)
功能 :在1602上在指定位置显示指定的字符串
说明 : 无
入口参数:x为横坐标,y为纵坐标,*ptr为指向显示字符串的指针
返回值 :无
********************************/
void ePutstr(Uchar x,Uchar y, Uchar code *ptr)
{
Uchar i,l=0;
while (ptr[l]>31){l++;};
for (i=0;i<l;i++)
{
DispOneChar(x++,y,ptr[i]);
if ( x == 16 )
{
x = 0; y ^= 1;
}
}
}
/********************************
函数名称: void Display( Uchar dd )
功能 :在1602第一行显示dd到dd+15
说明 : 无
入口参数:dd为要显示的第一个数
返回值 :无
********************************/
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)
功能 :在指定位置显示光标定位
说明 : 无
入口参数:posx为光标的横坐标,posy为光标的纵坐标
返回值 :无
********************************/
void LocateXY( char posx,char posy)
{
Uchar temp;
temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
WriteLcdCommand(temp,0);
}
/********************************
函数名称: void DispOneChar(Uchar x,Uchar y,Uchar
Wdata)
功能 :在指定位置显
示出一个字符
说明 : 无
入口参数:x为光标的横坐标,y为光标的纵坐标,Wdata为要显示的字符
返回值 :无
********************************/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata)
{
LocateXY( x, y ); // 定位显示地址
WriteLcdData( Wdata ); // 写字符
}
/********************************
函数名称: void LcdReset( void )
功能 :初始化液晶屏
说明 : 无
入口参数:无
返回值 :无
********************************/
void LcdReset( void )
{
WriteLcdCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
Delay5Ms();
WriteLcdCommand( 0x38, 0); // 共三次
Delay5Ms();
WriteLcdCommand( 0x38, 0);
Delay5Ms();
WriteLcdCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
WriteLcdCommand( 0x08, 1); // 显示关闭
WriteLcdCommand( 0x01, 1); // 显示清屏
WriteLcdCommand( 0x06, 1); // 显示光标移动设置
WriteLcdCommand( 0x0c, 1); // 显示开及光标设置
}
/********************************
函数名称: void WriteLcdCommand( Uchar CMD,Uchar AttribC )
功能 :写控制字符子程序
说明 : E=1 RS=0 RW=0
入口参数:CMD为命令码,AttribC为属性
返回值 :无
********************************/
void WriteLcdCommand( Uchar CMD,Uchar AttribC )
{
if (AttribC)
WaitEnable(); // 检测忙信号?
RS = 0;
RW = 0;
_nop_();
Data = CMD; // 送控制字子程序
_nop_();
Elcm = 1;
_nop_();
_nop_();
Elcm = 0; // 操作允许脉冲信号
}
/********************************
函数名称: void WriteLcdData( char dataW )
功能 :当前位置写字符
说明 : E =1 RS=1 RW=0
入口参数:dataW为要显示的字符
返回值 :无
********************************/
void WriteLcdData( char dataW )
{
WaitEnable(); // 检测忙信号
RS = 1;
RW = 0;
_nop_();
Data = dataW;
_nop_();
Elcm = 1;
_nop_();
_nop_();
Elcm = 0; // 操作允许脉冲信号
}
/********************************
函数名称: void WaitEnable( void )
功能 :检测LCD控制器状态
说明 :正常读写操作之前必须检测LCD控制器状态:CS=1 RS=0 RW=1
DB7: 0 LCD控制器空闲; 1 LCD控制器忙
入口参数:无
返回值 :无
********************************/
void WaitEnable( void )
{
Data = 0xff;
RS =0;
RW = 1;
_nop_();
Elcm = 1;
_nop_();
_nop_();
while( Data &By ); //等待LCD空闲
Elcm = 0;
}
/********************************
函数名称: void Delay5Ms(void)
功能 :短延时函数
说明 :在单片机工作在12MH是大约延时5毫秒
入口参数:无
返回值 :无
********************************/
void Delay5Ms(void)
{
Uint i = 5552;
while(i--);
}
/********************************
函数名称: void Delay400Ms(void)
功能 :长延时函数
说明 :在单片机工
作在12MH是大约延时400毫秒
入口参数:
无
返回值 :无
********************************/
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{
j=7269;
while(j--);
};
}