|
|
#include <reg52.h>
#include<intrins.h>
/**
* P2 上接的是 D1 ~ D7
*/
sbit RS = P3 ^ 0;//數(shù)據(jù) H 命令 L
sbit RW = P3 ^ 1;//讀 H 寫(xiě) L
sbit E = P3 ^ 2;//高電平 H 使能
#define DATA P2
/**
* 經(jīng)過(guò)邏輯分析儀測(cè)量時(shí)間
* 單指令是 5us
* nop 0.4ms
* 經(jīng)過(guò)試驗(yàn)發(fā)現(xiàn), 只需要一個(gè)單指令執(zhí)行時(shí)間 5us 休眼就可以
* E = 1 后需要等一小段時(shí)間, 在手冊(cè)中并沒(méi)有說(shuō)明 -
*/
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()
{
//初始化 復(fù)位 lcd1602
write_cmd(0x38);//設(shè)置顯示模式 指令碼 00111000 => 0x38
delayms(1);
write_cmd(0x0c);//開(kāi)顯示 不顯示光標(biāo) 不閃爍
delayms(1);
write_cmd(0x06);//光標(biāo)設(shè)置 寫(xiě)字符后指針加一
delayms(1);
write_cmd(0x01);//光標(biāo)清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)
{
//設(shè)置指針位置 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 高向低變化時(shí)傳輸
E = 0;
}
void write_cmd(unsigned char cmd)
{
while(is_busy());
RS = 0;
RW = 0;
E = 0;
//_nop_();
DATA = cmd;
_nop_();
E = 1;//在E 高向低變化時(shí)傳輸
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);
}
}
|
|