📄 sed1330.h
字号:
//以下程序用于SED1330控制的液晶显示模块,显示点阵为320X240
#include "stdarg.h"
#define CR 39 /*定义显示窗口的长度,以字符为单位*/
#define TCR 45 /*定义LCD的时间常数.这个时间常数应该尽量小(场频就大),防止转换时出现闪烁*/
#define LF 239 /*定义LCD的行数*/
#define APL 40 /*定义LCD一行所占缓冲区的字节数,低8位*/
#define APH 0 /*定义LCD一行所占缓冲区的字节数,高8位*/
#define SAD1 0X0000 /*定义显示一区首址*/
#define SAD1L 0X00 /*定义显示一区首址低8位*/
#define SAD1H 0X00 /*定义显示一区首址高8位*/
#define SL1 239 /*定义显示一区所占显示屏幕的行数*/
#define SAD2 0X2800 /*定义显示二区首址*/
#define SAD2L 0X00 /*定义显示二区首址低8位*/
#define SAD2H 0X28 /*定义显示二区首址高8位*/
#define SL2 239 /*定义显示二区所占显示屏幕的行数*/
#define SAD3 0X5000 /*定义显示三区首址*/
#define SAD3L 0X00 /*定义显示三区首址低8位*/
#define SAD3H 0X50 /*定义显示三区首址高8位*/
#define SAD4 0X2800 /*定义显示四区首址*/
#define SAD4L 0X00 /*定义显示四区首址低8位*/
#define SAD4H 0X28 /*定义显示四区首址高8位*/
#define TA_LEFT 0 //左对齐方式
#define TA_CENTER 1 //中心对齐方式
///////////////////////
void wrstr(unsigned int sad,unsigned int hnum,unsigned char vnum,unsigned char* str);
void wrdot(unsigned int sad,unsigned int hnum,unsigned char vnum);
void initlcd();
void rectangle(unsigned int sad,unsigned int strhnum,unsigned char strvnum,unsigned int endhnum,unsigned char endvnum,unsigned char fill);
void wrchat(unsigned int sad,unsigned int hnum,unsigned char vnum,unsigned char chatnum);
void liney(unsigned int sad,unsigned int x,unsigned char y1,unsigned char y2);
void linex(unsigned int sad,unsigned char y,unsigned int x1,unsigned int x2);
//////////////////////
/*设定三个显示区域为:第一显示区 0000H----27FFH (10K容量)
第二显示区 2800H----4FFFH (10K容量)
第三显示区 5000H----77FFH (10K容量)*/
const unsigned char LCDSYSINIT[8]={0X30,0X87,0X07,CR,TCR,LF,APL,APH}; /*主LCD0的SYS设置参数*/
const unsigned char LCDSCRINIT[10]={SAD1L,SAD1H,SL1,SAD2L,SAD2H,SL2,SAD3L,SAD3H,SAD4L,SAD4H}; /*主LCD0的SCR设置参数*/
/***********************************************************
* 程序名称: INITLCD *
* 程序用途: 将SED1330 初始化成3层图形方式 *
* 输入参数: 无 *
* *
* *
***********************************************************/
void initlcd()
{
xdata unsigned char counter;
LCDORDER=0X40; /*送入SYS命令*/
for(counter=0;counter<=7;counter++)
{LCDDATA=LCDSYSINIT[counter];} /*送入8个SYSTERM数据*/
LCDORDER=0X44; /*送入SCROLL命令*/
for(counter=0;counter<=9;counter++)
{LCDDATA=LCDSCRINIT[counter];} /*送入十个SCROLL数据*/
LCDORDER=0X5A; /*送入HDOTSCR命令*/
LCDDATA=0X00; /*送入HDOTSCR数据*/
LCDORDER=0X4F;
LCDORDER=0X5B; /*送入OVLAY命令*/
LCDDATA=0X1D; /*送入OVLAY数据,显示方式==(L1*L2)+L3 */
LCDORDER=0X59; /*开关显示*/
LCDDATA=0X40; /*开启一.二四.三, 关闭光标*/
//LCDDATA=0X04|0x10|0x40; /*开启一.二四.三, 关闭光标*/
LCDORDER=0X5D; /*设置光标*/
LCDDATA=0X07; /*水平点数为7*/
LCDDATA=0X87; /*垂直点数为7,阴影显示*/
}
/***********************************************************
* 程序名称: WRDOT() *
* 程序用途: 在指定层的指定位置写点. *
* 输入参数: sad 指定层的内存地址 *
* hnum 点横坐标 *
* vnum 点纵坐标 *
* *
***********************************************************/
void wrdot(unsigned int sad,unsigned int hnum,unsigned char vnum)
{
unsigned char flag;
union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=vnum*(APL)+hnum/8+sad;
flag=hnum-(hnum/8)*8;
flag=(0x80)>>flag;
LCDORDER=0X46; /*设置光标地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X43; /*取出该点所在地址的数据*/
flag=flag|(LCDORDER);
LCDORDER=0X46;
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X42;
LCDDATA=flag;
}
/***********************************************************
* 程序名称: WRDOT() *
* 程序用途: 在指定层的指定位置清点. *
* 输入参数: sad 指定层的内存地址 *
* hnum 点横坐标 *
* vnum 点纵坐标 *
* *
***********************************************************/
/*void clsdot(unsigned int sad,unsigned int hnum,unsigned char vnum)
{
xdata unsigned char flag;
xdata union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=vnum*(APL)+hnum/8+sad;
flag=hnum-(hnum/8)*8;
flag=(0x80)>>flag;
flag=~flag;
LCDORDER=0X46; //设置光标地址
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X43; //取出该点所在地址的数据
flag=flag&(LCDORDER);
LCDORDER=0X46;
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X42;
LCDDATA=flag;
} */
/***********************************************************
* 程序名称: CLSSED() *
* 程序用途: 清空显示器 *
* 输入参数: 无 *
* *
* *
* *
************************************************************/
void clssed(unsigned int sad)
{
xdata union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=sad;
LCDORDER=0X46; /*设置光标地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X4C;
LCDORDER=0X42;
sad=0;
while(sad<9600)
{
LCDDATA=0X00;
sad++;
}
}
/***********************************************************
* 程序名称: LINEX() *
* 程序用途: 作水平线 *
* 输入参数: sad 指定层的内存地址 *
* y位置 *
* x1起点 *
* x2终点 *
* *
* *
************************************************************/
void linex(unsigned int sad,unsigned char y,unsigned int x1,unsigned int x2)
{
do{
wrdot(sad,x1,y);
x1++;
}while(x1<=x2);
}
/***********************************************************
* 程序名称: LINEY() *
* 程序用途: 作垂直线 *
* 输入参数: sad 指定层的内存地址 *
* x位置 *
* y1起点 *
* y2终点 *
* *
* *
************************************************************/
void liney(unsigned int sad,unsigned int x,unsigned char y1,unsigned char y2)
{
do{
wrdot(sad,x,y1);
y1++;
}while(y1<=y2);
}
/***********************************************************
* 程序名称: LINE() *
* 程序用途: 作垂直线 *
* 输入参数: sad 指定层的内存地址 *
* x1起点 *
* x2终点 *
* y1起点 *
* y2终点 *
* *
* *
************************************************************/
/*void line(unsigned int sad,unsigned int x1,unsigned int x2,unsigned char y1,unsigned char y2)
{
unsigned char tem,tem1;
if(y2>y1)
{
tem=y2-y1;
for(tem1=0;tem1<=tem/2;tem1++)
{
wrdot(sad,x1,y1+tem1);
wrdot(sad,x2,y1+tem/2+tem1+1);
}
}
else
{
tem=y1-y2;
for(tem1=0;tem1<=tem/2;tem1++)
wrdot(sad,x1,y1-tem1);
for(tem1=1;tem1<=tem/2;tem1++)
wrdot(sad,x2,y1-tem/2-tem1);
}
} */
/***********************************************************
* 程序名称: WRCHAT() *
* 程序用途: 在指定层的指定位置写ASCII字符 *
* 输入参数: sad 指定层的内存地址 *
* hnum 点横坐标 *
* vnum 点纵坐标 *
* chatnum字符的序号值 *
***********************************************************/
void wrchatasc(unsigned int sad,unsigned int hnum,unsigned char vnum,unsigned char chatnum)
{
unsigned char buff[16]; /*缓存,用于读写ASCII字符的16*16点阵*/
unsigned char counter;
unsigned char flag1;
unsigned char flag2;
unsigned char offset;
union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=vnum*(APL)+hnum/8+sad; /*计算出首址*/
offset=hnum-(hnum/8)*8; /*计算出字符内的偏移量*/
LCDORDER=0X46; /*确定光标地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
/*以下写字符的左部*/
LCDORDER=0X4F; /*确定光标移动方向为向下*/
flag1=(0XFF)<<(8-offset);
flag2=~flag1;
LCDORDER=0X43; /*由光标处开始,向下读入16个数据*/
for(counter=0;counter<16;counter++)
{ /*由于LCDORDER的操作是一次写,一次读,C51可能在读操作时优化成直接使用写的数据,
而不进行读操作,所以加一个无用指令*/
buff[counter]=(LCDORDER&flag1)|(ASC_MSK[chatnum][counter]>>offset);
}
LCDORDER=0X46; /*再次确定光标地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X42;
for(counter=0;counter<16;counter++)
{
(LCDDATA)=buff[counter];
}
curadd.add=curadd.add+1; /*地址加1,移到右部*/
LCDORDER=0X4F; /*确定光标移动方向为向下*/
LCDORDER=0X46; /*确定光标地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
flag1=(0XFF)>>offset;
flag2=~flag1;
flag1=0XFF>>offset;
LCDORDER=0X43; /*由光标处开始,向下读入16个数据*/
for(counter=0;counter<16;counter++)
{
buff[counter]=(LCDORDER&flag1)|(ASC_MSK[chatnum][counter]<<(8-offset));
}
LCDORDER=0X46; /*再次确定光标地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
LCDORDER=0X42;
for(counter=0;counter<16;counter++)
{
(LCDDATA)=buff[counter];
}
}
/***********************************************************
* 程序名称: WRCHAT() *
* 程序用途: 在指定层的指定位置写汉字字符 *
* 输入参数: sad 指定层的内存地址 *
* hnum 点横坐标 *
* vnum 点纵坐标 *
* chatnum字符的序号值 *
***********************************************************/
void wrchat(unsigned int sad,unsigned int hnum,unsigned char vnum,unsigned char chatnum)
{
unsigned char buff[16]; /*缓存,用于读写ASCII字符的16*16点阵*/
unsigned char counter;
unsigned char flag1;
unsigned char flag2;
unsigned char offset;
union {unsigned int add;
struct {unsigned char addhi;unsigned char addlo;}addhalf;
}curadd;
curadd.add=vnum*(APL)+hnum/8+sad; /*计算出首址*/
offset=hnum-(hnum/8)*8; /*计算出字符内的偏移量*/
LCDORDER=0X46; /*确定光标地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
/*以下写字符的左部*/
LCDORDER=0X4F; /*确定光标移动方向为向下*/
flag1=(0XFF)<<(8-offset);
flag2=~flag1;
LCDORDER=0X43; /*由光标处开始,向下读入16个数据*/
for(counter=0;counter<16;counter++)
buff[counter]=(LCDORDER&flag1)|(GB_16[chatnum].Msk[counter]>>offset);
LCDORDER=0X46; /*再次确定光标地址*/
LCDDATA=curadd.addhalf.addlo;
LCDDATA=curadd.addhalf.addhi;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -