?? lcd_61.c
字號:
//LCD1602 Driver Create by nie xiong 2006.11.18
#inculde "spce061V004.h"
#define DC1 0x0100 // IOA8 Set 1
#define DC0 0xfeff //Set 0
#define RW1 0x0200 // IOA9
#define RW0 0xfdff //Set 0
#define CS1 0x0400 // IOA10
#define CS0 0xfbff //Set 0
#define LCDBUS *P_IOA_Buffer // IOA0~IOA7 Data
unsigned int sys10mscounter;
//unsigned char syslimitcounter;
char path1[8]={0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f};/*自定義符號:橫1*/
char path2[8]={0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00};/*自定義符號:橫2*/
char pats1[8]={0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15};/*自定義符號:豎1*/
char pats2[8]={0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a};/*自定義符號:豎2*/
void soft_nop(){}
void soft_10ms()/***********12MHZ 提供10MS 軟件延時************/
{ register int i;
for(i=0;i<711;i++);
}
void soft_20ms()/***********12MHZ 提供20MS 軟件延時************/
{ soft_10ms();
soft_10ms();
}
void hard_10ms(unsigned int delaytime) /*基于10MS 的硬件延時*/
{ sys10mscounter=delaytime;
while(sys10mscounter--) soft_10ms();
}
unsigned char data lcdcounter;
unsigned int lcdusing1,lcdusing2;
unsigned int lcd_checkbusy()/*檢查LCD 忙*/
{ register lcdstate;
LCDBUS &= DC0; //DC=1為數據,=0為命令.
LCDBUS |= RW1; //RW=1為讀,=0為寫.
LCDBUS |= CS1; //CS=1選通.
soft_nop();
lcdstate=LCDBUS & 0x00ff;
LCDBUS &= CS0;
return((unsigned int )(lcdstate&0x80));
}
void lcd_wrcmd(unsigned char lcdcmd) /*寫LCD 命令*/
{ lcdusing1=1;
while(lcd_checkbusy());
LCDBUS &=0xff00;
LCDBUS |= lcdcmd;
LCDBUS &= DC0;
LCDBUS &= RW0;
LCDBUS |= CS1;
soft_nop();
LCDBUS &= CS0;
LCDBUS |=0x00ff;
lcdusing1=0;
}
void lcd_moveto(char position) /*移動光標到指定位.0-79*/
{ register cmd=0x80;
lcdcounter=position;
if (position > 59)
position += 0x18;
else
{ if (position > 39)position -= 0x14;
else
{ if (position > 19)position += 0x2c;
}
}
cmd=cmd|position;
lcd_wrcmd(cmd);
}
void lcd_wrdata(char lcddata) /*在當前顯示位置顯示數據*/
{ char i;
lcdusing2=1;
while(lcd_checkbusy());
if(lcdcounter==20){
lcd_moveto(20);
while(lcd_checkbusy());
}
if(lcdcounter==40){
lcd_moveto(40);
while(lcd_checkbusy());
}
if(lcdcounter==60){
lcd_moveto(60);
while(lcd_checkbusy());
}
if(lcdcounter==80){
lcd_moveto(0);
while(lcd_checkbusy());
lcdcounter=0;
} /*為通用而如此*/
lcdcounter++;
LCDBUS &=0xff00;
LCDBUS |= lcddata;
LCDBUS |= DC1; //DC=1為數據,=0為命令.
LCDBUS &= RW0; //RW=1為讀,=0為寫.
LCDBUS |= CS1; //CS=1選通.
soft_nop();
LCDBUS &= CS0;
LCDBUS |=0x00ff;
lcdusing2=0;
}
void lcd_string(char *strpoint) /*在當前顯示位置顯示LCD 字符串*/
{ register i=0;
while(strpoint[i]!=0){
lcd_wrdata(strpoint[i]);
i++;
}
}
void lcd_init()/*初始化*/
{ lcd_wrcmd(0x38); /*設置8 位格式,2 行,5*7*/
lcd_wrcmd(0x0c); /*整體顯示,關光標,不閃爍*/
lcd_wrcmd(0x06); /*設定輸入方式,增量不移位*/
lcd_wrcmd(0x01); /*清除顯示*/
lcdcounter=0;
}
void lcd_cls()/*清除顯示*/
{ lcd_wrcmd(0x01);
lcdcounter=0;
}
main()
{
unsigned char j;
IE=0;P0=0xff;P1=0xff;P2=0xff;P3=0xff; /*初始化T*/
lcd_init();soft_20ms();
/* TMOD=0x51;
TH0=0xd8; //12M,10ms
TL0=0xf6;
TR0=1;ET0=1;EA=1;
*/
while(1)
{
/*全黑、橫一、橫二、豎一、豎二、U、Q、ABCD...,*/
lcd_init(); /*全黑*/
for(j=0;j<80;j++){lcd_wrdata(0xff);}
hard_10ms(50);
lcd_init(); /*橫一,可參考自行設計符號*/
lcd_wrcmd(0x40);
for(j=0;j<8;j++)lcd_wrdata(path1[j]);
for(j=0;j<100;j++)lcd_wrdata(0);
hard_10ms(50);
lcd_init(); /*橫二*/
lcd_wrcmd(0x40);
for(j=0;j<8;j++)lcd_wrdata(path2[j]);
for(j=0;j<100;j++)lcd_wrdata(0);
hard_10ms(50);
lcd_init(); /*豎一*/
lcd_wrcmd(0x40);
for(j=0;j<8;j++)lcd_wrdata(pats1[j]);
for(j=0;j<100;j++)lcd_wrdata(0);
hard_10ms(50);
lcd_init(); /*豎二*/
lcd_wrcmd(0x40);
for(j=0;j<8;j++)lcd_wrdata(pats2[j]);
for(j=0;j<100;j++)lcd_wrdata(0);
hard_10ms(50);
lcd_init();
lcd_string("UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU");
hard_10ms(50);
lcd_init();
lcd_string("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ");
hard_10ms(50);
lcd_init();
lcd_string("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789+-!#$%&?");
hard_10ms(50);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -