- #include<reg52.h>
- #include<intrins.h> //包含_nop_()函数的头文件
- sbit RS=P2^0; //将RS定义为P2^0
- sbit RW=P2^1; //将RW定义为P2^1
- sbit E=P2^2; //将E定义为P2^2
- sbit BF=P0^7; //将BF定义为P0^7
- unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃
- unsigned char str1[]="FREEDOM";
- unsigned char str2[]="zhengzhongjie";
- /************************************
- 函数功能:1ms基准延时
- 入口参数:n
- ************************************/
- void delay1ms(unsigned int n )
- {
- unsigned char i;
- while(n--)
- for(i=0;i<115;i++);
- }
- /************************************
- 函数功能:判断液晶的忙碌状态
- 返回值:result=1,忙碌;result=0,不忙
- ************************************/
- bit BusyTest()
- {
- bit result;
- RS=0; //读状态时,RS=0,RW=1,E=1
- RW=1;
- E=1;
- _nop_(); //延时一个时钟周期
- _nop_();
- _nop_();
- _nop_(); //4个周期延时,给硬件反应时间
- result=BF;
- E=0; //将E置0,不允许读
- return result;
- }
- /************************************
- 函数功能:将模式设置指令或显示地址送入液晶
- 入口参数:dictate
- ************************************/
- void Write_com(unsigned char dictate)
- {
- while(BusyTest()==1); //如果忙就等待
- RS=0; //写指令时,RS=0.RW=0,E=负跳变
- RW=0;
- E=1; //先将E拉高
- _nop_();
- _nop_(); //给硬件反应时间
- P0=dictate; //将数据送入P0口,即指令或地址
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //反应时间
- E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
- }
- /************************************
- 函数功能:指定字符显示的实际地址
- 入口参数:x
- ************************************/
- void WriteAddress(unsigned char x)
- {
- Write_com(x|0x80); //显示位置的确定方法为“0x80+地址码x”
- }
- /************************************
- 函数功能:将数据(ASKII码)写入液晶模块
- 入口参数:y(字符常量)
- ************************************/
- void WriteData(unsigned char y)
- {
- while(BusyTest()==1); //如果忙碌就等待
- RS=1; //写数据时RS=1,RW=0,E=负跳变
- RW=0;
- E=1; //先将E拉高
- P0=y;
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //反应时间
- E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
- }
- /************************************
- 函数功能:对LCD的显示模式进行初始化
- ************************************/
- void LcdInt()
- {
- delay1ms(15); //首次写指令时给LCD一段较长的反应时间
- Write_com(0x38); //显示模式设置:16X2显示,5X7点阵,8位数据总线
- delay1ms(5);
- Write_com(0x38);
- delay1ms(5);
- Write_com(0x38);
- delay1ms(5); //3次写 设置模式
- Write_com(0x0f); //显示模式设置:显示开,有光标,光标闪烁
- delay1ms(5);
- Write_com(0x06); //显示模式设置:光标右移,字符不移
- delay1ms(5);
- Write_com(0x01); //清屏
- delay1ms(5);
- }
- //主函数
- void main()
- {
- unsigned char i,j;
- LcdInt(); //调用LCD初始化函数
- delay1ms(10);
- while(1){
- Write_com(0x01); // 清屏
- delay1ms(5);
- WriteAddress(0x05); //设置显示位置为第1行,第6个位置
- delay1ms(5);
- i=0;
- for(;str1[i]!='\0';i++){
- WriteData(str1[i]); // 显示字符"FREEDOM"
- delay1ms(100);
- }
- WriteAddress(0x41); // 设置显示位置为第2行,第2个位置
- i=0;
- for(;str2[i]!='\0';i++){
- WriteData(str2[i]); // 显示字符"zhengzhongjie"
- delay1ms(100);
- }
- delay1ms(3000);
- //右侧移位进来
- Write_com(0x01); //清屏
- delay1ms(5);
- WriteAddress(0x15); // 设置显示位置为第1行,第22个位置
- delay1ms(5);
- i=0;
- for(;str1[i]!='\0';i++){
- WriteData(str1[i]);
- delay1ms(100);
- }
- WriteAddress(0x51); // 设置显示位置为第2行,第18个位置
- delay1ms(5);
- i=0;
- for(;str2[i]!='\0';i++){
- WriteData(str2[i]);
- delay1ms(100);
- }
- for(j=0;j<16;j++){ //左移指令
- Write_com(0x18);
- delay1ms(300);
- }
- delay1ms(3000);
- //关闭显示
- Write_com(0x08);
- delay1ms(5);
- delay1ms(3000);
- //开启显示
- Write_com(0x0f);
- delay1ms(5);
- delay1ms(3000);
- //右移,移出
- for(j=0;j<16;j++){
- Write_com(0x1c);
- delay1ms(300);
- }
- delay1ms(3000);
- //显示一个自定义的字符℃
- Write_com(0x40); //设置CGRAM地址
- delay1ms(5);
- for(j=0;j<8;j++){
- WriteData(User[j]); //写入℃
- delay1ms(5);
- }
- WriteAddress(0x05); //设定屏幕上的显示位置
- WriteData(0x00); //因为执行过Write_com(0x40),默认从CGRAM取出℃
- delay1ms(3000);
- }
- }
复制代码
|