12864和1602還是有一些相似之處的,但是論功能來(lái)看,12864還是強(qiáng)大很多的!
12864的操作方式有兩種----(串行和并行),就我個(gè)人而言是比較傾向于串行的,雖然程序稍微麻煩一點(diǎn),但是很節(jié)省GPIO的資源,這是很重要的,12864也可以實(shí)現(xiàn)繪制各種圖形的功能,和1602相似,個(gè)人認(rèn)為還是弄一個(gè)比較好用的取模軟件比較好,生成代碼后就可以顯示自己想要的圖形了(1602的使用里是有介紹的^_^)!
STC12C5410AD這款單片機(jī)和51單片機(jī)是十分相似的,相對(duì)比51而言,它更有了推挽輸出功能,AD轉(zhuǎn)換功能等;它內(nèi)部鎖相環(huán)也照比51強(qiáng)大的多,最高工作頻率可達(dá)30+M。它的基本操作方法和51是一樣的。
我來(lái)簡(jiǎn)單的介紹一下12864的顯示問(wèn)題:
1、字符產(chǎn)生ROM(CGROM)
里面提供了8192(213)個(gè)漢字GB2132宋體
2、顯示數(shù)據(jù)RAM(DDRAM)
內(nèi)部提供64*2位空間,最多可控制4行16字,也就是16個(gè)中文字型顯示,當(dāng)寫入顯示數(shù)據(jù)RAM時(shí),可分別顯示CGROM和CGRAM的字型,可以用來(lái)顯示三種字型:半角英文數(shù)字型、CGRAM字型和CGROM的中文字型,三種字型的選擇,由在DDRAM總寫入的編碼選擇,在0000H—0006H的編碼中(其代碼分別為0000、0002、0004、0006共四個(gè))將選擇CGRAM的自定義字型,02H—7FH的編碼中將顯示半角英文數(shù)字型的字型(也就是ASCII碼,大小為16*8),至于A1以上的編碼將自動(dòng)結(jié)合下一個(gè)位元組,組成兩個(gè)位元組的編碼,從而形成一個(gè)中文字型的編碼,也就是說(shuō)顯示一個(gè)漢字要兩個(gè)ASCII碼顯示的位置,即大小為16*16。BIG(A140—D75F),GB(A1A0—F7FF)。
下面我來(lái)寫一個(gè)顯示古詩(shī)《涼州詞》的程序,這個(gè)實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,可以參照數(shù)據(jù)手冊(cè)來(lái)看,無(wú)論什么時(shí)候,數(shù)據(jù)手冊(cè)都是十分重要的,其實(shí)就是一款產(chǎn)品的說(shuō)明書,所以學(xué)會(huì)自己閱讀數(shù)據(jù)手冊(cè)是很必要的哦^_^!
由于篇幅有限本文只列出了部分代碼,完整的源代碼下載地址:http://www.zg4o1577.cn/f/1286452.rar 以下是部分代碼
=======================================================================================
#include <stc12c5410ad.h> #include <intrins.h> sbit E_CLK =P1^2; //時(shí)鐘使能 sbit RW_SID=P1^1;//串行數(shù)據(jù)輸入、輸出端 sbit RS_CS =P1^0;//片選端 //宏定義 #define uint unsigned int #define uchar unsigned char //下面是數(shù)組定義 uchar code ts[]={"黃河遠(yuǎn)上白云間"}; uchar code tw[]={"一片孤城萬(wàn)仞山"}; uchar code ta[]={"羌笛何須怨楊柳"}; uchar code tb[]={"春風(fēng)不度玉門關(guān)"}; //延時(shí)子函數(shù) void delay(unsigned int xms) { unsigned int i,j; for(i=0; i<xms; i++) for(j=0;j<110;j++) {}; } //串行發(fā)送一字節(jié)數(shù)據(jù) void Send_Byte(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { delay(1); P1M0=0; P1M1=1; E_CLK=0; //時(shí)鐘線拉低 if(dat&0x80) RW_SID=1; else RW_SID=0; E_CLK=1; dat=dat<<1; } } //控制命令 void Send_command(unsigned char dat) { P1M0=0; P1M1=1; RS_CS=1; Send_Byte(0xF8);//11111,00,0 RW=0,RS=0 同步標(biāo)志 Send_Byte(dat&0xF0);//高四位 Send_Byte((dat&0x0F)<<4);//低四位 RS_CS=0; } //顯示數(shù)據(jù)或單字節(jié)字符 void Send_Dat(unsigned char dat) { RS_CS=1; Send_Byte(0xFA);//11111,01,0 RW=0,RS=1 Send_Byte(dat&0xF0);//高四位 Send_Byte((dat&0x0F)<<4);//低四位 RS_CS=0; } void display_1() { uchar a; Send_command(0x80); for(a=0;a<14;a++) { Send_Dat(ts[a]); } } void display_2() { uchar b; Send_command(0x90); for(b=0;b<14;b++) { Send_Dat(tw[b]); } } void display_3() { uchar c; Send_command(0x88); for(c=0;c<14;c++) { Send_Dat(ta[c]); } } void display_4() { uchar d; Send_command(0x98); for(d=0;d<14;d++) { Send_Dat(tb[d]); } } //初始化 LCD void init(void) { P1M0=0; P1M1=1; RS_CS=0; delay(1); Send_command(0x30);//功能設(shè)置,一次送8位數(shù)據(jù),基本指令集 Send_command(0x0c);//0000,1100 整體顯示,游標(biāo)on,游標(biāo)位置on Send_command(0x01);//0000,0001 清DDRAM Send_command(0x02);//0000,0010 DDRAM地址歸位 Send_command(0x80);//1000,0000 設(shè)定DDRAM 7位地址000,0000到地址計(jì)數(shù)器AC } void main(void) { init(); delay(1); display_1(); display_2(); display_3(); display_4(); while(1); } ========================================================================= 程序到這里結(jié)束,如果有什么想法或者建議請(qǐng)給我留言!