?? lcd12864.c
字號:
#include<PIC18.h>
#include "def.h"
#include "lib.h"
/*
將整型數據分離開
*/
void data_change(uint data)
{
uint a=data;
display_data[0]=(uchar)(a%10);
a/=10;
display_data[1]=(uchar)(a%10);
a/=10;
display_data[2]=(uchar)(a%10);
a/=10;
display_data[3]=(uchar)(a%10);
}
/*
串行發送一個字節數據
*/
void data_send(uchar data)
{
uchar i,s,temp;
s=data;
sclk=0;
for(i=0;i<8;i++)
{
sclk=0;
delay(1);
temp=s&0x80;
if(temp)
{lcd_di=1;}
else
{lcd_di=0;}
sclk=1;
s=s<<1;
}
}
/*************************************************/
//寫命令,串行模式
/*************************************************/
void w_com(unsigned char x)
{
a0=0;
cs1=0;
data_send(x);
}
/*************************************************/
//寫數據,串行模式
/*************************************************/
void wdata(unsigned char dat)
{
a0=1;
cs1=0;
data_send(dat);
}
void display_map(
const uchar *mapdata,//顯示圖形時的數據指針
uchar startpage,//起始頁面
uchar endpage,//終止頁面
uchar startsege,//起始列
uchar endsege//終止列
)
{
uchar seg,page,const *data= mapdata;;
for(page= startpage;page<= endpage;page++) //寫頁地址共 8 頁 0xb0----0xb8
{
lcd_setpage(page);
lcd_setpage( startsege);
for(seg=startsege;seg<=endsege;seg++)//寫列
wdata(*mapdata++);
}
}
void display_ascii( uchar dispnum,//需要顯示的字符數
const uchar **dispdata,//指向顯示內容地址的指針
uchar startpage,//起始頁面
uchar startsege//起始列
)//顯示ASCII碼
{
uchar num,i;
lcd_setpage(startpage); //設置起始頁面和起始位置
lcd_setcol(startsege);
for(num=0;num<dispnum;num++)
{
for(i=0;i<=4;i++) //一個字符有效數據共5列
wdata(*(*( dispdata+num)+i));
wdata(0x00); //補充空余的3列
wdata(0x00);
wdata(0x00);
}
}
void display_hanzi( uchar dispnum,//需要顯示的字符數
const uchar **dispdata,//指向顯示內容地址的指針
uchar startpage,//起始頁面
uchar startsege//起始列
)
{
uchar num,i;
for(num=0;num<dispnum;num++)
{
lcd_setpage(startpage);//寫上半行
lcd_setcol(startsege+num<<4);
for(i=0;i<16;i++)
wdata(*(*(dispdata+num)+i));
//wdata(0xff);
lcd_setpage(startpage+1);//頁面更改,寫下半行
lcd_setcol(startsege+num<<4);
for(i=16;i<32;i++)
wdata(*(*(dispdata+num)+i));
//wdata(0xff);
}
}
/*
用于將SO128*64液晶屏復位
*/
void lcd_rst(void)
{
rst=0;
delay(10);
rst=1;
}
/*
lcd打開還是關斷 1:打開 0:關斷
*/
void lcd_openclose(uchar i)
{
w_com(0xae|(i&0x01));
}
/*
用于設置頁面,0-8,其中第8頁只有一行
*/
void lcd_setpage(uchar i)
{
w_com((i&0x0f)|0xb0);
}
/*
用于設置起始行,從0到63,不考慮頁面
*/
void lcd_setrow(uchar row)
{
w_com((row&0x3f)|0x40);
}
/*
用于設置開始列,從0-131,其中127后是不能顯示的
分高低兩個字節寫入
*/
void lcd_setcol(uchar i)
{
w_com((i>>4)|0x10);
w_com(i&0x0f);
}
/*
列順序翻轉,左右翻轉0:正常 1:翻轉
*/
void lcd_colrev(uchar i)
{
w_com(0xa0|(i&0x01));
}
/*
行順序翻轉,上下翻轉 0:正常 1;翻轉
*/
void lcd_rowrev(uchar i)
{
w_com(0xc0|((i<<3)&0x08));
}
/*
設置對比度 0-7 5V電壓下 設置為4比較好
*/
void lcd_setrat(uchar i)
{
w_com(0x20|(i&0x07));
}
/*
設置亮度 0-64;5V電壓下設置為0X20比較適中 0x20=32
*/
void lcd_setvol(uchar vol)
{
w_com(0x81);
w_com(vol);
}
/*
黑白翻轉 0正常 1翻轉
*/
void lcd_nomrev(uchar nomrev)
{
w_com(0xa6|(nomrev&0x01));
}
void lcd_clear(void)
{
uchar page,seg;
for(page=0xb0;page<0xb9;page++) //寫頁地址共 8 頁 0xb0----0xb8
{
lcd_setpage(page);
w_com(0x10); //列地址,高低字節兩次寫入,從第 0 列開始
w_com(0x00);
for(seg=0;seg<133;seg++)//寫 128 列
{ wdata(0x00); }
}
}
void lcd_init(void)
{
lcd_rst();
lcd_openclose(1);
lcd_setpage(0);
lcd_setrow(0);
lcd_setcol(0);
lcd_nomrev(0);
lcd_rowrev(1);
lcd_colrev(0);
lcd_setvol(32);
lcd_setrat(4);
w_com(0x2f);//電源打開
lcd_clear();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -