|
*===========================================================================
KS0070(44780) 16x2 字符液晶屏驅動演示程序總線方式 ============================================================================= 連接線圖: LCM-------51 LCM-------51 LCM--------51 DB0-----P0.0 DB4-----P0.4 RW-------P2.1 //p2.0 DB1-----P0.1 DB5-----P0.5 RC-------P2.0 //p2.1 DB2-----P0.2 DB6-----P0.6 E--------P2.2 =>74ls00+wr+rd //p2.7 DB3-----P0.3 DB7-----P0.7 VLCD接1K2電阻到GND
[注]:AT89C51的晶振頻率為12MHz
============================================================================*/ //#pragma src // 產生匯編文件 #include <AT89X52.H> #include<intrins.h>
//========= 變量類型標識的宏?====== #define Uchar unsigned char #define Uint unsigned int
// ================= LCM1602A端口地址定義 ======================= sbit RS = 0xA0; sbit RW = 0xA1; sbit E = 0xA2; //char xdata Lcd1602CmdPort _at_ 0xf8ff; //0x7cff; //E=1 RS=0 RW=0 //char xdata Lcd1602WdataPort _at_ 0xf9ff; //0x7eff; //E =1 RS=1 RW=0 //char xdata Lcd1602StatusPort _at_ 0xfaff; //0x7dff; //CS=1 RS=0 RW=1
//#define Busy 0x80 // 忙判別位
code char data1[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e, 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e};
void Delay400Ms(void); void Delay5Ms(void); void LcdWriteData( char dataW ); void LcdWriteCommand( Uchar CMD,Uchar AttribC ); void LcdReset( void ); void Display( Uchar dd ); void DispOneChar(Uchar x,Uchar y,Uchar Wdata); void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
void init_port() { P0 = 0x00; P1 = 0xFE; P2 = 0x01; P3 = 0xFF; } //=============主程序 ================ void main(void) { Uchar temp; init_port(); Delay400Ms(); // 啟動時必須的延時,等待lcm進入工作狀態 LcdReset(); // 這也是必需的....初始化 temp = 32; ePutstr(0,0,data1); // 上面一行顯示一個預定字符串 DispOneChar(0,0,0x3f); DispOneChar(1,0,0x3e); DispOneChar(2,0,0x3d); DispOneChar(0,1,0x30); DispOneChar(1,1,0x31); DispOneChar(2,1,0x32); Delay400Ms(); // 保留顯示內容 Delay400Ms(); Delay400Ms(); Delay400Ms(); Delay400Ms(); Delay400Ms(); Delay400Ms(); Delay400Ms();
while(1) { //temp &= 0x7f; // 只顯示ASCII字符
//if (temp<32)temp=32; // 屏蔽控制字符,不予顯示 //Display( temp++ ); Delay400Ms(); } }
/*======================================================= 顯示字符串 =======================================================*/ void ePutstr(Uchar x,Uchar y, Uchar code *ptr) { Uchar i,j=0; while (ptr[j] >31){j++;}; for (i=0;i<j;i++) { DispOneChar(x++,y,ptr[i]); if ( x == 16 ){ x = 0; y ++; } } }
/*======================================================= 演示一行連續字符串,配合上位程序演示移動字串 =======================================================*/ void Display( Uchar dd ) { Uchar i; for (i=0;i<16;i++) {
DispOneChar(i,1,dd++); dd &= 0x7f; if (dd<32) dd=32; } }
/*======================================================= 顯示光標定位 =======================================================*/ void LocateXY( char posx,char posy) { Uchar temp;
temp = posx & 0xf; posy &= 0x1; if ( posy ) temp |= 0x40; temp |= 0x80; LcdWriteCommand(temp,0); }
/*======================================================= 按指定位置顯示數出一個字符 =======================================================*/ void DispOneChar(Uchar x,Uchar y,Uchar Wdata) { LocateXY( x, y ); // 定位顯示地址 LcdWriteData( Wdata ); // 寫字符 }
/*======================================================= 初始化程序, 必須按照產品資料介紹的初始化過程進行 =======================================================*/ void LcdReset( void ) { LcdWriteCommand( 0x38, 0); // 顯示模式設置(不檢測忙信號) Delay5Ms(); LcdWriteCommand( 0x38, 0); // 共三次 Delay5Ms(); LcdWriteCommand( 0x38, 0); Delay5Ms();
LcdWriteCommand( 0x38, 1); // 顯示模式設置(以后均檢測忙信號) LcdWriteCommand( 0x08, 1); // 顯示關閉 LcdWriteCommand( 0x01, 1); // 顯示清屏 LcdWriteCommand( 0x06, 1); // 顯示光標移動設置 LcdWriteCommand( 0x0e, 1); // 顯示開及光標設置 LcdWriteCommand( 0x02, 1); }
/*======================================================= 寫控制字符子程序: E=1 RS=0 RW=0 =======================================================*/ void LcdWriteCommand( Uchar CMD,Uchar AttribC ) { if(AttribC){ P0=0xFF; RS=0; RW=1; E=1; while (P0_7!=0) { E=1; } E=0; } P0=CMD; RS=0; RW=0; E=1; _nop_(); E=0; } /*======================================================= 當前位置寫字符子程序: E =1 RS=1 RW=0 =======================================================*/ void LcdWriteData( char dataW ) { P0=0xFF; RS=0; RW=1; E=1; while (P0_7!=0) { E=1; } E=0; //is busy?
P0=dataW; //data is in write RS=1; RW=0; E=1; _nop_(); E=0; }
// 短延時 void Delay5Ms(void) { Uint i = 5552; while(i--); }
//長延時 void Delay400Ms(void) { Uchar i = 5; Uint j; while(i--) { j=7269; while(j--); }; } |