📄 lcd_drive.c
字号:
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define DISPON 0x3f
#define DISPOFF 0x3e
#define DISPFIRST 0xc0
#define SETX 0xB8
#define SETY 0x40
#define Lcbusy 0x80
#define CWADD1 XBYTE[0x7400] /*p2.3 p2.2 p2.1 p2.0*/
#define CRADD1 XBYTE[0x7600] /*csa csb r/w d/i*/
#define DWADD1 XBYTE[0x7500]
#define DRADD1 XBYTE[0x7700]
#define CWADD2 XBYTE[0x7800]
#define CRADD2 XBYTE[0x7A00]
#define DWADD2 XBYTE[0x7900]
#define DRADD2 XBYTE[0x7B00]
void WrcmdL(uchar );
void WrcmdR(uchar );
void WrdataL(uchar );
void WrdataR(uchar );
void Lcmcls(void);
void lc_setxy(uchar ,uchar );
void Lcminit(void);
void lc_delay(unsigned int );
void putdot(uchar ,uchar ,uchar *);
void print1(uchar,uchar ,uchar ,uchar ,uchar *);
void print2(uchar,uchar ,uint ,uchar ,uchar ,uchar *);
void print2_1(uchar,uchar ,uint ,uchar ,uchar,uchar ,uchar *);
void menu(uchar ,uchar ,uchar ,uchar ,uchar ,uchar *);
void wdot(uchar ,uchar );
unsigned char code zifu[160];
unsigned char code zifu1[96];
unsigned char code caidan1[512];
unsigned char code caidan2[128];
uchar col,row,cbyte;
uchar page=0;
/**************全或半角字符点阵码数据输出*******************/
void putdot(uchar a,uchar w,uchar *j) /*a=8或16为字符/汉字,w=1为反白,j为代码指针*/
{
uchar i,bakerx,bakery,b; /*共定义4个局部变量*/
bakerx=row;
bakery=col; /*暂存x,y坐标,已备下半个字符使用*/
lc_setxy(row,col);
/*上半个字符输出,a列*/
for(i=0;i<a;i++)
{
b=j[i];
if(w==1)cbyte=~b; /*反白显示*/
else cbyte=j[i]; /*取点阵码,rom数组*/
if(col>0x3F){lc_setxy(row,col);WrdataR(cbyte);} /*写输出一字节*/
else WrdataL(cbyte);
col++;
} /*上半个字符输出结束*/
col=bakery;
row=bakerx+1; /*指向下半个字符行*/
lc_setxy(row,col);
/*下半个字符输出,16列*/
for(i=a;i<2*a;i++)
{
if(w==1)cbyte=~j[i];
else cbyte=j[i]; /*取点阵码,rom数组*/
if(col>0x3F){lc_setxy(row,col);WrdataR(cbyte);} /*写输出一字节*/
else WrdataL(cbyte);
col++;
} /*下半个字符输出结束*/
row=bakerx;
col=bakery+a;
}
/***************打印一行汉字******************/
void print1(uchar rowfirst,uchar colfirst,uchar n, uchar w,uchar *p)
{ /*hang,lie,zishu,fanbai,daima*/
uchar i;
row=rowfirst;
col=colfirst;
for(i=0;i<n;i++)
{ putdot(16,w,p);
p+=32;
}
}
/***************打印一串字符*********************/
void print2(uchar rowfirst,uchar colfirst,uint cdata,uchar n,uchar w,uchar *p)
{uchar i,j,k; /*hang,lie,shu,weishu,fanbai,daima*/
uchar a[8];
uint m;
uchar *s;
col=colfirst;
row=rowfirst;
s=p;
m=cdata;
for(i=0;i<n;i++)
{j=m%10;m=m/10;a[i]=j;}
for(i=0;i<n;i++)
{k=a[n-1-i];
s=p+k*16;
putdot(8,w,s);
}
}
/***************打印浮点字符,小数点保留两位*********************/
void print2_1(uchar rowfirst,uchar colfirst,uint cdata,uchar n,uchar d,uchar w,uchar *p)
{uchar i,j,k; /*行,列,显示的数,位数,d小数点前有几位,反白,代码*/
uchar a[8];
uint m;
uchar *s;
col=colfirst;
row=rowfirst;
s=p;
m=cdata;
for(i=0;i<n;i++)
{j=m%10;m=m/10;a[i]=j;}
for(i=0;i<n;i++)
{k=a[n-1-i];
s=p+k*16;
putdot(8,w,s);
if(i==d-1) putdot(8,w,zifu1+80);
}
}
/***************驱动*************/
void WrdataL(uchar X)
{
while(0x80&CRADD1);
DWADD1=X;
}
void WrdataR( uchar X)
{
while(0x80&CRADD2);
DWADD2=X;
}
void WrcmdL(uchar X)
{
while(0x80&CRADD1);
CWADD1=X;
}
void WrcmdR(uchar X)
{
while(0x80&CRADD2);
CWADD2=X;
}
/***************行列设置****************/
void lc_setxy(uchar x,uchar y)
{
if(y>0x3F){
WrcmdR(SETX|x);
WrcmdR(y&0x3F|SETY);
}
else{
WrcmdL(SETX|x);
WrcmdL(SETY|y);
}
}
/***************初始化***************/
void Lcminit(void)
{
cbyte=DISPOFF;
WrcmdL(cbyte);
WrcmdR(cbyte);
cbyte=DISPON;
WrcmdL(cbyte);
WrcmdR(cbyte);
cbyte=DISPFIRST;
WrcmdL(cbyte);
WrcmdR(cbyte);
Lcmcls();
col=0;
row=0;
}
/**************清屏***************/
void Lcmcls()
{
uchar i,j,disp_page;
for(i=0;i<8;i++)
{
disp_page=i;
disp_page=disp_page|SETX;
while(0x80&CRADD1);
WrcmdL(disp_page);
WrcmdL(SETY);
for(j=0;j<64;j++)WrdataL(0x00);
WrcmdR(disp_page);
WrcmdR(SETY);
for(j=0;j<64;j++)WrdataR(0x00);
}
}
/*************延时***************/
void lc_delay(unsigned int MS)
{
uchar us,usn;
while(MS!=0)
{
usn=4;
while(usn!=0)
{
us=0xf0;
while(us!=0){us--;}
usn--;
}
MS--;
}
}
/*********************打印整屏************************/
void menu(uchar x,uchar w1,uchar w2,uchar w3,uchar w4,uchar*k) /*x表示所显示的行数*/
{ /*w1 w2 w3 w4 分别表示*/
uchar m,n,h,*c; /*1~4行所显字数*/
Lcmcls();
c=k;
row=0;col=0;
for(m=0;m<x;m++)
{ if(m==0)h=w1;
if(m==1)h=w2;
if(m==2)h=w3;
if(m==3)h=w4;
for(n=0;n<h;n++)
{
if(m==page) putdot(16,1,k);
else putdot(16,0,k);
k+=32;
}
col=0;row+=2;
}
}
/**********************打点程序*****************************/
void wdot(uchar lie,uchar line)
{uchar n;
col=lie;
row=line/8;
lc_setxy(row,col);
n=line%8;
cbyte=0x01;
cbyte=cbyte<<n;
if(col>0x3F){lc_setxy(row,col);WrdataR(cbyte);}
else WrdataL(cbyte);
}
unsigned char code zifu[160]={
//0
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
//1
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
//2
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
//3
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
//4
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
//5
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
//6
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
//7
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
//8
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
//9
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};
/***************************单位*******************************************/
unsigned char code zifu1[96]={
/*-- 文字: H --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,
/*-- 文字: Z --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,
/*-- 文字: u --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,
/*-- 文字: s --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,
/*-- 文字: V --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,
/*-- 文字: . --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};
unsigned char code caidan1[512]={
/*-- 文字: 电 --*/
/*-- 宋体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,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00,
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,
/*-- 文字: 量 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,
/*-- 文字: 频 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x3C,0x20,0x20,0xBF,0x24,0x24,0x00,0xF2,0x1A,0xD6,0x12,0x12,0xF2,0x02,0x00,
0x44,0x43,0x20,0x10,0x0B,0x04,0x43,0x40,0x27,0x18,0x07,0x08,0x10,0x27,0x60,0x00,
/*-- 文字: 率 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x0C,0x14,0xA4,0x04,0x64,0x35,0xAE,0x64,0x24,0x14,0xA4,0x14,0x04,0x04,0x00,
0x08,0x0A,0x09,0x08,0x08,0x0A,0x0B,0xFE,0x0A,0x0B,0x0C,0x08,0x09,0x0A,0x08,0x00,
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,
/*-- 文字: 量 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,
/*-- 文字: 脉 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xFE,0x12,0x12,0xFE,0x00,0x48,0xC8,0x09,0xFE,0x82,0x40,0x38,0x10,0x00,0x00,
0x60,0x1F,0x41,0x81,0x7F,0x10,0x08,0x47,0x80,0x7F,0x00,0x01,0x06,0x1C,0x08,0x00,
/*-- 文字: 宽 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x0C,0x14,0x94,0x94,0xBC,0x95,0x96,0x94,0xBC,0x94,0x94,0x14,0x0C,0x04,0x00,
0x00,0x80,0x80,0x4F,0x40,0x20,0x18,0x07,0x38,0x40,0x40,0x4F,0x40,0x70,0x00,0x00,
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,
/*-- 文字: 量 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,
/*-- 文字: 波 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x60,0x01,0xE6,0x00,0xF8,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x18,0x08,0x00,
0x04,0x04,0xFF,0x40,0x30,0x8F,0x80,0x41,0x26,0x18,0x18,0x26,0x61,0xC0,0x40,0x00,
/*-- 文字: 形 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0x42,0xFE,0x42,0x42,0xFE,0x42,0x42,0x40,0x10,0x88,0xE4,0x47,0x02,0x00,
0x80,0x40,0x30,0x0F,0x00,0x00,0x7F,0x00,0x84,0x42,0x21,0x10,0x08,0x0E,0x04,0x00,
/*-- 文字: 显 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00,
0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00,
/*-- 文字: 示 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00,
0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00};
unsigned char code caidan2[128]={
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,
/*-- 文字: 量 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,
/*-- 文字: 值 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x80,0x40,0xF0,0x2F,0x02,0x04,0xE4,0xA4,0xB4,0xAF,0xA6,0xA4,0xE4,0x04,0x00,0x00,
0x00,0x00,0xFF,0x00,0x40,0x40,0x7F,0x4A,0x4A,0x4A,0x4A,0x4A,0x7F,0x40,0x40,0x00,
/*-- 文字: : --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -