|
//=============熟练运用以下方案可以扩展到工业控制中的人机介友好介面显示,实现中文化可视控制=======//
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define Lcd_Bus P0 //数据总线
sbit RS=P1^0; // 并行的指令/数据选择信号;串行的片选信号
sbit RW=P1^1; // 并行的读写选择信号;串行的数据口
sbit E=P1^2; // 并行的使能信号;串和的同步时钟
/*************************************************************/
/******************************************************************************/
void chk_busy(){ //检查忙位(底层)
RS=0;
RW=1;
E=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80);
E=0;
}
//============================================================//写命令到LCD(底层)
void write_com(unsigned char cmdcode){
chk_busy(); //忙检查
RS=0;
RW=0; //RS=0,RW=0;表示MCU写指令到指令暂存器IR
E=1;
Lcd_Bus=cmdcode; //Lcd_Bus=P0;
E=0; //E由高到低变化将配合W进行写数据或写指令
}
//------------------------------------------------------------//写数据到LCD(底层)
void write_data(unsigned char Dispdata){
chk_busy(); //忙检查
RS=1;
RW=0; //RS=1;RW=0;表示MCU写数据到暂存器DR
E=1;
Lcd_Bus=Dispdata; //Lcd_Bus=P0;
E=0; //E由高到低变化将配合W进行写数据或写指令
}
//============================================================//初始化LCD屏(被调用层)
void lcm_init(){
write_com(0x30); //选择8bit数据流 0X30=0011,0000
write_com(0x0C); //开显示(无游标、不反白)
write_com(0x01); //清除显示,并且设定地址指针为00H
}
//============================================================//写指令或数据(被调用层)
void lcm_w_test(bit i,unsigned char word){
if(i == 0){ //根据i的状态区分指令或数据
write_com(word);//写指令或数据(0,指令)
}
else{
write_data(word);//写指令或数据(1,数据)
}
}
//-----------------------------------------------------------//清屏函数
void lcm_clr(void){
lcm_w_test(0,0x01);
}
//===========================================================//向LCM发送一个字符串,长度64字符之内。(被调用层)
void lcm_w_word(unsigned char *s){
while(*s>0){ //应用:lcm_w_word("您好!");
write_data(*s);//这里指针用得很好,用指针后显示数据的地址不用数组了,减小了内存开支
s++; //自加显示下一个数据地址
}
}
void welcome(void)//==========================================//初始开机显示画面
{
//----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺
//lcm_w_word(" WiCN12864LCD V1.0 2013-05-09 LCD:WC12864CBL WWW#WiCN#COM");
lcm_w_test(0,0x81); //写指令和地址
lcm_w_word ("离离原上草,"); //写显示数据
lcm_w_test(0,0x91);
lcm_w_word ("一岁一枯荣;");
lcm_w_test(0,0x89);
lcm_w_word ("野火烧不尽,");
lcm_w_test(0,0x99);
lcm_w_word ("春风吹又生.");
}
//=========================================================================================//
void DelayM(int num){//延时函数
while(num--) ;
}
/*******************************************************************************************/
void main()
{
lcm_init();//初始化液晶显示器
lcm_clr();//清屏
welcome(); //初始开机显示画面,显示欢迎信息
DelayM(3000); //显示等留3秒
while(1);
}
|
|