📄 lce128642.c
字号:
//Lcm.c
//
//Body: HT48C30-1
//Mask option
//BZ/BZB : All Disable
//the others use the default value
#include <reg52.h>
#include <INTRINS.H>
#define Uchar unsigned char
#define Uint unsigned int
#define Datalcm P2
#define cotr P3
sbit Elcm= P3^0;
sbit Rwlcm= P3^1;
sbit Dilcm= P3^2;
sbit CS2LCM= P3^3;
sbit CS1LCM= P3^4;
//#pragma vector isr_4 @ 0x4
//#pragma vector isr_8 @ 0x8
//#pragma vector isr_c @ 0xc
//ISR for safequard
///void isr_4(){} // external ISR
//void isr_8(){}// timer/event 0
//void isr_c(){} // timer/event 1
//initialize registers for safeguard
//void safeguard_init(){
// _intc = 0;
_//tmrc = 0;
//tmr = 0;
//_pac = 0xff; //input mode
//_pbc = 0xff;
//_pcc = 0x00;
//}
//#define FOUR_BIT
//#define ONE_LINE
#define DISPON 0x3f /*显示on */
#define DISPOFF 0x3e /*显示off */
#define DISPFIRST 0xc0 /*显示起始行定义 */
#define SETX 0x40 /*X定位设定指令(页) */
#define SETY 0xb8 /*Y定位设定指令(列) */
#define Lcdbusy 0x80 /*LCM忙判断位 */
/**************显示分区边界位置*****************/
#define MODL 0x00 /*左区 */
#define MODR 0x40 /*中区和右区分界 */
#define LCMLIMIT 0x80 /*显示区的右边界 */
;void compute(Uchar *shuzhu,char);
void Lcminit(void); /*液晶模块初始化 */
void Delay(Uchar); /*延时,入口数为Ms */
void lcdbusyL(void); /*busy判断、等待(左区) */
void lcdbusyR(void); /*busy判断、等待(右区) */
void Putedot(Uchar); /*半角字符输出 */
void Putcdot(Uchar); /*全角(汉字)输出 */
void Wrdata(Uchar); /*数据输出给LCM */
void Lcmcls( void ); /*LCM全屏幕清零(填充0) */
void wtcom(void); /*公用busy等待 */
void Locatexy(void); /*光标定位 */
void WrcmdL(Uchar); /*左区命令输出 */
void WrcmdR(Uchar); /*右区命令输出 */
void Putstr(Uchar *puts,Uchar i); /*中英文字符串输出 */
void Rollscreen(Uchar x); /*屏幕向上滚动演示 */
void Rddata(void); /* 从液晶片上读数据 */
void point(void); /*打点 */
void Linexy(Uchar endx,Uchar endy);
void display(void);
/*数组列表*/
char code Ezk[]={
/*-文字:0--0x30 */
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-文字:1--0x31 */
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-文字:2--0x32 */
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-文字:3--0x33 */
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-文字:4--0x34 */
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-文字:5--0x35 */
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-文字:6--0x36 */
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-文字:7--0x37 */
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-文字:8--0x38 */
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*-文字:9--0x39 */
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
/*-文字::-- */
0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
/*-文字:.--0x2e */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
}; /*ASCII常规字符点阵码表 */
/****************************************/
/* 定义ASCII字库8列*16行 */
/****************************************/
Uchar code Hzk[]={
0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0xFE,//"距",
0x22,0x22,0x22,0x22,0xF3,0x22,0x00,0x00,
0x20,0x7F,0x20,0x3F,0x12,0x12,0x00,0x7F,
0x42,0x42,0x42,0x42,0x47,0x60,0x40,0x00,
0x04,0x04,0x04,0xF4,0x04,0x8C,0x55,0x26,//"离",
0x54,0x8C,0x04,0xF4,0x04,0x06,0x04,0x00,
0x00,0xFC,0x04,0x05,0x25,0x35,0x2D,0x27,
0x25,0x35,0x25,0x45,0x84,0x7E,0x04,0x00,
0x00,0x00,0xFC,0x24,0x24,0x24,0x24,0x24,//"后",
0x24,0x22,0x22,0x23,0xA2,0x30,0x20,0x00,
0x40,0x30,0x0F,0x00,0x00,0xFF,0x41,0x41,
0x41,0x41,0x41,0x41,0xFF,0x01,0x00,0x00,
0x08,0x08,0x08,0x08,0x88,0x78,0x0F,0x08,//"左",
0x08,0x08,0x08,0x88,0x0C,0x08,0x00,0x00,
0x20,0x50,0x48,0x46,0x41,0x41,0x41,0x41,
0x7F,0x41,0x41,0x41,0x41,0x60,0x40,0x00,
0x08,0x08,0x08,0x08,0xC8,0x38,0x0F,0x08,//"右",
0x08,0x08,0x08,0x08,0x88,0x0C,0x08,0x00,
0x08,0x04,0x02,0x01,0xFF,0x41,0x41,0x41,
0x41,0x41,0x41,0x41,0xFF,0x01,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0xF1,0x92,0x96,// "方",
0x90,0x90,0x90,0xD0,0x90,0x18,0x10,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00
};
/*自用汉字点阵码表 */
char dot2[]=10;
Uchar disdatahou[4];//="20.0"; /*自定义字符串 */
Uchar disdatayou[4];//="05.0";
Uchar disdatazuo[4];//="05.0";
Uchar datahou=211;
Uchar datayou=55;
Uchar datazuo=50;
Uchar dir;//pian duan fang xiang
//Uchar STRhh[];
//Uchar STRh1[];
//Uchar STRh2[];
//Uchar STRh3[];
//Uchar num[];
/********************************/
/* 演示主程序 */
/********************************/
Uchar col;
Uchar row;
Uchar cbyte; /*列x,行(页)y,输出数据 */
Uchar hou,zuo,you;
bit xy; /*画线方向标志:1水平 */
void main(void)
{
//Uchar x,y;
col=0;
row=0;
Delay(40); /*延时大约40Ms,等待外设准备好 */
Lcminit(); /*液晶模块初始化,包括全屏幕清屏*/
while(1){
display();
}
}
/****************************************/
/* 画点 */
/****************************************/
void point(void)
{
Uchar x1,y1,x,y;
x1=col;
y1=row;
row=y1>>3; /*取Y方向分页地址 */
Rddata();
y=y1&0x07; /*字节内位置计算 */
x=0x01;
x=x<<y; /*移入所画点 */
Wrdata(cbyte|x); /*画上屏幕 */
col=x1; /*恢复xy坐标 */
row=y1;
}
/****************************************/
/* 屏幕滚动定位 */
/****************************************/
void Rollscreen(Uchar x)
{
cbyte = DISPFIRST|x; /*定义显示起始行为x?*/
WrcmdL(cbyte);
WrcmdR(cbyte);
}
/****************************************/
/* 一个字串的输出 */
/****************************************/
void Putstr(Uchar *puts,Uchar i)
{
Uchar j,X;
for (j=0;j<i;j++)
{
X = puts[j];
if (X&0x80)
{
Putcdot(X&0x7f); /*只保留低7位*/
}
else Putedot(X); /*ascii码表从0x20开始*/
//else Putedot(X);
}
}
/****************************************/
/* 半角字符点阵码数据输出 */
/****************************************/
void Putedot(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定义4个局部变量 */
int x; /*偏移量,字符量少的可以定义为UCHAR */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 0x10; /*半角字符,每个字符16字节 */
/*上半个字符输出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取点阵码,rom数组 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;}; /*下一列,如果列越界换行*/
if (row>7) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
col = bakerx; /*列对齐 */
row = bakery+1; /*指向下半个字符行 */
/*下半个字符输出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row=bakery;
} /*整个字符输出结束 */
/****************************************/
/* 全角字符点阵码数据输出 */
/****************************************/
void Putcdot(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定义3个局部变量 */
int x; /*偏移量,字符量少的可以定义为UCHAR */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 0x20; /*每个字符32字节 */
/*上半个字符输出,16列 */
for(i=0;i<16;i++)
{
Wrdata(Hzk[x]); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){ col=0;row++;row++;} /*下一列,如果列越界换行*/
if (row>6) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
/*下半个字符输出,16列 */
col = bakerx;
row = bakery+1;
for(i=0;i<16;i++) /*下半部分*/
{
Wrdata(Hzk[x]);
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;} /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row = bakery;
} /*整个字符输出结束 */
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
for(col=0;col<LCMLIMIT;col++) Wrdata(0);
}
/****************************************/
/* 从液晶片上读数据,保留在全局变量中 */
/****************************************/
void Rddata(void)
{
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
Datalcm=0xFF;
Dilcm = 1;
Rwlcm=1; /*读数据*/
Elcm = 1; /*读入到LCM*/
_nop_();
cbyte = Datalcm; /*虚读一次 */
Elcm = 0;
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
Datalcm=0xFF;
_nop_();
Dilcm = 1; /*数据*/
Rwlcm = 1; /*读数据*/
Elcm = 1; /*读入到LCM*/
_nop_();
cbyte = Datalcm; /*从数据口读数据,真读 */
Elcm = 0;
}
/****************************************/
/* 数据写输出 */
/****************************************/
void Wrdata(Uchar X)
{
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
// wtcom();
Dilcm = 1; /*数据输出*/
Rwlcm = 0;
Datalcm = X; /*数据输出到数据口 */
Elcm = 1; /*读入到LCM*/
_nop_();
Elcm = 0;
}
/********************************/
/* 命令输出到左区控制口 */
/********************************/
void WrcmdL(Uchar X)
{
lcdbusyL(); /*确定分区,返回时保留分区状态不变*/
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*写输出 */
Datalcm = X; /*数据输出到数据口 */
Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
}
/********************************/
/* 命令输出到中区控制口 */
/********************************/
void WrcmdM(Uchar X)
{
//lcdbusyM(); /*确定分区,返回时保留分区状态不变*/
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*写输出 */
Datalcm = X; /*命令输出到数据口 */
Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
}
/********************************/
/* 命令输出到右区控制口 */
/********************************/
void WrcmdR(Uchar X)
{
lcdbusyR(); /*确定分区,返回时保留分区状态不变 */
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*写输出 */
Datalcm = X; /*命令输出到数据口 */
Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
}
/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态 */
/********************************************************/
void lcdbusyL(void)
{
CS1LCM = 0; /*CLR CS1 */
CS2LCM = 1; /*SETB CS2 */
// CS3LCM = 1; /*SETB CS3 */
wtcom(); /* waitting for enable */
}
void lcdbusyR(void)
{
CS1LCM = 1; /*SETB CS1 */
CS2LCM = 0; /*SETB CS2 */
// CS3LCM = 0; /*CLR CS3 */
wtcom(); /* waitting for enable */
}
void wtcom(void)
{
Dilcm = 0; /*CLR DI */
Rwlcm = 1; /*SETB RW */
Datalcm = 0xFF; /*MOV DATA_LCM,#0FFH */
Elcm = 1;_nop_();
//while(Datalcm & Lcdbusy);
Delay(1);
Elcm = 0;
}
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void Locatexy(void)
{
unsigned char x,y;
switch (col&0xc0) /* col.and.0xC0 */
{ /*条件分支执行 */
case 0: {lcdbusyL();break;} /*左区 */
//case 0x40: {lcdbusyM();break;} /*中区 */
case 0x40: {lcdbusyR();break;} /*右区 */
}
x = col&0x3F|SETX; /* col.and.0x3f.or.setx */
y = row&0x07|SETY; /* row.and.0x07.or.sety */
wtcom(); /* waitting for enable */
Dilcm = 0; /*CLR DI */
Rwlcm = 0; /*CLR RW */
Datalcm = y; /*MOV P0,Y */
Elcm = 1;_nop_();Elcm = 0;
wtcom(); /* waitting for enable */
Dilcm = 0; /*CLR DI */
Rwlcm = 0; /*CLR RW */
Datalcm = x; /*MOV P0,X */
Elcm = 1;_nop_();Elcm = 0;
}
/********************************/
/*液晶屏初始化 */
/********************************/
void Lcminit(void)
{
cbyte = DISPOFF; /*关闭显示屏 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte = DISPON; /*打开显示屏 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte = DISPFIRST; /*定义显示起始行为零 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
Lcmcls();
col=0; /*清屏 */
row=0;
Locatexy();
}
/********************************/
/* 延时 */
/********************************/
void Delay(Uchar MS)
{
Uchar us,usn;
while(MS!=0)
{ usn = 4;
while(usn!=0)
{
us=0xf0;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
/********************************/
//定义字符串数组 */
/********************************/
Uchar const STRh1[]={0x80,0x81};
Uchar const STRh2[]={0x82,0x85};
Uchar const STRh3[]={0x83,0x85};
Uchar const STRh4[]={0x84,0x85};
/********************************/
/* 定义中文字库 */
/********************************/
void display(void)
{col=0x40;
row=0;
Putstr(STRh1,2);
/*第一行字符输出,24字节 */
col=0;
row=2;
Putstr(STRh2,2); /*第二行字符输出,12字节 */
Putstr(dot2,1);
compute(disdatahou,datahou);
Putstr(disdatahou,4);
col=0;
row=4;
Putstr(STRh3,2); /*第三行字符输出,24字节 */
Putstr(dot2,1);
compute(disdatazuo,datazuo);
Putstr(disdatazuo,4);
col=0;
row=6;
Putstr(STRh4,2); /*第三行字符输出,24字节4 */
Putstr(dot2,1);
compute(disdatayou,datayou);
Putstr(disdatayou,4);
}
void compute(Uchar *disdata,Uchar shuju)
{Uchar temp;
//Uchar shuju;
disdata[2]=11;
disdata[3]=shuju%10;
temp=shuju-(shuju%10);
temp=temp/10;
disdata[1]=temp%10;
if(shuju>99)
disdata[0]=1;
else
disdata[0]=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -