清風斜影:
/*SMC1602A(16*2)模擬口線接線方式連接線圖: --------------------------------------------------- |LCM-----51 |LCM-----51 |LCM------51 | --------------------------------------------------| |DB0-----P0.0|DB4-----P0.4|RW-------P2.1 | |DB1-----P0.1|DB5-----P0.5|RS-------P2.0 | |DB2-----P0.2|DB6-----P0.6|E--------P2.2 | |DB3-----P0.3|DB7-----P0.7|VLCD接1K電阻到GND| ---------------------------------------------------=============================================================*/#includesbitLCM_RW=P2^1;//定義引腳sbitLCM_RS=P2^0;sbitLCM_E=P2^2;#defineLCM_DataP0#defineBusy 0x80//用于檢測LCM狀態字中的Busy標識voidWriteDataLCM(unsignedcharWDLCM);voidWriteCommandLCM(unsignedcharWCLCM,BuysC);unsignedcharReadDataLCM(void);unsignedcharReadStatusLCM(void);voidLCMInit(void);voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);voidDelay5Ms(void);voidDelay400Ms(void);//unsignedcharcodeuctech[]={"uctech"};//unsignedcharcodenet[]={"uctech.icpcn.com"};voidmain(void){Delay400Ms();//啟動等待,等LCM講入工作狀態LCMInit();//LCM初始化Delay5Ms();//延時片刻(可不要)//DisplayListChar(0,0,"9.63_8.24");DisplayListChar(0,1,"123.456"); DisplayOneChar(7,0,0x44); DisplayOneChar(8,0,0x46);//DisplayOneChar(8,0,0x20); DisplayOneChar(9,0,0x43);//ReadDataLCM();//測試用句無意義while(1);}/*----------------------------------------------------------------*//*寫數據 *//* 輸入:RS=1,RW=0,E=1,D0~D7=數據,E=高脈沖 輸出:無 *//*----------------------------------------------------------------*/voidWriteDataLCM(unsignedcharWDLCM){ReadStatusLCM();//檢測忙LCM_Data=WDLCM;LCM_RS=1;LCM_RW=0;LCM_E=0;//若晶振速度太高可以在這后加小的延時LCM_E=0;//延時LCM_E=1;}/*----------------------------------------------------------------*//*寫指令 *//* 輸入:RS=0,RW=0,E=1,D0~D7=指令碼,E=高脈沖 輸出:無 *//*----------------------------------------------------------------*/voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC為0時忽略忙檢測{if(BuysC)ReadStatusLCM();//根據需要檢測忙LCM_Data=WCLCM;LCM_RS=0;LCM_RW=0;LCM_E=0;LCM_E=0;LCM_E=1;}/*----------------------------------------------------------------*//*讀數據 *//* 輸入:RS=1,RW=1,E=1 輸出:D0~D7=數據 *//*----------------------------------------------------------------*/unsignedcharReadDataLCM(void){LCM_RS=1;LCM_RW=1;LCM_E=0;LCM_E=0;LCM_E=1;return(LCM_Data);}/*==========================*//*讀狀態:輸入:RS=0,RW=1,E=1 輸出:D0~D7狀態字 *//* 狀態字說明 *//* D0~D6當前數據地址指針的數值 *//* D7 讀寫操作使能 1:禁止 0:允許 *//*==========================*/unsignedcharReadStatusLCM(void){LCM_Data=0xFF;LCM_RS=0;LCM_RW=1;LCM_E=0;LCM_E=0;LCM_E=1;while(LCM_Data&Busy);//檢測忙信號return(LCM_Data);}voidLCMInit(void)//LCM初始化{LCM_Data=0;WriteCommandLCM(0x38,0);//三次顯示模式設置,不檢測忙信號Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1);//顯示模式設置,開始要求每次檢測忙信號WriteCommandLCM(0x08,1);//關閉顯示WriteCommandLCM(0x01,1);//顯示清屏WriteCommandLCM(0x06,1);//顯示光標移動設置WriteCommandLCM(0x0C,1);//顯示開及光標設置}//按指定位置顯示一個字符voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData){Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1if(Y)X|=0x40;//當要顯示第二行時地址碼+0x40;X|=0x80;//算出指令碼WriteCommandLCM(X,0);//這里不檢測忙信號,發送地址碼WriteDataLCM(DData);}//按指定位置顯示一串字符voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData){unsignedcharListLength; ListLength=0;Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1while(DData[ListLength]>0x20)//若到達字串尾則退出 { if(X