- //12864液晶的試驗程序,驅動芯片為ST7920
- //目標板為TS8900-M128
- //驅動方式-并口
- //J1,J15,J8短路塊位于左側
- //調節RV1電位器調整對比度
- //注意:因為廠家不同液晶的19腳和20腳(背光)有時會不同,導致背光不亮,需要注意。
- #include <iom128v.h>
- #include <string.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define RS (1<<0)
- #define RW (1<<1)
- #define EN (1<<2)
- //延時函數
- void s_ms(uint ms)
- {
- for(;ms>1;ms--);
- }
- //此處定義字符串
- char text_1[]="液晶測試第一行";
- char text_2[]="液晶測試第二行";
- char text_3[]="液晶測試第三行";
- char text_4[]="液晶測試第四行";
- //寫數據
- void WriteDataLCM(unsigned char WDLCM)
- {
- //ReadStatusLCM(); //檢測忙
- s_ms(100);
- PORTC|=RS; //RS=1
- s_ms(100);
- PORTC&=~RW; //RW=0
- s_ms(100);
- PORTC|=EN; //EN=1
- s_ms(100);
- PORTA=WDLCM; //輸出數據
- s_ms(100);
- PORTC&=~EN; //EN=0
- s_ms(100);
- }
- //寫指令
- void WriteCommandLCM(unsigned char WCLCM)
- {
- //ReadStatusLCM(); //根據需要檢測忙
- s_ms(100);
- PORTC&=~RS; //RS=0
- s_ms(100);
- PORTC&=~RW; //RW=0
- s_ms(100);
- PORTC|=EN; //EN=1
- s_ms(100);
- PORTA=WCLCM; //輸出指令
- s_ms(100);
- PORTC&=~EN; //EN=0
- s_ms(100);
- }
- //讀狀態:檢測忙
- void ReadStatusLCM(void)
- {
- uchar temp;
- uchar flag = 1;
- while(flag==1)
- {
- DDRA=0x00; //端口B改為輸入
- PORTA=0xff;
- s_ms(100);
- PORTC&=~RS; //RS=0
- s_ms(100);
- PORTC|=RW; //RW=1
- s_ms(100);
- PORTC|=EN; //EN=1
- s_ms(1000);
- temp = PINA; //讀端口B
- s_ms(1000);
- DDRA=0xff; //端口B改為
- s_ms(100);
- PORTC&=~EN; //EN=0
- s_ms(100);
- if(temp>>7==0)
- flag = 0;
- }
- }
- //LCM初始化
- void LCMInit(void)
- {
- WriteCommandLCM(0x38); //三次顯示模式設置,不檢測忙信號
- s_ms(1000);
- WriteCommandLCM(0x38);
- s_ms(1000);
- WriteCommandLCM(0x38);
- s_ms(1000);
- WriteCommandLCM(0x38); //顯示模式設置,開始要求每次檢測忙信號
- WriteCommandLCM(0x08); //關閉顯示
- WriteCommandLCM(0x01); //顯示清屏
- WriteCommandLCM(0x06); //顯示光標移動設置
- WriteCommandLCM(0x0C); //顯示開及光標設置
- }
- //按指定位置顯示一串字符
- //液晶顯示:漢字為16*16,字母及數字為8*16,此次顯示的文本
- // 從第一行第一列開始,依次向左,如果想在不同的
- // 位置顯示,只需修改相應的行值即可。液晶顯示
- // 完畢后,轉入語音文本發送。
- //DisplsyList(X,DData)函數:X為0x80在第一行顯示;X為0x90在
- // 第二行顯示;X為0x88在第三行顯示;X為0x98在
- // 第四行顯示;DData為顯示數組。
- void DisplayList(unsigned char X,char *DData)
- {
- unsigned char length;
- unsigned char i=0;
- char *p;
- p = DData;
- length = strlen(p);
- WriteCommandLCM(0x08);
- WriteCommandLCM(X);
- WriteCommandLCM(0x06);
- WriteCommandLCM(0x0C);
- WriteCommandLCM(X);
- for(i=0;i<length;i++)
- {
- WriteDataLCM(DData[i]);
- i++;
- WriteDataLCM(DData[i]);
- }
- }
- //主函數
- void main(void)
- {
- //端口初始化
- DDRA=0xff;
- PORTA=0xff;
- DDRC=0xff;
- PORTC=0xff;
- DDRD=0xff;
- PORTD=0x00;
-
- s_ms(200);
- s_ms(200);
- LCMInit(); //LCM初始化 //液晶初始化
- DisplayList(0x80,text_1); //顯示第一行
- DisplayList(0x90,text_2); //顯示第二行
- DisplayList(0x88,text_3); //顯示第三行
- DisplayList(0x98,text_4); //顯示第四行
- while(1);
- }
復制代碼 |