以下是源程序:
#include <reg52.h>
#include<intrins.h> /**
* P2 上接的是 D1 ~ D7
*/
sbit RS = P3 ^ ;//数据 H 命令 L
sbit RW = P3 ^ ;//读 H 写 L
sbit E = P3 ^ ;//高电平 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();
write_cmd(0x0c);//开显示 不显示光标 不闪烁
delayms();
write_cmd(0x06);//光标设置 写字符后指针加一
delayms();
write_cmd(0x01);//光标清0 指针清0
delayms(); pos ();
write_data('');
write_data('');
write_data('');
write_data('');
write_data('');
write_data('');
write_data('');
write_data('');
write_data('');
write_data(''); pos (0x40); write_data('');
write_data('');
write_data('');
write_data('');
write_data(''); while();
} void pos (unsigned char pos)
{
//设置指针位置 0x80 | 位置
write_cmd(pos|0x80);
} void write_data(unsigned char dat)
{
while(is_busy());
RS = ;
RW = ;
E = ;
//_nop_();
DATA = dat;
_nop_();
E = ;//在E 高向低变化时传输
E = ;
} void write_cmd(unsigned char cmd)
{
while(is_busy());
RS = ;
RW = ;
E = ;
//_nop_();
DATA = cmd;
_nop_();
E = ;//在E 高向低变化时传输
E = ;
} char is_busy()
{
int a=;
char result;
RS = ;//发送的是命令
RW = ;//读
//_nop_();
E = ;//使能
_nop_();
result = (<< & DATA);//7bit 1 忙 0 不忙
E = ;//取消使能
return result;
} void delayms(char ms) //@12.000MHz
{
while(ms--)
{
unsigned char i, j;
i = ;
j = ;
do
{
while (--j);
} while (--i);
}
}
仿真显示少了一个字符, 不知道什么原因。 等真机到了,在试验。