单片机源程序如下:- /* 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();
- }
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|