LCD12864写数据函数

合集下载

LCD12864写数据函数

LCD12864写数据函数
i++;
}
lcd_pos(2,0);//第三行
i = 0;
while(dis3[i] != '\0')
{
write_dat(dis3[i]);
i++;
}
/*lcd_pos(3,0);//第四行
i = 0;
while(dis4[i] != '\0')
{
write_dat(dis4[i]);
i++;
}*/
void write_cmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P2 = cmd;
delay_1ms(5);
LCD_EN = 1;//高脉冲
delay_1ms(5);
LCD_EN = 0;
}
/*写数据子程序*/
void write_dat(uchar dat)
write_dat('.');
write_dat(p|0x30);
write_dat(k|0x30);
}
}
uchar dis3[] = {"加油!加油!"};
//uchar dis4[] = {"赶着马车去北京"};
/*延时子程序*/
void delay_1ms(uint x)
{
uint i,j;
for(j = 0; j < x; j++)
{
for(i = 0; i < 110; i ++);
}
}
/*写指令子程序*/

12864函数总结

12864函数总结

一.初始化函数!/**********************************1.初始化函数!//**********************************void init(){writecmd(0x30);delayms(1);writecmd(0x30);delayms(1);writecmd(0x0c);delayms(1);writecmd(0x01);delayms(1);writecmd(0x06);delayms(1);}2.初始化LCDvoid init(){write_com(0x30); //基本指令, 扩充指令为34Hwrite_com(0x0c); //显示开, 关光标write_com(0x01); //清屏delaym(10);}二.判忙函数1.检测LCD是否处于忙状态, 若忙返回1, 空闲返回0bit checkBusy(){bit busy;RS = 0;RW = 1;E = 1;delayu();busy = (bit)(LCD_DATA&0x80);E = 0;return busy ;}2.等待LCD到空闲void wait(){while(checkBusy());}三.数据读写函数1.写命令void write_com(uchar cmd){wait();RS = 0;RW = 0;E = 0;LCD_DATA = cmd;delayu();E = 1;E = 0;}2.写数据void write_data(uchar dat){wait();RS = 1;RW = 0;E = 0;LCD_DATA = dat;delayu();E = 1;E = 0;}3.读数据uchar read_data(void){uchar dsp_data;wait();LCD_DATA=0xFF;RS = 1;RW = 1;E=0;E=1;delayu();dsp_data=LCD_DATA;E = 0;return(dsp_data);}四.填充液晶DDRAM全为空格//***********************************//填充液晶DDRAM全为空格//**********************************void clrram_lcd (void){wr_i_lcd(0x30);wr_i_lcd(0x01);}五.指定要显示字符的坐标//********************************//指定要显示字符的坐标//*******************************void gotoxy(unsigned char y, unsigned char x){if(y==1)writecmd(0x80|x);if(y==2)writecmd(0x90|x);if(y==3)writecmd((0x80|x)+8);if(y==4)writecmd((0x90|x)+8);}六.液晶显示字符串程序/**********************************//液晶显示字符串程序//**********************************void print(uchar *str){while(*str!='\0'){writedate(*str);str++;}}七.指定要显示字符的坐标和字!或字节!/**********************************//指定要显示字符的坐标和字!或字节!//**********************************void disoneword( uchar x,uchar y,uint word) //此word如disoneword(2,0,0xb5a5); 0xb5a5为一个“单”字!!{uchar ah,al;if(x==0)ah=0x80;else if(x==1)ah=0x90;else if(x==2)ah=0x88;else ah=0x98;al=ah+y;writecmd(al);writedate((word&0xff00)>>8);writedate(word&0xff);}/**********************************//指定要显示字符的坐标和字!或字节!222222//**********************************void write_sfm(uchar x,uchar y,uchar shu) //shu经处理后见函数!!!!{uchar d1,d2,add,ah;d1=shu/10;d2=shu%10;if(x==0)ah=0x80;else if(x==1)ah=0x90;else if(x==2)ah=0x88;else ah=0x98;add=ah+y; //相当于ah+alwritecmd(add);writedate( d1+'0');writedate( d2+'0');}八.控制液晶显示汉字/*******************************************函数名称:Disp_HZ功能:控制液晶显示汉字参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示字符个数返回值:无********************************************/void Disp_HZ(uchar addr,const uchar * pt,uchar num){uchar i;writecmd(addr);for(i = 0;i < (num*2);i++)writedata(*(pt++));}1.显示一个16*16大小的图形/*******************************************函数名称:Draw_TX功能:显示一个16*16大小的图形参数:Yaddr--Y地址Xaddr--X地址dp--指向图形数据存放地址的指针返回值:无********************************************/void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp) {uchar j;uchar k=0;// Write_Cmd(0x01); //清屏,只能清除DDRAMWrite_Cmd(0x34); //使用扩展指令集,关闭绘图显示for(j=0;j<16;j++){Write_Cmd(Yaddr++); //Y地址Write_Cmd(Xaddr); //X地址Write_Data(dp[k++]);Write_Data(dp[k++]);}Write_Cmd(0x36); //打开绘图显示// Write_Cmd(0x30); //回到基本指令集模式}#include<LCD12864_12.h>void delayu(){_nop_();}//延时a * 1msvoid delaym(uint a){uint i, j;for(i = a; i > 0; i--)for(j = 110; j > 0; j--);}//初始化LCDvoid init(){write_com(0x30); //基本指令, 扩充指令为34Hwrite_com(0x0c); //显示开, 关光标write_com(0x01); //清屏delaym(10);}void setPosition(uchar x, uchar y){uchar p;switch(y%4){case 0: p = 0x80; break; //第一行开始地址case 1: p = 0x90; break; //第二行case 2: p = 0x88; break; //第三行case 3: p = 0x98; break; //第四行}p += x;write_com(p);}void writestring(uchar * str){uchar i = 0;while(str[i] != '\0'){write_data(str[i++]);}}void lcd_DisplayImage(unsigned char *str){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++) // 在绘图GDRAM中写满屏图片数据{for(j = 0; j < 32; j++){for(k = 0; k < 8; k++){write_com(0x34);write_com(bGDRAMAddrY + j);//垂直地址write_com(bGDRAMAddrX + k);//水平地址write_com(0x30);write_data(*str++);write_data(*str++);}}bGDRAMAddrX = 0x88;}write_com(0x36);write_com(0x30);}2.任意坐标写汉字void write_sfm(uchar x,uchar y,uchar date){uchar shi,ge;shi=date/10;ge=date%10;switch(y){case 0:{write_com(0x80+x);write_data(0x30+shi);write_data(0x30+ge);}break;case 1:{write_com(0x90+x);write_data(0x30+shi);write_data(0x30+ge);}break;case 2:{write_com(0x88+x);write_data(0x30+shi);write_data(0x30+ge);}break;case 3:{write_com(0x98+x);write_data(0x30+shi);write_data(0x30+ge);}break;}}3.点显示子程序//*************点显示子程序************************//*** 0<=x<=127表示横坐标,0<=y<=63表示纵坐标colour=0表示删除点colour=1表示现实点void lcd_DisplayDot(uchar x,uchar y,uchar colour){uchar i,j,l,h,h1,l1;unsigned char bGDRAMAddrX = 0x80; //GDRAM水平地址unsigned char bGDRAMAddrY = 0x80;if(y>31){y-=32;bGDRAMAddrX = 0x88;}i=x/16;j=15-(x%16);k=k<<j;l=0xff&k;h=0xff&(k>>8);write_com(0x34);write_com(bGDRAMAddrY + y);//垂直地址write_com(bGDRAMAddrX + i);//水平地址write_com(0x30);read_data();h1=read_data();l1=read_data();write_com(0x34);write_com(bGDRAMAddrY + y);//垂直地址write_com(bGDRAMAddrX + i);//水平地址write_com(0x30);if(colour==0){write_data((~h)&h1);write_data((~l)|l1);}else{write_data(h|h1);write_data(l|l1);}write_com(0x36);write_com(0x30);}4.画横直线void lcd_DisplayHLine(unsigned char x0, unsigned char x1, unsigned char y, unsigned char color) {unsigned char bak;if(x0>x1) // 对x0、x1大小进行排列,以便画图{x1 = x0;x0 = bak;}do{lcd_DisplayDot(x0, y, color); // 从左到右逐点显示,描出垂直线x0++;}while(x1>=x0);}5.画纵直线void lcd_DisplayRLine(unsigned char x, unsigned char y0, unsigned char y1, unsigned char color) {unsigned char bak;if(y0>y1) // 对y0、y1大小进行排列,以便画图{bak = y1;y1 = y0;y0 = bak;}do{lcd_DisplayDot(x, y0, color); // 从上到下逐点显示,描出垂直线y0++;}while(y1>=y0);}6.画任意一直线void lcd_DisplayLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char color){unsigned char bak;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; // 决策变量dx = x1-x0; // 求取两点之间的差值dy = y1-y0;if(x0==x1) //判断是否为垂直线{lcd_DisplayRLine(x0,y0,y1,color); //画垂直线return;}if(y0==y1) //判断是否为水平线{lcd_DisplayHLine(x0,x1,y0,color); //画水平线return;}dx = x1-x0; // 求取两点之间的差值dy = y1-y0;/* 判断增长方向,或是否为水平线、垂直线、点*/ 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,画垂直线,或一点lcd_DisplayRLine(x0, y0, y1, color);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,画水平线,或一点lcd_DisplayHLine(x0, y0, x1, color);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){lcd_DisplayDot(x0, y0, color);x0 += dx_sym;if(di<0){di += dy_x2; // 计算出下一步的决策值}else{di += dy_x2 - dx_x2;y0 += dy_sym;}}lcd_DisplayDot(x0, y0, color); // 显示最后一点}else // 对于dx<dy,则使用y轴为基准{di = dx_x2 - dy;while(y0!=y1){lcd_DisplayDot(x0, y0, color);y0 += dy_sym;if(di<0){di += dx_x2;}else{di += dx_x2 - dy_x2;x0 += dx_sym;}}lcd_DisplayDot(x0, y0, color); // 显示最后一点}}7.填充矩形函数void lcd_DisplayRectangleFill(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char color){unsigned char i;if(x0>x1) // 若x0>x1,则x0与x1交换{i = x0;x0 = x1;x1 = i;}if(y0>y1) // 若y0>y1,则y0与y1交换{i = y0;y0 = y1;y1 = i;}//判断是否只是直线if(y0==y1){lcd_DisplayHLine(x0,x1,y0,color);return;}if(x0==x1){lcd_DisplayRLine(x0,y0,y1,color);return;}while(y0<=y1){lcd_DisplayHLine(x0,x1,y0,color); // 当前画水平线y0++; // 下一行}}8.画圆函数void lcd_DisplayCircle(unsigned char x0,unsigned char y0,unsigned char r,unsigned char color) {char a,b;char di;if(r>31 ||r==0) return; //参数过滤,次液晶显示的最大圆半径为31a=0;b=r;di=3-2*r; //判断下个点位置的标志while(a<=b){lcd_DisplayDot(x0-b,y0-a,color); //3lcd_DisplayDot(x0+b,y0-a,color); //0lcd_DisplayDot(x0-a,y0+b,color); //1lcd_DisplayDot(x0-b,y0-a,color); //7lcd_DisplayDot(x0-a,y0-b,color); //2lcd_DisplayDot(x0+b,y0+a,color); //4lcd_DisplayDot(x0+a,y0-b,color); //5lcd_DisplayDot(x0+a,y0+b,color); //6lcd_DisplayDot(x0-b,y0+a,color);a++;/***使用Bresenham算法画圆**/if(di<0)di +=4*a+6;else{di +=10+4*(a-b);b--;}lcd_DisplayDot(x0+a,y0+b,color);}}。

