?? lcd.c
字號:
/*該模塊包括下面9個子程序
讀液晶顯示器狀態子程序LCDSTA1(E)
對液晶顯示器發指令子程序TRANS1(TRANS,E)
對液晶顯示器寫數據子程序WRITE1(WRITE,CLMADD,E)
開E1顯示子程序DISP1(E)
E1邊清屏子程序CLEAR1(int E)
關 E1顯示子程序DISOFF1(int E)
LCD的E1邊初始化子程序LCD1INIT(int E)
漢字顯示子程序DISPLAY1(ARRAY,E,PAGADD,CLMADD)
數字和字母顯示子程序DISPLAY2(ARRAY,E,PAGADD,CLMADD)*/
char chari[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,};//.
char char0[16]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,};//0
char char1[16]={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,};//1
char char2[16]={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,};//2
char char3[16]={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,};//3
char char4[16]={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,};//4
char char5[16]={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,};//5
char char6[16]={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,};//6;
char char7[16]={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,};//7
char char8[16]={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,};//8
char char9[16]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,};//9
// 讀液晶顯示器狀態子程序,形參E代表處理的液晶的邊(E1或E2邊)
void LCDSTA1(int E)
{
int E1FLAG;
*PBDATDIR=*PBDATDIR&0X00FF;// IOPB口為輸入口
while(1)
{
if(E==1)
*PADATDIR=(*PADATDIR|0X0050)&0X0FF5F;
// E1=1,E2=0,R/W=1,A0=0,以便讀晶的狀態
else *PADATDIR=(*PADATDIR|0X0060)&0X0FF6F;
// E1=0,E2=1,R/W=1,A0=0,以便液晶的狀態
E1FLAG=*PBDATDIR&0X0080;
if(E1FLAG==0x0000) break; // 若液晶空閑,則停止等待
}
}
// 對液晶顯示器發指令子程序,形參E代表處理的液晶的邊(E1或E2邊)
void TRANS1(int TRANS,int E) // 該函數采用形參和實參的方式傳遞數值,TRANS為一個形參
{
LCDSTA1(E); // 判斷液晶是否為忙
*PBDATDIR=*PBDATDIR|0XFF00; // IOPB口為輸出口
if(E==1) *PADATDIR=(*PADATDIR|0X0010)&0X0FF1F;
// E1=1,E2=0,R/W=0,A0=0,以便寫入令字
else *PADATDIR=(*PADATDIR|0X0020)&0X0FF2F;
// E1=0,E2=1,R/W=0,A0=0,以便入命令字
*PBDATDIR=(*PBDATDIR&0X0FF00)|TRANS;
// 需要寫入的命令字送入數據線
if(E==1) *PADATDIR=*PADATDIR&0X0FFEF; // E1=0,寫入指令
else *PADATDIR=*PADATDIR&0X0FFDF; // E2=0,寫入指令
}
// 對液晶顯示器寫數據子程序,注意在此子程序里面列地址沒有加1,需要用戶在外
// 對其進行操作,形參E代表處理的液晶的邊(E1或E2邊)
void WRITE1(int WRITE,int CLMADD,int E) // WRITE代表需要寫入的數據,CLMADD代表要的列地址
{
TRANS1(CLMADD,E); // 設置列地址
LCDSTA1(E); // 查詢液晶是否為空閑
*PBDATDIR=*PBDATDIR|0XFF00; // IOPB口為輸出口
if(E==1) *PADATDIR=(*PADATDIR|0X0090)&0X0FF9F;
// E1=1,E2=0,R/W=0,A0=1,以便寫入要顯示的數據
else *PADATDIR=(*PADATDIR|0X00A0)&0X0FFAF;
// E1=0,E2=1,R/W=0,A0=1,以便要顯示的數據
*PBDATDIR=(*PBDATDIR&0X0FF00)|WRITE;
// 需要寫入的數據送入數據線
if(E==1) *PADATDIR=*PADATDIR&0X0FFEF;// E1=0,寫入數據
else *PADATDIR=*PADATDIR&0X0FFDF; // E2=0,寫入數據
}
// 開E1顯示子程序,形參E代表處理的液晶的邊(E1或E2邊)
void DISP1(int E)
{
int E1FLAG;
while(1)
{
TRANS1(0X0AF,E); // 送出控制命令
LCDSTA1(E); // 判斷液晶是否為空閑
*PBDATDIR=*PBDATDIR&0X00FF; // IOPB口為輸入口
if(E==1) *PADATDIR=(*PADATDIR|0X0050)&0X0FF5F;
// E1=1,E2=0,R/W=1,A0=0,以便讀晶的狀態
else *PADATDIR=(*PADATDIR|0X0060)&0X0FF6F;
// E1=0,E2=1,R/W=1,A0=0,以便液晶的狀態
E1FLAG=*PBDATDIR&0X0020;
if(E1FLAG==0) break; // 如果液晶沒被打開,則繼續打開
}
}
// E1邊清屏子程序,形參E代表處理的液晶的邊(E1或E2邊)
void CLEAR1(int E)
{
int PAGEADD,PAGENUM,CLMADD,CLMSUM;// 定義所需要的局部變量
for(PAGENUM=0X04,PAGEADD=0x0B8;PAGENUM>0;PAGENUM--,PAGEADD++)
{
TRANS1(PAGEADD,E); // 設置相應的頁地址
for(CLMSUM=0X00;CLMSUM<0X3E;CLMSUM++)
{
LCDSTA1(E); // 判斷液晶是否為空閑
WRITE1(0X00,CLMSUM,E); // 向相應的列送0以清屏
}
}
}
// 關 E1顯示子程序,形參E代表處理的液晶的邊(E1或E2邊)
void DISOFF1(int E)
{
int E1FLAG;
while(1)
{
TRANS1(0X0AE,E); // 發出控制命令
LCDSTA1(E); // 判斷液晶是否為空閑
*PBDATDIR=*PBDATDIR&0X00FF; // IOPB口為輸入口
if(E==1) *PADATDIR=(*PADATDIR|0X0050)&0X0FF5F;
// E1=1,E2=0,R/W=1,A0=0,以便讀晶的狀態
else *PADATDIR=(*PADATDIR|0X0060)&0X0FF6F; // E1=0,E2=1,R/W=1,A0=0,以便
// 液晶的狀態
E1FLAG=*PBDATDIR&0X0020;
if(E1FLAG==1) break; // 如果液晶沒有被關閉,則繼續關
}
}
// LCD的E1邊初始化子程序,形參E代表處理的液晶的邊(E1或E2邊)
void LCD1INIT(int E)
{
DISOFF1(E); // 關顯示E1
TRANS1(0X0A4,E); // 靜態顯示驅動
TRANS1(0X0A9,E); // 占空比為1/32
TRANS1(0X0E2,E); // 復位
TRANS1(0X0A0,E); // ADC選擇正常輸出
CLEAR1(E); // 清屏
LCDSTA1(E); // 判斷液晶是否為空閑
DISP1(E); // 開顯示
}
// 漢字顯示子程序,入口為存儲漢字庫的數組的首地址,頁地址和起始列地址
// 和選中的E1或E2的邊數
/*void DISPLAY1(int* ARRAY,int E,int PAGADD,int CLMADD)
{
int K,TEMP;
TRANS1(0X0C0,E); // 從第0行開始顯示
TRANS1(PAGADD,E); // 送需要顯示的頁地址
for(K=0;K<8;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY&0X00FF;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
CLMADD++;
TEMP=(*ARRAY&0X0FF00)>>8;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
}
CLMADD=CLMADD-16; // 恢復列地址
PAGADD=PAGADD+1; // 頁地址加1
TRANS1(PAGADD,E);
for(;K<16;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY&0X00FF;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
CLMADD++;
TEMP=(*ARRAY&0X0FF00)>>8;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
}
}*/
void DISPLAY1(char* ARRAY,int E,int PAGADD,int CLMADD)
{
int K;
char TEMP;
TRANS1(0X0C0,E); // 從第0行開始顯示
TRANS1(PAGADD,E); // 送需要顯示的頁地址
for(K=0;K<16;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY&0X00FF;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
}
CLMADD=CLMADD-16; // 恢復列地址
PAGADD=PAGADD+1; // 頁地址加1
TRANS1(PAGADD,E);
for(;K<32;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY&0X00FF;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
}
}
// 數字和字母顯示子程序,入口為存儲字母或數字庫的數組的首地址,頁地址和
// 始列地址和選中的E1或E2的邊數
/*void DISPLAY2(int* ARRAY,int E,int PAGADD,int CLMADD)
{
int K,TEMP;
TRANS1(0X0C0,E); // 從第0行開始顯示
TRANS1(PAGADD,E); // 送需要顯示的頁地址
for(K=0;K<4;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY&0X00FF;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
CLMADD++;
TEMP=(*ARRAY&0X0FF00)>>8;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
}
CLMADD=CLMADD-8; // 恢復列地址
PAGADD=PAGADD+1; // 頁地址加1
TRANS1(PAGADD,E);
for(;K<8;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY&0X00FF;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
CLMADD++;
TEMP=(*ARRAY&0X0FF00)>>8;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
}
}*/
void DISPLAY2(char* ARRAY,int E,int PAGADD,int CLMADD)
{
int K;
char TEMP;
TRANS1(0X0C0,E); // 從第0行開始顯示
TRANS1(PAGADD,E); // 送需要顯示的頁地址
for(K=0;K<8;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY&0X00FF;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
}
CLMADD=CLMADD-8; // 恢復列地址
PAGADD=PAGADD+1; // 頁地址加1
TRANS1(PAGADD,E);
for(;K<16;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY&0X00FF;
WRITE1(TEMP,CLMADD,E); // 送需要顯示的數據字節
}
}
/* 主程序
main()
{
initial(); // 系統初始化
// 顯示第一行"DSP 實驗板"
LCD1INIT(1); // LCD的E1邊初始化
LCD1INIT(2); // LCD的E2邊初始化
DISPLAY2(char1,1,0x0BA,00); // 調用字母和數字顯示子程序
DISPLAY2(char2,1,0x0BA,8); // 調用字母和數字顯示子程序
DISPLAY2(char3,1,0x0BA,17); // 調用字母和數字顯示子程序
DISPLAY1(char4,2,0x0BA,0); // 調用漢字顯示子程序
DISPLAY1(char5,2,0x0BA,15); // 調用漢字顯示子程序
DISPLAY1(char6,2,0x0BA,30); // 調用漢字顯示子程序
// 顯示第行行"DSP 實驗板"
DISPLAY2(char1,1,0x0B8,00); // 調用字母和數字顯示子程序
DISPLAY2(char2,1,0x0B8,8); // 調用字母和數字顯示子程序
DISPLAY2(char3,1,0x0B8,17); // 調用字母和數字顯示子程序
DISPLAY1(char4,2,0x0B8,0); // 調用漢字顯示子程序
DISPLAY1(char5,2,0x0B8,15); // 調用漢字顯示子程序
DISPLAY1(char6,2,0x0B8,30); // 調用漢字顯示子程序
}*/
/*顯示SOC值*/
void displaysoc(float soc)
{
int p,i;
if(10000*soc>=5)soc+=0.001;//對soc四舍五入保留3位有效數字
DISPLAY2(chari,1,0x0BA,00); // 調用字母和數字顯示子程序
for(i=0;i<3;i++)
{
p=(int)soc/0.1;
switch(p)
{
case 0:
DISPLAY2(char0,1,0x0BA,8+i*8);
break;
case 1:
DISPLAY2(char1,1,0x0BA,8+i*8);
break;
case 2:
DISPLAY2(char2,1,0x0BA,8+i*8);
break;
case 3:
DISPLAY2(char3,1,0x0BA,8+i*8);
break;
case 4:
DISPLAY2(char4,1,0x0BA,8+i*8);
break;
case 5:
DISPLAY2(char5,1,0x0BA,8+i*8);
break;
case 6:
DISPLAY2(char6,1,0x0BA,8+i*8);
break;
case 7:
DISPLAY2(char7,1,0x0BA,8+i*8);
break;
case 8:
DISPLAY2(char8,1,0x0BA,8+i*8);
break;
case 9:
DISPLAY2(char9,1,0x0BA,8+i*8);
break;
}
soc=soc-p*0.1;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -