12864程序,字库与自定义字符的显示
PG12864F汉字显示程序
![PG12864F汉字显示程序](https://img.taocdn.com/s3/m/d2a5afcaa48da0116c175f0e7cd184254b351bcb.png)
PG12864F汉字显示程序Proteus仿真图:汉字用取模软件取得地址程序:#include <reg51.h>#define uchar unsigned char #define uint unsigned intsbit wr=P2^0;sbit rd=P2^1;sbit ce=P2^2;sbit cd=P2^3;sbit rst=P2^4;void delay(uint t);void init_12864();void write_data(uchar dat); void write_cmd1(uchar cmd); void write_cmd2(uchar dat,uchar cmd);void write_cmd3(uchar data1,uchar data2,uchar cmd);uchar read_status();void check_status();void clear_screen();void display_char(uchar x,uchar y,uchar ch);//注意汉字数组要加code放到外部存储器中,如果不加code则空间不够uchar code HZ0[6][32]={{/*-- 文字: 华 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/0x11,0x00,0x11,0x10,0x21,0x20,0x61,0xC0,0xA3,0x00,0x2D,0x08,0x21,0x0 8,0x20,0xF8,0x22,0x00,0x02,0x00,0xFF,0xF8,0x02,0x00,0x02,0x00,0x02,0x00}, /*-- 文字: 东 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x04,0x00,0x04,0x00,0x7F,0xF0,0x08,0x00,0x12,0x00,0x22,0x00,0x3F,0x E0,0x02,0x00,0x02,0x00,0x22,0x40,0x22,0x20,0x42,0x10,0x82,0x10,0x0E,0x00}, /*-- 文字: 交 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x04,0x00,0x02,0x00,0xFF,0xF8,0x00,0x00,0x10,0x40,0x20,0x20,0x40,0x 10,0x10,0x40,0x08,0x80,0x05,0x00,0x02,0x00,0x05,0x00,0x18,0xC0,0xE0,0x38},/*-- 文字: 通 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x47,0xF0,0x21,0x20,0x20,0xC0,0x07,0xF0,0x04,0x90,0xE4,0x90,0x27,0x F0,0x24,0x90,0x24,0x90,0x27,0xF0,0x24,0x90,0x24,0xB0,0x50,0x00,0x8F,0xF8}, /*-- 文字: 大 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFF,0xF8,0x02,0x00,0x05,0x 00,0x05,0x00,0x05,0x00,0x08,0x80,0x08,0x80,0x10,0x40,0x20,0x20,0xC0,0x18}, /*-- 文字: 学 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x24,0x20,0x12,0x40,0x00,0x80,0xFF,0xF8,0x80,0x08,0x80,0x08,0x3F,0x C0,0x00,0x80,0x03,0x00,0xFF,0xF8,0x02,0x00,0x02,0x00,0x02,0x00,0x0E,0x00}};uchar code HZ1[4][32]={/*-- 文字: 电 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x02,0x00,0x02,0x00,0x02,0x00,0x7F,0xF0,0x42,0x10,0x42,0x10,0x7F,0x F0,0x42,0x10,0x42,0x10,0x7F,0xF0,0x42,0x00,0x02,0x08,0x02,0x08,0x01,0xF8},/*-- 文字: 气 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x20,0x00,0x20,0x00,0x3F,0xF8,0x40,0x00,0x9F,0xE0,0x00,0x00,0x7F,0x E0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x28,0x00,0x18,0x00,0x08}, /*-- 文字: 学 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x24,0x20,0x12,0x40,0x00,0x80,0xFF,0xF8,0x80,0x08,0x80,0x08,0x3F,0x C0,0x00,0x80,0x03,0x00,0xFF,0xF8,0x02,0x00,0x02,0x00,0x02,0x00,0x0E,0x00}, /*-- 文字: 院 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x00,0x80,0xF0,0x40,0x97,0xF8,0x94,0x08,0xA0,0x00,0xA3,0xF0,0x90,0x 00,0x90,0x00,0x97,0xF8,0x91,0x20,0xE1,0x20,0x82,0x20,0x84,0x28,0x88,0x18}};uchar code HZ2[6][32]={{/*-- 文字: 零 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/0x3F,0xE0,0x02,0x00,0xFF,0xF8,0x82,0x08,0xBA,0xE8,0x02,0x00,0x3A,0xE 0,0x0D,0x80,0x30,0x60,0xC2,0x18,0x1F,0xC0,0x00,0x80,0x1D,0x00,0x03,0x00},/*-- 文字: 七 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x78,0x07,0x80,0xFC,0x 00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x08,0x04,0x08,0x03,0xF8}, /*-- 文字: 电 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x02,0x00,0x02,0x00,0x02,0x00,0x7F,0xF0,0x42,0x10,0x42,0x10,0x7F,0x F0,0x42,0x10,0x42,0x10,0x7F,0xF0,0x42,0x00,0x02,0x08,0x02,0x08,0x01,0xF8}, /*-- 文字: 牵 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x02,0x00,0x3F,0xE0,0x05,0x00,0x08,0x80,0x10,0x40,0xFF,0xF8,0x80,0x 08,0x22,0x00,0x3F,0xE0,0x42,0x00,0x02,0x00,0xFF,0xF8,0x02,0x00,0x02,0x00}, /*-- 文字: 二 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x00,0x00,0x00,0x00,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF8,0x00,0x00},/*-- 文字: 班 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x01,0x00,0xF9,0x78,0x21,0x20,0x25,0x20,0x25,0x20,0xFD,0x20,0x25,0x 78,0x25,0x20,0x29,0x20,0x21,0x20,0x3A,0x20,0xE2,0x20,0x04,0xF8,0x08,0x00}};uchar code HZ3[3][32]={{/*-- 文字: 占 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xF8,0x04,0x00,0x04,0x00,0x04,0x0 0,0x7F,0xE0,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x7F,0xE0,0x40,0x20},/*-- 文字: 俊 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x10,0x80,0x11,0x00,0x12,0x20,0x27,0xF0,0x20,0x10,0x62,0x20,0xA4,0x 10,0x29,0x08,0x21,0xE0,0x22,0x20,0x25,0x40,0x20,0x80,0x23,0x60,0x2C,0x18},/*-- 文字: 龙 --*//*-- 楷体_GB231211; 此字体下对应的点阵为:宽x高=14x14 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x14 --*/{0x04,0x00,0x04,0x80,0x04,0x40,0x04,0x00,0xFF,0xF8,0x05,0x00,0x09,0x 10,0x09,0x20,0x09,0x40,0x11,0x80,0x11,0x00,0x23,0x08,0x4D,0x08,0x80,0xF8}}; //汉字显示函数,处在x y处显示汉字hzvoid display_HZ(uchar x,uchar y,uchar *hz)////x 0-3 y 0-7 {uchar i,j=0;for(i=0;i<16;i++){write_cmd3(((j/2)<<4)|(y*2),x,0x24);//地址指针设置..低地址,高地址,命令write_cmd2(hz[j++],0xc0);write_cmd2(hz[j++],0xc0);}}void main(){uchar i,j=0;init_12864();for(i=0;i<6;i++)display_HZ(0,1+i,HZ0[i]);//显示:华东交通大学 for(i=0;i<4;i++)display_HZ(1,1+i,HZ1[i]);显示:电气学院 for(i=0;i<6;i++)display_HZ(2,1+i,HZ2[i]);显示:零七电牵二班 for(i=0;i<3;i++)display_HZ(3,2+i,HZ3[i]);显示:占俊龙//for(i=0;i<128;i++) //{// display_char(i/16,i%16,'0'+i);//}//clear_screen(); }//显示字符函数,处在x y处显示chvoid display_char(uchar x,uchar y,uchar ch)//x 0-7 y 0-15{write_cmd3((((x*2)<<4)+y),0x00,0x24);//地址指针位置 write_cmd2(ch-32,0xc0);//t6963c字符表与ASCII差32@@@@@@@@@@@@@@@@}void delay(uint t) {uint i,j;for(i=0;i<t;i++)for(j=0;j<50;j++); }void init_12864() {rst=1;delay(10);rst=0;wr=1;rd=1;ce=1;cd=1;rst=1;check_status();write_cmd3(0x01,0x00,0x21);//光标指针设置 check_status();write_cmd3(0x00,0x00,0x42);//图形区首地址 check_status();write_cmd3(16,0x00,0x43);//图形区宽度 check_status();write_cmd1(0x80);//显示方式设置,正常显示 check_status();//write_cmd1(0x94);//。
带字库12864液晶显示程序
![带字库12864液晶显示程序](https://img.taocdn.com/s3/m/84dde1c49ec3d5bbfd0a74df.png)
#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define LCDdata P0//采用并行模式sbit E = P2^7;sbit RW = P2^6;sbit RS = P2^5;sbit RST = P2^4;sbit key1 = P2^0; //时、分、秒选择键sbit key2 = P2^1; //加一键sbit key3 = P2^2; //减一键void init();//void check_busy();void delayms(uint x);void write_com(uchar com);void write_data(uchar date);//void delay(uchar y);void t_bcd();void disp_time();void t_time();uchar code string[]={"00时00分00秒"}; uchar code tab[] ={"长春工业大学"}; uchar code tab1[]={"人文信息学院"}; uchar code tab2[]={"electronic 沈琦"};uchar time[6];//显示缓冲区uchar count;char sec,min,hour;//--------------主函数-----------------void main(){init();while(1){if(count == 200){count = 0;sec++;if(sec == 60){sec = 0;min++;if(min == 60){min = 0;hour++;if(hour == 24){hour = 0;}}}t_bcd();disp_time();}t_time();}}//-------------初始化----------------void init(){uchar i;// RST = 0;// delayms(1);// RST = 1;// delayms(40);write_com(0x30);write_com(0x0f);write_com(0x01);write_com(0x81);for(i=0;i<12;i++){write_data(string[i]);delayms(5);}write_com(0x90);for(i=0;i<16;i++){write_data(tab[i]);delayms(5);}write_com(0x8a);for(i=0;i<12;i++){write_data(tab1[i]);delayms(5);}write_com(0x98);for(i=0;i<16;i++){write_data(tab2[i]);delayms(5);}TMOD = 0x01;TH0 = (65536-5000)/256;TL0 = (65536-5000)%256;EA = 1;ET0 = 1;TR0 = 1;write_com(0x0c);}//------------毫秒延时--------------- void delayms(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}/*//--------------判忙程序--------------- void check_busy(){// LCDdata = 0xff;RS = 0;RW = 1;// E = 0;E = 1;LCDdata = 0xff;while(LCDdata&0x80);E = 0;}*///------------写命令----------------- void write_com(uchar com){// check_busy();RS = 0;RW = 0;E = 0;LCDdata = com;// delayms(5);E = 1;delayms(5);E = 0;}//-------------写数据------------------ void write_data(uchar date){// check_busy();RS = 1;RW = 0;E = 0;LCDdata = date;// delayms(5);E = 1;delayms(5);E = 0;}//-----------定时中断0------------- void timer0() interrupt 1{TH0 = (65536-5000)/256;TL0 = (65536-5000)%256;count++;}void t_bcd(){time[0] = sec%10;time[1] = sec/10;time[2] = min%10;time[3] = min/10;time[4] = hour%10;time[5] = hour/10;}//--------------时钟时间显示----------------- void disp_time(){write_com(0x85);write_data(0x30+time[1]);write_data(0x30+time[0]);write_com(0x83);write_data(0x30+time[3]);write_data(0x30+time[2]);write_com(0x81);write_data(0x30+time[5]);write_data(0x30+time[4]);}//------------调整时间程序--------------- void t_time(){static uchar num;if(key1 == 0){delayms(5);while(!key1);TR0 = 0;num++;}//-----------------调时-----------------if(num == 1){write_com(0x81);write_com(0x0f);if(key2 == 0){delayms(5);if(key2 == 0){while(!key2);hour++;if(hour == 24){hour = 0;}t_bcd();write_data(0x30+time[5]);write_data(0x30+time[4]);}}if(key3 == 0){delayms(5);if(key3 == 0){while(!key3);hour--;if(hour == -1){hour = 23;}t_bcd();write_data(0x30+time[5]);write_data(0x30+time[4]);}}}//-----------------调分----------------------if(num == 2){write_com(0x83);if(key2 == 0){delayms(5);if(key2 == 0){while(!key2);min++;if(min == 60){min = 0;}t_bcd();write_data(0x30+time[3]);write_data(0x30+time[2]);}}if(key3 == 0){delayms(5);if(key3 == 0){while(!key3);min--;if(min == -1){min = 59;}t_bcd();write_data(0x30+time[3]);write_data(0x30+time[2]);}}}//---------------调秒------------------if(num == 3){write_com(0x85);if(key2 == 0){delayms(5);if(key2 == 0){while(!key2);sec++;if(sec == 60){sec = 0;}t_bcd();write_data(0x30+time[1]);write_data(0x30+time[0]);}}if(key3 == 0){delayms(5);if(key3 == 0){while(!key3);sec--;if(sec == -1){sec = 59;}t_bcd();write_data(0x30+time[1]);write_data(0x30+time[0]);}}}//---------------退出调整时间----------------- if(num == 4){num = 0;write_com(0x0c);TR0 = 1;}}。
LCD12864编码显示汉字
![LCD12864编码显示汉字](https://img.taocdn.com/s3/m/74b66ea743323968011c92d2.png)
#include <>#include <>#define uint unsigned int#define uchar unsigned char#define DATA P0 //LCD12864数据线sbit RS=P2^2; // 数据\指令选择sbit RW=P2^1; // 读\写选择sbit EN=P2^0; // 读\写使能sbit CS1=P2^3; // 片选1sbit CS2=P2^4; // 片选2/********************************//* 定义中文字库*//********************************/uchar code Hzk[]={/*-- 文字: 各--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x20,0x20,0x10,0x08,0x8F,0xB4,0x44,0x44,0xA4,0x9C,0x04,0x00,0x00,0x00,0x00, 0x02,0x02,0x02,0x01,0x7F,0x42,0x42,0x42,0x42,0x42,0x42,0x7F,0x01,0x03,0x01,0x00,/*-- 文字: 位--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xC0,0x30,0xEC,0x03,0x2A,0xC8,0x09,0x0A,0x0E,0x08,0xE8,0x48,0x08,0x00,0x00, 0x01,0x00,0x00,0x7F,0x20,0x20,0x20,0x27,0x20,0x30,0x2E,0x21,0x20,0x20,0x20,0x00,/*-- 文字: 单--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x28,0x29,0x2E,0x2A,0xF8,0x28,0x2C,0x2B,0x2A,0xF8,0x00,0x00,0x00, 0x08,0x08,0x0B,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x0B,0x08,0x08,0x00,/*-- 文字: 机--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x08,0xC8,0xFF,0x48,0x88,0x08,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00, 0x04,0x03,0x00,0xFF,0x00,0x41,0x30,0x0C,0x03,0x00,0x00,0x00,0x3F,0x40,0x78,0x00,/*-- 文字: 爱--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0xB2,0x96,0x9A,0x92,0xF6,0x9A,0x93,0x91,0x99,0x97,0x91,0x90,0x30,0x00, 0x40,0x20,0xA0,0x90,0x4C,0x47,0x2A,0x2A,0x12,0x1A,0x26,0x22,0x40,0xC0,0x40,0x00,/*-- 文字: 好--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,0x82,0x82,0xF2,0x8A,0x86,0x82,0x80,0x00, 0x80,0x43,0x22,0x14,0x0C,0x73,0x20,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,/*-- 文字: 者--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x20,0x24,0x24,0x24,0x24,0xA4,0xBF,0x64,0x24,0x34,0x28,0x26,0x24,0x20,0x00, 0x04,0x04,0x04,0x02,0x02,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,/*-- 文字: 你--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0xF0,0x2C,0x43,0x20,0x98,0x0F,0x0A,0xE8,0x08,0x88,0x28,0x1C,0x08,0x00, 0x00,0x00,0x7F,0x00,0x10,0x0C,0x03,0x21,0x40,0x3F,0x00,0x00,0x03,0x1C,0x08,0x00,/*-- 文字: 们--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0xF0,0x1C,0x03,0xF0,0x01,0x0E,0x04,0x00,0x04,0x04,0x04,0xFC,0x00,0x00, 0x00,0x00,0x7F,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,/*-- 文字: 辛--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x84,0x84,0x94,0xA4,0xC4,0x85,0x86,0x84,0xC4,0xA4,0x94,0x84,0x84,0x80,0x00, 0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,/*-- 文字: 苦--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x44,0x44,0x44,0x44,0x5F,0x44,0xF4,0x44,0x44,0x5F,0x44,0x44,0x44,0x44,0x00, 0x00,0x00,0x00,0x7E,0x22,0x22,0x22,0x23,0x22,0x22,0x22,0x7E,0x00,0x00,0x00,0x00,/*-- 文字: 了--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x02,0x02,0x02,0x02,0x02,0x02,0xF2,0x12,0x0A,0x0A,0x06,0x06,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: 希--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x30,0x30,0xA9,0x6A,0x3A,0x24,0xE4,0x2A,0x29,0x30,0x20,0x20,0x20,0x00, 0x08,0x04,0x02,0x01,0x3F,0x01,0x01,0x01,0xFF,0x01,0x21,0x61,0x3F,0x00,0x00,0x00,/*-- 文字: 望--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x04,0x04,0xFC,0x85,0x46,0x24,0x04,0x80,0x7E,0x2A,0x2A,0xAA,0xAA,0xFE,0x00,0x00,/*-- 文字: 大--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00, 0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,/*-- 文字: 家--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x18,0x04,0x14,0x94,0x94,0xD5,0xB6,0x14,0x14,0x94,0x04,0x14,0x0C,0x04,0x00, 0x00,0x29,0x29,0x15,0x14,0x4A,0x89,0x44,0x3F,0x06,0x09,0x09,0x10,0x30,0x10,0x00,/*-- 文字: 能--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0xB8,0x97,0x92,0x90,0x94,0xB8,0x10,0x00,0x7F,0x48,0x48,0x44,0x74,0x20,0x00, 0x00,0xFF,0x0A,0x0A,0x4A,0x8A,0x7F,0x00,0x00,0x3F,0x44,0x44,0x42,0x72,0x20,0x00,/*-- 文字: 多--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x20,0x90,0x88,0x54,0x53,0xA2,0x22,0x12,0x0A,0x06,0x00,0x00,0x00, 0x00,0x81,0x89,0x89,0x44,0x44,0x42,0x25,0x29,0x11,0x11,0x09,0x05,0x03,0x01,0x00,/*-- 文字: 多--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x20,0x90,0x88,0x54,0x53,0xA2,0x22,0x12,0x0A,0x06,0x00,0x00,0x00, 0x00,0x81,0x89,0x89,0x44,0x44,0x42,0x25,0x29,0x11,0x11,0x09,0x05,0x03,0x01,0x00,/*-- 文字: 交--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x40,0x41,0x22,0x14,0x18,0x0C,0x16,0x23,0x61,0xC0,0x40,0x00,0x00,/*-- 文字: 流--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x60,0x01,0x86,0x60,0x04,0x44,0x64,0x55,0x4E,0x44,0x64,0xC4,0x04,0x04,0x00, 0x04,0x04,0xFC,0x03,0x40,0x30,0x0F,0x00,0x00,0x7F,0x00,0x3F,0x40,0x40,0x70,0x00,/*-- 文字: 学--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00,/*-- 文字: 习--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x02,0x02,0x0A,0x12,0x22,0x62,0x02,0x82,0x82,0x42,0x02,0xFE,0x00,0x00, 0x00,0x00,0x04,0x0C,0x04,0x02,0x02,0x01,0x01,0x00,0x20,0x40,0x80,0x7F,0x00,0x00,/*-- 文字: 24 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };/****************************************//* 定义ASCII字库8列*16行*//****************************************/uchar code Ezk[]={/*-- 文字: Q --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,/*-- 文字: Q --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,/*-- 文字: 3 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*-- 文字: 5 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, /*-- 文字: 5 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*-- 文字: --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };/*状态检查,LCD是否忙*/void CheckState(){uchar dat;//状态信息(判断是否忙)RS=0; // 数据\指令选择,D/I(RS)=“L”,表示DB7∽DB0 为显示指令数据RW=1; //R/W=“H”,E=“H”数据被读到DB7∽DB0do{DATA=0x00;EN=1; //EN下降源_nop_(); //一个时钟延时dat=DATA;EN=0;dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)}while(!(dat==0x00));}/*写命令到LCD中*/SendCommandToLCD(uchar com){CheckState();//状态检查,LCD是否忙RS=0; //向LCD发送命令。
带字库LCD12864自定义图形、汉字显示
![带字库LCD12864自定义图形、汉字显示](https://img.taocdn.com/s3/m/f342bce74693daef5ef73df9.png)
带字库的LCD12864自定义图片、汉字显示
一、将图片修改成128*64像素
1、打开win7自带的画图软件,载入图片(图片不满足128*64)
2、点击重新调整大小(或者图片处右击鼠标),如下设置,保持纵横比不勾选。
3、图片另存为,选择单色位图。
二、LCD12864用ZIMO21软件取模(BMP图片)
1、基本设置里面设置LCD的大小(如果图片像素就是128*64就不需要设置,直接打开)
2、打开BMP图片(黑白)
3、发现图片偏小,不足128*64,此时生成的数据就缺少128*64个点,显示会照成错误,需要修改一下图片大小。
改成128*64
3、直接调入128*64图片
4、设置参数,如下
5、取模选择C51格式
6、显示效果
三、PCtoLCD2002图片取模设置
四、PCtoLCD2002汉字取模设置(根据程序而定)
1、汉字取模参数设置
2、显示效果如下。
FM12864M-12液晶模块自定义字符任意位置显示的实现
![FM12864M-12液晶模块自定义字符任意位置显示的实现](https://img.taocdn.com/s3/m/6e3b2f8e8762caaedd33d4b9.png)
工业仪表与 自动化装置
・ 5・ 4
F 1 8 4 一1 液 晶 模 块 M 26M 2
自定 义 字符 任 意 位 置 显 示 的 实 现
熊 金, 彭 伟
( 南 自动 化研 究所 数控 部 , 西 四川 绵 阳 6 1 0 ) 2 0 0
摘 要 : 绍 了点 阵 图形 液 晶显 示模 块 F 2 6 M 一1 介 M1 8 4 2的硬 件 结 构 , 出 MC 给 U与 F 2 6 M 一 M1 8 4
术 的不 断发 展 , 片机 应 用 系 统 显示 部 分 的硬 件设 单
计 更 加 简 洁 … 。该 文 以 F 2 6 M 一1 M1 8 4 2图形 点 阵
液 晶显 示模 块 为例 , 绍 在 单 片机 控 制 系统 中 自定 介 义 字符 任意 位置 显示 的具 体 实 现 方 法 , 新 点 在 于 创 推导 出 了 坐 标 的计 算 公 式 , 给 出 了相 应 的 实 现 并
中图分 类 号 :P 3 T 34 文 献标 志码 : B 文章编 号 :0 0— 6 2 2 1 )4— 0 5— 4 10 0 8 ( 0 1 0 0 4 0
Re lz to f d s a fn to ha a t r a o sto a i a i n o ipl y de ii n c r c e s r nd m po ii n i f r LCD o u e FM 1 8 4M o k s h d l ih i c n r l d b U,a l a e b s e in p n i l fF 2 6 M 2 a d w r c e u e wh c s o tol y MC e swel s t a i d sg r c p e h c i
12864字符和汉字显示程序
![12864字符和汉字显示程序](https://img.taocdn.com/s3/m/3a99bbd026fff705cc170ab9.png)
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit lcdrs=P2^4;sbit lcdrw=P2^5;sbit lcden=P2^6;/****************************** 函数名:delayus()功能:延时k微秒参数:k返回值:无*******************************/ void delayus(uint k){while(k--);}/****************************** 函数名:lcd_wrcom()功能:12864写命令参数:lcd_com返回值:无*******************************/ void lcd_wrcom(char lcd_com){uchar temp;lcdrs=0;lcdrw=1;do //12864判忙{lcden=1;temp=P0;delayus(6);lcden=0;}while(temp & 0x80);//不忙则退出循环lcdrw=0;P0=lcd_com; //写命令lcden=1;delayus(6);lcden=0;}/****************************** 函数名:lcd_wrdata()功能:12864写数据参数:lcd_dat返回值:无*******************************/ void lcd_wrdata(char lcd_dat){uchar temp;lcdrs=0;lcdrw=1;do //12864判忙{lcden=1;temp=P0;delayus(6);lcden=0;}while(temp & 0x80);lcdrs=1;lcdrw=0;P0=lcd_dat; //写数据lcden=1;delayus(6);lcden=0;}/****************************** 函数名:init_12864()功能:12864初始化参数:无返回值:无*******************************/ void init_12864(){delayus(100); //延时100微秒lcd_wrcom(0x30);//功能设定delayus(5000);lcd_wrcom(0x02);//地址归位delayus(100);lcd_wrcom(0x0e);//显示状态delayus(100);lcd_wrcom(0x1c);//游标和显示的移位delayus(100);lcd_wrcom(0x01);//清屏delayus(5000); //延时5毫秒}/******************************************* 函数名称:disp_HZ功能:控制液晶显示汉字参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示汉字个数返回值:无********************************************/ void disp_HZ(uchar addr,const uchar * pt,uchar num) {uchar i;lcd_wrcom(addr);for(i = 0;i < (num*2);i++)lcd_wrdata(*(pt++));}/******************************函数名:main()功能:调用子程序/12864显示程序参数:无返回值:无*******************************/void main() //显示字符{uchar i;const uchar hang1[]={"一路江南"};//汉字显示init_12864();lcd_wrcom(0x80);//设定显示起始地址for(i=0;i<16;i++)lcd_wrdata(0x00+i);lcd_wrcom(0x90);//设定显示起始地址for(i=0;i<16;i++)lcd_wrdata(0x10+i);lcd_wrcom(0x88);//设定显示起始地址for(i=0;i<16;i++)lcd_wrdata(0x20+i);lcd_wrcom(0x98);//设定显示起始地址for(i=0;i<16;i++)lcd_wrdata(0x30+i);disp_HZ(0x80,hang1,4);//调用显示汉字while(1);}。
带字库12864超详细扩展操作,写自定义字符,画图,画直线,画圆,读取数据等操作
![带字库12864超详细扩展操作,写自定义字符,画图,画直线,画圆,读取数据等操作](https://img.taocdn.com/s3/m/dc04322abd64783e09122bac.png)
在此指出,这一篇文章出至网络上zhaoshan413之手,感谢他的无私贡献,让大家轻松玩转带字库12864!~~[p=30, 2, left]之前说学完12864字库液晶后和大家交流一下心得,一直没有时间,今天整理一下发上来,希望对想学习的朋友能有点帮助…首先说明一点,本人也是初学者,自感水平不高,若有不足及不对之处,望情指正…以下以并行口传输为例,别的还不会,呵呵![/p][p=30, 2, left]先传一下ST7920的芯片说明书:[/p][p=30, 2, left]/bbs/redirect.php?tid=7676&goto=lastpo st#lastpost[/p][p=30, 2, left]ST7920(字库)12864.pdf(2010-12-01 10:46:58, Size: 1.65 MB, Downloads: 1689)[/p][p=30, 2, left]一、首先说一下关于驱动函数的书写,这些是液晶显示的基础一般包括四个函数:1、写命令函数;2、写数据函数;3、读状态函数;4、读数据函数;这四个函数并不是必须全部写的,具体要看你实现的功能,如果只是单纯的显示汉字和字符,写命令、写数据、读状态这三个函数就够了,如过你还需要进行一些绘图的操作,那读数据函数也必须书写。
另外关于读状态函数,其实也就是用于判忙操作,我看郭天祥的书里面是这样说的:原则上每次对控制器进行读写操作之前,都必须进行读写检测,由于单片机的操作速度慢于液晶控制器的反应速度,因此可不进行读写检测,或者只进行简短的延时即可。
因此,读状态函数也可以不写,只用简短的延时函数替换即可。
1、写操作的编写:首先看一下时序图[/p][p=30, 2, left]时序.JPG[/p][p=30, 2, left]由图可见操作很简单:1>RS=1(写数据操作);或者RS=0(写命令操作);2>RW=0;//指明为写操作3>E=1;4>DB=data;//data为你要写入的命令或数据值5>E=0;[/p][p=30, 2, left]以下是我的驱动函数,仅供参考:[/p][p=30, 2, left]CODE:/********************************液晶端口定义**************************/#define lcd_data P0 //数据口sbit RS = P2^4; //选择寄存器(并行) 0:指令寄存器1:数据寄存器;sbit RW = P2^5; //读写控制脚(并行) 0:写入 1:读出sbit E = P2^6; //读写数据启始脚(并行)sbit PSB = P2^1; //串并方式选择引脚,0为串行模式,1为8/4位数据口模式sbit RST = P2^3; //复位引脚//******************************************************* *//延时函数//******************************************************* *void delay(unsigned int k){unsigned int i;unsigned char j;for(i=0;i<k;i++){for(j=0;j<10;j++);}}//******************************************************* *//延时1ms函数//******************************************************* *void delay_ms(unsigned int k)//延时0.994us,晶振12M{unsigned int x,y;for(x=k;x>0;x--)for(y=121;y>0;y--);}//******************************************************* *//写命令函数//******************************************************* *void LcdWcom(unsigned char WCom){delay(1);RS=0; //指明操作对象为指令寄存器RW=0; //指明为写操作E=1;lcd_data=WCom; //将命令写入总线E=0;}//******************************************************* *//写数据函数//******************************************************* *void LcdWdata(unsigned char WData){delay(1);RS=1; //指明操作对象为数据寄存器RW=0; //指明为写操作E=1;lcd_data=WData; //将数据写入总线E=0;}[/p][p=30, 2, left]二、初始化操作[/p][p=30, 2, left]以8位并行操作为例,操作流程图如下:[/p][p=30, 2, left]初始化.JPG[/p][p=30, 2, left]初始化操作如下:[/p][p=30, 2, left]1>芯片上电;[/p][p=30, 2, left]2>延时40ms以上;[/p][p=30, 2, left]3>复位操作:RST出现一个上升沿(RST=1;RST=0;RST=1;);[/p][p=30, 2, left]4>功能设定;[/p][p=30, 2, left]5>延时100us以上;[/p][p=30, 2, left]6>再次进行功能设定;[/p][p=30, 2, left]7>延时37us;[/p][p=30, 2, left]8>显示开关控制;[/p][p=30, 2, left]9>延时100us 以上;[/p][p=30, 2, left]10>清除显示;[/p][p=30, 2, left]11>延时10ms以上;[/p][p=30, 2, left]12>进入点设置;[/p][p=30, 2, left]13>初始化结束;[/p][p=30, 2, left]这里我遇到了一个小问题,我的液晶按照这个顺序进行初始化结果不正确,无法显示,最后我把调整了一下就可以了,调整后的顺序为:清除显示进入点设置显示开关控制,不知道是什么原因,知道的告诉我一声…[/p][p=30, 2, left]CODE://******************************************************* *//显示初始化函数//******************************************************* *void Display_Init(void){delay_ms(45); //延时45msPSB=1; //8位并行口//复位操作RST=1;delay(1);RST=0;delay(1);RST=1;delay(1);//功能设定LcdWcom(0x30); //设置为8位并行口,基本指令集delay(10);LcdWcom(0x30); //再次设置为8位并行口,基本指令集delay(5);// //显示开关控制// LcdWcom(0x0c); //游标显示关,正常显示,整体显示开// delay(10);//清除显示LcdWcom(0x01);delay_ms(12); //延时12ms//进入点设置LcdWcom(0x06); //设置为游标右移,DDRAM位地址加1,画面不移动delay(5);LcdWcom(0x0C); //开显示}[/p][p=30, 2, left]三、显示基本的字符和汉字[/p][p=30, 2, left]1、要想显示汉字或字符,首先要确定显示的位置,看看芯片说明书上关于屏幕地址的分配:[/p][p=30, 2, left]DDRAM位址.JPG[/p][p=30, 2, left]由于此液晶为128*64,即是横向128个点,竖向64个点,由于该液晶控制器支持的字符为8*16,汉字为16*16,因此只能显示四行,如果是汉字,为每行显示8个,如果是字符,每行显示16个。
LCD12864中文字库使用说明
![LCD12864中文字库使用说明](https://img.taocdn.com/s3/m/fedbbd204a35eefdc8d376eeaeaad1f34693115e.png)
( 一 ) ( 一 )概括⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯3(二) ( 二)外形尺寸1 方框⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯32 外型尺寸⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4( 三 )( 三 )模的接口⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4( 四 )( 四 )硬件明⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯5( 五 )指令明⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯7( 五 )( 五 )写操作序⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯8( 六 )( 六 )沟通参数⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯11( 七 )( 七 )件初始化程⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯12( 八 )( 八 )用例⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯13( 九 )( 九 )附1 半字符表⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯202 字字符表⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯21一、概括FYD12864-0402B是一种拥有 4 位/8 位并行、 2 线或 3 线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为 128× 64, 内置 8192 个 16*16 点汉字,和 128 个 16*8 点 ASCII 字符集 . 利用该模块灵巧的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
能够显示 8× 4 行 16× 16 点阵的汉字 . 也可达成图形显示 . 低电压低功耗是其又一明显特色。
由该模块构成的液晶显示方案与同种类的图形点阵液晶显示模块对比,无论硬件电路构造或显示程序都要简短得多,且该模块的价钱也略低于同样点阵的图形液晶模块。
基本特征 :低电源电压( VDD:+3.0--+5.5V)显示分辨率 :128 × 64 点内置汉字字库,供给8192 个 16× 16 点阵汉字 ( 简繁体可选 )内置 128 个 16× 8 点阵字符2MHZ时钟频次显示方式: STN、半透、正显驱动方式: 1/32DUTY, 1/5BIAS视角方向: 6 点背光方式:侧部高亮白色 LED,功耗仅为一般 LED的 1/5 —1/10 通信方式:串行、并口可选内置 DC-DC变换电路,无需外加负压无需片选信号,简化软件设计工作温度 :0 ℃ -+55℃ ,储存温度:-20℃ -+60℃二、方框图3、外形尺寸图三、模块接口说明* 说明 1:如在实质应用中仅使用串口通信模式,可将PSB接固定低电平,也能够将模块上的J8 和“ GND”用焊锡短接。
12864程序,字库与自定义字符的显示
![12864程序,字库与自定义字符的显示](https://img.taocdn.com/s3/m/565cd5fbaef8941ea76e0559.png)
uchar code user1[]={
/*--文字:你--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x08,0x80,0x08,0x80,0x08,0x80,0x11,0x38,0x11,0xC8,0x32,0x10,0x50,0x40,
delay(1);
RES=1;
delay(10);
w_cmd(0x30);//功能设置,选着8位元模式
delay(1);
w_cmd(0x30);//选择基本指令集,因为DL与RE不能同时改变需要两个指令
delay(1);
w_cmd(0x0c);//开显示(无游标、不反白)
delay(1);
w_cmd(0x01);//clear print
12864并口输入在输入输出数据是注意时序之前由于忙检测时序写错而无法显示字库文字自定义字符注意地址与编码方式对应不然会显示乱码includesbitrsp24
/*------------------------------------
12864并口输入,在输入输出数据是注意时序
之前由于忙检测时序写错,而无法显示字库文字
{
RW=1;
RS=0;
E=1;
data_port=0xff;
while((data_port&&0x80)==0x80);//data_port&&0x80必须加上括号
E=0;
}
void w_cmd(uint dat)
{check_busy();
RS=0;
RW=0;
E=1;
data_port=dat;
12864画圆程序 12864显示任意图形和字符
![12864画圆程序 12864显示任意图形和字符](https://img.taocdn.com/s3/m/a75e3aa3b0717fd5360cdca6.png)
uchar Read_data()
{
uchar shuju;
P0=0xff;
rs=1;
// D/I=1,代表数据
rw=1;
// R/W=1.读取
delayms(10);
en=1;
delayms(100); shuju=P0; //读取当前显示的数据
en=0;
return(shuju);
}
/******************************************* 函数名称:Draw_TX 功 能:显示一个 16*16 大小的图形 参 数:Yaddr--Y 地址
uchar i,j,k;
Write_com(0x34);
//打开扩展指令集
i=0x80;
for(j=0;j<32;j++)
{
Write_com(i++);
Write_com(0x80);
for(k=0;k<16;k++)
{
Write_data(0x00);
}
}
i=0x80;
for(j=0;j<32;j++)
{
Write_com(i++);
Write_com(0x88);
for(k=0;k<16;k++)
{
Write_data(0x00);
}
} Write_com(0x30);
//回到基本指令集
}
/****************************
画点函数:Write_Point() x 表示列,y 表示为行。 ******************************/
lcd12864带字库经典程序
![lcd12864带字库经典程序](https://img.taocdn.com/s3/m/9473a96b011ca300a6c39040.png)
X++;
Delay5Ms();
}
}
}
/***********短延时********************************************************/
voidDelay5Ms(void)
{
unsignedintTempCyc= 5552;
while(TempCyc--);
WriteDataLCD(DData);
}
/***********按指定位置显示一串字符*****************************************/
voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData)
voidWriteDataLCD(unsignedcharWDLCD)
{
ReadStatusLCD();//检测忙
LCD_RS= 1;
LCD_RW= 0;
LCD_Data=WDLCD;
LCD_E= 1;
LCD_E= 1;
LCD_E= 0;
}
/***********写指令********************************************************/
sbitLCD_RS=P1^0;
sbitLCD_RW=P1^1;
sbitLCD_E=P1^2;
sbitPSB=P1^6;//PSB脚为-12系列的串、并通讯功能切换,使用位并行接口,PSB=1
/********宏定义***********************************************************/
带字库12864画点波形显示程序
![带字库12864画点波形显示程序](https://img.taocdn.com/s3/m/0c05f3e181c758f5f61f67d9.png)
// uint ADzhi; RW=0 ; lcdreset(); ceshi(); clrgdram(); delay(5000); clrscreen(); for(i=4;i<124;i++) {
j=35-27*sin((i-4)*3.14/30); //正弦波显示 DrawPoint(i,j,colour);
write_com(0x80); //第一行(如果是地址是:80H,即 LCD 的第一行的第一个位置显示) hzkdis("中国计量学院");
write_com(0x90); //第二行(如果是地址是:90H,即 LCD 的第二行的第一个位置显示) hzkdis("光电学院");
write_com(0x88); //第三行(如果是地址是:88H,即 LCD 的第二行的第一个位置显示) hzkdis("06 光信 2");
/*-------------------写数据到 LCD----------------------------*/ void write_data(unsigned char Dispdata) {
chk_busy(); RS=1 ; RW=0 ; E=1 ; Lcd_Bus=Dispdata ; delay(5); //------------------在数据写入的时候加入适当的延时 E=0 ; delay(5); } /*------------------初始化 LCD 屏--------------------------*/ void lcdreset() { delay(2000); write_com(0x30); delay(10); //选择基本指令集 write_com(0x30); //选择 8bit 数据流 delay(5); write_com(0x0c); //开显示(无游标、不反白) delay(10); write_com(0x01); //清除显示,并且设定地址指针为 00H delay(500); write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位 delay(0); } /*------------------显示字符串--------------------------*/ void hzkdis(unsigned char code*s) { while(*s>0) {
LCD 12864液晶显示汉字程序
![LCD 12864液晶显示汉字程序](https://img.taocdn.com/s3/m/a6cb7a24aaea998fcc220e18.png)
/*--文字: --*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--文字: --*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
/*--文字: --*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0E,0x10,0x20,0x3F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,
/*--文字:地--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16 --*/
12864各种画图程序(带字库修改)
![12864各种画图程序(带字库修改)](https://img.taocdn.com/s3/m/eb856001bb68a98271fefa80.png)
/****************************************************************************** ******************************************************************************* *********///程序说明:本程序为12864(st7920)驱动程序,只实现了最简单的显示功能//端口设置:RS、RW、EN分别为P0口的0、1、2,数据口为P2口//注意:1.要想在液晶屏上同时显示自定义字库和绘图,必须先显示自定义字库// 2.本程序所有函数均有用且正确,由于我的keil未破解不能编译,所以将其注释了// 3.用取模软件取的图形或汉字必须是逐行取的,因为本函数是在液晶上逐行打点的/****************************************************************************** *****************************************************************************/ #include<reg51.h>#include<intrins.h> //内含-NOP-函数#include<stdlib.h> //内含rand()函数#define uchar unsigned char#define uint unsigned int//**********宏定义所需指令#define BASIC_SET 0x30#define EXTEND_SET 0x34#define DRAW_ON 0x36#define DRAW_OFF 0x34//*************端口定义sbit LCD_RS = P0^0;sbit LCD_RW = P0^1;sbit LCD_EN = P0^2;//************变量定义//uchar dis1[10];//****************短延时void delay(uint k){uint i;uchar j;for(i = 0; i < k ;i ++)for(j = 0; j < 10 ;j ++);}//***********ms级延时函数/*void delay_1ms(uint x){uint i,j;for(j = 0;j < x; j++)for(i = 0;i < 110; i++);} *///***********12864写指令函数void write_com(uchar cmd){LCD_RS = 0;LCD_RW = 0;P2 = cmd;delay(5);LCD_EN = 1;delay(5);LCD_EN = 0;}//********12864写数据函数void write_dat(uchar dat){LCD_RS = 1;LCD_RW = 0;P2 = dat;delay(5);LCD_EN = 1;delay(5);LCD_EN = 0;}//****************从LCD中读数据uchar read_dat(void){uchar temp;P2 = 0XFF; //释放数据线LCD_RS = 1; //数据LCD_RW = 1; // 读模式LCD_EN = 1; //E为高电平进行读数据或指令delay(1);temp = P2;LCD_EN = 0;return temp;}//********************************************************//设置光标(地址)函数//参数说明:x---为行号,y为列号//********************************************************void set_cursor(unsigned char x, unsigned char y){unsigned char i;switch(x) //确定行号{case 0x00: i=0x80; break; //第一行case 0x01: i=0x90; break; //第二行case 0x02: i=0x88; break; //第三行case 0x03: i=0x98; break; //第四行default : break;}i = y+i; //确定列号write_com(i);}//********************************************************//显示字符函数//********************************************************void display_char(unsigned char Alphabet){write_dat(Alphabet); //写入需要显示字符的显示码}//********************************************************//指定位置显示字符串函数//参数说明:x为行号,y为列号//********************************************************void display_string(unsigned char x,unsigned char y,unsigned char *Alphabet) {unsigned char i=0;set_cursor(x,y); //设置显示的起始地址while(Alphabet[i]!='\0'){write_dat(Alphabet[i]); //写入需要显示字符的显示码i++;}}//***********************以下为GDRAM绘图部分***************************////*********************绘图显示的清屏函数(因清屏指令在画图时不能用)------------------------------------------------------------------------------注意!!!!!!!void gui_clear(){uchar i , j , k;write_com(EXTEND_SET);//扩展指令集,8位数据传输write_com(DRAW_OFF);//绘图显示关闭for(i = 0; i < 2; i ++)//分上下两屏写{for(j = 0; j < 32; j ++){write_com(0x80 + j);//写y坐标delay(1);if(i == 0) //写x坐标{write_com(0x80);delay(1);}else //写下半屏{write_com(0x88);delay(1);}for(k = 0; k < 16; k ++)//写一整行数据{write_dat(0x00);//写高字节write_dat(0x00);//写低字节delay(1);}}}write_com(DRAW_ON);//打开绘图显示write_com(BASIC_SET);//打开基本指令集}//******************************************************************//*****有反白显示功能的打点函数***********//参数:color=1,该点填充1;color=0,该点填充白色0;//*******************************************************************void GUI_Point(unsigned char x,unsigned char y,unsigned char color){unsigned char x_Dyte,x_byte; //定义列地址的字节位,及在字节中的哪1位unsigned char y_Dyte,y_byte; //定义为上下两个屏(取值为0,1),行地址(取值为0~31)unsigned char GDRAM_hbit,GDRAM_lbit;write_com(0x36); //扩展指令命令/***X,Y坐标互换,即普通的X,Y坐标***/x_Dyte=x/16; //计算在16个字节中的哪一个x_byte=x&0x0f; //计算在该字节中的哪一位y_Dyte=y/32; //0为上半屏,1为下半屏y_byte=y&0x1f; //计算在0~31当中的哪一行write_com(0x80+y_byte); //设定行地址(y坐标),即是垂直地址write_com(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏,即是水平地址read_dat(); //预读取数据GDRAM_hbit= read_dat(); //读取当前显示高8位数据GDRAM_lbit= read_dat(); //读取当前显示低8位数据delay(1);write_com(0x80+y_byte); //设定行地址(y坐标)write_com(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏delay(1);if(x_byte<8) //判断其在高8位,还是在低8位{if(color==1){write_dat(GDRAM_hbit|(0x01<<(7-x_byte))); //置位GDRAM区高8位数据中相应的点}elsewrite_dat(GDRAM_hbit&(~(0x01<<(7-x_byte)))); //清除GDRAM区高8位数据中相应的点write_dat(GDRAM_lbit); //显示GDRAM区低8位数据}else{write_dat(GDRAM_hbit);if(color==1)write_dat(GDRAM_lbit|(0x01<<(15-x_byte))); //置位GDRAM区高8位数据中相应的点elsewrite_dat(GDRAM_lbit&(~(0x01<<(15-x_byte))));//清除GDRAM区高8位数据中相应的点}write_com(0x30); //恢复到基本指令集}//***********(给定坐标并打点的)任意位置打点函数void lcd_set_dot(uchar x,uchar y){uchar x_byte,x_bit;//确定在坐标的那一字节哪一位uchar y_ping , y_bit;//确定在坐标的哪一屏哪一行uchar tmph , tmpl;//定义两个临时变量,用于存放读出来的数据write_com(EXTEND_SET);//扩展指令集write_com(DRAW_OFF);//绘图显示关闭x_byte = x / 16;//算出在哪一字节,注意一个地址是16位的x_bit = x % 16;//& 0x0f;//算出在哪一位y_ping = y / 32;//确定在上半屏还是下半屏,0代表上半屏,1代表下半屏y_bit = y % 32;//& 0x1f;//确定在第几行write_com(0X80 + y_bit);//先写垂直地址(最高位必须)write_com(0x80 + x_byte + 8 * y_ping);//水平坐标,下半屏坐标起始地址为0x88,(+8*y_ping)就是用来确定上半屏还是下半屏read_dat();//预读取数据tmph = read_dat();//读取当前显示高8位数据tmpl = read_dat();//读取当前显示低8位数据delay(1);write_com(0x80 + y_bit);//读操作会改变AC,所以重新设置一下write_com(0x80 + x_byte + 8 * y_ping);delay(1);if(x_bit < 8){write_dat(tmph | (0x01 << (7 - x_bit)));//写高字节,因为坐标是从左向右的,GDRAM 高位在昨,低位在右write_dat(tmpl);//原低位数据送回}else{write_dat(tmph);//原高位数据送回write_dat(tmpl | (0x01 << (15 - x_bit)));}write_com(DRAW_ON); //打开绘图显示write_com(BASIC_SET);//回到基本指令集}//************画水平线函数**********************************////x0、x1为起始点和终点的水平坐标,y为垂直坐标***************////**********************************************************//void gui_hline(uchar x0, uchar x1, uchar y){uchar bak;//用于对两个数互换的中间变量,使x1为大值if(x0 > x1){bak = x1;x1 = x0;x0 = bak;}do{lcd_set_dot(x0 , y);//从左到右逐点显示x0 ++;}while(x1 >= x0);}//***********画竖直线函数***********************************////x为起始点和终点的水平坐标,y0、y1为垂直坐标***************////**********************************************************//void gui_rline(uchar x, uchar y0, uchar y1)uchar bak;//用于对两个数互换的中间变量,使y1为大值if(y0 > y1){bak = y1;y1 = y0;y0 = bak;}do{lcd_set_dot(x , y0);//从上到下逐点显示y0 ++;}while(y1 >= y0);}//*********任意两点间画直线*********************************// //x0、y0为起始点坐标,x1、y1为终点坐标**********************// //**********************************************************// void gui_line(uchar x0 , uchar y0 , uchar x1 , uchar y1){char dx;//直线x轴差值char dy;//直线y轴差值char dx_sym;//x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym;//y轴增长方向,为-1时减值方向,为1时增值方向char dx_x2;//dx*2值变量,用于加快运算速度char dy_x2;//dy*2值变量,用于加快运算速度char di; //决策变量if(x0 == x1)//判断是否为垂直线{gui_rline(x0 , y0 , y1);//画垂直线return;}if(y0 == y1)//判断是否为水平线{gui_hline(x0 , x1 , y0);//画水平线return;}dx = x1 - x0;//求取两点之间的差值dy = y1 - y0;//****判断增长方向,或是否为水平线、垂直线、点*// if(dx > 0)//判断x轴方向dx_sym = 1;else{if(dx < 0)dx_sym = -1;else{gui_rline(x0 , y0 , y1);return;}}if(dy > 0)//判断y轴方向dy_sym = 1;else{if(dy < 0)dy_sym = -1;else{gui_hline(x0 , x1 , y0);return;}}/*将dx、dy取绝对值***********/dx = dx_sym * dx;dy = dy_sym * dy;/****计算2倍的dx、dy值*******/dx_x2 = dx * 1;//我改为了一倍,这样才跟真实的两点对应dy_x2 = dy * 1;/***使用bresenham法进行画直线***/if(dx >= dy)//对于dx>=dy,使用x轴为基准{di = dy_x2 - dx;while(x0 != x1){lcd_set_dot(x0,y0);x0 +=dx_sym;if(di < 0)di += dy_x2;//计算出下一步的决策值else{di += dy_x2 - dx_x2;y0 += dy_sym;}}lcd_set_dot(x0, y0);//显示最后一点}else //对于dx<dy使用y轴为基准{di = dx_x2 - dy;while(y0 != y1){lcd_set_dot(x0, y0);y0 += dy_sym;if(di < 0)di += dx_x2;else{di += dx_x2 - dy_x2;x0 += dx_sym;}}lcd_set_dot(x0, y0);//显示最后一点}}//***************************************************************************// //*******************画指定宽度的任意两点之间的直线**************************// //参数说明:x0、y0为起始点坐标,x1、y1为终点坐标,with为线宽*****************// //***************************************************************************// void gui_linewith(uchar x0 , uchar y0 , uchar x1 , uchar y1 , uchar with){char dx; // 直线x轴差值变量char dy; // 直线y轴差值变量char dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向char dx_x2; // dx*2值变量,用于加快运算速度char dy_x2; // dy*2值变量,用于加快运算速度char di; // 决策变量char wx, wy; // 线宽变量char draw_a, draw_b;// 参数过滤if(with==0) return;if(with>50) with = 50;dx = x1-x0; // 求取两点之间的差值dy = y1-y0;wx = with/2;wy = with-wx-1;//判断增长方向,或是否为水平线、垂直线、点if(dx>0) // 判断x轴方向{dx_sym = 1; // dx>0,设置dx_sym=1 }else{if(dx<0){dx_sym = -1; // dx<0,设置dx_sym=-1 }else{//dx==0,画垂直线,或一点wx = x0-wx;if(wx<0) wx = 0;wy = x0+wy;while(1){x0 = wx;gui_rline(x0, y0, y1);if(wx>=wy) break;wx++;}return;}}if(dy>0) // 判断y轴方向{dy_sym = 1; // dy>0,设置dy_sym=1}else{if(dy<0){dy_sym = -1; // dy<0,设置dy_sym=-1 }else{//dy==0,画水平线,或一点wx = y0-wx;if(wx<0) wx = 0;wy = y0+wy;while(1){y0 = wx;gui_hline(x0, x1, y1);if(wx>=wy) break;wx++;}return;}}// 将dx、dy取绝对值dx = dx_sym * dx;dy = dy_sym * dy;//计算2倍的dx及dy值dx_x2 = dx*2;dy_x2 = dy*2;//使用Bresenham法进行画直线if(dx>=dy) // 对于dx>=dy,则使用x轴为基准{di = dy_x2 - dx;while(x0!=x1){//x轴向增长,则宽度在y方向,即画垂直线draw_a = y0-wx;if(draw_a<0) draw_a = 0;draw_b = y0+wy;gui_rline(x0, draw_a, draw_b);x0 += dx_sym;if(di<0){di += dy_x2; // 计算出下一步的决策值}else{di += dy_x2 - dx_x2;y0 += dy_sym;}}draw_a = y0-wx;if(draw_a<0) draw_a = 0;draw_b = y0+wy;gui_rline(x0, draw_a, draw_b);}else // 对于dx<dy,则使用y轴为基准{di = dx_x2 - dy;while(y0!=y1){//y轴向增长,则宽度在x方向,即画水平线draw_a = x0-wx;if(draw_a<0) draw_a = 0;draw_b = x0+wy;gui_hline(draw_a, y0, draw_b);y0 += dy_sym;if(di<0){di += dx_x2;}else{di += dx_x2 - dy_x2;x0 += dx_sym;}}draw_a = x0-wx;if(draw_a<0) draw_a = 0;draw_b = x0+wy;gui_hline(draw_a, y0, draw_b);}//***********画矩形函数*************************************// //x0、y0为矩形左上角坐标值,x1、y1为矩形右下角坐标值********// //**********************************************************// void gui_rectangle(uchar x0 , uchar y0 , uchar x1 , uchar y1){gui_hline(x0 , x1 , y0);gui_rline(x0 , y0 , y1);gui_rline(x1 , y0 , y1);gui_hline(x0 , x1 , y1);}//****************画填充矩形函数****************************// //x0、y0为矩形左上角坐标值,x1、y1为矩形右下角坐标值********// //**********************************************************// /*void gui_rectangle_fill(uchar x0 , uchar y0 , uchar x1 , uchar y1){uchar i;//转换数据的中间变量,使x1、y1大if(x0 > x1){i = x0;x0 = x1;x1 = i;}if(y0 > y1){i = y0;y0 = y1;y1 = i;}//***判断是否是直线***//* if(y0 == y1)//画水平线{gui_hline(x0 , x1 , y0);return;}if(x0 == x1)//画竖直线gui_rline(x0 , y0 , y1);return;}while(y0 <= y1)//画填充矩形{gui_hline(x0 , x1 , y0);y0 ++;}} *///*******************画正方形函数*************************// //x0、y0为正方形左上角坐标,with正方形边长****************// //********************************************************// /*void gui_square(uchar x0 , uchar y0 , uchar with){if(with == 0)return;if((x0 + with) > 127)//横轴超出液晶边界return;if((y0 + with) > 63)return;gui_rectangle(x0 , y0 , x0 + with , y0 + with);} *///****************画填充正方形函数*************************// //x0、y0为正方形左上角坐标,with正方形边长*****************// //*********************************************************// /*void gui_square_fill(uchar x0 , uchar y0 , uchar with){if(with == 0)return;if((x0 + with) > 127)//横轴超出液晶边界return;if((y0 + with) > 63)return;gui_rectangle_fill(x0 , y0 , x0 + with , y0 + with);} *///****************画圆函数*********************************////x0、y0为圆心坐标,r为圆的半径****************************////*********************************************************///*void gui_circle(uchar x0 , uchar y0 , uchar r){char a , b;char di;if(r > 31 || r == 0)//圆大于液晶屏或者没半径则返回return;a = 0;b = r;di = 3 - 2 * r;//判断下个点位置的标志while(a <= b){lcd_set_dot( x0 - b , y0 - a);//3lcd_set_dot( x0 + b , y0 - a); //0lcd_set_dot( x0 - a , y0 + b); //1lcd_set_dot( x0 - b , y0 - a); //7lcd_set_dot( x0 - a , y0 - b); //2lcd_set_dot( x0 + b , y0 + a); //4lcd_set_dot( x0 + a , y0 - b); //5lcd_set_dot( x0 + a , y0 + b); //6lcd_set_dot( x0 - b , y0 + a);a ++;//***使用bresenham算法画圆********//* if(di < 0)di += 4 * a + 6;else{di += 10 + 4 * (a - b);b --;}lcd_set_dot( x0 + a , y0 + b);}} *///***************************************************************************// //***************************画正椭圆函数************************************// //说明:给定椭圆的四个点的参数,最左、最右点的x轴坐标值为x0、x1,最上、最下点// 的y轴坐标为y0、y1.//说明:----------------------------显示效果不好//***************************************************************************// /*void gui_ellipse(char x0, char x1, char y0, char y1){char draw_x0, draw_y0; // 刽图点坐标变量char draw_x1, draw_y1;char draw_x2, draw_y2;char draw_x3, draw_y3;char xx, yy; // 画图控制变量char center_x, center_y; // 椭圆中心点坐标变量char radius_x, radius_y; // 椭圆的半径,x轴半径和y轴半径int radius_xx, radius_yy; // 半径乘平方值int radius_xx2, radius_yy2; // 半径乘平方值的两倍char di; // 定义决策变量/* 参数过滤*//* if( (x0==x1) || (y0==y1) ) return; *//* 计算出椭圆中心点坐标*//* center_x = (x0 + x1) >> 1;center_y = (y0 + y1) >> 1; *//* 计算出椭圆的半径,x轴半径和y轴半径*//* if(x0 > x1){ radius_x = (x0 - x1) >> 1;}else{ radius_x = (x1 - x0) >> 1;}if(y0 > y1){ radius_y = (y0 - y1) >> 1;}else{ radius_y = (y1 - y0) >> 1;} *//* 计算半径平方值*//* radius_xx = radius_x * radius_x;radius_yy = radius_y * radius_y; *//* 计算半径平方值乘2值*//* radius_xx2 = radius_xx<<1;radius_yy2 = radius_yy<<1; *//* 初始化画图变量*//* xx = 0;yy = radius_y;di = radius_yy2 + radius_xx - radius_xx2*radius_y ; // 初始化决策变量/* 计算出椭圆y轴上的两个端点坐标,作为作图起点*//* draw_x0 = draw_x1 = draw_x2 = draw_x3 = center_x;draw_y0 = draw_y1 = center_y + radius_y;draw_y2 = draw_y3 = center_y - radius_y;lcd_set_dot(draw_x0, draw_y0); // 画y轴上的两个端点lcd_set_dot(draw_x2, draw_y2);while( (radius_yy*xx) < (radius_xx*yy) ){ if(di<0){ di+= radius_yy2*(2*xx+3);}else{ di += radius_yy2*(2*xx+3) + 4*radius_xx - 4*radius_xx*yy;yy--;draw_y0--;draw_y1--;draw_y2++;draw_y3++;}xx ++; // x轴加1draw_x0++;draw_x1--;draw_x2++;draw_x3--;lcd_set_dot(draw_x0, draw_y0);lcd_set_dot(draw_x1, draw_y1);lcd_set_dot(draw_x2, draw_y2);lcd_set_dot(draw_x3, draw_y3);}di = radius_xx2*(yy-1)*(yy-1) + radius_yy2*xx*xx + radius_yy + radius_yy2*xx - radius_xx2*radius_yy;while(yy>=0){ if(di<0){ di+= radius_xx2*3 + 4*radius_yy*xx + 4*radius_yy - 2*radius_xx2*yy;xx ++; // x轴加1draw_x0++;draw_x1--;draw_x2++;draw_x3--;}else{ di += radius_xx2*3 - 2*radius_xx2*yy;}yy--;draw_y0--;draw_y1--;draw_y2++;draw_y3++;lcd_set_dot(draw_x0, draw_y0);lcd_set_dot(draw_x1, draw_y1);lcd_set_dot(draw_x2, draw_y2);lcd_set_dot(draw_x3, draw_y3);}} *///******************************************************************* //*******画满屏图片-----本程序为逐行写,因此图片数据也应该是逐行取的//参数:dat为填充的数据------用本程序时需要满屏图的数组//******************************************************************* /*void gui_draw_full_picture (unsigned char *dat){unsigned char i;unsigned char j;unsigned char k;unsigned char bGDRAMAddrX = 0x80; //GDRAM水平地址unsigned char bGDRAMAddrY = 0x80; //GDRAM垂直地址for(i = 0; i < 2; i++){for(j = 0; j < 32; j++){for(k = 0; k < 8; k++){write_com(0x34); //设置为8位MPU接口,扩充指令集,关闭绘图显示write_com(bGDRAMAddrY+j); //垂直地址Ywrite_com(bGDRAMAddrX+k); //水平地址Xwrite_dat(*dat++); //写数据高字节write_dat(*dat++); //写数据低字节}}bGDRAMAddrX = 0x88; //写下半屏幕}write_com(0x36); //打开绘图模式write_com(0x30); //恢复基本指令集,关闭绘图模式} */unsigned char code DCB2HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; //****************************输出一行数据函数,此行可任意长,不必非得是8的倍数**和下个函数合用画任意大小(矩形)的图形或汉字//参数:flag反显标志,1为反显,x、y为指定显示位置的起始点,*dat要输出的点阵数组,no显示此行所需的点个数,即图形一行的点数void gui_loadline(unsigned char x,unsigned char y,unsigned char *dat,unsigned char no,unsigned char flag){unsigned char bit_dat;unsigned char i;/* 参数过滤,若指定显示位置超出液晶屏则返回*/if(x>127) return;if(y>63) return;for(i=0; i<no; i++)//超出本行所规定的点数则本行显示完成{/* 判断是否要读取点阵数据,每字节的开始读取一次点阵数组即i为8的倍数时*/if( (i%8)==0 ) bit_dat = *dat++;/* 对相应的点打1或打0,i&0x07意思是对8求余*/if( (bit_dat&DCB2HEX_TAB[i&0x07])==0 )//取出i对应的位,并判断是否为0{if(flag==0) //判断是否反显,该位取出的数据为0,反显要打为1,flag==0代表不反显GUI_Point(x,y,0); //正常显示0,GUI_Point(x,y,0)代表在x、y处打0elseGUI_Point(x,y,1); //将0反显}else{if(flag==0)GUI_Point(x,y,1);elseGUI_Point(x,y,0);}if( (++x)>127) return;//若显示超出了液晶屏则返回}}//*********************************************************************//********在自定义大小的区域内画图或画字函数****************************//参数说明:x、y指定显示区域的起始点坐标// dat 要输出显示的图形或汉字点阵数组。
12864显示实例
![12864显示实例](https://img.taocdn.com/s3/m/125d12e1998fcc22bcd10d8f.png)
我乃一介初学者,此程序也是在别人的基础上更改的,不过功能是经过验证的,能够实现。
本实例采用的是proteus仿真中的12864显示,通过更改字库和一些参数来实现显示不同的文字、字母、数字。
下面给出仿真图与程序。
代码:字库头文件:#ifndef __ZK_H__#define __ZK_H__#define uchar unsigned char/*-- 文字: - --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar henggang[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x 01,0x01};/*-- 文字: --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar kongge[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00};/*-- 文字: 0 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar num0[16]={0x00,0x00,0xF0,0x08,0x08,0x18,0xE0,0x00,0x00,0x00,0x0F,0x10,0x20,0x10,0x0F,0 x00};/*-- 文字: 1 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code ucharnum1[16]={0x00,0x00,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x10,0x00,0x00,0x00};/*-- 文字: 2 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar num2[16]={0x00,0x30,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x18,0x14,0x13,0x10,0x08,0 x00};/*-- 文字: 3 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar num3[16]={0x00,0x00,0x10,0x08,0x88,0x78,0x00,0x00,0x00,0x00,0x10,0x20,0x20,0x11,0x0E,0 x00};/*-- 文字: 4 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar num4[16]={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1F,0x02,0 x00};/*-- 文字: 5 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar num5[16]={0x00,0x00,0x70,0x48,0xC8,0x88,0x00,0x00,0x00,0x10,0x10,0x20,0x10,0x0F,0x00,0 x00};/*-- 文字: 6 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar num6[16]={0x00,0x00,0xE0,0x90,0x88,0x80,0x00,0x00,0x00,0x07,0x18,0x20,0x20,0x19,0x06,0 x00};/*-- 文字: 7 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar num7[16]={0x00,0x10,0x08,0x08,0x88,0x78,0x00,0x00,0x00,0x00,0x00,0x18,0x07,0x00,0x00,0 x00};/*-- 文字: 8 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar num8[16]={0x00,0x00,0x78,0x88,0x88,0x78,0x00,0x00,0x00,0x0C,0x12,0x21,0x21,0x1E,0x00,0 x00};/*-- 文字: 9 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=8x16 --*/code uchar num9[16]={0x00,0x60,0x98,0x08,0x08,0xF8,0xC0,0x00,0x00,0x00,0x21,0x12,0x09,0x07,0x00,0 x00};#endif程序文件:#include<AT89X51.h>#include<intrins.h>#include "ZK.h" //中文字库#define uchar unsigned char#define uint unsigned int#define LCD_databus P0 //LCD8位数据口uchar num;sbit RS=P2^2; //RS为0命令;1数据sbit RW=P2^1; //RW为0-写;1-读sbit EN=P2^0; //使能端sbit CS1=P2^4; //片选1低电平有效,控制左半屏sbit CS2=P2^3; //片选1低电平有效,控制右半屏sbit PgDn=P2^5; //换页,下一页void delay(uint i){while(--i);}void Read_busy() //读“忙”函数----数据线的最高位DB71则bus{P0=0x00;RS=0;RW=1;EN=1;while(P0&0x80);EN=0;}void write_LCD_command(uchar value)//写入指令函数{Read_busy(); //每次读写都要忙判断RS=0; //选择命令RW=0; //写操作LCD_databus=value;EN=1; //EN由1---0锁存有效数据_nop_();_nop_();EN=0;}void write_LCD_data(uchar value)//写数据函数{Read_busy();RS=1; //选择数据RW=0; //写操作LCD_databus=value;EN=1; //EN由1----0锁存有效数据_nop_();_nop_();EN=0;}void Set_page(uchar page)//设置“页”LCD12864共8页,一页是8行点阵点{page=page&0x07;page=0xb8|page; //页的首地址为0xB8write_LCD_command(page);}void Set_line(uchar startline) //设置显示的起始行{startline=0xC0|startline; //起始行地址为0XC0write_LCD_command(startline);//设置从哪行开始:共0--63;一般从0行开始显示}void Set_column(uchar column) //设置显示的列{column=column&0x3f; //列的最大值位64column=0x40|column; //列的首地址为0x40write_LCD_command(column); //列位置}void SetOnOff(uchar onoff) //显示开关函数:0x3E是关显,0x3F是开显示{onoff=0x3e|onoff; //0011 111x.onoff只能为0或者1write_LCD_command(onoff);}void SelectScreen(uchar screen)//选屏{switch(screen){case 0: CS1=0;CS2=0;break;//全屏case 1: CS1=0;CS2=1;break;//左半屏case 2: CS1=1;CS2=0;break;//右半屏default:break;}}void ClearScreen(uchar screen) //清屏{uchar i,j;SelectScreen(screen);for(i=0;i<8;i++) //控制页数0-7,共8页{Set_page(i);Set_column(0);for(j=0;j<64;j++) //控制列数0-63,共64列{write_LCD_data(0x00); //写入0,地址指针自加1}}}void InitLCD() //LCD的初始化{Read_busy();SelectScreen(0);SetOnOff(0); //关闭显示SelectScreen(0);SetOnOff(1); //开显示SelectScreen(0);ClearScreen(0); //清屏Set_line(0); //开始行:0}void Display(uchar ss,uchar page,uchar column,uchar *p)//显示汉字{uchar i;SelectScreen(ss);Set_page(page); //写上半页Set_column(column); //控制列for(i=0;i<8;i++) //控制8列的数据输出{write_LCD_data(p[i]);//汉字的上半部分}Set_page(page+1); //写下半页Set_column(column); //控制列for(i=0;i<8;i++) //控制8列的数据输出{write_LCD_data(p[i+8]);//汉字的下半部分}}void main(){PgDn=1;if(PgDn){InitLCD(); //初始化ClearScreen(0); //清屏Set_line(0); //显示开始行Display(1,0,0*8,num0);//数字0Display(1,0,1*8,num1);//数字1Display(1,0,2*8,henggang);//横岗Display(1,0,3*8,num0);//数字0Display(1,0,4*8,num2);//数字2Display(1,0,5*8,henggang);//横岗Display(1,0,6*8,num0);//数字0Display(1,0,7*8,num3);//数字3Display(2,0,0*8,henggang);//横岗Display(2,0,1*8,num0);//数字0Display(2,0,2*8,num4);//数字4Display(2,0,3*8,henggang);//横岗Display(2,0,4*8,num0);//数字0Display(2,0,5*8,num5);//数字5Display(2,0,6*8,henggang);//横岗Display(1,4,0*8,num0);//数字0Display(1,4,1*8,num6);//数字6Display(1,4,2*8,henggang);//横岗Display(1,4,3*8,num0);//数字0Display(1,4,4*8,num7);//数字7Display(1,4,5*8,henggang);//横岗Display(1,4,6*8,num0);//数字0Display(1,4,7*8,num8);//数字8Display(2,4,0*8,henggang);//横岗Display(2,4,1*8,num0);//数字0Display(2,4,2*8,num9);//数字9Display(2,4,3*8,henggang);//横岗Display(2,4,4*8,num1);//数字1Display(2,4,5*8,num0);//数字0Display(2,4,6*8,henggang);//横岗while(PgDn);}else{InitLCD(); //初始化ClearScreen(0); //清屏Set_line(0); //显示开始行Display(1,0,0*8,num1);//数字0Display(1,0,1*8,num1);//数字1Display(1,0,2*8,henggang);//横岗Display(1,0,3*8,num1);//数字0Display(1,0,4*8,num2);//数字2Display(1,0,5*8,henggang);//横岗Display(1,0,6*8,num1);//数字0Display(1,0,7*8,num3);//数字3Display(2,0,0*8,henggang);//横岗Display(2,0,1*8,num1);//数字0Display(2,0,2*8,num4);//数字4Display(2,0,3*8,henggang);//横岗Display(2,0,4*8,num1);//数字0Display(2,0,5*8,num5);//数字5Display(2,0,6*8,henggang);//横岗Display(1,4,0*8,num1);//数字0Display(1,4,1*8,num6);//数字6Display(1,4,2*8,henggang);//横岗Display(1,4,3*8,num1);//数字0Display(1,4,4*8,num7);//数字7Display(1,4,5*8,henggang);//横岗Display(1,4,6*8,num1);//数字0Display(1,4,7*8,num8);//数字8Display(2,4,0*8,henggang);//横岗Display(2,4,1*8,num1);//数字0Display(2,4,2*8,num9);//数字9Display(2,4,3*8,henggang);//横岗Display(2,4,4*8,num2);//数字1Display(2,4,5*8,num0);//数字0Display(2,4,6*8,henggang);//横岗while(1);}}。
12864显示自主设定字库
![12864显示自主设定字库](https://img.taocdn.com/s3/m/d87149d70c22590102029d83.png)
#include<reg52.h>#define uint unsigned int#define uchar unsigned charunsigned char CGRAM_ZIKU[4][24]={/*-- 文字: 你--*//*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x12 --*/0x14,0x00,0x14,0x00,0x27,0xE0,0x24,0x20,0x69,0x40,0xA1,0x00,0x25,0x40,0x25,0x20, 0x25,0x20,0x29,0x20,0x21,0x00,0x23,0x00,/*-- 文字: 好--*//*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x12 --*/0x20,0x00,0x27,0xC0,0x20,0x40,0xF8,0x80,0x49,0x00,0x49,0x00,0x4F,0xE0,0x91,0x00, 0x51,0x00,0x21,0x00,0x51,0x00,0x8B,0x00,/*-- 文字: 先--*//*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x12 --*/0x04,0x00,0x24,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x04,0x00,0xFF,0xE0,0x09,0x00, 0x09,0x00,0x11,0x20,0x21,0x20,0x40,0xE0,/*-- 文字: 生--*//*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=16x12 --*/0x04,0x00,0x24,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x84,0x00,0x04,0x00,0x3F,0x80, 0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,};sbit RS=P2^6; //这个是LCD的数据命令选择端sbit RW=P2^5; //这个是LCD的写入或是读出选择端sbit PSB=P3^2; //这个是LCD串行还是并行选择端sbit RST=P3^4; //这个是LCD的复位端口sbit LCDE=P2^7; // 这个是LCD的使能端/*延时子函数*/void delay(uint x){uint y;for(;x>0;x--)for(y=110;y>0;y--);}/*忙碌检查*/voidlcd_busy(){RS=0;RW=1;P0=0XFF;LCDE=1;delay(2);while((P0&0x80)==0x80);/*如下图1,当LCD忙碌的时候BF位是为1,而我们只需要想知道这位,所有与上0x80,当它是1的时候得到0X80,当它是0的时候得到0.*/LCDE=0;}/*写入命令*/voidwrite_com(uchar com){lcd_busy();/*每次操作LCD之前都需要检查一次LCD是否忙碌,不过一般LCD工作比单片机快,所有都不用检查。
51单片机带字库12864液晶动态汉字显示C语言源程序
![51单片机带字库12864液晶动态汉字显示C语言源程序](https://img.taocdn.com/s3/m/fc56a9b069dc5022aaea00a9.png)
51单片机带字库12864液晶动态汉字显示C语言源程序2009-10-17 19:36实验芯片为:AT89S52,带字库液晶屏:12864,实现的目的:动态一个汉字一个汉字显示。
其实和显示汉字的程序一样,只是稍做一下修改即可。
C语言源程序如下:#include <stdio.h>#include <math.h>#include <reg52.h>#include <string.h>sbit RS=P2^4;sbit WRD=P2^5;sbit E=P2^6;sbit PSB=P2^1;sbit RES=P2^3;void TransferData(char data1,bit DI);void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg003(unsigned char code *addr1);unsigned char code IC_DAT[]={"我是一个中国人啊"};void initinal(void){delay(40);PSB=1; //并口工作模式delay(1);RES=0; //复位delay(1);RES=1; //复位置高delay(10);TransferData(0x30,0);delay(100);TransferData(0x30,0);delay(37);TransferData(0x08,0);delay(100);TransferData(0x10,0);delay(100);TransferData(0x0C,0);delay(100);TransferData(0x01,0);delay(10);TransferData(0x06,0);delay(100);}void main(void){while(1){initinal();//调用LCD字库初始化程序delay(100);lcd_mesg003(IC_DAT);}}void lcd_mesg003(unsigned char code *addr1){unsigned char i;//第一行TransferData(0x80,0);delay(100);for(i=0;i<16;i++){TransferData(*addr1,1);addr1++;delayms(50);}}void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据{WRD=0;RS=DI;delay(1);P0=data1;E=1;delay(1);E=0;}void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m){unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}原理就是在显示每个汉字的时候加了一个延时程序,当然可以用定时器来实现,这样的话,不占用CPU处理时间。
带字库12864显示(已测试)
![带字库12864显示(已测试)](https://img.taocdn.com/s3/m/a2c93729ccbff121dd368378.png)
/*********************必要的变量定义****************/#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define DATA P0sbit RS=P2^2;sbit RW=P2^1;sbit EN=P2^0;sbit cs1=P2^3;sbit cs2=P2^4;/*******************定义字库********************/uchar code Hzk[]={/*-- 文字: --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00, 0x00,0x00,0x90,0x20,0x20,0x20,0x20,0x00,0x90,0x70,0x20,0x20,0x89,0x00,0x00,0x00,/*-- 文字: --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x20,0x20,0x20,0x20,0x89,0xF870x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, 0x80,0x80,0x40,0x20,0x88,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x00,0x80,0x00,/*-- 文字: 电--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00, 0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,/*-- 文字: 工--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,/*-- 文字: 电--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00, 0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,/*-- 文字: 子--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: 中--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00, 0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00,/*-- 文字: 心--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x00,0x00,0xE0,0x02,0x04,0x18,0x00,0x00,0x00,0x40,0x80,0x00,0x00, 0x10,0x0C,0x03,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x01,0x0E,0x00};/**********************延时子程序****************/void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}/********************LCD忙检查子程序**************/void CheckState(){uchar dat;RS=0;RW=1;do {DA TA=0x00;EN=1;_nop_();EN=0;dat=DATA;dat=0x80&dat; //检查忙信号} while(!(dat==0x00)); //当忙信号为0是才可继续操作}/*********************写命令子程序****************/void SendCommandToLCD(uchar com){CheckState();RS=0; //写命令RW=0;DA TA=com;EN=1; //利用EN下降沿完成命令写操作_nop_();_nop_();EN=0;}/****************设置页码子程序******************/void SetLine(uchar page) //设置页码,页码为0~7{page=0xb8|page;SendCommandToLCD(page);}/****************设置起始行************************/void SetStartLine(uchar startline) //设置起始行,行号为0~63{startline=0xc0|startline;SendCommandToLCD(startline);}/********************设置列*****************/void SetColumn(uchar column) //设置列,列号为0~63{column=column&0x3f;column=0x40|column;SendCommandToLCD(column);}/********************开关显示屏******************************/ void SetOnOff(uchar onoff) //开关显示屏,onoff只能为0或1 {onoff=0x3e|onoff;SendCommandToLCD(onoff);}/************************写数据子程序*****************/void WriteByte(uchar dat){CheckState();RS=1;RW=0;DA TA=dat;EN=1;_nop_();_nop_();EN=0;}/**************************选屏子程序****************/ void SelectScreen(uchar screen) //选屏,screen=0,1,2{switch(screen){case 0: cs1=0; //选全屏_nop_();_nop_();_nop_();cs2=0;_nop_();_nop_();_nop_();break;case 1: cs1=0; //左屏显示_nop_();_nop_();_nop_();cs2=1;_nop_();_nop_();_nop_();break;case 2: cs1=1; //右屏显示_nop_();_nop_();_nop_();cs2=0;_nop_();_nop_();_nop_();break;}}/****************************清屏子程序****************/void ClearScreen(uchar screen) //清屏,screen=0,1,2{uchar i,j;SelectScreen(screen);for (i=0;i<8;i++){SetLine(i);SetColumn(0);for(j=0;j<64;j++){WriteByte(0x00); //写数据列地址将自动加1}}}/*************************初始化子程序****************/void InitLCD(){CheckState();SelectScreen(0);SetOnOff(0); //关屏SelectScreen(0);SetOnOff(1); //开屏SelectScreen(0);ClearScreen(0); //清屏SetStartLine(0); //开始行为0}/*********************显示全角汉字****************/void Display(uchar ss,uchar page,uchar column,uchar number){int i;SelectScreen(ss); //ss为屏号column=column&0x3f; //column为列号SetLine(page); //page 为页号,显示第number个汉字的上半部分,//page可理解为要显示的汉字位于屏幕的第page行SetColumn(column);for(i=0;i<16;i++) //i为一个字里面的各个列{WriteByte(Hzk[i+32*number]); //number为字号,取第number个汉字的第i列数据编码值}SetLine(page+1); //显示第number个汉字的下半部分SetColumn(column);for(i=0;i<16;i++){WriteByte(Hzk[i+32*number+16]); //取第number个汉字的下半部分}}/********************************主程序****************************/void main(){uint i;InitLCD();ClearScreen(0);while(1){for(i=0;i<128;i++){SetStartLine(i);Display(1,0,2*16,2); //显示第2号字,"电"Display(1,0,3*16,3); //显示第3号字,"工"Display(2,0,4*16,4); //显示第4号字,"电"Display(2,0,5*16,5); //显示第5号字,"子"Display(2,0,6*16,6); //显示第6号字,"中"Display(2,0,7*16,7); //显示第7号字,"心"SelectScreen(0);delay(50);}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
post(1,1);
while(display[i]!='\0')
{
w_dat(display[i]);
i++;
}
cgram(user,1);
displaycgram(0,4,1);
cgram(user1,2);
displaycgram(0,2,2);
while(1)
{
}
}
}
w_cmd(0x30);//基本指令
delay(1);
w_cmd(0x02);//允许修改CG地址
delay(1);
w_cmd(z);//CG地址
delay(1);
for(i=0;i<16;i++)
{
w_dat(*s++);
w_dat(*s++);
}
}
/*----------------------------------------------
delay(1);
E=0;
delay(1);
}
void w_dat(uint dat)
{check_busy();
RS=1;
RW=0;
E=1;
data_port=dat;
delay(1);
E=0;
delay(1);
}
void init_lcd(void)
{
delay(40);
PSB=1;
RES=0;
case 3:z=0x04;break;
case 4: z=0x06;break;
default:break;
}
w_dat(0x00);
w_dat(z);
}
/*-------------------------
----------------------------*/
void main()
{ uint i=0;
void cgram(uchar *s,uchar z)
{ uchar i;
check_busy();
s z=0x40;break;
case 2:z=0x50;break;
case 3:z=0x60;break;
case 4: z=0x70;break;
default:break;
{
RW=1;
RS=0;
E=1;
data_port=0xff;
while((data_port&&0x80)==0x80);//data_port&&0x80必须加上括号
E=0;
}
void w_cmd(uint dat)
{check_busy();
RS=0;
RW=0;
E=1;
data_port=dat;
case 4:add=0x98;break;
default:break;
}
add+=x;
w_cmd(add);
}
/*---------------------------------
写入自定义字符
四种编码与写入的地址是一一对应关系;
若不对应,则出现乱码,及z的取值必须相同
-------------------------------------*/
};
uchar code user1[]={
/*--文字:你--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x08,0x80,0x08,0x80,0x08,0x80,0x11,0x38,0x11,0xC8,0x32,0x10,0x50,0x40,
uchar code user[]={
/*--文字:我--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16 --*/
0x06,0x40,0x38,0x50,0x08,0x48,0x08,0x48,0x08,0x40,0xFF,0xFE,0x08,0x40,0x08,0x48,
0x0E,0x28,0x38,0x30,0xC8,0x20,0x08,0x50,0x09,0x92,0x08,0x0A,0x28,0x06,0x10,0x02
delay(13);
w_cmd(0x06);//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动,屏幕不移动
delay(1);
}
/*------------------------------------------------
显示字符串
x:横坐标值,范围0~8
y:纵坐标值,范围1~4
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;
sbit RES = P2^3;
sbit PSB = P2^1;
#define data_port P0
#define uchar unsigned char
#define uint unsigned int
uchar code display[]={"西华"};
0x90,0x40,0x12,0x50,0x12,0x4C,0x14,0x44,0x11,0x40,0x10,0xC0,0x00,0x00,0x00,0x00
};
void delay(uint xms)
{
uint i,j;
for(i=0;i<xms;i++)
for(j=0;j<125;j++);
}
void check_busy(void)
------------------------------------------------*/
void post(uchar x,uchar y)
{ uchar add;
switch(y)
{case 1:add=0x80;break;
case 2:add=0x90;break;
case 3:add=0x88;break;
case 2: w_cmd(0x90+x);break;
case 3: w_cmd(0x88+x);break;
case 4: w_cmd(0x98+x);break;
default:break;
}
switch(z)
{
case 1: z=0x00;break;
case 2:z=0x02;break;
/*------------------------------------
12864并口输入,在输入输出数据是注意时序
之前由于忙检测时序写错,而无法显示字库文字
自定义字符注意地址与编码方式对应,不然会
显示乱码
--------------------------------------*/
#include<reg52.h>
显示自定义字符
x为x轴方向取值0~8;
y为Y方向取值1~4;
z为四种编码,与地址一一对应;
-----------------------------------------------*/
void displaycgram(uchar x,uchar y,uchar z)
{
switch(y)
{
case 1: w_cmd(0x80+x);break;
delay(1);
RES=1;
delay(10);
w_cmd(0x30);//功能设置,选着8位元模式
delay(1);
w_cmd(0x30);//选择基本指令集,因为DL与RE不能同时改变需要两个指令
delay(1);
w_cmd(0x0c);//开显示(无游标、不反白)
delay(1);
w_cmd(0x01);//clear print