單片機源程序如下:
- /* Test program for JLX12864G-290-PC-S,串行接口,帶中文字庫 IC
- 驅動 IC 是:ST7567(or competible),字庫 IC:JLX-GB2312
- */
- #include <reg51.H>
- #include <intrins.h>
- sbit lcd_sclk=P3^2; //接口定義:lcd_sclk 就是 LCD 的 sclk
- sbit lcd_sid=P3^1; //接口定義:lcd_sid 就是 LCD 的 sid
- sbit lcd_rs=P3^0; //接口定義:lcd_rs 就是 LCD 的 rs
- sbit lcd_reset=P1^0; //接口定義:lcd_reset 就是 LCD 的 reset
- sbit lcd_cs1=P1^1; //接口定義:lcd_cs1 就是 LCD 的 cs1
- sbit Rom_IN=P1^2; //字庫 IC 接口定義:Rom_IN 就是字庫 IC 的 SI
- sbit Rom_OUT=P1^3; //字庫 IC 接口定義:Rom_OUT 就是字庫 IC 的 SO
- sbit Rom_SCK=P1^4; //字庫 IC 接口定義:Rom_SCK 就是字庫 IC 的 SCK
- sbit Rom_CS=P1^5; //字庫 IC 接口定義 Rom_CS 就是字庫 IC 的 CS#
- sbit key=P2^0; //定義一個按鍵
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- void delay_us(int i);
- /*寫指令到 LCD 模塊*/
- void transfer_command_lcd(int data1)
- {
- char i;
- lcd_cs1=0;
- lcd_rs=0;
- for(i=0;i<8;i++)
- {
- lcd_sclk=0;
- delay_us(1);
- if(data1&0x80) lcd_sid=1;
- else lcd_sid=0;
- lcd_sclk=1;
- delay_us(1);
- data1=data1<<=1;
- }
- lcd_cs1=1;
- }
- /*寫數據到 LCD 模塊*/
- void transfer_data_lcd(int data1)
- {
- char i;
- lcd_cs1=0;
- lcd_rs=1;
- for(i=0;i<8;i++)
- {
- lcd_sclk=0;
- if(data1&0x80) lcd_sid=1;
- else lcd_sid=0;
- lcd_sclk=1;
- data1=data1<<=1;
- }
- lcd_cs1=1;
- }
- /*延時*/
- void delay(int i)
- {
- int j,k;
- for(j=0;j<i;j++)
- for(k=0;k<500;k++);
- }
- /*短延時*/
- void delay_us(int i)
- {
- int j,k;
- for(j=0;j<i;j++)
- for(k=0;k<2;k++);
- }
- /*等待一個按鍵,我的主板是用 P2.0 與 GND 之間接一個按鍵*/
- void waitkey()
- {
- repeat:
- if (P2&0x01) goto repeat;
- else delay(60);
- if (P2&0x01) goto repeat;
- else
- delay(400);
- }
- /*LCD 模塊初始化*/
- void initial_lcd()
- {
- lcd_reset=0; /*低電平復位*/
- delay(20);
- lcd_reset=1; /*復位完畢*/
- delay(20);
- transfer_command_lcd(0xe2); /*軟復位*/
- delay(5);
- transfer_command_lcd(0x2c); /*升壓步聚 1*/
- delay(5);
- transfer_command_lcd(0x2e); /*升壓步聚 2*/
- delay(5);
- transfer_command_lcd(0x2f); /*升壓步聚 3*/
- delay(5);
- transfer_command_lcd(0x24); /*粗調對比度,可設置范圍 0x20~0x27*/
- transfer_command_lcd(0x81); /*微調對比度*/
- transfer_command_lcd(0x2a); /*0x1a,微調對比度的值,可設置范圍 0x00~0x3f*/
- transfer_command_lcd(0xa2); /*1/9 偏壓比(bias)*/
- transfer_command_lcd(0xc8); /*行掃描順序:從上到下*/
- transfer_command_lcd(0xa0); /*列掃描順序:從左到右*/
- transfer_command_lcd(0x40); /*起始行:第一行開始*/
- transfer_command_lcd(0xaf); /*開顯示*/
- }
- void lcd_address(uint page,uint column)
- {
- column=column-1;
- transfer_command_lcd(0xb0+page-1); /*設置頁地址*/
- transfer_command_lcd(0x10+(column>>4&0x0f)); /*設置列地址的高 4 位*/
- transfer_command_lcd(column&0x0f); /*設置列地址的低 4 位*/
- }
- /*全屏清屏*/
- void clear_screen()
- {
- unsigned char i,j;
- for(i=0;i<9;i++)
- {
- lcd_address(1+i,1);
- for(j=0;j<224;j++)
- {
- transfer_data_lcd(0x00);
- }
- }
- lcd_cs1=1;
- }
- //===顯示測試畫面:例如全顯示,隔行顯示,隔列顯示,雪花顯示=====
- void test_display(uchar data1,uchar data2)
- {
- int i,j;
- for(j=0;j<8;j++)
- {
- lcd_address(j+1,1);
- for(i=0;i<128;i++)
- {
- transfer_data_lcd(data1);
- transfer_data_lcd(data2);
- }
- }
- }
- /*顯示 16x16 點陣圖像、漢字、生僻字或 16x16 點陣的其他圖標,reverse=1 反顯*/
- void display_graphic_16x16(uint page,uint column,uchar reverse,uchar *dp)
- {
- uint i,j;
- for(j=0;j<2;j++)
- {
- lcd_address(page+j,column);
- for (i=0;i<16;i++)
- {
- if(reverse==1)
- transfer_data_lcd(~*dp); /*寫數據到 LCD,每寫完一個 8 位的數據后列地址自動加 1*/
- else
- transfer_data_lcd(*dp); /*寫數據到 LCD,每寫完一個 8 位的數據后列地址自動加 1*/
- dp++;
- }
- }
- }
- /*顯示 8x16 點陣圖像、ASCII, 或 8x16 點陣的自造字符、其他圖標,reverse=1 反顯*/
- void display_graphic_8x16(uint page,uchar column,uchar reverse,uchar *dp)
- {
- uint i,j;
- for(j=0;j<2;j++)
- {
- lcd_address(page+j,column);
- for (i=0;i<8;i++)
- {
- if(reverse==1)
- transfer_data_lcd(~*dp); /*寫數據到 LCD,每寫完一個 8 位的數據后列地址自動加 1*/
- else
- transfer_data_lcd(*dp); /*寫數據到 LCD,每寫完一個 8 位的數據后列地址自動加 1*/
- dp++;
- }
- }
- }
- /****送指令到晶聯訊字庫 IC***/
- void send_command_to_ROM( uchar datu )
- {
- uchar i;
- for(i=0;i<8;i++ )
- {
- if(datu&0x80)
- Rom_IN = 1;
- else
- Rom_IN = 0;
- datu = datu<<1;
- Rom_SCK=0;
- Rom_SCK=1;
- }
- }
- /****從晶聯訊字庫 IC 中取漢字或字符數據(1 個字節)***/
- static uchar get_data_from_ROM( )
- {
- uchar i;
- uchar ret_data=0;
- Rom_SCK=1;
- for(i=0;i<8;i++)
- {
- Rom_OUT=1;
- Rom_SCK=0;
- ret_data=ret_data<<1;
- if( Rom_OUT )
- ret_data=ret_data+1;
- else
- ret_data=ret_data+0;
- Rom_SCK=1;
- }
- return(ret_data);
- }
- /*從相關地址(addrHigh:地址高字節,addrMid:地址中字節,addrLow:地址低字節)中連續讀出 DataLen 個字節的數據到 pBuff 的地址*/
- /*連續讀取*/
- void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen )
- {
- uchar i;
- Rom_CS = 0;
- lcd_cs1=1;
- Rom_SCK=0;
- send_command_to_ROM(0x03);
- send_command_to_ROM(addrHigh);
- send_command_to_ROM(addrMid);
- send_command_to_ROM(addrLow);
- for(i = 0; i < DataLen; i++ )
- *(pBuff+i) =get_data_from_ROM();
- Rom_CS = 1;
- }
- /******************************************************************/
- ulong fontaddr=0;
- void display_GB2312_string(uchar y,uchar x,uchar reverse,uchar *text)
- {
- uchar i= 0;
- uchar addrHigh,addrMid,addrLow ;
- uchar fontbuf[32];
- while((text[i]>0x00))
- {
- if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1))
- {
- /*國標簡體(GB2312)漢字在晶聯訊字庫 IC 中的地址由以下公式來計算:*/
- /*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/
- /*由于擔心 8 位單片機有乘法溢出問題,所以分三部取地址*/
- fontaddr = (text[i]- 0xb0)*94;
- fontaddr += (text[i+1]-0xa1)+846;
- fontaddr = (ulong)(fontaddr*32);
-
- addrHigh = (fontaddr&0xff0000)>>16; /*地址的高 8 位,共 24 位*/
- addrMid = (fontaddr&0xff00)>>8; /*地址的中 8 位,共 24 位*/
- addrLow = fontaddr&0xff; /*地址的低 8 位,共 24 位*/
- get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取 32 個字節的數據,存到"fontbuf[32]"*/
- display_graphic_16x16(y,x,reverse,fontbuf);/*顯示漢字到 LCD 上,y 為頁地址,x 為列地址,fontbuf[]為數據*/
- i+=2;
- x+=16;
- }
- else if(((text[i]>=0xa1) &&(text[i]<=0xa3))&&(text[i+1]>=0xa1))
- {
- /*國標簡體(GB2312)15x16 點的字符在晶聯訊字庫 IC 中的地址由以下公式來計算:*/
- /*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/
- /*由于擔心 8 位單片機有乘法溢出問題,所以分三部取地址*/
- fontaddr = (text[i]- 0xa1)*94;
- fontaddr += (text[i+1]-0xa1);
- fontaddr = (ulong)(fontaddr*32);
-
- addrHigh = (fontaddr&0xff0000)>>16; /*地址的高 8 位,共 24 位*/
- addrMid = (fontaddr&0xff00)>>8; /*地址的中 8 位,共 24 位*/
- addrLow = fontaddr&0xff; /*地址的低 8 位,共 24 位*/
- get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取 32 個字節的數據,存到"fontbuf[32]"*/
- display_graphic_16x16(y,x,reverse,fontbuf);/*顯示漢字到 LCD 上,y 為頁地址,x 為列地址,fontbuf[]為數據*/
- i+=2;
- x+=16;
- }
- else if((text[i]>=0x20) &&(text[i]<=0x7e))
- {
- unsigned char fontbuf[16];
- fontaddr = (text[i]- 0x20);
- fontaddr = (unsigned long)(fontaddr*16);
- fontaddr = (unsigned long)(fontaddr+0x3cf80);
- addrHigh = (fontaddr&0xff0000)>>16;
- addrMid = (fontaddr&0xff00)>>8;
- addrLow = fontaddr&0xff;
- get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16 );/*取 16 個字節的數據,存到"fontbuf[32]"*/
-
- display_graphic_8x16(y,x,reverse,fontbuf);/*顯示 8x16 的 ASCII 字到 LCD 上,y 為頁地址,x 為列地址,fontbuf[]為數據*/
- i+=1;
- x+=8;
- }
- else
- i++;
- }
-
- }
- //===============main program===================
- void main(void)
- {
- initial_lcd();
- while(1)
- {
- Rom_CS=1;
- lcd_cs1=0;
- clear_screen();
- display_GB2312_string(1,1,0,"0123456789"); /*在第 1 頁,第 1 列,顯示一串 16x16 點陣漢字或 8x16 的 ASCII 字*/
- display_GB2312_string(4,1,1,"A B C D E F G");
- display_GB2312_string(7,1,0,"DIY興趣愛好者"); /*顯示一串 16x16 點陣漢字或 8x16 的 ASCII 字.以下雷同*/
- waitkey();
- }
- }
復制代碼 下載以上代碼:
12864.rar
(2.58 KB, 下載次數: 43)
2021-4-15 17:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|