📄 lcdio.c
字号:
#include <reg52.h>
#include <absacc.h>
#include "bb.h" //汉字
#include "bb1.h"
#include "asc_168.h"
#define wcadd1 XBYTE[0xc001] /* 写指令代码地址 */
#define wdadd1 XBYTE[0xc000] /* 写参数及显示数据地址 */
#define rdadd1 XBYTE[0xc001] /* 读参数及显示数据地址 */
#define rbadd1 XBYTE[0xc000] /* 读忙状态地址 */
unsigned char code SYSTAB[8]={0x30,0x87,0x07,0x28,0x42,0xf0,0x28,0x00};
unsigned char code SCRTAB[10]={0x00,0x00,0xf0,0x80,0x25,0xf0,0x00,0x4b,0x80,0x70};
extern char xdata curx,cury;
extern bit cursta;
unsigned char code *pos1;
char xdata c2;
int addr1;
/************************/
/* 初始化子程序函数 */
/************************/
extern void CLEAR()
{
unsigned int i;
wcadd1=0x4c; /* CSRDIR 代码 */
wcadd1=0x46; /* CSRW 代码 */
wdadd1=0x80; /* 设置参数光标指针低8位 */
wdadd1=0x25; /* 设置参数光标指针高8位 */
wcadd1=0x42; /* MWRITE 代码 */
/*清64K的显示存储器*/
for(i=0;i<9600;i++) /*写入一行*/
{
wdadd1=0x00; /* 写入数据 */
}
}
extern void initlcd()
{
unsigned char i;
wcadd1=0x40; /* SYSTEM SET代码 */
for(i=0;i<8;i++)
{
wdadd1=SYSTAB[i]; /* 写入参数 */
}
wcadd1=0x44; /* SCROLL代码 */
for(i=0;i<10;i++)
{
wdadd1=SCRTAB[i]; /* 写入参数 */
}
wcadd1=0x5a; /* HDOT SCR 代码 */
wdadd1=0x00; /* 设置参数P1 */
wcadd1=0x5b; /* OVLAY 代码 */
wdadd1=0x0c; /* 设置参数:显示一,三区为文本属性 */
/* 调清屏子程序 */
CLEAR();
wcadd1=0x59; /* 显示状态设置 */
wdadd1=0x10; /* 设置参数:显示一~四区开显示 */
}
/***************************/
/* 写汉字子程序(图形)函数 */
/***************************/
extern void wchar(char x,char y,char c,char c1,char mode)
{
char i,j;
int addr;
unsigned char code *pos;
if ((c&0x80)==0)
pos=chzmk+(c-0x20)*0x10;
else
pos=cczmk+((int)(c&0x7f)*128+(int)(c1&0x7f))*0x20;
pos1=pos;
c2=c;
wcadd1=0x4f;
addr=(int)y+x*320+0x2580;//+x/2*40
addr1=addr;
for (i=0;i<2;i++)
{
wcadd1=0x46;
wdadd1=(char)addr; /* 设置光标地址CSR */
wdadd1=(char)(addr>>8);
wcadd1=0x42; /* MWRITE 代码 */
for (j=0;j<0x10;j++)
{
if(mode)
wdadd1=~(*pos++);
else
wdadd1=(*pos++);
}
if ((c&0x80)==0)
break;
addr++;
}
}
extern void print(char x,char y,char *s,char mode)
{
char c,c1,i,j;
i=x;j=y;
while (1)
{
c=*s++;
c1=1;
if ((c&0x80)!=0)
{
c1=*s++;
if (j>38)
{
j=y;
i+=2;
}
}
else
if (c==0x0d)
{
i+=2;
j=y;
continue;
}
if ((c==0)||(c1==0))
break;
wchar(i,j++,c,c1,mode);
if ((c&0x80)!=0)
j++;
if (j>39)
{
j=y;
i+=2;
}
}
}
/***************************/
/* 写大字程序 24*24字阵 */
/***************************/
extern void wsmall(char x,char y,char c,char mode)
{
char i,j;
int addr;
unsigned char code *pos;
if(c==0x20)
pos=Dczmk+(0x3A-0x30)*0x30;
else if (c==0x2E)
pos=Dczmk+(0x3B-0x30)*0x30;
else
pos=Dczmk+(c-0x30)*0x30;// 数字0的ASII为0x30 一个数要0x30也就时三行
wcadd1=0x4f;
addr=(int)y+x*320+0x2580;//定位
for (i=0;i<2;i++) //分左右
{
wcadd1=0x46;
wdadd1=(char)addr;
wdadd1=(char)(addr>>8);
wcadd1=0x42;
for (j=0;j<0x18;j++) //48/2=0x30/2
{
if(mode)
wdadd1=~(*pos++);
else
{
wdadd1=(*pos++);
}
}
addr++;
}
}
extern void Dprint(char x,char y,char *s,char mode)
{
char c,i,j;
i=x;j=y;
while (1)
{
c=*s++;
if (c==0) break;
wsmall(i,j,c,mode);
j=j+2;
if ((c&0x80)!=0)
j++;
if (j>38) //一行最多19个大字 19*2
{
j=y;
i+=3;
}
}
}
/********************************************************************************/
/*写大字程序 32*32字阵 */
/*extern void Lsmall(char x,char y,char c,char mode)
{
char i,j;
int addr;
unsigned char code *pos;
if(c==0x20)
pos=Lczmk+(0x3A-0x30)*0x40;
else if (c==0x2E)
pos=Lczmk+(0x3B-0x30)*0x40;
else
pos=Lczmk+(c-0x30)*0x40; // 数字0的ASII为0x30 一个数要0x40
pos1=pos;
c2=c;
wcadd1=0x4f;
addr=(int)y+x*320+0x2580;//定位
for (i=0;i<2;i++) //分左右
{
wcadd1=0x46;
wdadd1=(char)addr;
wdadd1=(char)(addr>>8);
wcadd1=0x42;
for (j=0;j<0x20;j++) //64/2=0x40/2
{
if(mode)
wdadd1=~(*pos++);
else
{
wdadd1=(*pos++);
pos1=pos;
}
}
addr++;
}
}
extern void Lprint(char x,char y,char *s,char mode)
{
char c,i,j;
i=x;j=y;
while (1)
{
c=*s++;
if (c==0) break;
c2=c;
Lsmall(i,j,c,mode);
j=j+3;
if ((c&0x80)!=0)
j++;
if (j>39) //一行最多13个大字 13*3
{
j=y;
i+=4;
}
}
}
*/
/*
extern void SaveScr(char x1,char y1,char x2,char y2,unsigned int adr)
{
unsigned int addr,addr1,num;
char i,j,k,c;
addr=(int)y1+x1*320+0x2580;//+x/2*40
addr1=adr;
num=(unsigned int)(x2-x1+1)*8;
k=y2-y1+1;
for (j=0;j<num;j++)
{
for (i=0;i<k;i++)
{
wcadd1=0x4f;
wcadd1=0x46;
wdadd1=(char)addr; // 设置光标地址CSR
wdadd1=(char)(addr>>8);
wcadd1=0x43;
c=rdadd1;
wcadd1=0x46;
wdadd1=(char)addr1; // 设置光标地址CSR
wdadd1=(char)(addr1>>8);
wcadd1=0x42; // MWRITE 代码
wdadd1=c;
addr++;
addr1++;
}
addr=addr+40-k;
}
}
*/
/*
extern void LoadScr(char x1,char y1,char x2,char y2,unsigned int adr)
{
unsigned int addr,addr1,num;
char i,j,k,c;
addr=(int)y1+x1*320+0x2580;//+x/2*40
addr1=adr;
num=(unsigned int)(x2-x1+1)*8;
k=y2-y1+1;
for (j=0;j<num;j++)
{
for (i=0;i<k;i++)
{
wcadd1=0x4f;
wcadd1=0x46;
wdadd1=(char)addr1; //设置光标地址CSR
wdadd1=(char)(addr1>>8);
wcadd1=0x43;
c=rdadd1;
wcadd1=0x46;
wdadd1=(char)addr; // 设置光标地址CSR
wdadd1=(char)(addr>>8);
wcadd1=0x42; // MWRITE 代码
wdadd1=c;
addr++;
addr1++;
}
addr=addr+40-k;
}
}
*/
extern void clrscr(char line1,char line2)
{
char i;
for (i=line1;i<=line2;i++)
print(i,1," ",0);
}
extern void SetPixel(unsigned char x,unsigned int y,char mod)
{
unsigned int addr;
unsigned char i,c,d;
addr=x*40+y/8+0x2580;
wcadd1=0x4f;
wcadd1=0x46;
wdadd1=(char)addr; /* 设置光标地址CSR */
wdadd1=(char)(addr>>8);
i=7-(y%8);
d=0x01;
d<<=i;
wcadd1=0x43;
c=rdadd1;
wcadd1=0x46;
wdadd1=(char)addr; /* 设置光标地址CSR */
wdadd1=(char)(addr>>8);
wcadd1=0x42; /* MWRITE 代码 */
if (mod)
wdadd1=c|d;
else
wdadd1=c&(d^0xff);
}
/*
extern void scrollup(char x,char y,unsigned char num)
{
unsigned int addr,addr1;
unsigned char i,j,k;
char xdata c;
addr=(int)y+x*320+0x2580;//+x/2*40
addr1=addr+640;
k=40-y;
num=num*16;
for (j=0;j<num;j++)
{
for (i=0;i<k;i++)
{
wcadd1=0x4f;
wcadd1=0x46;
wdadd1=(char)addr1; //设置光标地址CSR /
wdadd1=(char)(addr1>>8);
wcadd1=0x43;
c=rdadd1;
wcadd1=0x46;
wdadd1=(char)addr; //设置光标地址CSR
wdadd1=(char)(addr>>8);
wcadd1=0x42; // MWRITE 代码
wdadd1=c;
addr++;
addr1++;
}
addr+=y;
addr1+=y;
}
}
*/
/*
extern void scrolldown(char x,char y,unsigned char num)
{
unsigned int addr,addr1;
unsigned char i,j,k;
char xdata c;
addr=(int)y+x*320+0x2580;//+x/2*40
addr1=addr-640;
k=40-y;
num=num*16;
for (j=0;j<num;j++)
{
for (i=0;i<k;i++)
{
wcadd1=0x4f;
wcadd1=0x46;
wdadd1=(char)addr1; // 设置光标地址CSR
wdadd1=(char)(addr1>>8);
wcadd1=0x43;
c=rdadd1;
wcadd1=0x46;
wdadd1=(char)addr; // 设置光标地址CSR
wdadd1=(char)(addr>>8);
wcadd1=0x42; // MWRITE 代码
wdadd1=c;
addr++;
addr1++;
}
addr=addr-80+y;
addr1=addr-640;
}
}
*/
extern void xol(char x,char y,unsigned char len)
{
unsigned int addr;
unsigned char i,j;
char xdata c;
addr=(int)y+x*320+0x2580;//+x/2*40
for (j=0;j<16;j++)
{
for (i=0;i<len;i++)
{
wcadd1=0x4f;
wcadd1=0x46;
wdadd1=(char)addr; // 设置光标地址CSR
wdadd1=(char)(addr>>8);
wcadd1=0x43;
c=rdadd1;
wcadd1=0x46;
wdadd1=(char)addr; // 设置光标地址CSR
wdadd1=(char)(addr>>8);
wcadd1=0x42; // MWRITE 代码
wdadd1=c^0xff;
addr++;
}
addr=addr+40-len;
}
}
extern void LineY(x,y,len,mod)
unsigned int y,len;
unsigned char mod,x;
{
int i;
for (i=0;i<len;i++)
SetPixel(x++,y,mod);
}
extern void LineX(x,y,len,mod)
unsigned int y,len;
unsigned char mod,x;
{
int i;
for (i=0;i<len;i++)
SetPixel(x,y++,mod);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -