?? lcd_test1.c
字號:
/////////////LCD測試程序//////////////
////////////lcd_test1.c//////////////
#include "C8051F040.h" // Register definition file.
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#define toup sendc(0x14) //lcd光標右移
#define todown sendc(0x10)//lcd光標左移
#define curshow sendc(0x0f)//顯示光標
#define home sendc(0x02)//移到首行
#define cls sendc(0x01)//清屏
sbit lcdrs=P5^2;//硬件控制接口
sbit lcdrw=P5^1;
sbit lcdcs=P5^0;
void delay1ms(uint time){//延遲1ms*time,這不是一個精確值
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void sendc(uchar c){//給lcd送命令
SFRPAGE = 0x0f;//以下實際上是對lcd發送命令的時序圖進行操作的
P4=c;
lcdrs=0;
lcdrw=0;
EA=0;
lcdcs=1;
lcdcs=0;
lcdcs=1;
lcdrw=1;
P4=0xff;//先置1,后讀取
lcdrs=0;
while(P4>=0x80);
lcdcs=0;
lcdcs=1;
EA=1;
if(c==1)
delay1ms(2);
}
void dispini(){ //lcd顯示初始化
delay1ms(100);
SFRPAGE=0xf;
lcdcs=0;
lcdrs=1;
lcdrw=1;
delay1ms(30);
sendc(0x38);//8位,2行,5*7字體
delay1ms(100);
sendc(0x0c);//顯示開,光標關;不閃
delay1ms(100);
sendc(0x06);//增量方式,現不移動
delay1ms(100);
sendc(0x01);//清屏
delay1ms(100);
}
void sendd(uchar c){//給lcd送數據
SFRPAGE = 0x0f;
EA=0;
P4=c;
lcdrs=1;
lcdrw=0;
lcdcs=1;
lcdcs=0;
lcdcs=1;
lcdrw=1;
P4=0xff;//先置1,后讀取
lcdrs=0;
while(P4>=0x80);
lcdcs=0;
lcdcs=1;
EA=1;
}
void config (void) {
//看門狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉開關使能,使得P0-P3口能輸出
XBR3 = 0x00;
SFRPAGE = 0x0F;
P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口為開漏輸出
P1MDOUT = 0x00;
P2MDOUT = 0x00;
P3MDOUT = 0x00;
P4MDOUT = 0x00; //P4口為開漏
P5MDOUT = 0x07;
P6MDOUT = 0x00;
P7MDOUT = 0x00;
P1MDIN = 0xFF; //所有端口為數字輸入,沒有模擬輸入端口
P2MDIN = 0xFF;
P3MDIN = 0xFF;
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
//采用內部晶振,為24.5MHZ8分頻
}
void dispmoveauto(){//自動移位顯示
xdata uchar i;
sendc(0x01);//清屏
delay1ms(2);
sendc(0x80);
for(i=0;i<16;i++){
sendd('a'+i);//第一行顯示
}
delay1ms(1000);
sendc(0x07);//設置為移動顯示模式,AC自增
for(i=0;i<26;i++){
sendd('A'+i);//當CG RAM地址自增超過第一行地址時,自動跳到第二行地址
delay1ms(500);
}
for(i=0;i<26;i++){
sendd('a'+i);
delay1ms(500);
}
}
void makelogo1(){
sendc(0x48);//CG RAM 地址設定指令,寫地址0x08,即定義代碼0x01的點陣數據
sendd(0x04);//給CG RAM寫數據,定義點陣數據,為一片葉子的點陣,一共8行
sendd(0x0e);
sendd(0x1f);
sendd(0x1f);
sendd(0x1f);
sendd(0x0e);
sendd(0x04);
sendd(0x0e);
}
uchar readd(){//給顯示lcd送顯示字符
uchar k;
SFRPAGE = 0x0f;
EA=0;
lcdrw=1;
P4=0xff;
lcdrs=1;
k=P4;
lcdcs=0;
lcdcs=1;
P4=0xff;//先置1,后讀取,否則所讀數據可能有誤
lcdrs=0;
while(P4>=0x80);//讀LCD是否為忙
lcdcs=0;
lcdcs=1;
EA=1;
return k;
}
void dispmovemanual(){
xdata uchar i;
sendc(0x80);
for(i=0;i<26;i++){
sendd('a'+i);//一次性將‘a’至‘z’數據寫入第一行內存中
}
delay1ms(100);
for(i=0;i<40;i++){
sendc(0x18);
delay1ms(300);//每隔三十毫秒移動一次數據
}
for(i=0;i<12;i++){
sendd('0'+i);//操作完移位指令后繼續在第一行中寫入‘0’-‘9’和‘:’,‘;’
}
delay1ms(300);
sendc(0xc0);
for(i=0;i<26;i++){//一次性將‘A’至‘Z’寫入第二行的內存中
sendd('A'+i);
}
for(i=0;i<12;i++){//繼續在第二行中寫入‘0’-‘9’和‘:’,‘;’
sendd('0'+i);
}
delay1ms(1000);
for(i=0;i<40;i++){//移位指令,整屏移動
sendc(0x18);
delay1ms(600);
}
}
main(){
xdata uchar readdata[6];
uchar t;
config();
dispini();
dispmovemanual();//手動移位顯示
cls;//清零
makelogo1();//設置自定義點陣
delay1ms(1000);
sendc(0x80);//連續寫入5個數據,以供讀取值比較
sendd(0x01);//顯示自定義點陣
sendd(0x31);
sendd(0x32);
sendd(0x61);
sendd(0x62);
sendd(0x71);
sendc(0x80);
for(t=0;t<6;t++)
readdata[t]=readd();
delay1ms(1000);
dispmoveauto();//自動移位顯示,每寫一個數據,自動移位一次
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -