|
//=============熟練運用以下方案可以擴展到工業控制中的人機介友好介面顯示,實現中文化可視控制=======//
#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);
}
|
|