?? lcd2864_dispaly.c
字號:
//實驗目的:用PICC熟悉12864LCD的中文使用
//使用12864LCD自帶中文字庫
//編程讓LCD12864向上滾動顯示詩詞〈北京歡迎你〉
//硬件設置:
//關斷LCD1602的所有跳線,接通LCD12864的所有跳線。
#include<p30f6014.h>
_FOSC(CSW_FSCM_OFF & XT_PLL4); //4倍頻晶振,Failsafe 時鐘關閉
_FWDT(WDT_OFF); //關閉看門狗定時器
_FBORPOR(PBOR_OFF & MCLR_EN); //掉電復位禁止,MCLR復位使能。
_FGS(CODE_PROT_OFF); //代碼保護禁止
//芯片配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關,加密,4M晶體HS振蕩
#define rs LATBbits.LATB4 //定義LCD的數據/命令控制口
#define rw LATBbits.LATB5 //定義LCD的讀/寫控制口
#define e LATBbits.LATB6 //定義LCD的使能口
#define psb LATBbits.LATB2 //8位/4位并口選擇
#define rst LATBbits.LATB7 //定義復位口
#define nop() asm("nop") //定義nop()函數
const unsigned char sdgt[]={
//北京歡迎你
' ',' ',0xB1,0xB1,0xBE,0xA9,0xBB,0xB6,0xD3,0xAD,0xC4,0xE3,' ',' ',' '};
const unsigned char clear[]={
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
const unsigned char time[]={
//2008年10月12日
'2','0','0','8',0xC4,0xEA,'1','0',0xD4,0xC2,'1','2',0xC8,0xD5,' ',' '};
const unsigned char TAB[16][16]={
{//我家大門常打開
0xCE,0xD2,0xBC,0xD2,0xB4,0xF3,0xC3,0xC5,0xB3,0xA3,0xB4,0xF2,0xBF,0xAA,',' ,' '},
{//開放懷抱等你。
0xBF,0xAA,0xB7,0xC5,0xBB,0xB3,0xB1,0xA7,0xB5,0xC8,0xC4,0xE3,',',' ',' ' ,' '},
{//擁抱過后有了默契,
0xD3,0xB5,0xB1,0xA7,0xB9,0xFD,0xBA,0xF3,0xD3,0xD0,0xC1,0xCB,0xC4,0xAC,0xC6,0xF5},
{//你會愛上這里。
0xC4,0xE3,0xBB,0xE1,0xB0,0xAE,0xC9,0xCF,0xD5,0xE2,0xC0,0xEF,',', ' ', ' ' , ' '},
{//不管遠近都是朋友,
0xB2,0xBB,0xB9,0xDC,0xD4,0xB6,0xBD,0xFC,0xB6,0xBC,0xCA,0xC7,0xC5,0xF3,0xD3,0xD1},
{//請不要客氣,
0xC7,0xEB,0xB2,0xBB,0xD2,0xAA,0xBF,0xCD,0xC6,0xF8,',',' ',' ', ' ' , ' ' , ' '},
{//第幾次來沒關系。
0xB5,0xDA,0xBC,0xB8,0xB4,0xCE,0xC0,0xB4,0xC3,0xBB,0xB9,0xD8,0xCF,0xB5,',' ,' '},
{//我們歡迎你,
0xCE,0xD2,0xC3,0xC7,0xBB,0xB6,0xD3,0xAD,0xC4,0xE3,',',' ',' ', ' ' , ' ' , ' '},
{//北京歡迎你!
0xB1,0xB1,0xBE,0xA9,0xBB,0xB6,0xD3,0xAD,0xC4,0xE3,'!',' ',' ', ' ' , ' ' , ' '},
{//讓溫暖感動你,
0xC8,0xC3,0xCE,0xC2,0xC5,0xAF,0xB8,0xD0,0xB6,0xAF,0xC4,0xE3,',',' ',' ',' '},
{//流動中的魅力充滿,
0xC1,0xF7,0xB6,0xAF,0xD6,0xD0,0xB5,0xC4,0xF7,0xC8,0xC1,0xA6,0xB3,0xE4,0xC2,0xFA},
{//著朝氣北京歡迎你。
0xD7,0xC5,0xB3,0xAF,0xC6,0xF8,0xB1,0xB1,0xBE,0xA9,0xBB,0xB6,0xD3,0xAD,0xC4,0xE3},
{//在太陽下分享呼吸,
0xD4,0xDA,0xCC,0xAB,0xD1,0xF4,0xCF,0xC2,0xB7,0xD6,0xCF,0xED,0xBA,0xF4,0xCE,0xFC},
{//在黃土地刷新成績
0xD4,0xDA,0xBB,0xC6,0xCD,0xC1,0xB5,0xD8,0xCB,0xA2,0xD0,0xC2,0xB3,0xC9,0xBC,0xA8},
{//我家種著萬年青,
0xCE,0xD2,0xBC,0xD2,0xD6,0xD6,0xD7,0xC5,0xCD,0xF2,0xC4,0xEA,0xC7,0xE0,',',' '},
{//開放每段傳奇..,
0xBF,0xAA,0xB7,0xC5,0xC3,0xBF,0xB6,0xCE,0xB4,0xAB,0xC6,0xE6,'.','.','.','.'},
};
unsigned int lcd_x; //定義LCD頁地址寄存器
unsigned int lcd_y; //定義LCD列地址寄存器
void init(); //申明I/O口設置函數
void lcd_init(); //申明LCD初始化函數
void clear_p(); //申明清屏函數
void qushu(int counts,const unsigned char *ps); //申明查表獲取顯示數據
void send_d(unsigned char x); //申明送一字節數據顯示函數
void send_i(unsigned char x); //申明送一字節控制命令函數
void chk_busy(); //申明檢測LCD是否工作繁忙函數
void delay(); //申明延時函數,供各命令之間的延時和決定顯示快慢用
//-------------------------------------------
//主程序
int main(void)
{
unsigned char i,j;
init(); //調用I/O口設置函數
lcd_init(); //調用LCD初始化函數
clear_p(); //調用清屏函數
while(1)
{
clear_p();
send_i(0x90); //設置顯示位置:第二行
qushu(0x10,sdgt); //顯示歌頭行
send_i(0x88); //設置顯示位置:第三行
qushu(0x10,time); //顯示日期行
for(j=0;j<160;j++)
{delay();} //延時一定時間
clear_p(); //清屏
for(i=0;i<16;i++) //顯示完所有信息需移動16次
{
send_i(0x80); //設置顯示位置:顯示第一行
qushu(0x10,TAB[i]);
send_i(0x90); //設置顯示位置:清除第二行
qushu(0x10,clear);
delay();
send_i(0x90); //設置顯示位置:顯示第二行
qushu(0x10,TAB[i+1]);
send_i(0x88); //設置顯示位置:清除第三行
qushu(0x10,clear);
delay();
send_i(0x88); //設置顯示位置:顯示第三行
qushu(0x10,TAB[i+2]);
send_i(0x98); //設置顯示位置:清除第四行
qushu(0x10,clear);
delay();
send_i(0x98); //設置顯示位置:顯示第四行
qushu(0x10,TAB[i+3]);
delay();
for(j=0;j<16;j++) //控制移動頻率
{delay();}
}
for(j=0;j<32;j++) //顯示完一次,等待一定時間
{delay();}
}
}
//-------------------------------------------
//I/O口設置函數
void init()
{
TRISB=0X0000; //設置B口為輸出
TRISD=0X0000; //設置D口為輸出
}
//-------------------------------------------
//LCD初始化函數
void lcd_init()
{
rst=0; //復位LCD
delay(); //保證復位所需要的時間
rst=1; //恢復LCD正常工作
nop();
psb=1; //設置LCD為8位并口通信
send_i(0x30); //基本指令操作
send_i(0x01); //清除顯示
send_i(0x06); //指定在寫入或讀取時,光標的移動方向
send_i(0x0c); //開顯示,關光標,不閃爍
}
//有關顯示設置函數
void wr_zb()
{
send_i(lcd_y);
send_i(lcd_x);
}
//-------------------------------------------
//清屏函數
void clear_p()
{
send_i(0x1); //清除所有顯示
send_i(0x34); //擴展指令操作
send_i(0x30); //基本指令操作
}
//------------------------------------------
//查表函數
void qushu(int counts,const unsigned char *ps)
{
int i; //定義循環變量
for(i=counts;i>0;i--) //循環counts次
{
send_d(*ps); //查表取數并調用顯示一個字節數據函數送顯示
ps++; //取下一個數據
}
}
//-------------------------------------------
//顯示一字節數據函數
void send_d(unsigned char x)
{
chk_busy(); //檢測LCD是否工作繁忙
rs=1; //設置該字節數據是顯示數據
rw=0; //設置該次操作為寫
PORTD=x; //送數據口PORTD
e=1; //使能
nop();
nop();
nop();
e=0; //禁止
}
//--------------------------------------------
//送一字節命令代碼函數
void send_i(unsigned char x)
{
chk_busy(); //檢測LCD是否工作繁忙
rs=0; //設置該字節數據為控制命令
rw=0; //設置此次操作為寫
PORTD=x; //送數據口PORTD
e=1; //使能
nop();
nop();
nop();
e=0; //禁止
}
//-------------------------------------------
//檢測LCD是否工作繁忙
void chk_busy()
{
TRISD=0Xffff; //更改總線方向為輸入
rs=0; //總線上為命令
delay();
rw=1; //讀操作
delay();
while(PORTDbits.RD7)
{
delay();
delay();
e=1;
delay();
delay();
e=0;
}
e=0;
TRISD=0X0000; //總線還原為輸出
}
//-------------------------------------------
//延時函數
void delay()
{
int i;
for(i=0;i<4000;i++)
{;}
}
//-------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -