#include <reg52.h>
#include<intrins.h>
/**
* P2 上接的是 D1 ~ D7
*/
sbit RS = P3 ^ 0;//数据 H 命令 L
sbit RW = P3 ^ 1;//读 H 写 L
sbit E = P3 ^ 2;//高电平 H 使能
#define DATA P2
/**
* 经过逻辑分析仪测量时间
* 单指令是 5us
* nop 0.4ms
* 经过试验发现, 只需要一个单指令执行时间 5us 休眼就可以
* E = 1 后需要等一小段时间, 在手册中并没有说明 -
*/
void delayms(char ms);
char is_busy();
void write_cmd(unsigned char cmd);
void write_data(unsigned char dat);
void pos (unsigned char pos);
void main()
{
//初始化 复位 lcd1602
write_cmd(0x38);//设置显示模式 指令码 00111000 => 0x38
delayms(1);
write_cmd(0x0c);//开显示 不显示光标 不闪烁
delayms(1);
write_cmd(0x06);//光标设置 写字符后指针加一
delayms(1);
write_cmd(0x01);//光标清0 指针清0
delayms(1);
pos (0);
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_data('W');
write_data('a');
write_data('r');
write_data('n');
write_data('i');
write_data('n');
write_data('g');
pos (0x40);
write_data('P');
write_data('l');
write_data('e');
write_data('a');
write_data('s');
write_data(' ');
write_data(' ');
write_data('g');
write_data('i');
write_data('v');
write_data('e');
write_data(' ');
write_data(' ');
write_data('w');
write_data('a');
write_data('y');
while(1);
}
void pos (unsigned char pos)
{
//设置指针位置 0x80 | 位置
write_cmd(pos|0x80);
}
void write_data(unsigned char dat)
{
while(is_busy());
RS = 1;
RW = 0;
E = 0;
//_nop_();
DATA = dat;
_nop_();
E = 1;//在E 高向低变化时传输
E = 0;
}
void write_cmd(unsigned char cmd)
{
while(is_busy());
RS = 0;
RW = 0;
E = 0;
//_nop_();
DATA = cmd;
_nop_();
E = 1;//在E 高向低变化时传输
E = 0;
}
char is_busy()
{
int a=0;
char result;
RS = 0;//发送的是命令
RW = 1;//读
//_nop_();
E = 1;//使能
_nop_();
result = (1<<7 & DATA);//7bit 1 忙 0 不忙
E = 0;//取消使能
return result;
}
void delayms(char ms) //@12.000MHz
{
while(ms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
|