📄 test.c.bak
字号:
#include <intrins.h>
#include "ZYEL0304.H"
#include "Matrix16.H"
#define CMDADD XBYTE[0x6100] //写指令代码地
#define DATAADD XBYTE[0x6000] //写数据通道地址
unsigned char xdata bmp_info[1536];
volatile unsigned char idata info_ln[30];
#define LINEWIDTH 30 //行宽 30个字节
#define LCM_ERR 1
#define LCM_ERR 1
uchar sta01(void) // 状态位STA1,STA0判断(读写指令和读写数据)
{
uchar i;
for(i=10;i>0;i--)
{
if((CMDADD & 0x03) == 0x03)
break;
}
return i; // 若返回零,说明错误
}
uchar sta2(void) // 状态位STA2判断
{
uchar i;
for(i=10;i>0;i--)
{
if((CMDADD & 0x04) == 0x04)
break;
}
return i; // 若返回零,说明错误
}
uchar sta3(void) // 状态位STA3判断
{
uchar i;
for(i=10;i>0;i--)
{
if((CMDADD & 0x08) == 0x08)
break;
}
return i; // 若返回零,说明错误
}
uchar sta6(void) // 状态位STA6判断
{
uchar i;
for(i=10;i>0;i--)
{
if((CMDADD & 0x40) == 0x40)
break;
}
return i; // 若返回零,说明错误
}
// 返回值
uchar writecode(unsigned char com) //写无参数指令
{
uint ret;
ret=sta01();
if(ret==0)
return LCM_ERR;
else
CMDADD=com;
return LCM_SUC;
}
uchar write1byte(unsigned char dat1,unsigned char com) //写单字节参数指令
{
uint ret;
ret=sta01();
if(ret==0)
return LCM_ERR;
else
DATAADD=dat1;
ret=sta01();
if(ret==0)
return LCM_ERR;
else
CMDADD=com;
return LCM_SUC;
}
uchar write2byte(unsigned char dat1,unsigned char dat2,unsigned char com) //写双字节参数指令
{
uint ret;
ret=sta01();
if(ret==0)
return LCM_ERR;
else
DATAADD=dat1;
ret=sta01();
if(ret==0)
return LCM_ERR;
else
DATAADD=dat2;
if(ret==0)
return LCM_ERR;
else
CMDADD=com;
return LCM_SUC;
}
uchar disp_ini(void) //显示屏初始化子程序
{
uint ret;
ret=write2byte(0x00,0x00,0x40); //设置显示区域首地址0000h
ret=write2byte(0x10,0x00,0x41); //设置文本显示的宽度,即一行所占的字节数(12864t,16个8X8点阵字符)
ret=write2byte(0x00,0x08,0x42); //设置图形显示区域首地址0800h,或为文本属性区域首地址
ret=write2byte(LINEWIDTH,0x00,0x43); //设置图形显示区域宽度,或为文本属性区域宽度
ret=write2byte(LINEWIDTH,0x00,0x43); //设置图形显示区域宽度,或为文本属性区域宽度
ret=writecode(0xa7); //光标形状设置
ret=writecode(0x9c); //显示开关设置,打开图形显示模式
ret=writecode(0x80); //显示方式设置,逻辑或合成
return ret;
}
uchar clearram(void) //清屏程序
{
unsigned int i;
uint ret;
ret=write2byte(0x00,0x00,0x24); //设置显示ram首地址0000h
ret=writecode(0xb0); //设置自动写方式
for(i=8192;i>0;i--) //往显示区域写0;区域大小8k
{
ret=sta3();
DATAADD=0;
};
ret=writecode(0xb2); //关闭自动写指令
return ret;
}
uchar gshowNullword(unsigned char y,unsigned char x) //图形方式下显示空内容
//x--显示在第x(0~29)字符列,y--显示在第y(0~127)
{
unsigned int num,ret;
unsigned char d1,d2,i=16;
num=y*LINEWIDTH+x+0x800; //图形显示区首地址为0800h
for(i=16;i>0;i--)
{
d1=num/256; //得到显示屏上汉字显示的相对位置
d2=num%256;
ret=write2byte(d2,d1,0x24);
ret=write1byte(0x00,0xc0); //写汉字左代码
ret=write1byte(0x00,0xc0); //写汉字右代码
num+=LINEWIDTH; //显示ram地址修正
}
return ret;
}
//显示16*16点阵汉字
uchar gshowword(unsigned char y,unsigned char x,unsigned char *w_no) //图形方式下显示一个汉字字符(分为左右两半字模)
{
unsigned int num,ret;
unsigned char d1,d2,i=16;
num=y*LINEWIDTH+x+0x800; //图形显示区首地址为0800h
for(i=16;i>0;i--)
{
d1=num/256; //得到显示屏上汉字显示的相对位置
d2=num%256;
ret=write2byte(d2,d1,0x24);
ret=write1byte(*w_no,0xc0); //写汉字左代码
ret=write1byte(*(w_no+16),0xc0); //写汉字右代码
w_no++;
num+=LINEWIDTH; //显示ram地址修正
}
return ret;
}
//显示16*32点阵汉字
uchar gshow2word(unsigned char y,unsigned char x,unsigned char *w_no) //图形方式下显示一个汉字字符(分为左右两半字模)
{
unsigned int num,ret;
unsigned char d1,d2,i=16;
num=y*LINEWIDTH+x+0x800; //图形显示区首地址为0800h
for(i=16;i>0;i--)
{
d1=num/256; //得到显示屏上汉字显示的相对位置
d2=num%256;
ret=write2byte(d2,d1,0x24);
ret=write1byte(*w_no,0xc0); //写汉字左代码
ret=write1byte(*(w_no+16),0xc0); //写汉字右代码
num+=LINEWIDTH; //显示ram地址修正
d1=num/256; //得到显示屏上汉字显示的相对位置
d2=num%256;
ret=write2byte(d2,d1,0x24);
ret=write1byte(*w_no,0xc0); //写汉字左代码
ret=write1byte(*(w_no+16),0xc0); //写汉字右代码
w_no++;
num+=LINEWIDTH; //显示ram地址修正
}
return ret;
}
//显示8*16点阵字符
uchar gshowchar(unsigned char y,unsigned char x,unsigned char *w_no)
{
unsigned int num,ret;
unsigned char d1,d2,i=16;
num=y*LINEWIDTH+x+0x800; //图形显示区首地址为0800h
for(i=16;i>0;i--)
{
d1=num/256; //得到显示屏上汉字显示的相对位置
d2=num%256;
ret=write2byte(d2,d1,0x24);
ret=write1byte(*w_no,0xc0); //写汉字左代码
w_no++;
num+=LINEWIDTH; //显示ram地址修正
}
return ret;
}
//显示8*32点阵字符
uchar gshow2char(unsigned char y,unsigned char x,unsigned char *w_no)
{
unsigned int num,ret;
unsigned char d1,d2,i=16;
num=y*LINEWIDTH+x+0x800; //图形显示区首地址为0800h
for(i=16;i>0;i--)
{
d1=num/256; //得到显示屏上汉字显示的相对位置
d2=num%256;
ret=write2byte(d2,d1,0x24);
ret=write1byte(*w_no,0xc0); //写汉字左代码
num+=LINEWIDTH; //显示ram地址修正
d1=num/256; //得到显示屏上汉字显示的相对位置
d2=num%256;
ret=write2byte(d2,d1,0x24);
ret=write1byte(*w_no,0xc0); //写汉字左代码
w_no++;
num+=LINEWIDTH; //显示ram地址修正
}
return ret;
}
//显示16*16点阵一行数据
//nLineNo:1-8
uchar Show16Line(unsigned char nLineNo,unsigned char *info_ln)
{
unsigned int ret,i,pos_x,pos_y=0;
nLineNo=nLineNo-1;
for(i=0;i<LINEWIDTH;i++)
{
if(info_ln[i]>0xa0)
{
GetHzDots(info_ln[i],info_ln[i+1]);
pos_x=i*16;
ConvertHzDots(pos_x,pos_y);
ret=gshowword(16*nLineNo,i,bmp_info+i*16);
i++;
}
else
{
GetChDots(info_ln[i]);
pos_x=16*i;
ConvertChDots(pos_x,pos_y);
ret=gshowchar(16*nLineNo,i,bmp_info+i*16);
}
}
return ret;
}
//显示16*32点阵一行数据
//nLineNo:1-4
uchar Show32Line(unsigned char nLineNo,unsigned char *info_ln)
{
unsigned int i,ret,pos_x,pos_y=0;
nLineNo=nLineNo-1;
for(i=0;i<LINEWIDTH;i++)
{
if(info_ln[i]>0xa0)
{
GetHzDots(info_ln[i],info_ln[i+1]);
pos_x=16*i;
ConvertHzDots(pos_x,pos_y);
ret=gshow2word(32*nLineNo,i,bmp_info+i*16);
i++;
}
else
{
GetChDots(info_ln[i]);
pos_x=16*i;
ConvertChDots(pos_x,pos_y);
ret=gshow2char(32*nLineNo,i,bmp_info+i*16);
}
}
return ret;
}
//清除16*16点阵行数据
uchar Clear16OneLine(unsigned char nLineNo)
{
int i;
nLineNo=nLineNo-1;
for(i=0;i<LINEWIDTH;i++)
{
ret=gshowNullword(16*nLineNo,i);
}
return ret;
}
void main(void) //test program segment
{
int ret,i=0;
P0=P1=P2=0x00;P3=0xff;
ret=disp_ini();
ret=clearram();
while(1)
{
i++;
strcpy(info_ln,"所在的字库首址为基地址显示数据");
ret=Show16Line(1,info_ln);
strcpy(info_ln,"0日Ac!@$%*日A月__+|>?<N~U日月B");
// strcpy(info_ln,"09aAc!@#$$%*234_+|>?<N~U4645fr");
ret=Show32Line(2,info_ln);
ret=Clear16OneLine(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -