導航:首頁 > 文件教程 > 12864液晶屏教程

12864液晶屏教程

發布時間:2023-02-19 12:49:41

A. 怎麼編寫程序使12864液晶顯示

你好:

如果你的12864是帶字型檔的話,只要寫好了驅動,直接在寫數據函數里版用雙引號寫一個權漢字就能直接顯示。

如果不是帶字型檔的液晶,就是通過繪圖的方式,用字模軟體畫出圖形,用液晶顯示就行了。

這兩種液晶的程序我也有,如果你需要回復我。

希望我的回答能幫助到你。

B. 關於單片機液晶屏LCD12864的程序

/*****************************************************************

*程序名稱:帶漢字型檔的12864液晶顯示模塊驅動

*程序功能:顯示字元 、漢字和圖片

*開發工具:Kile

* MCU型號:AT89S52-24PU

*時鍾頻率:11.0592MHZ

*程序作者:yuan

*版權說明:yuan

*****************************************************************/
#include<reg52.h>
#include "lcd.h"
#include "util.h"

sbit E=P1^5;//脈沖使能
sbit RW=P1^6;//讀寫選擇
sbit RS=P1^7;//數據命令選擇
sbit rst=P3^6;//12864復位

// 延時ms函數:

// 12864檢查狀態函數:
void Check12864State(void)
{

P0=0xff;
E=0;//讀狀態前三控制線的狀態
RS=0;
RW=1;
E=1;//拉高,讀狀態
while((P0&0x80)==0x80);//等待空閑
E=0;//寫命令後三控制線的狀態
RS=1;
RW=0;

}

// 12864寫命令函數:
void Write12864Command( unsigned char com)
{

Check12864State();//檢查狀態
P0=com;//賦值
E=0;//寫命令前三控制線的狀態
RS=0;
RW=0;
E=1;//拉高,寫命令
E=0;//寫命令後三控制線的狀態
RS=1;
RW=1;

}

//12864寫數據函數:
void Write12864Data( unsigned char dat)
{

Check12864State();//檢查狀態
P0=dat;//賦值
E=0;//寫數據前三控制線的狀態
RS=1;
RW=0;
E=1;//拉高,寫數據
E=0;//寫數據後三控制線的狀態
RS=0;
RW=1;

}

//在指定的位置顯示字元串(漢字和ASCII碼字元)函數:
void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)
//y-行數值0-3,x-列數值0-7,pstr-字元串指針
//12864可以顯示32個漢字(四行每行8個),一個地址對應一個漢字
//可以顯示64個ASCII碼字元(四行每行16個),一個地址對應兩個字元
//為了實現自動換行功能,這個函數比較繁瑣
{

unsigned char row,n=0;
Write12864Command(0x30);//基本指令
Write12864Command(0x06);//地址計數器自動加以,游標右移
switch(y)//根據行號選擇行地址
{

case 0:row=0x80;break;//第一行首地址
case 1:row=0x90;break;//第二行首地址
case 2:row=0x88;break;//第三行首地址
case 3:row=0x98;break;//第四行首地址
default:;

}

Write12864Command(row+x);//寫地址
while(*pstr!='\0')
{

Write12864Data(*pstr);//寫字元
pstr++;
n++;//計數
if((n+x*2)==16)//如果一行寫完 ,繼續寫第二行
{
if(y==0) Write12864Command(0x90);//寫下一行地址
else if(y==1) Write12864Command(0x88);//寫下一行地址
else if(y==2) Write12864Command(0x98);//寫下一行地址
else ;

}
else if((n+x*2)==32)//如果第二行寫完 ,繼續寫第三行
{

if(y==0) Write12864Command(0x88);//寫下一行地址
else if(y==1) Write12864Command(0x98);//寫下一行地址
else ;
}

else if((n+x*2)==48)//如果第三行寫完 ,繼續寫第四行
{
if(y==0) Write12864Command(0x98);//寫下一行地址
else ;
}
else ;
}

}

//圖片模式清屏函數:
void Clear12864Screen()
{

unsigned char i,j;
Write12864Command(0x34);//功能設定:8位控制方式,使用擴充指令
Write12864Command(0x36);//使用擴充指令,繪圖顯示控制
for(i=0;i<32;i++)

//ST7920可控制256*32點陣(32行256列),而12864液晶實際的行地址只有0-31行,

//12864液晶的32-63行的行是0-31行地址從第128列劃分一半出來的,所以分為上下兩半屏,

//也就是說第0行和第32行同屬一行,行地址相同;第1行和第33行同屬一行,以此類推

{

Write12864Command(0x80|i);//寫行地址(垂直地址)
Write12864Command(0x80);//寫列地址(水平地址)
for(j=0;j<32;j++)
Write12864Data(0x00);//清屏

}

}

//在任意位置顯示任意大小的圖片函數:

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,

unsigned char px,unsigned char py, unsigned char *pp)

//y-起始行(數值0-63),x-起始列(16位寬,數值0-7),

//px-圖片寬度,py-圖片高度,pp-指針指向圖片數組

//因為上下屏的地址不連續,要在任意位置顯示完整的圖像,處理起來比較繁瑣

{

unsigned char i,j,k;
Clear12864Screen();//清屏
if(y<32)//如果起始行在上半屏
{

k=32-y;//算出上半屏的行數
for(i=0;i<k;i++,y++)//上半屏行數
{
Write12864Command(0x80|y);//寫行地址(垂直地址)
Write12864Command(0x80|x);//寫列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//寫圖片數據

}

y=0;//下半屏起始行,接上半屏繼續寫數據
for(;i<py;i++,y++)//下半屏剩下的行數
{

Write12864Command(0x80|y);//寫行地址(垂直地址)
Write12864Command(0x80|(8+x));//寫列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//寫圖片數據

}

}

else //如果起始行在下半屏

{

for(i=0;i<py;i++,y++)//行數
{
Write12864Command(0x80|(y-32));//寫行地址(垂直地址)
Write12864Command(0x80|(8+x));//寫列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//寫圖片數據

}

}

}

void Clear12864Text()
{
Write12864Command(0x34);//清屏
DelayMs(5);
Write12864Command(0x30);//清屏
DelayMs(5);
Write12864Command(0x01);//清屏
DelayMs(5);
}

//12864初始化函數:
void Initialize12864()
{

rst=0;//復位12864
DelayMs(30);
rst=1;
DelayMs(20);
Write12864Command(0x30);//功能設定:8位控制方式,使用基本指令
Write12864Command(0x08);//顯示關
Write12864Command(0x01);//清屏
Write12864Command(0x06);//地址計數器加一、游標右移
Write12864Command(0x0c);//顯示開

}

帶字型檔的驅動

C. 如何用12864液晶屏顯示圖形程序

12864內部有驅動電路和字型檔緩存晶元,數據就是按照說明輸進去,驅動顯示和字型檔點陣都由12864內部的電路和晶元處理。內部怎麼驅動我們使用者不需要管,只要看介面電路和介面輸入方法就行。
這個是不能用單片機的串口,LCD的串列的時序跟單片機串口的時序是不同的,(具體參考12864的說明書,上邊有LCD的串列時序)。
LCD串列顯示的速度比較慢,大約是並行的1/24,但是所需引腳比較少(3個)。
LCD並行顯示的速度快,但所需管腳比較多(11個)。
只做簡單的游戲機的話,管腳應該是夠用的,可以考慮用並行顯示。

D. LCD 12864怎樣和單片機連接

LCD 12864液晶屏工作電壓+3.0V~+5.5V,邏輯電平與單片機兼容,能夠直接與單片機的IO口連接。

12864液晶屏的介面方式有並行4位、並行8位、串列2線和串列3線,以適應不同的應用場合。

兩個以上的 12864LCD跟單片機連接, 只要選通線 接不同的引腳,及對比度分別控制,其它的如數據線、讀寫線,都可以共用,讀寫時分別選需要制的LCD就可以了,來完成所需要的不同內容。

串口控制和I2C不同,串口時只要程序里有這樣幾句:SBUF=dat;while(!TI);TI=0;就可以輸出控制量dat了,而使用I2C控制就不同了,實際應用時要有:確定總模擬線數據傳輸介面、模擬時鍾介面,匯流排啟動、匯流排應答、匯流排停止、匯流排發送單位元組、匯流排發送數據等等許多模擬時序的問題。

(4)12864液晶屏教程擴展閱讀:

單片機的選擇:

各種單片機都有各自的優缺點,應根據需要選擇。選擇單片機原則如下:

1、單片機的基本參數例如速度,程序存儲器容量,I/O引腳數量。

2、單片機的增強功能,例如看門狗,雙指針,雙串口,RTC(實時時鍾),EEPROM,擴展RAM,CAN介面,I2C介面,SPI介面,USB介面。

3、Flash和OTP(一次性可編程)相比較,最好是Flash。

4、封裝IP(雙列直插),PLCC(PLCC有對應插座)還是貼片。DIP封裝在做實驗時可能方便一點。

5、工作溫度范圍,工業級還是商業機。如果設計戶外產品,必須選用工業級。

6、功耗,比如設計並口加密狗,信號線取電只能提供幾個mA,用PIC就是因為低功耗,後來出了MSP430也不錯。

E. 12864LCD 液晶顯示的流程圖

帶中文字型檔的128X64是一種具有4位/8 位並行、2線或3線串列多種介面方式,內部含有國標一級、二級簡體中文字型檔的點陣圖形液晶顯示模塊。

其顯示解析度為128×64,內置8192個16*16點漢字,和128個16*8點ASCII字元集,利用該模塊靈活的介面方式和簡單、方便的操作指令,可構成全中文人機交互圖形界面。可以顯示8×4行16×16點陣的漢字,也可完成圖形顯示,低電壓低功耗是其又一顯著特點。

由該模塊構成的液晶顯示方案與同類型的圖形點陣液晶顯示模塊相比,不論硬體電路結構或顯示程序都要簡潔得多,且該模塊的價格也略低於相同點陣的圖形液晶模塊。

(5)12864液晶屏教程擴展閱讀:

用帶中文字型檔的128X64顯示模塊時應注意以下幾點:

1.欲在某一個位置顯示中文字元時,應先設定顯示字元位置,即先設定顯示地址,再寫入中文字元編碼。

2.顯示ASCII字元過程與顯示中文字元過程相同。不過在顯示連續字元時,只須設定一次顯示地址,由模塊自動對地址加1指向下一個字元位置,否則,顯示的字元中將會有一個空ASCII字元位置。

3.當字元編碼為2位元組時,應先寫入高位位元組,再寫入低位位元組。

4.模塊在接收指令前,向處理器必須先確認模塊內部處於非忙狀態,即讀取BF標志時BF需為「0」,方可接受新的指令。

如果在送出一個指令前不檢查BF標志,則在前一個指令和這個指令中間必須延遲一段較長的時間,即等待前一個指令確定執行完成。指令執行的時間請參考指令表中的指令執行時間說明。

5.「RE」為基本指令集與擴充指令集的選擇控制位。當變更「RE」後,以後的指令集將維持在最後的狀態,除非再次變更「RE」位,否則使用相同指令集時,無需每次均重設「RE」位。

F. 怎樣用12864液晶顯示屏畫實時曲線

一. 顯示圖片

顯示圖片的要點在於:1.取模 2.利用擴展指令設置液晶.清楚液晶地址的概念
1.1取模
取模軟體用的是「字模221」下圖是他的參數設置

這里對參數設置先解釋一下,所謂橫向取模就是,一張圖片從圖片最左上角的8位開始取模,從左向右,每次取8位二進制數據轉化為16進制保存,第一排取完之後,接著到第二排最左邊8位開始取模,以此類推。為什麼要這樣取模呢?因為12864液晶的橫縱坐標就是這個取模順序,這點在之後還會詳細提到。
1.2液晶的設置
液晶顯示圖片必須用擴充指令集,初始化和顯示字元的初始化不一樣。我用的初始化函數如下:

