投訴(sù)熱(rè)線:13148701893
聯系人:鄧小姐
傳真:0755-27315661
0760-85884496
座機:0755-29769890-0
0760-85884486
辦(bàn)公地址:深圳市寶(bǎo)安區福永塘尾富華工業區11棟3樓
工廠(chǎng)地址:廣東(dōng)省中山市三鄉鎮萬裏路1号平鋪工業區B棟三樓
12864中文字庫(kù)液晶基本操作函數(shù)庫(kù)
來源:LCD液晶模塊廠家 發布時間:2018-01-15 點擊量:2895
module_12864.h
#include
#define IO_12864 P0 //定義12864的數(shù)據(jù)端口
sbit RS_12864 = P2^5; //定義命令數(shù)據(jù)寄存器選擇端
sbit RW_12864 = P2^6; //定義定義讀(dú)寫(xiě)控制端
sbit E_12864 = P2^7; //定義(yì)使能端
sbit RST_12864 = P2^2; //定義(yì)複(fù)位端
void delay_12864(unsigned int ); //延時(shí)子函數(shù)原型
void busychk_12864(void); //忙檢(jiǎn)測(cè)子函數原型
void wrtcom_12864(unsigned char); //寫(xiě)命令子函數(shù)原型
unsigned char reddat_12864(void); //讀(dú)數據(jù)子函數原型
void wrtdat_12864(unsigned char); //寫數(shù)據(jù)子函數(shù)原型
void drawpic_12864( unsigned char*); //繪(huì)圖子函數(shù)原型
void drawdot_12864(unsigned char,unsigned char,unsigned char);//畫(huà)點(diǎn)子函數原型
//畫矩形子函數原型
void drawrec_12864(unsigned char,unsigned char,
unsigned char,unsigned char,unsigned char);
void clnGDR_12864(void); //清空GDRAM子函數(shù)原型
//輸(shū)入短字符串子函數(shù)原型
void inputchars_12864(unsigned char,unsigned char,unsigned char*);
void scroll_12864(unsigned char*); //輸入長(zhǎng)字符串卷動(dòng)子函數原型
void initial_12864(void); //12864初始化子函數(shù)原型
modlule_12864.c
//*延時子程序,最大延遲(chí)時間(jiān)爲65ms
void delay_12864(unsigned int del){
unsigned int i;
for(i = 0; i < del; i++){;}
}
//*忙檢測(cè),若忙則等待,最長(zhǎng)等待時間爲60ms
void busychk_12864(void){
unsigned int timeout = 0;
E_12864 = 0;
RS_12864 = 0;
RW_12864 = 1;
E_12864 = 1;
while((IO_12864 & 0x80) && ++timeout != 0); //忙狀态檢測(cè),等待超時時間(jiān)爲60ms
E_12864 = 0;
}
//寫命令子程序
void wrtcom_12864(unsigned char com){
busychk_12864();
E_12864 = 0;
RS_12864 = 0;
RW_12864 = 0;
IO_12864 = com;
E_12864 = 1;
delay_12864(50); //使能延時50us!!!注意這裏,如果是較(jiào)快的CPU應該(gāi)延時久一些
E_12864 = 0;
}
//讀(dú)數據子程序,返回一個(gè)字節的數據
unsigned char reddat_12864(void){
unsigned char temp;
busychk_12864();
E_12864 = 0;
IO_12864 = 0xff; //IO口置高電(diàn)平,讀(dú)引腳
RS_12864 = 1;
RW_12864 = 1;
E_12864 = 1;
delay_12864(50); //使能延時50us!!!注意這裏,如果是較(jiào)快的CPU應該(gāi)延時久一些
temp = IO_12864;
return temp;
}
//寫數據子程序
void wrtdat_12864(unsigned char dat){
busychk_12864();
E_12864 = 0;
RS_12864 = 1;
RW_12864 = 0;
E_12864 = 1;
IO_12864 = dat;
delay_12864(50); //使能延時50us!!!注意這裏,如果是較(jiào)快的CPU應該(gāi)延時久一些
E_12864 = 0;
}
//顯示圖片函數,參(cān)數時圖片的地址,圖片必須是128*64像素的逐行逐行的點(diǎn)陣信息。
void drawpic_12864( unsigned char *pPicture ){
unsigned char j, k ;
wrtcom_12864(0x34); //在寫GDRAM的地址之前一定要打開(kāi)擴充指令集,否則地址寫不進(jìn)去!!
for( j = 0 ; j < 32 ; j++ )
{
wrtcom_12864(0x80 + j) ; //寫(xiě)Y 坐标
wrtcom_12864(0x80) ; //寫(xiě)X 坐标
for( k = 0 ; k < 16 ; k++ ) //寫一整行數(shù)據(jù)
{
wrtdat_12864( *pPicture++ );
}
}
for( j = 0 ; j < 32 ; j++ )
{
wrtcom_12864(0x80 + j) ; //寫(xiě)Y 坐标
wrtcom_12864(0x88) ; //寫(xiě)X 坐标
for( k = 0 ; k < 16 ; k++ ) //寫一整行數(shù)據(jù)
{
wrtdat_12864( *pPicture++ ) ;
}
}
wrtcom_12864(0x36); //打開(kāi)繪(huì)圖顯示
wrtcom_12864(0x30); //返回基本指令集
}
//畫點(diǎn)函數,左上角爲參(cān)考點(diǎn)(0,0)
//右下角爲(wèi)(127,63),點(diǎn)坐标形式爲(wèi)(行坐标,列坐标)
//參數type用於(yú)設置畫黑點、白點或取反(黑變(biàn)白,白變(biàn)黑)
//type = 0爲(wèi)白色,1 爲(wèi)黑色,2爲(wèi)取反
//畫(huà)完點(diǎn)不開啓顯示,需要自行開啓繪圖顯示
void drawdot_12864(unsigned char y,unsigned char x,unsigned char type){
unsigned char X,Y,k; //X存儲(chǔ)行地址,Y存儲(chǔ)列地址,k存儲(chǔ)點在字中的位置(0~15從(cóng)左至右)
unsigned char DH,DL;
if(y >= 0 && y <= 63 && x >= 0 && x <= 127) {
if(y < 32){ //確(què)定所畫點(diǎn)的地址行與列地址
X = 0x80 + (x >> 4);
Y = 0x80 + y;
}else{
X = 0x88 + (x >> 4);
Y = 0x80 + (y - 32);
}
wrtcom_12864(0x34); //開啓擴展指令,關(guān)閉(bì)繪圖顯示
wrtcom_12864(Y); //寫(xiě)行位地址
wrtcom_12864(X); //寫(xiě)列字地址
DH = reddat_12864(); //假讀(dú)
DH = reddat_12864(); //讀(dú)高字節(jié)
DL = reddat_12864(); //讀(dú)低字節(jié)
k = x % 16;
switch(type){ //判斷(duàn)類型,是黑點(diǎn)還是白點(diǎn)還是取反
case 0: //畫(huà)白點(diǎn)
if(k < 8){
DH &= ~(0x01 << (7 - k));
}else{
DL &= ~(0x01 << (7 - (k % 8)));
}
break;
case 1: //畫(huà)黑點(diǎn)
if(k < 8){
DH |= (0x01 << (7 - k));
}else{
DL |= (0x01 << (7 - (k % 8)));
}
break;
case 2: //對(duì)點(diǎn)取反
if(k < 8){
DH ^= (0x01 << (7 - k));
}else{
DL ^= (0x01 << (7 - (k % 8)));
}
break;
default:
break;
}
wrtcom_12864(Y); //寫(xiě)行位地址
wrtcom_12864(X); //寫(xiě)列字地址
wrtdat_12864(DH); //回寫(xiě)高字節(jié)
wrtdat_12864(DL); //回寫(xiě)低字節(jié)
wrtcom_12864(0x36); //開(kāi)啓繪(huì)圖顯示
wrtcom_12864(0x30); //轉(zhuǎn)回普通指令
}
}
//畫矩形子函數,參(cān)數爲(點(diǎn)1行坐标,點(diǎn)1列坐标,點(diǎn)2行坐标,點(diǎn)2列坐标,
//線條(tiáo)顔色(0爲白,1爲黑,2對(duì)原色取反))
void drawrec_12864(unsigned char y1,unsigned char x1,unsigned char y2,unsigned char x2,unsigned char type){
unsigned char largex,largey,smallx,smally;
unsigned char i;
if(x1 > x2){
largex = x1;
smallx = x2;
}else{
largex = x2;
smallx = x1;
}
if(y1 > y2){
largey = y1;
smally = y2;
}else{
largey = y2;
smally = y1;
}
//畫4條矩形邊框
for(i = smallx; i < largex; i++){
drawdot_12864(largey,i,type);
}
for(i = largey; i > smally; i--){
drawdot_12864(i,largex,type);
}
for(i = largex; i > smallx; i--){
drawdot_12864(smally,i,type);
}
for(i = smally; i < largey; i++){
drawdot_12864(i,smallx,type);
}
wrtcom_12864(0x30); //返回普通指令
}
//清空GDRAM,往GDRAM内部寫(xiě)滿(mǎn)0x00
void clnGDR_12864(void){
unsigned char j,k;
wrtcom_12864(0x34);//在寫GDRAM的地址之前一定要打開(kāi)擴充指令集,否則地址寫不進(jìn)去!!
for( j = 0 ; j < 32 ; j++ )
{
wrtcom_12864(0x80 + j) ; //寫(xiě)Y 坐标
wrtcom_12864(0x80) ; //寫(xiě)X 坐标
for( k = 0 ; k < 32 ; k++ ) //寫一整行數(shù)據(jù)
{
wrtdat_12864( 0x00 );
}
}
wrtcom_12864(0x30); //返回基本指令集
}
//寫入短字符串函數(shù),參(cān)數(shù)分别爲顯示行(0~3),顯示列(0~7),字符串首地址
//字符串隻會(huì)在一行顯示,超過(guò)的不顯示
void inputchars_12864(unsigned char y,unsigned char x,unsigned char *dataaddr){
unsigned char i,address;
switch (y){ //設(shè)置字符顯(xiǎn)示起始地址
case 0: address = 0x80 + x;
break;
case 1: address = 0x90 + x;
break;
case 2: address = 0x88 + x;
break;
case 3: address = 0x98 + x;
break;
default: break;
}
wrtcom_12864(0x30);
wrtcom_12864(address);
for(i = x;i < 8; i++){
if(*dataaddr != '\0'){
wrtdat_12864(*dataaddr++);
}
}
}
//長字符串顯示卷屏函數
void scroll_12864(unsigned char *ser){
//addr存儲(chǔ)地址的中間變(biàn)量,flag卷屏地址,hang要寫數據的行,
//over寫完字符串後(hòu)繼續寫的空字符計(jì)數
unsigned char i,addr,flag,hang,over,*ptdat;
ptdat = ser; //獲(huò)得字符串首地址
over = 0; //寫入空字符串(寫完字符串後(hòu))數(shù)目初始化爲0
wrtcom_12864(0x80); //寫(xiě)第一行字符
for(i = 0; i < 16; i++){
if(*ptdat != '\0'){
wrtdat_12864(*ptdat++);
}else{
wrtdat_12864(0x20);
over++;
}
}
wrtcom_12864(0x90); //寫(xiě)第二行字符
for(i = 0; i < 16; i++){
if(*ptdat != '\0'){
wrtdat_12864(*ptdat++);
}else{
wrtdat_12864(0x20);
over++;
}
}
wrtcom_12864(0x88); //寫(xiě)第三行字符
for(i = 0; i < 16; i++){
if(*ptdat != '\0'){
wrtdat_12864(*ptdat++);
}else{
wrtdat_12864(0x20);
over++;
}
}
wrtcom_12864(0x98); //寫(xiě)第四行字符
for(i = 0; i < 16; i++){
if(*ptdat != '\0'){
wrtdat_12864(*ptdat++);
}else{
wrtdat_12864(0x20);
over++;
}
}
ptdat = ptdat - 32;
wrtcom_12864(0xa0); //寫(xiě)第三行DDRAM,寫(xiě)入内容爲(wèi)第三行字符串和第五行字符串
for(i = 0; i < 16; i++){ //寫(xiě)第三行字符串
if(*ptdat != '\0'){
wrtdat_12864(*ptdat++);
}else{
wrtdat_12864(0x20);
over++;
}
}
ptdat = ptdat + 16;
for(i = 0; i < 16; i++){ //寫(xiě)第五行字符串
if(*ptdat != '\0'){
wrtdat_12864(*ptdat++);
}else{
wrtdat_12864(0x20);
over++;
}
}
wrtcom_12864(0x0c); //開(kāi)顯(xiǎn)示
if(over > 15){;} //顯(xiǎn)示字符不足4行,不卷動(dòng)
else //顯示字符大於(yú)4行,繼續寫字符,同時開啓卷動(dòng)
{
hang = 4;
flag = 0x01;
while(1){
switch(hang){ //設(shè)置寫(xiě)入DDRAM的地址
case 1: addr = 0x80; break;
case 2: addr = 0x90; break;
case 3: addr = 0xa0; break;
case 4: addr = 0xb0; break;
}
switch(hang){ //設(shè)置要寫數據(jù)的下一行
case 1: hang = 2; break;
case 2: hang = 3; break;
case 3: hang = 4; break;
case 4: hang = 1; break;
}
ptdat = ptdat - 32;
for(i = 0; i < 8; i++){
wrtcom_12864(0x34); //打開(kāi)擴(kuò)展指令
wrtcom_12864(0x03); //允許輸(shū)入卷動(dòng)地址
wrtcom_12864(0x40 + flag++); //設(shè)置卷動(dòng)地址
wrtcom_12864(0x30); //回到基本指令
wrtcom_12864(addr + i);
delay_12864(20000);
if(*ptdat != '\0'){
wrtdat_12864(*ptdat++); //連續寫入兩個(gè)字節(jié)之高字節(jié)
}else{
wrtdat_12864(0x20);
}
if(*ptdat != '\0'){
wrtdat_12864(*ptdat++); //連續寫入兩個(gè)字節(jié)之低字節(jié)
}else{
wrtdat_12864(0x20);
}
}
ptdat = ptdat + 16;
for(i = 8; i < 16; i++){
wrtcom_12864(0x34); //打開(kāi)擴(kuò)展指令
wrtcom_12864(0x03); //允許輸(shū)入卷動(dòng)地址
if(flag == 64){flag = 0;}
wrtcom_12864(0x40 + flag); //設(shè)置卷動(dòng)地址
flag++;
wrtcom_12864(0x30); //回到基本指令
wrtcom_12864(addr + i);
delay_12864(20000);
if(*ptdat != '\0'){
wrtdat_12864(*ptdat++); //連續寫入兩個(gè)字節(jié)之高字節(jié)
}else{
over++; //寫完最後(hòu)一行字符,需要再卷動(dòng)16次才能顯示出來。
wrtdat_12864(0x20);
}
if(*ptdat != '\0'){
wrtdat_12864(*ptdat++); /連續寫入兩個(gè)字節(jié)之低字節(jié)
}else{
wrtdat_12864(0x20);
}
}
if(over < 8){;} //最後一行顯示完畢(bì)則停止卷動(dòng)
else {break;}
}
}
}
//初始化12864子函數(shù)
void initial_12864(void){
delay_12864(40000);
RST_12864 = 1;
RST_12864 = 0; //複(fù)位
delay_12864(500);
RST_12864 = 1;
wrtcom_12864(0x30); //設(shè)置爲基本指令集動(dòng)作
delay_12864(100);
wrtcom_12864(0x30); //設(shè)置爲基本指令集動(dòng)作
delay_12864(37);
wrtcom_12864(0x08); //設置顯示、光标、閃(shǎn)爍全關(guān)。
delay_12864(100);
wrtcom_12864(0x01); //清屏,並(bìng)且DDRAM數據(jù)指針清零
delay_12864(100000);
wrtcom_12864(0x06); //進(jìn)入模式設(shè)置
wrtcom_12864(0x0c); //開(kāi)顯(xiǎn)示
}
深圳佳顯電子技術有限公司10年專注LCD液晶模塊,LCM中文字庫液晶批發,12864中文字庫液晶,lcd液晶模組,lcd液晶顯示屏批發等以及其他lcd液晶産品,lcd液晶模塊價格全國最優惠!
相關産品
熱點資訊
- 廣州lcd液晶模組生産廠家2021-08-23
- 佛山lcd液晶顯示屏加工2021-08-23
- 上海12864中文字庫液晶價格2021-08-22
- 湖南LCM中文字庫液晶批發2021-08-22
- 湖北LCD液晶屏加工價格2021-08-21
- 惠州LCD液晶屏加工生産廠家2021-08-21
- 深圳lcd液晶顯示屏加工2021-08-20
- 杭州lcd液晶模組價格2021-08-20





