本人初次學習使用LCD12864
初學者都是一句一句照搬的,高手略過!程式中多出一堆無用的東西,要弄明白,要折騰好一會兒。網上查找pos=X+Y,也得不到答案。本文答案來了:本程式不用Y,(等我學習到用Y的時候,再和大家分享)
幾點體會:
我用天祥TX-1C開發板,下載光碟12864A-3.c源程式(E:新概念51單片機C語言教程\光碟資料\3. 示例代碼和模塊資料\2. 擴展模塊\3.12864液晶\12864帶字庫測驗程式),發現一些錯誤和未用陳述句、定義,為了方便和我一樣的初學者學習,現在帖出來,供參考,有錯誤的地方敬請老師指正。
(1)35到39行,定義和申明未用到,分別是:
uchar IRDIS[2];
uchar IRCOM[4];
void delay0(uchar x);
void beep();
void dataconv();
第40句void lcd_pos(uchar X,uchar Y);
現改為void lcd_pos(uchar X);Y引數定義未用到,圖形GDRAM操作時應該會用到Y。
(2)74行result = (bit)(P0&0x80); 的意思是:得到的結果是1為忙,
0為空,并回傳此資料
(3)148 行 lcd_pos(0,0); //設定顯示位置為第一行的第1個字符,
改為lcd_pos(0); 只用到x,用不到Y,我為pos=X+Y頭痛了很久。
(4)182~195行,此延時函式在程式中未被呼叫。
(5)214行 pos = X+Y ; 改為: pos = X;
0錯誤0警告,下載,顯示圖片如下:

C語言源程式:
/********************************************************/
/* 這個程式我是上機測驗過的,修改了其中沒有用到的部份和錯的地方,比如pos=X+Y,這種方式,應該是圖形操作中用到 ,
本程式0錯誤0警告
LCD型號:TS12864A-3(帶漢字庫)或兼容型號 控制器ST7920
MCU:STC89S52,晶體頻率:11.0592MHz */
/*【宣告】此程式僅用于學習與參考,參考請注明著作權和作者資訊! */
/*********************************************************/
#include <reg51.h>
#include <intrins.h> //含有空操作和回圈移位指令
#define uchar unsigned char
#define uint unsigned int
/*12864埠定義*/
#define LCD_data P0 //資料口
sbit LCD_RS = P3^5; //暫存器選擇輸入
sbit LCD_RW = P3^6; //液晶讀/寫控制
sbit LCD_EN = P3^4; //液晶使能控制
sbit LCD_PSB = P3^7; //串/并方式控制
sbit wela = P2^6;
sbit dula = P2^7;
uchar code dis1[] = {"天祥電子"};
uchar code dis2[] = {" www.txmcu.com"};
uchar code dis3[] = {"TX-1C 開發板帶您 "};
uchar code dis4[] = {"進入單片機的世界"};
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*uchar IRDIS[2]; //沒有用到
uchar IRCOM[4];
void delay0(uchar x); //x*0.14MS沒有用到
void beep();
void dataconv();
void lcd_pos(uchar X,uchar Y); //確定顯示位置 */
void lcd_pos(uchar X);
/*********************************************************/
/*延時函式 */
/**********************************************************/
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*********************************************************/
/*檢查LCD忙狀態 */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與資料。 */
/**********************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80); //得到的結果是1為忙,0為空,回傳此資料
LCD_EN = 0;
return(result);
}
/**********************************************************/
/*
/*寫指令資料到LCD
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
/**********************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy()); // 1時,一時等待,0時執行下面的程式
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/**********************************************************/
/*
/*寫顯示資料到LCD
/*RS=H,RW=L,E=高脈沖,D0-D7=資料。 */
/*********************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/**********************************************************/
/*
/*LCD初始化設定 */
/*********************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
lcd_wcmd(0x34); //擴充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //顯示開,關游標
delay(5);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(5);
}
/*********************************************************/
/* 主程式 */
/*********************************************************/
main()
{
uchar i;
delay(10); //延時
wela=0;
dula=0;
lcd_init(); //初始化LCD
/* lcd_pos(0,0); //設定顯示位置為第一行的第1個字符 */
lcd_pos(0); //只需要一個地址
i = 0;
while(dis1[i] != '\0')
{ //顯示字符
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(1); //設定顯示位置為第二行的第1個字符
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); //顯示字符
i++;
}
lcd_pos(2); //設定顯示位置為第三行的第1個字符
i = 0;
while(dis3[i] != '\0')
{
lcd_wdat(dis3[i]); //顯示字符
i++;
}
lcd_pos(3); //設定顯示位置為第四行的第1個字符
i = 0;
while(dis4[i] != '\0')
{
lcd_wdat(dis4[i]); //顯示字符
i++;
}
while(1);
}
/*********************************************************/
/* 延時x*0.14ms子程式 這個延時子程式沒有用到過
/*********************************************************/
/*void delay0(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
} */
/*********************************************************/
/* 設定顯示位置 */
/*********************************************************/
/*void lcd_pos(uchar X,uchar Y)*/ //Y沒有用
void lcd_pos(uchar X)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
/* pos = X+Y ; */
pos = X;
lcd_wcmd(pos); //顯示地址
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/230069.html
標籤:新手樂園
