|
發布時間: 2014-10-3 22:12
正文摘要:51單片機最小系統板 如圖,寫入程序后12864液晶無法顯示,已經試過多次了。。唉。。 付上程序,看看哪時不行了?? #include "reg52.h" #include "intrins.h" sbit io_LCD12864_RS = P2^ ... |
| rst沒有強制復位一次 |
dgahz 發表于 2014-11-5 22:57 你好 我也是這個程序 出的問題 請問您改了哪三根控制線? |
wyy450y 發表于 2014-11-8 21:26 已經正常,換個程序就好了。。呵呵 |
| 是你接口沒整清楚吧 |
| 程序里由很多沒加分號 |
|
這個是我的板子上能正常顯示的程序,你也可以改一下接口或者顯示的字體。 //頭文件: #include <reg52.h> /********IO引腳定義***********************************************************/ sbit LCD_RS=P2^3;//定義引腳 sbit LCD_RW=P2^4; sbit LCD_E=P2^5; sbit PSB =P2^6; //PSB腳為12864-12系列的串、并通訊功能切換,使用8位并行接口,PSB=1 /********宏定義***********************************************************/ #define LCD_Data P0 #define Busy 0x80 //用于檢測LCD狀態字中的Busy標識 /********函數聲明*************************************************************/ void WriteDataLCD(unsigned char WDLCD); void WriteCommandLCD(unsigned char WCLCD,BuysC); unsigned char ReadDataLCD(void); unsigned char ReadStatusLCD(void); void LCDInit(void); void LCDClear(void); void LCDFlash(void); void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void); void Delay400Ms(void); /********數據定義*************************************************************/ code unsigned char uctech[] = {"5 1 單片機實驗板"}; code unsigned char net[] = {"lydz8.taobao.com"}; code unsigned char mcu[] = {"自學單片機的首選"}; code unsigned char qq[] = {" QQ: 52927029 "}; /***********主函數開始********************************************************/ void main(void) { Delay400Ms(); //啟動等待,等LCD講入工作狀態 LCDInit(); //LCM初始化 Delay5Ms(); //延時片刻(可不要) while(1){ LCDClear(); DisplayListChar(0,1,uctech); //顯示字庫中的中文數字 DisplayListChar(0,2,net); //顯示字庫中的中文數字 DisplayListChar(0,3,mcu); //顯示字庫中的中文 DisplayListChar(0,4,qq); //顯示字庫中的中文數字 Delay400Ms(); Delay400Ms(); Delay400Ms(); Delay400Ms(); LCDFlash(); //閃爍效果 } } /***********寫數據********************************************************/ void WriteDataLCD(unsigned char WDLCD) { ReadStatusLCD(); //檢測忙 LCD_RS = 1; LCD_RW = 0; LCD_Data = WDLCD; LCD_E = 1; LCD_E = 1; LCD_E = 0; } /***********寫指令********************************************************/ void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC為0時忽略忙檢測 { if (BuysC) ReadStatusLCD(); //根據需要檢測忙 LCD_RS = 0; LCD_RW = 0; LCD_Data = WCLCD; LCD_E = 1; LCD_E = 1; LCD_E = 0; } /***********讀數據********************************************************/ unsigned char ReadDataLCD(void) { unsigned char LCDDA; LCD_RS = 1; LCD_RW = 1; LCD_E = 1; LCD_E = 1; LCDDA=LCD_Data; LCD_E = 0; return(LCDDA); } /***********讀狀態*******************************************************/ unsigned char ReadStatusLCD(void) { LCD_Data = 0xFF; LCD_RS = 0; LCD_RW = 1; LCD_E = 1; LCD_E = 1; while (LCD_Data & Busy); //檢測忙信號 LCD_E = 0; return(1); } /***********初始化********************************************************/ void LCDInit(void) { WriteCommandLCD(0x30,1); //顯示模式設置,開始要求每次檢測忙信號 WriteCommandLCD(0x01,1); //顯示清屏 WriteCommandLCD(0x06,1); // 顯示光標移動設置 WriteCommandLCD(0x0C,1); // 顯示開及光標設置 } /***********清屏********************************************************/ void LCDClear(void) { WriteCommandLCD(0x01,1); //顯示清屏 WriteCommandLCD(0x34,1); // 顯示光標移動設置 WriteCommandLCD(0x30,1); // 顯示開及光標設置 } /***********閃爍效果********************************************************/ void LCDFlash(void) { WriteCommandLCD(0x08,1); //顯示清屏 Delay400Ms(); WriteCommandLCD(0x0c,1); // 顯示開及光標設置 Delay400Ms(); WriteCommandLCD(0x08,1); //顯示清屏 Delay400Ms(); WriteCommandLCD(0x0c,1); // 顯示開及光標設置 Delay400Ms(); WriteCommandLCD(0x08,1); //顯示清屏 Delay400Ms(); } /***********按指定位置顯示一個字符*******************************************/ void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { if(Y<1) Y=1; if(Y>4) Y=4; X &= 0x0F; //限制X不能大于16,Y不能大于1 switch(Y){ case 1:X|=0X80;break; case 2:X|=0X90;break; case 3:X|=0X88;break; case 4:X|=0X98;break; } WriteCommandLCD(X, 0); //這里不檢測忙信號,發送地址碼 WriteDataLCD(DData); } /***********按指定位置顯示一串字符*****************************************/ void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) { unsigned char ListLength,X2; ListLength = 0; X2=X; if(Y<1) Y=1; if(Y>4) Y=4; X &= 0x0F; //限制X不能大于16,Y在1-4之內 switch(Y){ case 1:X2|=0X80;break; //根據行數來選擇相應地址 case 2:X2|=0X90;break; case 3:X2|=0X88;break; case 4:X2|=0X98;break; } WriteCommandLCD(X2, 1); //發送地址碼 while (DData[ListLength]>=0x20){ //若到達字串尾則退出 if (X <= 0x0F){ //X坐標應小于0xF WriteDataLCD(DData[ListLength]); ListLength++; X++; Delay5Ms(); } } } /***********短延時********************************************************/ void Delay5Ms(void) { unsigned int TempCyc = 5552; while(TempCyc--); } /***********長延時********************************************************/ void Delay400Ms(void) { unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--){ TempCycB=7269; while(TempCycB--); } } |
| 能共享一下可用的程序嗎? |
vohang 發表于 2014-10-9 16:19 我換了其他的程序,,改了接口,現在可以顯示了,,,唉開始以為LCD是壞的。。呵呵 |
| 剛試了你的程序 也沒顯示出來 ,我也剛學 沒法幫你改呵呵,簡單的會改 |