#include<reg51.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uint unsigned int
#define uchr unsigned char
sbit RS=P0^5; //寄存器选择位,将RS位定义为P0.5引脚
sbit RW=P0^6; //读写选择位,将RW位定义为P0.6引脚
sbit E=P0^7; //使能信号位,将E位定义为P0.7引脚
sbit BF=P2^7; //忙碌标志位,,将BF位定义为P2.7引脚
uchr code str[]={"Welcome to china"};
//延时程序 约为1ms
void delayms()
{
uchr i,j;
for(i=0;i<20;i++)
for(j=0;j<50;j++);
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(uchr n)
{
uchr i;
for(i=0;i<n;i++)
delayms();
}
//LCD忙判断
uchr busytest(void)
{
bit result;
P2=0x0ff;
RS=0;
RW=1;//读忙信号
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=BF;
E=0;
return result;
}
//函数;模式设置指令或显示地址写入
void write_instruction(uchr C)
{
// while(busytest()==1);
delay(5);
RS=0;
RW=0;
E=0;
_nop_();
_nop_();
P2=C;
delay(5);
_nop_();
_nop_();
_nop_();
_nop_();
E=1; //先E从0变1,写入指令再从1变0 通知lcd执行
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}
//函数;指定字符显示位置的实际地址
void write_address(uchr b)
{
write_instruction(b|0x80);//位置显示规定为“80H+b”
}
//函数:写入数据
void write_data(uchr b)
{
// while(busytest()==1);
delay(5);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P2=b;
//将数据送入P0口,即将数据写入液晶模块
delay(5);
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//函数:LCD初始化
void LCDinitial(void)
{
E=0;
delay(15);
write_instruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms
write_instruction(0x38);
delay(5);
write_instruction(0x38);
delay(5);
write_instruction(0x0f); //显示模式设置:显示开,有光标,光标闪烁
delay(5);
write_instruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
write_instruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}
//主函数
void main()
{
uint i;
LCDinitial();
delay(10);
while(1)
{
i=0;
write_instruction(0x01);
write_address(0x00);
while(str
=' ')
{
write_data(str);
delay(150);
i++;
}
delay(1000);
}
}
[ 本帖最后由 51DPJLT 于 2013-9-28 22:25 编辑 ]
此帖出自小平头技术问答
一周热门 更多>