#include <reg52.h>
#include<intrins.h>
/**
* P2 上接的是 D1 ~ D7
*/
sbit RS = P3 ^ 0;//數(shù)據(jù) H 命令 L
sbit RW = P3 ^ 1;//讀 H 寫 L
sbit E = P3 ^ 2;//高電平 H 使能
#define DATA P2
/**
* 經(jīng)過邏輯分析儀測量時間
* 單指令是 5us
* nop 0.4ms
* 經(jīng)過試驗發(fā)現(xiàn), 只需要一個單指令執(zhí)行時間 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;//發(fā)送的是命令
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);
}
}
|