lcd12864简单例程

lcd12864简单例程
ClearScreen(0);
Set_line(0);
}
/****************************************************/
/*
函数名:Display,Display_Photo_Panda
功能:写入显示数据
特点:
列行式
逆向
阴码
{
reg0 = 2;
//P3 = 0x0d;
}
}
P1 = 0x0b;
if((P1 & 0x0f)!=0x0f)
{
if((P1&0x0f) == 0x0b)
{
reg0 = 3;
//P3 = 0x0b;
{
if((P1&0x0f) == 0x0e)
{
reg0 = 1;
//P3 = 0x0e;
}
}
P1 = 0x0d;
if((P1 & 0x0f)!=0x0f)
{
if((P1&0x0f) == 0x0d)
}
}
P1 = 0x07;
if((P1 & 0x0f)!=0x0f)
{
if((P1&0x0f) == 0x07)
{
reg0 = 4;
//P3 = 0x07;
}
}
}
P1 = 0x0f;
if((P1&0x0f)==0x0f)
}
void Set_line(uchar startline)
{
startline = 0xc0 | startline;

12864液晶显示源程序(方法2)

12864液晶显示源程序(方法2)

main函数:*****12864显示********//***作者:曹江*****//*****时间:2008 8 25 ********/#include<Lcd.h>#include<absacc.h>#include "AT89X51.h"//函数名:main() 主函数//函数参数:无//返回值:无void main(){reset(); //调用复位函数dison_off(1); //开lcd显示set_startline(0); // 从第0行开始从上至下滑动显示clear(); //清屏while(1){display();}}lcd.c子函数:#include "AT89X51.h"#include "Lcd.h"#include "data.h"#define uint unsigned int//函数名:delay() 延时函数//函数参数:uint v//返回值:无void delay(uint v){ uint i;while(v!=0){v--;for(i=125;i>0;i--);}}//函数名:busy_check() 检测忙状态左//函数参数:无//返回值:无void busy_check(void){unsigned char busy;while(busy&0x80){busy=0xff;}}//函数名:reset()复位函数//函数参数:无//返回值:无void reset(){P3_2=0; //接lcd复位端口RSTdelay(1);P3_2=1;delay(1);}//函数名:wcode(c,cs1,cs2)写指令函数//函数参数:uchar c, uchar cs1,uchar cs2//返回值:无void wcode(ucharc,uchar cs1,uchar cs2){busy_check();P3_4=cs1;P3_3=cs2;P3_7=0; //接lcd的rs端P3_6=0; //接lcd的rw端P1=c; //lcd数据端d0-d7P3_5=0; //接lcd的e端delay(5);P3_5=1;delay(5);P3_5=0;}//函数名:wdata(c,cs1,cs2)写数据函数//函数参数:uchar c, uchar cs1,uchar cs2//返回值:无void wdata(ucharc,uchar cs1,uchar cs2){busy_check();P3_4=cs1;P3_3=cs2;P3_7=1;P3_6=0;P1=c;P3_5=0;delay(1);P3_5=1;delay(1);P3_5=0;}//函数名:set_startline(i)设置起始行函数//函数参数:uchar i//返回值:无void set_startline(uchar i)//每次加一使其从第0行开始从上至下滑动显示{i=0xc0+i;wcode(i,0,0); //调用写指令函数}//函数名:set_adr(x,y)设置页值,起始列值函数//函数参数:uchar x,uchar y//返回值:无void set_adr(uchar x ,uchar y){x=x+0xb8; //X位址即页page起始0xb8y=y+0x40; //Y位址即列起始0x40wcode(x,0,0);//调用写函数wcode(y,0,0);}//函数名:dison_off(uint o)开关显示函数//函数参数:uint o//返回值:无void dison_off(uchar o){o=o+0x3e;wcode(o,0,0);}//函数名:clear() 清屏函数//函数参数:无//返回值:无void clear(){uchari,loop;for(i=0;i<8;i++){set_adr(i,0);for(loop=0;loop<64;loop++)wdata(0x00,0,0); //左右半屏同时写0}}//函数名:chinese(x,y,n,cs1,cs2) 汉字函数//函数参数:x,y,n,cs1,cs2 注:x,y为页和列号;n为字号;cs1,cs2为左右屏显示//返回值:无void chinese(ucharx,uchary,ucharn,uchar cs1,uchar cs2){ uchari,loop;for(i=0;i<2;i++){set_adr(x+i,y);//一字分上下两页写for(loop=0;loop<16;loop++){wdata(Chinese_Charcter[n][16*i+loop],cs1,cs2);}}}//函数名:display() 显示函数//函数参数:无//返回值:无void display(){uchar i;for(i=0;i<0xff;i++) //汉字上下滚屏显示{set_startline(i);chinese(0,32,0,1,0); //第0行第1个字“长”,屏左边显示chinese(0,48,1,1,0); //第0行第2个字“江”,屏左边显示chinese(0,0,2,0,1); //第0行第3个字“大”,屏右边显示chinese(0,16,3,0,1); //第0行第4个字“学”,屏右边显示chinese(2,16,4,1,0); //第1行第5个字“电”,屏左边显示chinese(2,32,5,1,0); //第1行第5个字“子”,屏左边显示chinese(2,48,6,1,0); //第1行第6个字“信”,屏左边显示chinese(2,0,7,0,1); //第1行第5个字“息”,屏右边显示chinese(2,16,8,0,1); //第1行第7个字“学”,屏右边显示chinese(2,32,9,0,1); //第1行第8个字“院”,屏右边显示chinese(4,32,10,1,0); //第2行第9个字“电”,屏左边显示chinese(4,48,11,1,0); //第2行第10个字“气”,屏左边显示chinese(4,0,12,0,1); //第2行第11个字“工”,屏右边显示chinese(4,16,13,0,1); //第2行第12个字“程”,屏右边显示chinese(4,32,14,0,1); //第2行第13个字“系”,屏右边显示chinese(6,48,15,1,0); //第6行第21个字“曹”,屏左边显示chinese(6,0,16,0,1); //第6行第22个字“江”,屏右边显示delay(10);i+=5;}}data.h:#ifndef _DATA_H_#define _DATA_H_//**********显示文字部分*********////左右分屏写,同页同行内按左到右顺序写extern uchar code Chinese_Charcter[25][32]={{/*-- 文字: 长--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x80,0x80,0x80,0xFF,0xA0,0xA0,0x90,0x90,0x88,0x84,0x82,0x80,0x80,0x80,0x00, 0x00,0x00,0x00,0x00,0xFF,0x40,0x21,0x12,0x04,0x08,0x10,0x30,0x60,0x20,0x00,0x00, },{/*-- 文字: 江--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x60,0x01,0xC6,0x30,0x00,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x00,0x00, 0x04,0x04,0x7E,0x01,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,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 --*/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,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00, 0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00, },{/*-- 文字: 子--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xE2,0x12,0x0A,0x06,0x02,0x00,0x80,0x00,0x00, 0x01,0x01,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00, },{/*-- 文字: 信--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0x30,0xFC,0x07,0x0A,0xA8,0xA8,0xA9,0xAE,0xAA,0xA8,0xA8,0x08,0x08,0x00, 0x00,0x00,0x00,0x7F,0x00,0x00,0x7E,0x22,0x22,0x22,0x22,0x22,0x7E,0x00,0x00,0x00, },{/*-- 文字: 息--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFC,0x54,0x54,0x56,0x55,0x54,0x54,0x54,0xFC,0x00,0x00,0x00,0x00, 0x00,0x20,0x38,0x01,0x3D,0x41,0x41,0x45,0x59,0x41,0x41,0x71,0x00,0x08,0x30,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 --*/0xFE,0x02,0x32,0x4A,0x86,0x0C,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x0C,0x04,0x00, 0xFF,0x00,0x02,0x04,0x83,0x41,0x31,0x0F,0x01,0x01,0x7F,0x81,0x81,0x81,0xF1,0x00, },{/*-- 文字: 电--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00, 0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00, },{/*-- 文字: 气--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x20,0x10,0x8C,0xA7,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0x24,0x04,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x40,0xF0,0x00, },{/*-- 文字: 工--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, },{/*-- 文字: 程--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x00, 0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x40,0x00, },{/*-- 文字: 系--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x02,0x22,0xB2,0xAA,0x66,0x62,0x22,0x11,0x4D,0x81,0x01,0x01,0x00,0x00, 0x00,0x40,0x21,0x13,0x09,0x05,0x41,0x81,0x7F,0x01,0x05,0x09,0x13,0x62,0x00,0x00, },{/*-- 文字: 曹--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x02,0x02,0xFA,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xFA,0x02,0x00, 0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00, },{/*-- 文字: 江--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x60,0x01,0xC6,0x30,0x00,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x00,0x00, 0x04,0x04,0x7E,0x01,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x00, },};#endif仿真效果图:。

lcd12864程序

lcd12864程序

//用户版//描述: LCD12864液晶显示模块,对于芯片KS0108(HD61202)驱动程序.//编写:微控设计网 DC版主日期:2007.9.//编译环境:IAR EW430 V3.42A//验证平台: MC430F14+开发板 V1.0//声明:此程序只供微控用户使用.在未得到DC版主的许可请勿将资料外公开和用于商业用途.//******************************************************************* ***********#include "lcd12864.h"extern unsigned char ASCII86[][6];//******************************************************************* ***********//LCD12864函数声明void Lcd12864delay(); //延时void CheckState(); //忙状态检查void WriteByte(unsigned char dat); //写显示数据void SEdCommandToLCD(unsigned char command); //向LCD发送命令void SetLine(unsigned char line); //设定行地址(页)--X 0-7void SetColumn(unsigned char column); //设定列地址--Y 0-63void SetOnOff(unsigned char onoff); //开关显示void SetStartLine(unsigned char startline); //设定显示开始行--XXvoid ClearScreE(unsigned char screE); //清屏void SelectScreE(unsigned char screE); //选择屏幕unsigned char ReadByte(); //读显示数据//显示8*6字符串void ShowString86(unsigned char lin,unsigned char column, unsigned char *string); //反显一个8*6字块void ReverseShow86(unsigned char lin,unsigned char column);//反显某行某几个字符void ReverseLinChar(unsigned char lin,unsigned char startcolumn,unsigned char ShowQuantity);void InitLCD(void); //初始化LCD//******************************************************************* ***********//初级函数列表//******************************************************************* ***********//延时void Lcd12864delay(){unsigned int i=500;while(i--) {;}}void LcdDelay(){unsigned int i=2;while(i--) {;}}//******************************************************************* ***********//忙状态检查(已整理)void CheckState(){MCU_BUS_DIR_IN; //设置BUS口为输入LVC4254_5Vto3V; //LVC4254数据方向为5V往3VRS0;RW1;E1;while(BUSIN & busy) _NOP(); //等待LCD_DB7为0E0; //重设E=0MCU_BUS_DIR_OUT; //设置BUS口为输出LVC4254_3Vto5V; //LVC4254数据方向为3V往5V}//******************************************************************* ***********//写显示数据(已整理)//dat:显示数据void WriteByte(unsigned char dat){CheckState(); //忙状态检查RS1;RW0;BUSOUT = dat; //写向数据口E1;LcdDelay();E0;}//******************************************************************* ***********//向LCD发送命令(已整理)//command :命令void SEdCommandToLCD(unsigned char command){CheckState(); //忙状态检查RS0;RW0;BUSOUT = command; //写入E1;LcdDelay();E0;}//******************************************************************* ***********//清屏(已整理)//screE:1-左屏,2-右//每个屏的显示RAM共64行,分8页,每页8行(一行对相一个字节)void ClearScreE(unsigned char screE){unsigned char i,j;SelectScreE(screE); //选择指定屏for(i=0;i<8;i++) //共8页(每页8行*64列){ SetLine(i); //选择某一页for(j=0;j<64;j++) //每一页全送0x00为清屏{WriteByte(0x00); //一个数据对应8行,8*64=1页,64*8页}}}//******************************************************************* ***********//开关显示(已整理)//onoff=1开,onoff=0为关//当DB0=1时LCD显示RAM中的内容DB0=0时关闭显示void SetOnOff(unsigned char onoff){onoff=0x3e | onoff; //0011 111xSEdCommandToLCD(onoff); //发命令到LCD}//******************************************************************* ***********//选择屏幕(已整理)//screE: 0-全屏,1-左屏,2-右屏void SelectScreE(unsigned char screE){ //MSC-G12864DYSY-2N:选中高电平switch(screE){ case 0: //开全屏CS1_1;_NOP();CS2_1;_NOP();break;case 1: //开左屏CS1_0;_NOP();CS2_1; //关右屏_NOP();break;case 2:CS1_1;//关左屏_NOP();CS2_0;//开右屏_NOP();break;}}//******************************************************************* ***********//设定行地址(页,也就是字行)--X 0-7(已整理)void SetLine(unsigned char line){line=line & 0x07; //保证在 0<=line<=7line=line|0xb8; //1011 1xxx,SEdCommandToLCD(line); //设定指定页}//******************************************************************* ***********//设定列地址--Y 0-63(已整理)void SetColumn(unsigned char column){column=column &0x3f; //0=<column<=63column=column | 0x40; //01xx xxxxSEdCommandToLCD(column); //指定列}//******************************************************************* ***********//设定显示开始行--XX(已整理)//0--63void SetStartLine(unsigned char startline){startline=startline & 0x07; //保证 0<=startline<8startline=startline|0xc0; //1100 0000(显示起始行ROW设置指令)SEdCommandToLCD(startline); //指定行}//******************************************************************* ***********//初始化LCD (已整理)void InitLCD(void){LVC4254_DIR0; //MCU对LVC4254 DIR控制端IO方向设为0LVC4254_3Vto5V; //LVC4254方向为3V转5V,DIR=0MCU_BUS_DIR_OUT; //MCU总线方向为输出LCDCTL_RSRWE_DIR; //MCU对LCD 控制组端IO方向设为LCDCTL_CS1CS2_DIR; //Lcd12864delay();SelectScreE(0); //选择屏SetOnOff(0); //关显示ClearScreE(1); //清屏1ClearScreE(2); //清屏2SelectScreE(0);SetOnOff(1); //开显示SelectScreE(0);SetColumn(0); //开始列:0SetStartLine(0); //开始行:0ClearScreE(0);}//******************************************************************* ***********//读显示数据(已整理)unsigned char ReadByte(void){unsigned int i;unsigned char dat;CheckState();RS1;RW1;MCU_BUS_DIR_IN; //设置BUS口为输入LVC4254_5Vto3V;E1;for(i=0;i<10;i++); //这个延时是不同MCU速度而不同dat=BUSIN; //读入,(原文件是没有此句的)E0;MCU_BUS_DIR_OUT; //设置BUS口为输出LVC4254_3Vto5V;return(dat);}//******************************************************************* ***********//显示8*6点阵,如显ASCII86[][6],字符(已整理)//旋转90度:字模被竖着切分//lin:字行(0-7), column: 字列(0-31)//address : 字模区首地址由Microcontrol dc 编写void Show86(unsigned char lin,unsigned char column, unsigned char *address){unsigned char i,j=0;if(column>31) //列地址大于31返回{return;}//第0-9个字列else if(column<=9){SelectScreE(1);SetLine(lin);SetColumn((column<<3)-(column<<1)); //计算列地址,以6为倍数.每6列显示一个字符.for(i=0;i<6;i++)WriteByte(address[i]);}//第10个字列else if(column==10){ j=(column<<3)-(column<<1);if(j<=63) //第10个字列的前4列{ SelectScreE(1);SetLine(lin);SetColumn(j);for(i=0;i<4;i++){ WriteByte(address[i]);j++;}}if(j>=64){ SelectScreE(2); //第10个字列的后2列j=j-64;SetLine(lin);SetColumn(j);for(i=4;i<6;i++) //在12864中第10个字列的最后两个字节{WriteByte(address[i]);}}}//第11-20个字列else if(10<column&&column<21){ column=column-11;SelectScreE(2);SetLine(lin);SetColumn((column<<3)-(column<<1)+2);for(i=0;i<6;i++)WriteByte(address[i]);}//第21个字列else if(column==21) //第21个字列{ j=(column<<3)-(column<<1);if(j<128) //第21个字列的前2列{ SelectScreE(2);SetLine(lin);SetColumn(j);for(i=0;i<2;i++){ WriteByte(address[i]);j++;}}if(j>=128){j=j-128;SelectScreE(3); //第21个字列的后4列 SetLine(lin);SetColumn(j);for(i=0;i<4;i++){ WriteByte(address[i]);}}}//第22-31个字列/* else{ column=column-22;SelectScreE(3);SetLine(lin);SetColumn((column<<3)-(column<<1)+4);for(i=0;i<6;i++)WriteByte(address[i]);}*/}//******************************************************************* ***********//显示8*6字符串此字体下对应的点阵为:宽x高=8x6 (已整理)//!!!只能显示在一行上即: 串长+column <=31 column(为6的字列,左屏前4列和右屏后4列不用作显示,两屏共19字列)//旋转90度:字模被竖着切分//lin:字行(0-8), column: 字列(0-31)// *string :指向字符串的首址.void ShowString86(unsigned char lin,unsigned char column, unsigned char *string) { unsigned char ch;unsigned char i=0;for(i=0;string[i]!='\0';i++){if(i+column >20) //保证字符不会起过可显示长度.break;ch=string[i]-0x20; //将ASC字符从32-127位置移到0-96位置,以对应ASC86.C中位置Show86(lin,i+column,ASCII86[ch]);}}//******************************************************************* ***********//反显一个8*6字块只适合LCD19264屏,芯片KS0108(HD61202)//lin:行(0-8), column: 列(0-31)void ReverseShow86(unsigned char lin,unsigned char column){ unsigned char i,j=0;unsigned char tab[6];if(column>31) //列地址大于31返回{return;}//第0-9个字列if(column<=9){ SelectScreE(1); //如果列数(0-9),则写在第一屏上(左屏)SetColumn((column<<3)-(column<<1)); //计算列地址,以6为倍数.每6列显示一个字符.SetLine(lin); //设置行//tab[0]=(ReadByte()); //空读!!!!! ,进行读操作前,必须空读一次for(i=0;i<6;i++) //读6个字节回来tab[i]=~(ReadByte());SetColumn((column<<3)-(column<<1)); //设回初始列for(i=0;i<6;i++) //写回来字节WriteByte(tab[i]);}//第10个字列else if(column==10){ j=(column<<3)-(column<<1); //暂存列值if(j<=63) //是否为第10个字列的前4列{SelectScreE(1); //前4列显示在左屏SetColumn(j);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<4;i++) //读4个字节回来{tab[i]=~ReadByte();j++; }SetColumn((column<<3)-(column<<1));for(i=0;i<4;i++) //写回来字节WriteByte(tab[i]);}if(j>=64){ column=column-10; //为第10个字列的后2列 SelectScreE(2); //显示在中屏SetColumn(column);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<2;i++) //读6个字节回来{tab[i]=~ReadByte();j++;}SetColumn((column<<3)-(column<<1));for(i=0;i<2;i++) //写回来字节WriteByte(tab[i]);}}//第11-20个字列else if(10<column&&column<21){ SelectScreE(2); //显示在中屏column=column-11; //如果列数(11-20),则写在第一屏上(中屏)SetColumn((column<<3)-(column<<1)+2); //计算列地址,以6为倍数SetLine(lin);//tab[0]=ReadByte(); //空读!!!!! ,进行读操作前,必须空读一次for(i=0;i<6;i++) //读6个字节回来tab[i]=~ReadByte();SetColumn((column<<3)-(column<<1)+2);for(i=0;i<6;i++) //写回来字节WriteByte(tab[i]);}//第21个字列 --对于192*64屏else if(column==21){ j=(column<<3)-(column<<1);if(j<=127){SelectScreE(2);SetColumn(j);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<2;i++) //读6个字节回来{tab[i]=~ReadByte();j++; }SetLine(lin);SetColumn((column<<3)-(column<<1));for(i=0;i<2;i++)WriteByte(tab[i]);}if(j>=128){ column=column-21; //计算字列SelectScreE(3); //显示右屏SetColumn(column);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<4;i++) //读6个字节回来 {tab[i]=~ReadByte();j++;}SetLine(lin);SetColumn((column<<3)-(column<<1));for(i=0;i<4;i++)WriteByte(tab[i]);}}/* //第22-31个字列--对于192*64屏else if(21<column&&column<=31){ SelectScreE(3);column=column-22;SetColumn((column<<3)-(column<<1)+4);SetLine(lin);tab[0]=ReadByte();for(i=0;i<6;i++)tab[i]=~ReadByte();SetLine(lin);SetColumn((column<<3)-(column<<1)+4);for(i=0;i<6;i++)WriteByte(tab[i]);}*/}//******************************************************************* ***********//反显某行某几个字符 LCD19264//lin:行(0-7), column: 列(0-15)void ReverseLinChar(unsigned char lin,unsigned char startcolumn,unsigned char ShowQuantity){ unsigned char i;for(i=0;i<ShowQuantity;i++){if(startcolumn+i>21) //列地址大于21返回return;ReverseShow86(lin,startcolumn+i);}}//******************************************************************* ***********。

LCD12864画点,画线,定点写入等子函数

LCD12864画点,画线,定点写入等子函数

#define LCD12864_GLOBAL#include"lcd12864.h"void delay_10us(unsigned char del){while(del--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}///////////////////////////////////////读忙函数//操作方式RS>L RW>H E>低脉冲//输入://输出:忙标志1:忙0:闲/////////////////////////////////////void Lcd12864_ChkBusy(void){RS = 0;RW = 1;E = 1;L_PORT = 0XFF;while((L_PORT & 0X80) == 0X80); //忙了,则等待E = 0;}///////////////////////////////////////写指令//操作方式RS>L RW>H E>高电平//输入://输出://///////////////////////////////////void Lcd12864_WrCom(uchar com){Lcd12864_ChkBusy();RS = 0;RW = 0;E = 1;L_PORT = com;delay_10us(1);E = 0;}///////////////////////////////////////写数据//操作方式RS>L RW>H E>高电平//输入:写入数据//输出://///////////////////////////////////void Lcd12864_WrData(uchar dat){Lcd12864_ChkBusy();RS = 1;RW = 0;E = 1;L_PORT = dat;delay_10us(1);E = 0;}///////////////////////////////////////字库初始化函数//输入://输出://///////////////////////////////////void Lcd12864_WordInit(void){PSB = 1; //8位并行数据传输方式RET = 0; //复位函数delay_10us(1); //延时下RET = 1; //复位无效Lcd12864_WrCom(0x30);Lcd12864_WrCom(0x30);Lcd12864_WrCom(0x0c);Lcd12864_WrCom(0x01);Lcd12864_WrCom(0x06);}///////////////////////////////////////定位写入字符串函数//输入:参数1:行(1~4),参数2:列(0~7)参数3,字符串参数4,写入字节数//输出://///////////////////////////////////void Lcd12864_WrString(uchar x,uchar y,uchar *str,uchar num){uchar i;y = y % 7 ; //舍去大于八的数据switch(x){case 1:Lcd12864_WrCom(0x80 + y);break;case 2:Lcd12864_WrCom(0x90 + y);break;case 3:Lcd12864_WrCom(0x88 + y);break;case 4:Lcd12864_WrCom(0x98 + y);break;default:Lcd12864_WrCom(0x80 + y);}for(i = 0;i < num;i ++){Lcd12864_WrData(*str++); //写入对应点的数据}}///////////////////////////////////////图片初始化函数//输入://输出://///////////////////////////////////void Lcd12864_PhotoInit(void){PSB = 1; //8位并行数据传输方式RET = 0; //复位函数delay_10us(1); //延时下RET = 1; //复位无效Lcd12864_WrCom(0x36);Lcd12864_WrCom(0x36);Lcd12864_WrCom(0x3e);Lcd12864_WrCom(0x01);}///////////////////////////////////////图片打印函数//输入:图片数组的指针//输出://///////////////////////////////////void Lcd12864_PhotoPrint(uchar *photo){uchar i,j,k;for(i = 0;i < 2;i ++)for(j = 0;j < 32;j ++){Lcd12864_WrCom(0x80 + j); //纵坐标if(i == 0){Lcd12864_WrCom(0x80); //上半屏}else{Lcd12864_WrCom(0x88); //下半屏}for(k = 0;k < 16;k ++){Lcd12864_WrData(*photo ++ );}}}///////////////////////////////////////清楚GDRAM函数//输入://输出://///////////////////////////////////void Lcd12864_ClrGdRam(void){uchar x,y;for(y = 0;y < 64;y ++)for(x = 0;x < 16;x ++){Lcd12864_WrCom(0x34); //开指令扩充Lcd12864_WrCom(0x80 + y); //行坐标Lcd12864_WrCom(0x80 + x); //列坐标Lcd12864_WrCom(0x30); //关指令扩充Lcd12864_WrData(0x00); //高字节Lcd12864_WrData(0x00); //低字节}}///////////////////////////////////////读出数据函数//输入://输出:读出的数据/////////////////////////////////////uchar Lcd12864_ReData(void){uchar Temp;Lcd12864_ChkBusy();RS = 1;RW = 1;L_PORT = 0XFF; //准备读入数据E = 1;Temp = L_PORT; //读出数据E = 0;return Temp;}///////////////////////////////////// 0 63------------------------- 127 63//画对应点函数||//输入:参数1:列(0 ~ 127)参数2:行(0~63)参数3:改点的颜色||//输出:||///////////////////////////////////// 0 0------------------------- 127 0void Lcd12864_DrawPoint(uchar x,uchar y,uchar color){uchar Row,Tier,TierBit;uchar ReadDatH,ReadDatL;Lcd12864_WrCom(0x36);Tier = x >> 4; //取出对应层数TierBit = x & 0x0f; //取出对应层数的位if(y < 32){Row = ((~y) & 0x1f); //取32的补码Tier += 8; //下半屏}else{Row = ((~(y - 32)) & 0x1f);}//选取位置读出数据Lcd12864_WrCom(Row + 0x80); // 行Lcd12864_WrCom(Tier + 0x80); // 列Lcd12864_ReData();ReadDatH = Lcd12864_ReData(); //读取高八位ReadDatL = Lcd12864_ReData(); //读取低八位//定位位置准备写入数据Lcd12864_WrCom(Row + 0x80); // 行Lcd12864_WrCom(Tier + 0x80); // 列if(TierBit < 8){switch(color){case 0:ReadDatH &= (~(0x01 << (7 - TierBit))); //置零break;case 1:ReadDatH |= (0x01 << (7 - TierBit)); //置一break;case 2:ReadDatH ^= (0x01 << (7 - TierBit)); //异或取反break;}}else{switch(color){case 0:ReadDatL &= (~(0X01 << (15 - TierBit)));break;case 1:ReadDatL |= (0x01 << (15 - TierBit));break;case 2:ReadDatL ^= (0x01 << (15 - TierBit));}}Lcd12864_WrData(ReadDatH); //先写高位字节Lcd12864_WrData(ReadDatL);}///////////////////////////////////////画水平直线函数//输入:参数1:起始横坐标参数2:终止横坐标参数3:纵坐标参数4:显示状态//输出://///////////////////////////////////void Lcd12864_DrawLine_Level(uchar x0,uchar x1,uchar y,uchar color){uchar i,Temp;if(x0 > x1) //保证x1 > x0{Temp = x0;x0 = x1;x1 = Temp;}for(i = x0;i < x1;i ++){Lcd12864_ChkBusy();Lcd12864_DrawPoint(i,y,color);}}///////////////////////////////////////画垂直线函数///输入:参数1:定位横坐标参数2:起始纵坐标参数3:终止纵坐标参数4:显示状态//输出://///////////////////////////////////void Lcd12864_DrawLine_Vertical(uchar x,uchar y0,uchar y1,uchar color){uchar i,Temp;if(y0 > y1) //保证x1 > x0{Temp = y0;y0 = y1;y1 = Temp;}for(i = y0;i < y1;i ++){Lcd12864_ChkBusy();Lcd12864_DrawPoint(x,i,color);}}///////////////////////////////////////画垂直线函数///输入:参数1, 参数2:起始横纵坐标参数3:参数4:终止横纵坐标参数5:显示状态//输出://///////////////////////////////////void Lcd12864_DrawLine_Arbitrary(uchar x0,uchar y0,uchar x1,uchar y1,uchar color){int i,Distance;int x = 0,y = 0,DeltaX,DeltaY;char IncX,IncY; //取出斜率DeltaX = x1 - x0;DeltaY = y1 - y0;if(DeltaX > 0){IncX = 1;}else{IncX = -1;DeltaX = -DeltaX;}if(DeltaY > 0){IncY = 1;}else{IncY = -1;DeltaY = -DeltaY;}if(DeltaX > DeltaY){Distance = DeltaX;}else{Distance = DeltaY;}Lcd12864_DrawPoint(x0,y0,color);for(i = 0;i <= Distance + 1;i ++){Lcd12864_DrawPoint(x0,y0,color);x += DeltaX;y += DeltaY;if(x > Distance){x -= Distance;x0 += IncX;}if(y > Distance){y -= Distance;y0 += IncY;}}///////////////////////////////////////点位花图片函数(图片格式为横坐标32纵坐标30)///输入:参数1,图片指针,参数2,定位显示(固定)//输出://///////////////////////////////////void Lcd12864_PosDrawPhoto(uchar *photo,uchar pos){uchar Temp;uchar i,j;switch(pos){case 1: Temp = 0x80;break;case 2: Temp = 0x83;break;case 3: Temp = 0x86;break;case 4: Temp = 0x88;break;case 5: Temp = 0x8b;break;case 6: Temp = 0x8e;break;}for(i = 1;i < 31;i ++){Lcd12864_WrCom(0x80 + i); //纵坐标Lcd12864_WrCom(Temp); //横坐标for(j = 0;j < 4;j ++){Lcd12864_WrData(*photo ++);}}}。

LCD12864显示函数

LCD12864显示函数

#include <reg52.h>#include<intrins.h> //头文件#include<stdlib.h>#define uint unsigned int#define uchar unsigned charsbit rs=P3^5; //数据命令选择端sbit wr=P3^6; //读写选择端sbit psb=P3^7; //串、并方式控制sbit en=P3^4; //使能端uchar t[10];uchar code a[]=""; //定义的数组uchar code b[]="一米阳光";uchar code c[]="yimi23";void delay(uint x) //延时函数{ uint i,j;for(i=0;i<x;i++)for(j=0;j<115;j++); //延时x*ms}void write_com(uchar com) //写命令函数{ rs=0; //选择命令端wr=0; //选择写命令en=0; //将数据送入P0口P0=com;delay(5);en=1;delay(5);en=0;}void write_data(uchar dat) //写数据函数{ rs=1; //选择数据端wr=0;en=0;P0=dat; //将所要发送的数据送到P0口delay(5);en=1;delay(5);en=1;}void lcdpos(uchar x,uchar y) //设定显示位置{ uchar pos;if(x==0){x=0x80;}else if(x==1){x=0x90;}else if(x==2){ x=0x88; }else if(x==3){ x=0x88;}pos=x+y;write_com(pos); //显示地址}void makerand() //随机函数{ uint ran;ran=rand();t[0]=ran/10000+0x30;t[1]=ran%10000/1000+0x30;t[2]=ran%1000/100+0x30;t[3]=ran%100/10+0x30;t[4]=ran%10+0x30;ran=rand();t[5]=ran/10000+0x30;t[6]=ran%10000/1000+0x30;t[7]=ran%1000/100+0x30;t[8]=ran%100/10+0x30;t[9]=ran%10+0x30;}void init() //LCD初始化函数{ psb=1; //选择并行方式write_com(0x30); //基本指令操作delay(5);write_com(0x0c); //显示打开,关光标delay(5);write_com(0x01); //清除LCD显示的内容delay(5);}void main(){uchar i;delay(10); //延时init();lcdpos(1,0); //第二行第一个字符i=0;while(a[i]!='\0'){ write_data(a[i]); //显示的字符i++;}lcdpos(2,0); //第三行第一个字符i=0;while(b[i]!='\0'){ write_data(b[i]); //显示的字符i++;}lcdpos(3,0); //第四行第一个字符i=0;while(c[i]!='\0') //显示的字符{ write_data(c[i]);i++;}while(1){ l cdpos(0,0); //第一行第一个字符makerand();for(i=0;i<10;i++){ write_data(t[i]);}}}。

LCD12864液晶的使用之字库型液晶(二)

LCD12864液晶的使用之字库型液晶(二)
Read_H=ReadByte(); //读高8位
Read_L=ReadByte(); //读低8位
write_LCD_command(ROW+0x80); //送入垂直地址
write_LCD_command(xlabel+0x80);//再送入水平地址
if(xlabel_bit<8)
{
switch(color)
address++;//指针地址指向下个位置
}
}
}
还有一点要注意的就是显示图片和显示ASCII码、汉字的初始化函数不同,显示图片用的是扩展指令:
void init_BMP()
{
write_LCD_command(0x36);//CL=1--8位。扩充指令(RE=1),绘图打开(G=1)
delay(100);//适当延时
下面这个显示温度曲线:
这两个的仿真图大家可以做一下!
/echoas/blog/item/525d2f74bc735508b151b92d.html
{
ROW=y;
}
else//显示的是下半屏
{
ROW=y-32;
xlabel+=8; //规定显示在下半屏
}
write_LCD_command(ROW+0x80); //送入垂直地址
write_LCD_command(xlabel+0x80);//再送入水平地址
ReadByte();//读取当前GDRAM数据前腰进行一次空读,接下来就可以读出数据了
break;
default:break;
}
write_LCD_data(Read_H);//将数据写入GDRAM

LCD12864原理与应用(源程序+原理图+proteus仿真)

LCD12864原理与应用(源程序+原理图+proteus仿真)

LCD12864原理与应用1、LCD12864简介:LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。

而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。

下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它的液晶驱动器为KS0108。

引脚符号状态引脚名称#功能CS1,CS2输入芯片片选端,都是低电平有效CS1=0开左屏幕,CS1=1关左屏幕CS2=0开右屏幕,CS2=1关右屏幕RS输入。

数据/命令选择信号RS=1为数据操作,RS=0为写指令或读状态RW输入读写选择信号R/W=1为读选通,R/W=0为写选通E/输入读写使能信号在E下降沿,数据被锁存(写)入液晶,在E高电平期间,数据被读出DB0—DB7三态数据总线数据或指令的传送通道。

RST 输入复位信号,低电平时复位复位时,关闭液晶显示,使显示起始行为0,可以跟单片机的复位引脚RST相连,也可以直接接VCC,使之不起作用V0#液晶显示器驱动电压-Vout-10V LCD驱动负电压分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。

这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。

此液晶有8页,一页有8行点阵点,左右各64列,共128列。

如下图所示:2、LCD12864中的几条重要指令】(一)行(line)设置命令:由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。

(二)页(page)设置指令:起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。

(三)列(column)地址设置指令!每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。

(四)读状态指令!3、用LCD12864显示汉字(一)由于这块液晶不带字库,我们就要自己编写字库,编写字库所用的字模提取软件为Zimo21(软件下载地址,LCD1602显示自定义字符的时候也是用它。

12864LCD液晶显示原理及使用方法

12864LCD液晶显示原理及使用方法

12864LCD液晶显示原理及使用方法液晶简介液晶是一种在一定温度范围内呈现既不同于固态液态又不同于气态的特殊物质态,它既具有各向异性的晶体所特有的双折射性又具有液体的流动性液晶显示器件(英文的简写为LCD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件。

点阵式图形液晶显示屏是LCD 的一种能够动态显示图形汉字以及各种符号信息为各种电子产品提供了友好的人机界面点阵式图形液晶显示屏的主要特点如下(这些特点也就是LCD 的特点):工作电压低、微功耗、体积小、可视面积大、无电磁辐射、数字接口、寿命长等特点。

12864LCD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64 全点阵液晶显示器组成。

可完成图形显示,也可以显示8×4 个(16×16 点阵)汉字或者显示16×4个(8×16 点阵)ASCII码。

分为两种,带字库的和不带字库的。

不带字库的LCD需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。

带字库的LCD 提供字库字模,但是只能显示GB2312的宋体。

各有优缺点,根据不同应用场景灵活选择。

其液晶模块原理图如下所示。

12864LCD点阵图形液晶模块原理框图下面给出了其应用连接电路,分别介绍其各引脚的功能和作用。

如下表所示:12864LCD 的引脚说明管脚号管脚名称LEVER 管脚功能描述1GND 0 电源地2VCC+5.0V 电源电压3VLCD - 液晶显示器驱动电压4RS (D/I) H/LD/I=“H”,表示DB7∽DB0 为显示数据D/I=“L”,表示DB7∽DB0 为显示指令数据5R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR 或DR 6EN H/L R/W=“L”,E 信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM 数据读到DB7∽DB08DB1 H/L数据线9DB2 H/L 数据线10DB3 H/L 数据线11DB4 H/L数据线12DB5 H/L数据线13DB6 H/L数据线14DB7 H/L数据线15CS1 H/L H:选择芯片(右半屏)信号16CS2 H/L H:选择芯片(左半屏)信号17RET H/L复位信号,低电平复位18VEE -10VLCD 驱动负电压19LED+ - LED 背光板电源20LED- - LED 背光板电源12864LCD点阵图形液晶模块应用连接电路液晶驱动设置在理解12864LCD硬件原理和管脚功能之后,可以针对LCD进行驱动的编写,分两种情况:仿真环境下和实物开发板编程。

12864液晶显示函数

12864液晶显示函数
lcd_display_shuzi(1,0,4,5);//LCD显示数字
lcd_display_shuzi(1,0,5,1);//LCD显示数字
lcd_display_hanzi(1,0,3,0);//LCD显示汉字
lcd_display_hanzi(2,0,0,1);//LCD显示汉字//LCD字符汉字
{//screen:选择屏幕参数,page:选择页参数0-3,col:选择列参数0-7,mun:显示第几个汉字的参数
int a;
mun=mun*16;
select_screen(screen);
w_com(0xb8+(page*2));
w_com(0x40+(col*8));
for (a=0;a<8;a++)
{
w_date(hanzi[mun++]);
}
w_com(0xb8+(page*2)+1);
w_com(0x40+(col*16));
for (a=0;a<16;a++)
{
w_date(hanzi[mun++]);
}
}
/*
LCD显示字符字库函数
*/
void lcd_display_zifuk(uchar screen,uchar page,uchar col,uchar mun)
} */
}
{
select_screen(0);
w_com(0xc0+x);
delayms(500);
}
}
/*
LCD清屏函数:清屏从第一页的第一列开始,总共8页,64列

12864程序

12864程序

#include"lcd12864.h"/****************************************************************************** ** 函数名: LCD12864_Delay1ms* 函数功能: 延时1MS* 输入: c* 输出: 无******************************************************************************* /void LCD12864_Delay1ms(uint c){uchar a,b;for(; c>0; c--){for(b=199; b>0; b--){for(a=1; a>0; a--);}}}/****************************************************************************** ** 函数名: LCD12864_Busy* 函数功能: 检测LCD是否忙* 输入: 无* 输出: 1或0(1表示不忙,0表示忙)******************************************************************************* /uchar LCD12864_Busy(void){uchar i = 0;LCD12864_RS = 0; //选择命令LCD12864_RW = 1; //选择读取LCD12864_EN = 1;LCD12864_Delay1ms(1);while((LCD12864_DATAPORT & 0x80) == 0x80) //检测读取到的值{i++;if(i > 100){LCD12864_EN = 0;return 0; //超过等待时间返回0表示失败}}LCD12864_EN = 0;return 1;}/****************************************************************************** ** 函数名: LCD12864_WriteCmd* 函数功能: 写命令* 输入: cmd* 输出: 无******************************************************************************* /void LCD12864_WriteCmd(uchar cmd){uchar i;i = 0;while( LCD12864_Busy() == 0){LCD12864_Delay1ms(1);i++;if( i>100){return; //超过等待退出}}LCD12864_RS = 0; //选择命令LCD12864_RW = 0; //选择写入LCD12864_EN = 0; //初始化使能端LCD12864_DATAPORT = cmd; //放置数据LCD12864_EN = 1; //写时序LCD12864_Delay1ms(1);LCD12864_EN = 0;}/****************************************************************************** ** 函数名: LCD12864_WriteData* 函数功能: 写数据* 输入: dat* 输出: 无******************************************************************************* /void LCD12864_WriteData(uchar dat){uchar i;i = 0;while( LCD12864_Busy() == 0){LCD12864_Delay1ms(1);i++;if( i>100){return; //超过等待退出}}LCD12864_RS = 1; //选择数据LCD12864_RW = 0; //选择写入LCD12864_EN = 0; //初始化使能端LCD12864_DATAPORT = dat; //放置数据LCD12864_EN = 1; //写时序LCD12864_Delay1ms(1);LCD12864_EN = 0;}/****************************************************************************** ** 函数名: LCD12864_ReadData* 函数功能: 读取数据* 输入: 无* 输出: 读取到的8位数据*******************************************************************************/#ifdef LCD12864_PICTUREuchar LCD12864_ReadData(void){uchar i, readValue;i = 0;while( LCD12864_Busy() == 0){LCD12864_Delay1ms(1);i++;if( i>100){return 0; //超过等待退出}}LCD12864_RS = 1; //选择命令LCD12864_RW = 1;LCD12864_EN = 0;LCD12864_Delay1ms(1); //等待LCD12864_EN = 1;LCD12864_Delay1ms(1);readValue = LCD12864_DATAPORT;LCD12864_EN = 0;return readValue;}#endif/****************************************************************************** ** 函数名: LCD12864_Init* 函数功能: 初始化LCD12864* 输入: 无* 输出: 无******************************************************************************* /void LCD12864_Init(){LCD12864_PSB = 1; //选择并行输入LCD12864_RST = 1; //复位LCD12864_WriteCmd(0x30); //选择基本指令操作LCD12864_WriteCmd(0x0c); //显示开,关光标LCD12864_WriteCmd(0x01); //清除LCD12864的显示内容}/****************************************************************************** ** 函数名: LCD12864_ClearScreen* 函数功能: 在画图模式下,LCD12864的01H命令不能清屏,所以要自己写一个清* * 屏函数* 输入: 无* 输出: 无******************************************************************************* /#ifdef LCD12864_PICTUREvoid LCD12864_ClearScreen(void){uchar i,j;LCD12864_WriteCmd(0x34); //开启拓展指令集for(i=0;i<32;i++) //因为LCD有纵坐标32格所以写三十二次{LCD12864_WriteCmd(0x80+i); //先写入纵坐标Y的值LCD12864_WriteCmd(0x80); //再写入横坐标X的值for(j=0;j<32;j++) //横坐标有16位,每位写入两个字节的的数据,也{ //就写入32次以为当写入两个字节之后横坐标会自LCD12864_WriteData(0x00); //动加1,所以就不用再次写入地址了。

LCD12864(串口)显示程序

LCD12864(串口)显示程序

LCD12864(串口)显示程序#ifndef jh_f330#define jh_f330#include#endiftypedef unsigned char uint8;typedef unsigned int uint16;/*************端口配置**************/sbit LCD_CS = P0^4; //片选信号,低电平有效sbit LCD_RST = P0^3; //复位信号,低电平有效sbit LCD_A0 = P0^2; //数据、指令选择,H:数据、L:指令sbit LCD_DAT = P1^0; //串行输入数据引脚sbit LCD_CLK = P1^1; //串行时钟输入引脚uint8 code word1[]={0x04,0x44,0x84,0x04,0xE4,0x1F,0x84,0x44,0xA4,0x3F,0xA4,0x A4,0x64,0x06,0x04,0x00,0x20,0x10,0x09,0x04,0xFF,0x04,0x04,0x14,0x26,0x05,0x84,0xFF,0x04,0x06,0x04,0x00 };/**********预定义数据*********/#define LCD_X 128-1 //屏幕的X轴的物理宽度#define LCD_Y 64-1 //屏幕的Y轴的物理宽度/***********LCD指令集***************///LCD开关命令#define LCD_ON() Wr_Com(0xaf)#define LCD_OFF() Wr_Com(0xae)//设置显示起始行#define LCD_START_LINE 0x40 //起始行地址为,0x40+(0-63)//页地址设置#define LCD_Page 0xb0 //页地址为:0xb0+(0-8)//列地址设置#define LCD_Ad_H 0x10 //列高四位地址:0x10+()#define LCD_Ad_L 0x00 //列低四位地址:0x00+()//行列地址方向设置#define ADC_Norm() Wr_Com(0xa0);#define ADC_Reve() Wr_Com(0xa1);#define Com_Norm() Wr_Com(0xc0);#define Com_Reve() Wr_Com(0xc8);void Init_f330(){/*****内部振荡器配置******/OSCICL=OSCICL+4; //设置系统时钟为24MHZ,ΔT=(0.005*ΔOSCICL)/fbase // OSCICL=OSCICL+22; //设置系统时钟为22.1184MHZ// OSCICL=OSCICL+45; //设置系统时钟为20MHZ //15MHZ--24.5MHZ/********设置分频*********/// OSCICN|=0x00; //设置时钟为八分频,OSCIN复位值为1100000//00:8分频,01:4分频,10:2分频,11:不分频// OSCICN|=0x01; //设置系统时钟4分频// OSCICN|=0x02; //设置系统时钟2分频OSCICN|=0x03; //设置系统时钟不分频// RSTSRC=0x04;// OSCLCN = 0x82; // 设置内部L-F振荡器为40kHZ// CLKSEL = 0x02; // 内部低频振荡器while(OSCLCN&0x40 == 0); // 等待振荡器频率稳定/*****设置看门狗*****/PCA0MD &=~0x40; // 禁止看门狗定时器EA=1;/*****端口初始化******/P0MDIN = 0xff; //复位值为11111111P1MDIN = 0xff; //1为数字输入,0为模拟输入P0MDOUT = 0xff; //复位值为11111111P1MDOUT = 0xff; //1为推挽输出,0为漏极输出XBR0 = 0x00; // 交叉开关使能XBR1 = 0x40; //交叉开关允许,T0接到引脚//XBR1 = 0x48; // ECI连到端口引脚//XBR1 |= 0x08; // PCA0 外部计数输入使能}/***************************************功能:LCD串行写入数据程序**输入:8位数据**输出:无************************************/ void Wr_Dat(uint8 dat) {uint8 Num;LCD_CS = 0; //选通芯片LCD_A0 = 1; //写数据for(Num=0;Num<8;Num++){if((dat&0x80) == 0) LCD_DAT = 0;else LCD_DAT = 1;dat = dat << 1;LCD_CLK = 0;LCD_CLK = 1;}LCD_CS = 1;}/***************************************函数名称:Wr_Com()**功能:LCD串行写入命令程序**输入:8位数据**输出:无************************************/ void Wr_Com(uint8 com) {uint8 Num;LCD_CS = 0; //选通芯片LCD_A0 = 0; //写入命令for(Num=0;Num<8;Num++){if((com&0x80) == 0) LCD_DAT = 0;else LCD_DAT = 1;com = com << 1;LCD_CLK = 0;LCD_CLK = 1;}LCD_CS = 1;}/***************************************功能:LCD全屏显示数据程序**输入:8位数据**输出:无************************************/void LCD_Fill(uint8 dat){uint8 page;uint8 colume;for(page=0;page<8;page++)Wr_Com(LCD_Page+page);Wr_Com(LCD_Ad_H);Wr_Com(LCD_Ad_L);for(colume=0;colume<lcd_x;colume++)< p="">Wr_Dat(dat);}}/***************************************函数名称:LCD_Clear()**功能:LCD清屏程序(全屏填充0x00)**输入:8位数据**输出:无************************************/void LCD_Clear(){LCD_Fill(0x00);}/******************************************************* ** 函数名称: LCD12864_Init** 功能: LCD1286初始化程序** 输入: 无TimeDelay ** 输出: 无********************************************************/ void TimeDelay(int Time){int i;while(Time > 0){for(i = 0;i < 8000;i++){Time --;}}void LCD_Init(void){LCD_RST=0;TimeDelay(200);LCD_RST=1;TimeDelay(200);ADC_Norm();Com_Reve();Wr_Com(0xa2);Wr_Com(0x2c); //vc onTimeDelay(200);Wr_Com(0x2e); //vr onTimeDelay(200);Wr_Com(0x2f); //internal booster,follower,divided onWr_Com(0x24); //set rb/ra=5.29Wr_Com(0x81); //set reference voltage selectWr_Com(0x1d);LCD_ON();Wr_Com(LCD_START_LINE);}/************************************************************** *********函数名称:LCD_Word()**功能:输入单个汉字(16x16符号)**输入:页地址,列地址、字符数组**输出:无*************************************************************** ********/ void LCD_Word(unsigned char row,unsigned char colume,unsigned char *pword){unsigned char page= row;unsigned char col_high=colume>>4;unsigned char col_low =colume&0x0f;unsigned char i;Wr_Com(LCD_Page+page);Wr_Com(LCD_Ad_H+col_high);Wr_Com(LCD_Ad_L+col_low);for(i=0;i<16;i++){Wr_Dat(*(pword+i));}Wr_Com(LCD_Page+page+1);Wr_Com(LCD_Ad_H+col_high);Wr_Com(LCD_Ad_L+col_low);for(i=0;i<16;i++){Wr_Dat(*(pword+16+i));}main(){Init_f330();LCD_Init();LCD_Clear();LCD_Word(1,1,word1);while(1);}</lcd_x;colume++)<>。

LCD12864显示程序(成功版)

LCD12864显示程序(成功版)

#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char//--定时使用的IO口--//#define DATA_PORT P0sbit LCD12864_CS = P3^2;sbit LCD12864_RSET = P3^3;sbit LCD12864_RS = P2^6;sbit LCD12864_RW = P2^7;sbit LCD12864_RD = P2^5;//--定义全局函数--//void LcdSt7565_WriteCmd(cmd);void LcdSt7565_WriteData(dat);void Lcd12864_Init();void Lcd12864_ClearScreen(void);void Lcd12864_Write16CnCHAR(uchar x, uchar y,uchar k);void Delay10ms(unsigned int c);unsigned char code table[40][32]={/*-- 文字: 。

--*//*-- 宋体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,0x18,0x24,0x24,0x18,0x00,0x00,/*-- 文字: 都--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x06,0xDA,0x22,0x02,0xFE,0x20,0x26,0x28,0x34,0x24,0x7F,0xA4,0x24,0x24,0x20, 0x00,0x07,0x08,0x10,0x08,0xFF,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x02,0x04,/*-- 文字: 皇--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x7C,0x54,0x54,0x54,0x54,0x55,0x56,0x54,0x7C,0x00,0x00,0x00, 0x00,0x40,0x41,0x49,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,/*-- 文字: 满--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x24,0x24,0x2F,0xE4,0x24,0x24,0xE4,0x2F,0x24,0x24,0x00,0x8C,0x02,0x60,0x10, 0x00,0x7F,0x91,0x49,0x07,0x09,0x19,0x07,0x09,0x11,0xFF,0x00,0x01,0x7E,0x04,0x04,/*-- 文字: 柳--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFC,0x04,0x04,0xFC,0x00,0xF8,0x02,0x04,0xFC,0x10,0x90,0xFF,0xD0,0x10,0x10, 0x00,0x07,0x08,0x04,0xFF,0x00,0x0F,0x32,0x44,0x8F,0x01,0x00,0xFF,0x00,0x03,0x04,/*-- 文字: 烟--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0xFE,0x08,0x10,0xFF,0x00,0x70,0x80, 0x00,0xFF,0x40,0x4C,0x42,0x41,0x46,0x48,0x50,0xFF,0x10,0x08,0x07,0x18,0x60,0x80,/*-- 文字: 胜--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x10,0x10,0x10,0xFF,0x10,0x10,0x3C,0x40,0x00,0xFE,0x22,0x22,0xFE,0x00, 0x00,0x40,0x42,0x42,0x42,0x7F,0x42,0x42,0x42,0x40,0x00,0xFF,0x82,0x02,0x7F,0x80,/*-- 文字: 绝--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xE0,0x2C,0x34,0xE4,0x24,0x27,0xE8,0x10,0x20,0x10,0x63,0xAC,0x30,0x20, 0x00,0x70,0x43,0x42,0x42,0x43,0x42,0x42,0x3F,0x00,0x00,0x12,0x12,0x22,0x67,0x22,/*-- 文字: ,--*//*-- 宋体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,0x38,0x58,0x00,0x00,/*-- 文字: 处--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x20,0x10,0xFF,0x00,0x00,0xF8,0x08,0x08,0x9F,0x60,0x80,0x00, 0x00,0x40,0x41,0x40,0x40,0x40,0x5F,0x40,0x20,0x20,0x13,0x0C,0x13,0x20,0x40,0x81,/*-- 文字: 好--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x86,0x8A,0x92,0xE2,0x82,0x82,0x80,0x00,0xF0,0x10,0x1F,0xF0,0x10,0x10, 0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x00,0x00,0x61,0x16,0x08,0x15,0x22,0x40,/*-- 文字: 春--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x44,0x54,0x54,0xD4,0x54,0x54,0x5F,0x74,0x54,0xD4,0x54,0x54,0x44,0x40, 0x00,0x04,0x04,0x02,0x01,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x01,0x02,0x04,0x04,/*-- 文字: 年--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x04,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0xC7,0x18,0x20,0x00, 0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,/*-- 文字: 一--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: 是--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00, 0x00,0x81,0x81,0x89,0x89,0x89,0x89,0x89,0xFF,0x81,0x41,0x21,0x1D,0x21,0x41,0x81,/*-- 文字: 最--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x55,0xD5,0x55,0x55,0x5F,0xC0,0x40,0x40, 0x00,0x80,0x80,0x43,0x2D,0x11,0x29,0x47,0x90,0xFF,0x15,0x15,0x25,0x3F,0x60,0x20,/*-- 文字: 。

lcd12864头文件

lcd12864头文件

/***************糖coffee@uestc*****************/#ifndef __LCD12864#define __LCD12864#define LCD_CS BIT0#define LCD_SID BIT2#define LCD_CLK BIT4#define LCD_EN P3DIR#define LCD_CTRL P3OUT#define LCD_CS_Set_high LCD_CTRL |= LCD_CS#define LCD_CS_Set_low LCD_CTRL &= ~LCD_CS#define LCD_SID_Set_high LCD_CTRL |= LCD_SID#define LCD_SID_Set_low LCD_CTRL &= ~LCD_SID#define LCD_CLK_Set_high LCD_CTRL |= LCD_CLK#define LCD_CLK_Set_low LCD_CTRL &= ~LCD_CLK#define LCD_delay 1voidWrite_Data(unsigned char byte ,unsigned char reffer);voidSend_Byte(unsigned char byte);voidClearLCD(void);voidPut_Array(unsigned char *data , unsigned char length ,unsigned char address); /*************延时**********************/void Delay(unsigned char time) //主时钟1微秒延时{unsignedinti;i=0x08*time;for(; i; i--);}/************************************************//函数名称:Initial_LCD(void)//函数功能:启动初始化************************************************/voidInitial_LCD(void){LCD_EN |= LCD_CS + LCD_SID + LCD_CLK;Write_Data (0x30,0); //基本指令集Delay(LCD_delay);Write_Data(0x30,0);Write_Data(0x0C,0);Delay(LCD_delay);Write_Data(0x01,0); //清屏Delay(LCD_delay);Write_Data(0x06,0);Delay(LCD_delay);}/**************************************************************** *函数名称:Write_Data(unsigned char byte,unsigned char reffer)*函数功能:发送指令或数据reffer数据 1指令0*输入变量:unsigned char byteunsigned char byte****************************************************************/ voidWrite_Data(unsigned char byte ,unsigned char reffer){unsigned char temp,stemp;temp = byte;LCD_CS_Set_high;LCD_CLK_Set_low;if(reffer==1)Send_Byte(0xFA);elseSend_Byte(0xF8); //发送第一个字节stemp = (temp & 0xF0);Send_Byte(stemp);stemp = temp <<4;Send_Byte(stemp);LCD_CS_Set_low;}/**********************************************************函数名称:Send_Byte(unsigned char byte)*函数功能:发送一字节数据*输入变量:unsigned char byte*********************************************************/ voidSend_Byte(unsigned char byte){unsigned char temp,i;temp = byte;for(i=0;i<8;i++) //send 8 times{if (temp&0x80) //send the highestLCD_SID_Set_high;elseLCD_SID_Set_low;temp = (temp<<1);LCD_CLK_Set_low;LCD_CLK_Set_high;Delay(LCD_delay);}}/******************************************************************** ****************函数名称:Put_Array( unsigned char data, unsigned char length,unsigned char address )*函数功能: 在LCD上显示一个数组*输入变量:unsigned char dataunsigned char lengthunsigned char address********************************************************************* **************/voidPut_Array(unsigned char *data , unsigned char length ,unsigned char address) {if(address!=0){Write_Data(address,0);}for (unsigned char i=0;i<length;i++){Write_Data(data[i],1);}}/*************************************************函数名称:ClearLCD(void)*函数功能:清屏***************************************************/voidClearLCD(void){Write_Data(0x01,0);}/******************************************************************** ****函数名称: Set_cursor*功能描述: 设置光标的位置为CurY行,CurX列*输入: CurX=position(0:7) CurY=line(0:3)********************************************************************* **/voidSet_cursor(unsigned char CurY, unsigned char CurX){switch(CurY){case 0: Write_Data(0x80+CurX,0);break; // 写入第一行CurX列的地址case 1: Write_Data(0x90+CurX,0);break; // 写入第二行CurX列的地址case 2: Write_Data(0x88+CurX,0);break; // 写入第三行CurX列的地址case 3: Write_Data(0x98+CurX,0);break; // 写入第四行CurX列的地址default: break;}}/*************************************************函数名称:PutInt(unsigned intnum)*函数功能:显示十进制数************************************************/voidPutInt(unsigned intnum){unsignedintsnum;unsigned char temp[12]={0}, temp1[12] ={0};unsigned char i = 0,n = 0 ;snum = num;if(snum ==0 ){temp[0] = '0';i++ ;}while(num!=0){temp[i] = num%10+0x30;num = num/10;i++ ;}n = i;for(i=0;i<n; i++)temp1[i] = temp[n-1-i];Put_Array(temp1,n,0);}voidPutDig(unsigned char num){unsigned char snum;snum = num + 0x30;Write_Data(snum,1);;}/************************************************* 函数名称: PutcLCD()** 功能描述: LCD写char** 输入: LCD_Char***********************************************/ voidPutcLCD( unsigned char LCD_Char ){Write_Data(LCD_Char,1);}/************************************************* 函数名称: PutsLCD()** 功能描述: LCD写入RAM字符串** 输入: 字符指针Str***********************************************/ voidPutsLCD(const char *Str){intStr_Temp;Str_Temp=*Str; // Str_Temp所赋的值是Str所指向的字符while(Str_Temp!=0x00) // 字符串还没有结束{Write_Data(Str_Temp,1);Str++;Str_Temp=*Str;}}/*************************************函数名:ClrRam(void)函数功能:清整个GDRAM空间*************************************/voidClrRam(){unsigned char x,y ;for(y=0;y<64;y++)for(x=0;x<16;x++){Write_Data(0x34,0);Write_Data(y+0x80,0); //行地址Write_Data(x+0x80,0); //列地址Write_Data(0x30,0);Write_Data(0x00,1);Write_Data(0x00,1);}}/***************************************************函数名:ShowAll函数说明:显示一幅128*64的图画传入参数:图形指针*img,可以用字模软件提取****************************************************/ voidShowAll(unsigned char *pPicture){unsigned char i,j,k;Write_Data(0x36,0);for(i=0;i<2;i++) //分上下两屏写{for(j=0;j<32;j++) //行{Write_Data(0x80+j,0); //写X坐标(第几行上写)if(i==0) //写Y坐标,判断哪一屏Write_Data(0x80,0);elseWrite_Data(0x88,0);for(k=0;k<16;k++) //写一整行数据(16个字节,合八个字符)Write_Data(*pPicture++,1);}}//Write_Data(0x36,0);}#endif。