void init_picture()//顯示圖片的初始化函數
{
lcd_wcmd(0x36);//寫指令函數,擴充指令集,繪圖G=1打開
lcd_wcmd(0x36);
lcd_wcmd(0x3E);
lcd_wcmd(0x01);//清屏
Light= 0;//打開背光
}
1.3將取出的字模寫進相應地址
首先應該知道地址究竟是怎樣的,結合下圖講清楚。12864液晶分為半屏和下半屏。當你想要點亮某個地方時,必須先寫這個地方的垂直地址緊接著寫入它的水平地址,水平地址液晶可以自動加1,而垂直地址不會。圖中水平坐標從0x80+00到0x80+0F,一共16個,其中0x80+00到0x80+07是上半屏的坐標,其中0x80+08到0x80+0F是下半屏的坐標。水平坐標每個兩位元組,先寫入的數據填充在高位元組。垂直坐標只有0x80+00到0x80+1F,圖中上半截0x80+00到0x80+1F是上半屏的垂直地址,另外的那部分一樣的是下半屏垂直地址。每個垂直地址只確定一排,所以水平和垂直地址不能確定某個點的位置,只能確定某個兩位元組的位置,通過寫進2位元組數據確定點亮某個點或幾個點。比如我們寫入lcd_wcmd(0x81;(垂直地址)lcd_wcmd(0x80)(水平地址); 這就是說我們將在圖中水平坐標00,垂直坐標01的位置(紅圈處)輸入數據。

知道地址的知識之後就明白為什麼要橫向取模了,接下來只要將取模的數據一個個按取模生成的順序寫進液晶就行了。下面是我用的代碼,其中uchar=unsignedchar,uint=unsigned int。
void show_Pic(uchar*address)//顯示圖片函數
{ //address是是指向數組的指針,用法:show_Pic(XY)當中XY為數組名
uchari,j;
for(i=0;i<32;i++) //上半屏的32排依次先寫滿
{
lcd_wcmd(0x80+i);//先送垂直地址
lcd_wcmd(0x80); //再送水平地址,水平地址可自加1
for(j=0;j<16;j++)//每排128個點,所以一共要16個兩位16進制數(也就是8位二進制數)才能全部控制
{
lcd_wdat(*address);
address++;
}
}
for(i=0;i<32;i++) //下半屏的32排操作原理和上半屏一樣
{
lcd_wcmd(0x80+i);
lcd_wcmd(0x88);
for(j=0;j<16;j++)
{
lcd_wdat(*address);
address++;
}
}
}
1.4實際顯示結果
下圖是我顯示的一個坐標系和一條龍

下面的代碼是我的主函數,這部分加上上面我上面講的函數和一些基本設置就是整個代碼,XY是這幅坐標圖片取模得到的數組

void main()
{
init_picture();
文章原創來於12864:http://www.hzjingxian.com
show_Pic(XY);
while(1) //進入程序主循環
{
}
}
二. 用打點方式顯示任意圖像
有的同學認為打點只需按照上面的顯示圖片的方法點亮需要的點就是了,其實這不行。因為你寫進去的是八個點的控制,會影響周圍的點,很容易出現亂碼。比如,你寫進去的是0x80,x想的是只點亮左邊一個點,其他的都不要影響,但是右邊的7個0也是會顯示的,如果在要顯示0的地方原來顯示的是1的話,你現在寫進去的0就把1覆蓋了,這樣就容易產生亂碼。所以我建議,你先把液晶的數據讀出來,再用data&=(~(0x01<<(7-bit)))(bit是你點亮哪一位,data是讀出來的數據)置0,置1也是類似的,最後再把data重新寫進去就行了。
我的單片機介面是亂的,所以每一個液晶介面都用了位定義,並且用到了寄存器B,寄存器B的每一個當做一個變數的位來操作。我的具體代碼如下:

bit lcd_busy() // 讀寫判斷數據的D7讀寫位,用於判斷1602是否忙
{
bitresult;
D7 =1; //數據口D7置1,為讀狀態做准備
LCD_RS = 0; // 選擇指令寄存
LCD_RW = 1; // 選擇讀控制線
LCD_EN = 1; // 開使能控制線
delayNOP(); // 時序延時
result = D7; // 讀D7的電平
LCD_EN = 0; // 關使能
return(result); // 返回值1:忙,0可以執行操作
}
unsigned charreadData(void) //讀取數據函數
{
uchar i;
D0 = 1; D1 = 1; D2 = 1; D3 = 1;
D4 = 1; D5 = 1; D6 = 1; D7 = 1;
lcd_busy();
LCD_RS=1; LCD_RW=1;
LCD_EN=0; LCD_EN=1;
B_0=D0;B_1=D1; B_2=D2; B_3=D3;//B_1=B^1,在程序前段有位定義
B_4=D4;B_5=D5; B_6=D6;B_7=D7;
for(i=1;i<=7;i++)
delayNOP();//這個函數是{_nop_();_nop_();_nop_();_nop_();};
LCD_EN=0;
returnB;
}
uchar DrawDots(uchar x,uchar y,ucharcolor)//打點函數
{
ucharrow,xlabel,xlabel_bit;
uchar Read_H=0,Read_L=0;
lcd_wcmd(0x34); //擴充指令
lcd_wcmd(0x36); //繪圖指令
xlabel=x>>4; //去16*16首地址
xlabel_bit=x & 0x0F;
if(y<32) row=y;
else
{
row=y-32;
xlabel+=8;
}
lcd_wcmd(row+0x80);
lcd_wcmd(xlabel+0x80);
readData();
Read_H=readData();
Read_L=readData();

lcd_wcmd(row+0x80);
lcd_wcmd(xlabel+0x80);

if(xlabel_bit<8)
{
switch(color)
{
case 0:Read_H&=(~(0x01<<(7-xlabel_bit))); break; //變暗,看不見
case 1:Read_H |=(0x01<<(7-xlabel_bit));break; //變亮 ,看得見
case 2:Read_H ^=(0x01<<(7-xlabel_bit));break; //反轉
default:break;
}
lcd_wdat(Read_H);
lcd_wdat(Read_L);
}
else
{
switch(color)
{
case 0:Read_L&=(~(0x01<<(15-xlabel_bit))); break; //變暗 ,看不見
case 1:Read_L |=(0x01<<(15-xlabel_bit));break; //變亮 ,看得見
case 2:Read_L ^=(0x01<<(15-xlabel_bit));break; //反轉
default:break;
}
lcd_wdat(Read_H);
lcd_wdat(Read_L);
}
lcd_wcmd(0x30);//恢復正常模式
}
如果你的單片機和12864介面不是亂的,那可以這樣寫讀取函數
unsigned charreadData(void)
{
uchar i ,data;
P0=0xFF;
lcd_busy();
LCD_RS=1; LCD_RW=1;//
LCD_EN=0; LCD_EN=1;
data=P0;
for(i=1;i<=7;i++)
delayNOP();
LCD_EN=0;
returndata;
}
這樣,整個代碼就全部講完了,下面是顯示正弦波的圖片

閱讀全文

與12864液晶屏教程相關的資料

熱點內容
怎麼做到徹底理解編程語言 瀏覽:167
機器人和程序編程哪個好 瀏覽:563
怎麼改蘋果手機icloud賬號和密碼 瀏覽:526
什麼是P2P資料庫系統 瀏覽:494
js遍歷標簽數組長度 瀏覽:705
為什麼u盤讀有些文件讀取不出來 瀏覽:485
linux內核體系架構 瀏覽:758
java高低位元組 瀏覽:105
win10安全模式也死機 瀏覽:159
最簡單的資料庫開發軟體 瀏覽:718
迅雷下載網路斷開 瀏覽:792
考勤系統資料庫在哪個文件夾 瀏覽:134
creo30繪圖配置文件設置 瀏覽:624
蘋果ID被鎖要交600元交不交 瀏覽:29
實例化module配置文件失敗 瀏覽:872
網站源碼是什麼東西 瀏覽:90
怎樣打開桌面隱藏文件 瀏覽:904
拯救者的顏色配置文件 瀏覽:860
微信轉發朋友圈送禮品 瀏覽:905
新電腦裝win10教程 瀏覽:130

友情鏈接