JLX12864測試程序,如果玩會了,會再更新
單片機源程序如下:
- #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
- uchar code bmp1[];
- uchar code bmp2[];
- uchar code bmp3[];
- uchar code cheng1[];
- uchar code gong1[];
- uchar code zhuang1[];
- uchar code tai1[];
- uchar code shi1[];
- uchar code yong1[];
- void delay_us(int i);
- uchar code jiong1[]={/*-- 文字: 囧 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x 高=16x16 --*/
- 0x00,0xFE,0x82,0x42,0xA2,0x9E,0x8A,0x82,0x86,0x8A,0xB2,0x62,0x02,0xFE,0x00,0x00,
- 0x00,0x7F,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x7F,0x00,0x00};
- uchar code lei1[]={/*-- 文字: 畾 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x 高=16x16 --*/
- 0x80,0x80,0x80,0xBF,0xA5,0xA5,0xA5,0x3F,0xA5,0xA5,0xA5,0xBF,0x80,0x80,0x80,0x00,
- 0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00,0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00};
- /*寫指令到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(0x15); /*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);
- }
- }
- }
- /*顯示128x64 點陣圖像*/
- void display_128x64(uchar *dp)
- {
- uint i,j;
- for(j=0;j<8;j++)
- {
- lcd_address(j+1,1);
- for (i=0;i<128;i++)
- {
- transfer_data_lcd(*dp); /*寫數據到LCD,每寫完一個8 位的數據后列地址自動加1*/
- dp++;
- }
- }
- }
- /*顯示32x32 點陣圖像、漢字、生僻字或32x32 點陣的其他圖標*/
- void display_graphic_32x32(uchar page,uchar column,uchar *dp)
- {
- uchar i,j;
- for(j=0;j<4;j++)
- {
- lcd_address(page+j,column);
- for (i=0;i<31;i++)
- {
- transfer_data_lcd(*dp); /*寫數據到LCD,每寫完一個8 位的數據后列地址自動加1*/
- dp++;
- }
- }
- }
- /*顯示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++;
- }
- }
- }
- /*顯示 5*7 點陣圖像、ASCII, 或5x7 點陣的自造字符、其他圖標*/
- void display_graphic_5x7(uint page,uchar column,uchar reverse,uchar *dp)
- {
- uint col_cnt;
- uchar page_address;
- uchar column_address_L,column_address_H;
- page_address = 0xb0+page-1;
- column_address_L =(column&0x0f)-1;
- column_address_H =((column>>4)&0x0f)+0x10;
- transfer_command_lcd(page_address); /*Set Page Address*/
- transfer_command_lcd(column_address_H); /*Set MSB of column Address*/
- transfer_command_lcd(column_address_L); /*Set LSB of column Address*/
- for (col_cnt=0;col_cnt<6;col_cnt++)
- {
- 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++;
- }
- }
- void display_string_5x7(uchar y,uchar x,uchar *text)
- {
- unsigned char i= 0;
- unsigned char addrHigh,addrMid,addrLow ;
- while((text[i]>0x00))
- {
- if((text[i]>=0x20) &&(text[i]<=0x7e))
- {
- unsigned char fontbuf[8];
- fontaddr = (text[i]- 0x20);
- fontaddr = (unsigned long)(fontaddr*8);
- fontaddr = (unsigned long)(fontaddr+0x3bfc0);
- addrHigh = (fontaddr&0xff0000)>>16;
- addrMid = (fontaddr&0xff00)>>8;
- addrLow = fontaddr&0xff;
- get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,8);/*取8 個字節的數據,存到"fontbuf[32]"*/
- display_graphic_5x7(y,x,0,fontbuf);/*顯示5x7的ASCII字到LCD上,y為頁地址,x 為列地址,fontbuf[]為數據*/
- i+=1;
- x+=6;
- }
- else
- i++;
- }
- }
- //===============main program===================
- void main(void)
- {
- while(1)
- {
- Rom_CS=1;
- lcd_cs1=0;
- initial_lcd();
- clear_screen(); //clear all dots
- display_128x64(bmp1);
- waitkey();
- clear_screen(); //clear all dots
- display_128x64(bmp2);
- waitkey();
- clear_screen(); //clear all dots
- display_128x64(bmp3);
- waitkey();
- clear_screen();
- display_GB2312_string(1,1,0,"JLX12864G-132-PC"); /*在第1 頁,第1 列,顯示一串16x16 點陣漢字或8x16 的ASCII 字*/
- display_GB2312_string(3,1,1,"16X16 簡體漢字庫,");
- display_GB2312_string(5,1,0,"或8X16 點陣ASCII,"); /*顯示一串16x16 點陣漢字或8x16 的ASCII 字.以下雷同*/
- display_GB2312_string(7,1,0,"或5X7 點陣ASCII 碼");
- waitkey();
- clear_screen();
- display_GB2312_string(1,1,0,"abcdefghijklmnoprstuvwxyz"); /*在第1 頁,第1 列,顯示一串16x16 點陣漢字或8*16 的ASCII 字*/
- display_string_5x7(3,1,"abcdefghijklmnopqrstu");/*在第3 頁,第1 列,顯示一串5x7 點陣的ASCII 字*/
- display_string_5x7(4,1,"JLX electronics Co., ");/*顯示一串5x7 點陣的ASCII 字*/
- display_string_5x7(5,1,"Ltd. established at ");/*顯示一串5x7 點陣的ASCII 字*/
- display_string_5x7(6,1,"year 2004.Focus LCM. ");/*顯示一串5x7 點陣的ASCII 字*/
- display_string_5x7(7,1,"TEL:TEL:0755-29784961 ");/*顯示一串5x7 點陣的ASCII 字*/
- display_string_5x7(8,1,"FAX:0755-29784964 ");/*顯示一串5x7 點陣的ASCII 字*/
- waitkey();
- clear_screen();
- display_graphic_32x32(1,(1+32*1),cheng1); /*在第1 頁,第49 列顯示單個漢字"成"*/
- display_graphic_32x32(1,(1+32*2),gong1); /*在第1 頁,第49 列顯示單個漢字"功"*/
- display_graphic_16x16(6,1,1,zhuang1); /*在第5 頁,第1 列顯示單個漢字"狀"*/
- display_graphic_16x16(6,(1+16),1,tai1); /*在第5 頁,第17 列顯示單個漢字"態"*/
- display_GB2312_string(6,(1+16*2),0,":");
- display_graphic_16x16(6,(1+16*2+8),0,shi1); /*在第5 頁,第41 列顯示單個漢字"使"*/
- display_graphic_16x16(6,(1+16*3+8),0,yong1); /*在第5 頁,第49 列顯示單個漢字"用"*/
- display_GB2312_string(6,(1+16*4+8*2),0,"12:45");
- waitkey();
- clear_screen();
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
JLX12864測試程序.docx
(22.96 KB, 下載次數: 104)
2017-11-20 22:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|