LCD12864程序

LCD12864程序
wr_lcd (dat,word2); //接着前一个字在显示一个字符,均写入DDRAM
}
/*======================================
显示框架函数
=======================================*/
void disp_frame(void)
wr_lcd (dat,0x11);
}
else if((i%2==1)&&(i!=7)&&(j%4==0))
{
wr_lcd (dat,0x00);
wr_lcd (dat,0x01);
}
else
{
wr_lcd (dat,0x00);
wr_lcd (dat,0x00);
}
}
}
//wr_lcd (comm,0x36);//扩展功能:绘图显示开
wr_lcd (comm,0x30); //进入基本指令动作,8位MPU
wr_lcd (comm,0x01); //清DDRAM
wr_lcd (comm,0x06); //光标左移,AC自动加一
wr_lcd (comm,0x0c); //开显示,关游标
clear_Wdisp();//清除GDRAM
disp_frame();
wr_lcd (comm,0x30);//确保在基本指令模式,此模式下所写的数据存在DDRAM中
wr_lcd (comm,r); //列地址
wr_lcd (comm,c); //行地址,此处的行地址只能是0x80或0x90
wr_lcd (dat,word1); //以(x,y)为起点的8*16区域内显示一个字符,格式为'字符',如显示a则写为'a'。

无字库LCD12864(无时钟芯片显示时间)

无字库LCD12864(无时钟芯片显示时间)

/************************************************************************** 在无字库的12864LCD上显示时、分、秒;没有用时钟芯片MCU:STC89C52晶振:11.0592MHz作者:罗元俊时间:2014.06.25**************************************************************************/ #include <reg52.h>typedef unsigned char uchar;typedef unsigned int uint;#define Port P0 // 数据端口#define Disp_On 0x3f // 开显示#define Disp_Off 0x3e // 关显示#define Col_Add 0x40 // 列地址#define Page_Add 0xb8 // 页地址#define Start_Line 0xc0 // 起始页sbit RS = P2^6;sbit RW = P2^5;sbit EN = P2^7;sbit CS1 = P3^2;sbit CS2 = P3^3;uint t = 0; //全局变量:秒表(用于计数时间的增量)uchar sec,min,hour; // 全局变量:秒、分、时uchar a,b,c,d,e,f; // 秒、分、时的个位和十位uchar code HZ_tab[][32] = {{/*-- 文字: 潜--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0xC2,0x0C,0x80,0x10,0x94,0x54,0x3F,0x54,0x90,0x54,0x3F,0x54,0x94,0x10,0x00,0x04,0x04,0x7E,0x01,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x01,0x00},{/*-- 文字: 龙--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0xF0,0x10,0x11,0x16,0xD0,0x10,0x10,0x00,0x80,0x40,0x20,0x18,0x06,0x41,0x20,0x10,0x3F,0x44,0x42,0x41,0x40,0x40,0x78,0x00},{/*-- 文字: 花--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x04,0x04,0x04,0x84,0x6F,0x04,0x04,0x04,0xE4,0x04,0x8F,0x44,0x24,0x04,0x04,0x00,0x04,0x02,0x01,0xFF,0x00,0x10,0x08,0x04,0x3F,0x41,0x40,0x40,0x40,0x40,0x78,0x00},{/*-- 文字: 园--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x02,0x42,0x4A,0xCA,0x4A,0x4A,0xCA,0x4A,0x4A,0x42,0x02,0xFE,0x00,0x00,0x00,0xFF,0x40,0x50,0x4C,0x43,0x40,0x40,0x4F,0x50,0x50,0x5C,0x40,0xFF,0x00,0x00},{/*-- 文字: 输--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x88,0x68,0x1F,0xC8,0x08,0x10,0xC8,0x54,0x52,0xD1,0x12,0x94,0x08,0xD0,0x10,0x00,0x09,0x19,0x09,0xFF,0x05,0x00,0xFF,0x12,0x92,0xFF,0x00,0x5F,0x80,0x7F,0x00,0x00},{/*-- 文字: 入--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x01,0xE2,0x1C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x80,0x00},{/*-- 文字: 密--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x8C,0x44,0x04,0xE4,0x04,0x95,0xA6,0x44,0x24,0x14,0x84,0x44,0x94,0x0C,0x00,0x02,0x02,0x7A,0x41,0x41,0x43,0x42,0x7E,0x42,0x42,0x42,0x43,0xF8,0x00,0x00,0x00},{/*-- 文字: 码--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x04,0x84,0xE4,0x5C,0x44,0xC4,0x00,0x02,0xF2,0x82,0x82,0x82,0xFE,0x80,0x80,0x00,0x02,0x01,0x7F,0x10,0x10,0x3F,0x00,0x08,0x08,0x08,0x08,0x48,0x88,0x40,0x3F,0x00}};uchar code SZ_tab[][16] = {{/*-- 文字: 0 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}, //0 {/*-- 文字: 1 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, //1 {/*-- 文字: 2 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}, //2 {/*-- 文字: 3 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00}, //3 {/*-- 文字: 4 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00}, //4{/*-- 文字: 5 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00}, //5 {/*-- 文字: 6 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00}, //6 {/*-- 文字: 7 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00}, //7 {/*-- 文字: 8 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00}, //8 {/*-- 文字: 9 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}, //9 {/*-- 文字: - --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, //10 {/*-- 文字: : --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00} //11 };void delayms(uint xms) //延时子程序{uint x,y;for(x = xms;x > 0;x--)for(y = 2;y > 0;y--);}void DetBusybit(void) //忙位检测子程序{Port = 0xff; //读状态值时,先给数据端口赋高电平RS = 0;RW = 1;EN = 1;while(Port & 0x80); //如果LCD处于忙状态,程序就此停止delayms(2);EN = 0;}void LCD_WrCom_L(uchar com) // 写左半屏指令子程序{DetBusybit();CS1 = 1; CS2 = 0;RS = 0;RW = 0;EN = 1;Port = com;delayms(5);EN = 0;}void LCD_WrCom_R(uchar com) // 写右半屏指令子程序{DetBusybit();CS1 = 0; CS2 = 1;RS = 0;RW = 0;EN = 1;Port = com;delayms(5);EN = 0;}void LCD_WrDat_L(uchar dat) // 写左半屏数据子程序{DetBusybit();CS1 = 1; CS2 = 0;RS = 1;RW = 0;EN = 1;Port = dat;delayms(5);EN = 0;}void LCD_WrDat_R(uchar dat) // 写右半屏数据子程序{DetBusybit();CS1 = 0; CS2 = 1;RS = 1;RW = 0;EN = 1;Port = dat;delayms(5);EN = 0;}void Clear_L(void) // 左半屏清屏{uchar i,j;CS1 = 1; CS2 = 0;LCD_WrCom_L(Page_Add + 0);LCD_WrCom_L(Col_Add + 0);for(j = 0; j < 8; j++)LCD_WrCom_L(Page_Add + j);for(i = 0; i < 64; i++)LCD_WrDat_L(0x00);}void Clear_R(void) // 右半屏清屏{uchar i,j;CS1 = 0; CS2 = 1;LCD_WrCom_R(Page_Add + 0);LCD_WrCom_R(Col_Add + 0);for(j = 0; j < 8; j++)LCD_WrCom_R(Page_Add + j);for(i = 0; i < 64; i++)LCD_WrDat_R(0x00);}void Disp_HZ_L(uchar pag,uchar col,uchar n) // 显示左半屏汉字16*16 {uchar i = 0,j = 0;CS1 = 1; CS2 = 0;for(i = 0; i < 2; i++){LCD_WrCom_L(Page_Add + pag + i);LCD_WrCom_L(Col_Add + col);for(j = 0; j < 16; j++)LCD_WrDat_L(HZ_tab[n][16*i+j]);}}void Disp_SZ_L(uchar pag,uchar col,uchar n) // 显示左半屏数字8*16 {uchar i = 0,j = 0,k = 0;CS1 = 1; CS2 = 0;for(i = 0; i < 2; i++){LCD_WrCom_L(Page_Add + pag + i);LCD_WrCom_L(Col_Add + col);for(j = 0; j < 8; j++){LCD_WrDat_L(SZ_tab[n][8*i+j]);}}}void Disp_HZ_R(uchar pag,uchar col,uchar n) // 显示右半屏汉字16*16 {uchar i = 0,j = 0;CS1 = 0; CS2 = 1;for(i = 0; i < 2; i++){LCD_WrCom_R(Page_Add + pag + i);LCD_WrCom_R(Col_Add + col);for(j = 0; j < 16; j++)LCD_WrDat_R(HZ_tab[n][16*i+j]);}}void Disp_SZ_R(uchar pag,uchar col,uchar n) // 显示右半屏数字8*16 {uchar i = 0,j = 0;CS1 = 0; CS2 = 1;for(i = 0; i < 2; i++){LCD_WrCom_R(Page_Add + pag + i);LCD_WrCom_R(Col_Add + col);for(j = 0; j < 8; j++){LCD_WrDat_R(SZ_tab[n][8*i+j]);}}}void TimerInit(void) //定时器初始化函数{TMOD = 0x02; //设置定时器0为工作模式2TH0 = 0x47; //装初值TL0 = 0x47; //设定时间为0.2msEA = 1;ET0 = 1;TR0 = 1; //启动定时器0}void LCD_Init(void) // LCD初始化子程序{delayms(10);LCD_WrCom_L(Disp_Off); LCD_WrCom_R(Disp_Off);LCD_WrCom_L(Page_Add + 0); LCD_WrCom_R(Page_Add + 0);LCD_WrCom_L(Start_Line + 0); LCD_WrCom_R(Start_Line + 0);LCD_WrCom_L(Col_Add + 0); LCD_WrCom_R(Col_Add + 0);LCD_WrCom_L(Disp_On); LCD_WrCom_R(Disp_On); }void main(void){LCD_Init();TimerInit();Clear_L();Clear_R();while(1){sec = t%60; //秒钟分离min = (t/60)%60; //分钟分离hour = (t/3600)%60; //时钟分离a = sec%10; //秒钟个位分离b = (sec/10)%10; //秒钟十位分离c = min%10; //分钟个位分离d = (min/10)%10; //分钟十位分离e = hour%10; //时钟个位分离f = (hour/10)%10; //时钟十位分?Disp_HZ_L(0,32,0); // 第0页,第16列,第0个字Disp_HZ_L(0,48,1);Disp_HZ_R(0,0,2);Disp_HZ_R(0,16,3);Disp_SZ_L(2,24,2);Disp_SZ_L(2,32,0);Disp_SZ_L(2,40,1);Disp_SZ_L(2,48,4);Disp_SZ_L(2,56,10);Disp_SZ_R(2,0,0);Disp_SZ_R(2,8,6);Disp_SZ_R(2,16,10);Disp_SZ_R(2,24,2);Disp_SZ_R(2,32,7);Disp_SZ_L(4,32,f);Disp_SZ_L(4,40,e);Disp_SZ_L(4,48,11);Disp_SZ_L(4,56,d);Disp_SZ_R(4,0,c);Disp_SZ_R(4,8,11);Disp_SZ_R(4,16,b);Disp_SZ_R(4,24,a);Disp_HZ_L(6,0,4);Disp_HZ_L(6,16,5);Disp_HZ_L(6,32,6);Disp_HZ_L(6,48,7);Disp_SZ_R(6,0,11);}}void timer0(void) interrupt 1{uint i;i++;if(i == 5000) //1s时间到{t++; //秒表计时开始i = 0;}}。

