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)
|