LCD12864驱动函数

LCD12864驱动函数
LCD_E = 0;
}
//写指令
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙
LCD_RS = 0;
LCD_RW = 0;
WriteCommandLCD((0x80+i),1); //行地址,下半屏,即第三行地址0X88
WriteCommandLCD(0x30,1);
for(y=0;y<16;y++)
WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
tmp+=16;
case 2:X2|=0X90;break;
case 3:X2|=0X88;break;
case 4:X2|=0X98;break;
}
WriteCommandLCD(X2, 1); //发送地址码
while (DData[ListLength]>=0x20) //若到达字串尾则退出
/*屏幕闪动 */void LCDFlash(void);
/*显示一个字符*/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
/*显示一串字符*/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
{
unsigned char ListLength,X2;

LCD12864经典写数据

LCD12864经典写数据

/*注:不同开发板,LCD数据显示口不同,Y51最小系统板数据口为P2口*//*注:不同开发板,LCD数据显示口不同,Y51最小系统板数据口为P2口*//*注:不同开发板,LCD数据显示口不同,Y51最小系统板数据口为P2口*//*注:不同开发板,LCD数据显示口不同,Y51最小系统板数据口为P2口(即dat口)否则LCD12864不能正常显示!*/#include<reg52.h>/*端口定义*/#include <18b20.H>#include <jiankong.H>#define DataPort P2 //数据口#define uchar unsigned char#define uint unsigned intsbit RS = P0^7; //寄存器选择输入sbit RW = P0^6; //寄存器读写控制sbit E = P0^5; //液晶使能控制sbit PSB = P0^4; //串并方式控制sbit RES = P0^3;sbit led=P1^7;sbit F=P1^0;sbit L=P1^1;uint temp0,temp1,temp2;uint time,j,q,M=1,N,K,Z,W;uchar i;void tvaluesckan();uchar dis1[] = {"温度范围"};uchar dis2[] = {"℃"};uchar dis3[] = {"稳定时间:"};uchar dis4[] = {"最大功率跟踪!"};/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------// 检测忙位------------------------------------------------*/void Check_Busy(){RS=0;RW=1;E=1;DataPort=0xff;while((DataPort&0x80)==0x80);//忙则等待E=0;}/*------------------------------------------------写命令------------------------------------------------*/void Write_Cmd(unsigned char Cmd){Check_Busy();RS=0;RW=0;E=1;DataPort=Cmd;DelayUs2x(5);E=0;DelayUs2x(5);}/*------------------------------------------------写数据------------------------------------------------*/void Write_Data(unsigned char Data){Check_Busy();RS=1;RW=0;DataPort=Data;DelayUs2x(5);E=0;DelayUs2x(5);}/*------------------------------------------------液晶屏初始化------------------------------------------------*/void Init_ST7920(){DelayMs(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式DelayMs(1); //延时RES=0; //复位DelayMs(1); //延时RES=1; //复位置高DelayMs(10);Write_Cmd(0x30); //选择基本指令集DelayUs2x(50); //延时大于100usWrite_Cmd(0x30); //选择8bit数据流DelayUs2x(20); //延时大于37usWrite_Cmd(0x0c); //开显示(无游标、不反白)DelayUs2x(50); //延时大于100usWrite_Cmd(0x01); //清除显示,并且设定地址指针为00HDelayMs(15); //延时大于10msWrite_Cmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(50); //延时大于100us}/*------------------------------------------------显示字符串x:横坐标值,范围0~8y:纵坐标值,范围1~4------------------------------------------------*/void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s){switch(y){case 1: Write_Cmd(0x80+x);break;case 2: Write_Cmd(0x90+x);break;case 3: Write_Cmd(0x88+x);break;case 4: Write_Cmd(0x98+x);break;default:break;while(*s>0){Write_Data(*s);s++;DelayUs2x(50);}}/*------------------------------------------------清屏------------------------------------------------*/ void ClrScreen(){Write_Cmd(0x01);DelayMs(15);}unsigned char ReadByte(void){unsigned char byReturnValue ;Check_Busy();DataPort=0xff ;RS=1 ;RW=1 ;E=0 ;E=1 ;byReturnValue=DataPort ;E=0 ;return byReturnValue ;}//---------------------------------------------- // 清整个GDRAM空间//----------------------------------------------- void clrgdram(){unsigned char x,y ;for(y=0;y<64;y++)for(x=0;x<16;x++){Write_Cmd(0x34);Write_Cmd(y+0x80);//行地址Write_Cmd(x+0x80);//列地址Write_Cmd(0x30);Write_Data(0x00);Write_Data(0x00);}}/*----------------------------------------------显示数据----------------------------------------------*//*Write_Cmd(0x80);Write_Data(j+0x30);for(i=0;i<30;i++)DelayMs(200); *//*主程序*/void main(){Init_ST7920();while(1){zhu1();//借用库函数“18b20.h”中最主要的读取函数(很重要)!!/*******************************************/LCD_PutString(0,1,"温度");//第一行,第零列;Write_Data(':');/*百位*///write_dat(tvalue/1000+0x30);//写入18b20中的值必须加“0x30”非常重要!!;/*十位*/Write_Data(tvalue%1000/100+0x30);//写入18b20中的值必须加“0x30”非常重要!!;/*个位*/Write_Data(tvalue%100/10+0x30);//写入18b20中的值必须加“0x30”非常重要!!;/*小数点*/Write_Data('.');//写入18b20中的值必须加“0x30”非常重要!!;/*小数*/Write_Data(tvalue%10+0x30);//写入18b20中的值必须加“0x30”非常重要!!;Write_Data(' ');LCD_PutString(0,6,"℃");temp0=(tvalue%1000/100);temp1=(tvalue%100/10);temp2=temp0*10+temp1;tvaluesckan();//LCD_PutString(0,3,"床前明月光想死,");//LCD_PutString(0,4,"最大功率跟踪!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*延时子程序*/
void delay_1ms(uint x)
{
uint i,j;
for(j = 0; j < x; j++)
{
for(i = 0; i < 110; i ++);
}
}
/*写指令子程序*/
void write_cmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
i = 0;
while(dis1[i] != '\0')
{
write_dat(dis1[i]);
i++;
}
lcd_pos(1,0);//第二行
i = 0;
while(dis2[i] != '\0')
{
write_dat(dis2[i]);
i++;
}
lcd_pos(2,0);//第三行
i = 0;
while(dis3[i] != '\0')
write_cmd(0x0C);//显示开,光标关
delay_1ms(5);
write_cmd(0x01);//清除LCD显示内容
delay_1ms(5);
}
/*主程序*/
void main()
{
uint M,j,q,p,k;
uchar i;
lcd_init();
while(1)
{
lcd_pos(0,0);//第一行
#include<reg52.h>
/*端口定义*/
#define LCD_data P0//数据口
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P0^7;//寄存器选择输入
sbit LCD_RW = P0^6;//寄存器读写控制
lcd_pos(3,1);//第四行,第七列;//=write_cmd(0x99);
write_dat(j|0x30);//首地址已写,后续挨着写;
write_dat(q|0x30);
write_dat('.');
write_dat(p|0x30);
write_dat(k|0x30);
}
}
{
write_dat(dis3[i]);
i++;
}
/*lcd_pos(3,0);//第四行
i = 0;
while(dis4[i] != '\0')
{
write_dat(dis4[i]);
i++;
}*/
M=1024;
j=M/1000;
q=(M%1000)/100;
p=M%1000%100/10;
k=M%1000%100%10;
delay_1ms(5);
LCD_EN = 1;//高脉冲
delay_1ms(5);
LCD_EN = 0;
}
/*设定位置子程序*/
void lcd_pos(uchar X, uchar Y)
{
uchar pos;
if(X == 0)
{
X = 0x80;
}
else if(X == 1)
{
X = 0x90;
void lcd_pos(uchar X, uchar Y);//设定位置子程序
void lcd_init();//LCD初始化
uchar dis1[] = {"成功显示咯!"};
uchar dis2[] = {"迈出第一步!"};
uchar dis3[] = {"加油!加油!"};
//uchar dis4[] = {"赶着马车去北京"};
}
else if(X == 2)
{
X = 0x88;
}
else if(X == 3)
{
X = 0x98;
}
pos = X + Y;
write_cmd(pos);
}
/*LCD初始化*/
void lcd_init()
{
LCD_PSB = 1;//设置并行方式
write_cmd(0x30);
delay_1ms(5);
LCD_EN = 0;
P2 = cmd;
delay_1ms(5);
LCD_EN = 1;//高脉冲
delay_1ms(5);
LCD_EN = 0;
}
/*写数据子程序*/
void write_dat(uchar dat)
{
LCD_RS = 1;LCD NhomakorabeaRW = 0;
LCD_EN = 0;
P2 = dat;
sbit LCD_EN = P0^5;//液晶使能控制
sbit LCD_PSB = P0^4;//串并方式控制
void delay_1ms(uint x);//延时子程序
void write_cmd(uchar cmd); //写指令子程序
void write_dat(uchar dat);//写数据子程序
相关文档
最新文档