📄 sed1330.c
字号:
/*以下示例程序所使用的液晶屏为320*240分辨率
本程序中的x坐标值必须为8的倍数,取值在0-319之间
y的取值在0-239之间
画线的函数只能画水平或垂直的直线,如果需要画斜线,需要另外的算法
此程序中未提供源代码
*/
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define RR 0x01
#define LL 0x80
#define BLANK 1
#define WHITE 0
#define WC_ADD XBYTE[0x7100] //写指令代码地址
#define WD_ADD XBYTE[0x7000] //写参数及显示数据地址
#define RD_ADD XBYTE[0x7100] //读参数及显示数据地址
#define RB_ADD XBYTE[0x7000] //读忙状态地址
#define MiddleCursor 1
#define BigCursor 2
#define SmallCursor 0
// 特定字符的宏定义
#define CHARCM 0x00 //厘米
#define CHARHZ 0x01 //赫兹
#define CHARKG 0x02 //千克
#define CHARDU 0x03 //温度
#define CHARFEN 0x04 //
#define CHARFEN1 0x06 //
#define CHARMIAO 0x05 //秒
//全局变量
uchar xdata Char_Var_Count1,Char_Var_Count2;
uchar xdata Int_Var_Temp;
uchar xdata SetX,SetY;
uchar xdata CNumber,PrCNumber;
xdata uchar BUFFER[0x0800] ;//显示缓冲区
xdata uchar TBUF[240] ; //临时缓冲区
bdata kk;
sbit kk_0=kk^0;
uchar idata OXL;
uchar idata OY;
uchar xdata PrX,PrY; //记录光标原来的X、Y座标值
uchar code *hzp16;//指向16×16点阵字库
uchar code *hzp24;//指向24×24点阵字库
uchar code *nump;//指向自制数字字库
uchar xdata *bufferp;
uchar xdata *tempdata;
uchar code systab[8]={0x30,0x87,0x07,0x27,0x42,0xf0,0x30,0x00};//SED1330系统设置参数表
uchar code scrtab[10]={0x00,0x00,0xf0,0x00,0x40,0xf0,0x00,0x80,0x00,0x00};//SCROLL参数表
uchar code ZK16[]={0x00,0x00};//此数组是16点阵字库,读者自行制作,太长,省略
uchar code ZK24[]={0x00,0x00};//此数组是24点阵字库,读者自行制作,太长,省略
uchar code num8p[20][12]= //此数组是作者自制的8*12点阵数字库
{
0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,//0
0x00,0x18,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,//1
0x00,0x3C,0x66,0x66,0x06,0x0C,0x18,0x30,0x60,0x60,0x7E,0x00,//2
0x00,0x3C,0x66,0x06,0x06,0x1C,0x06,0x06,0x06,0x66,0x3C,0x00,//3
0x00,0x06,0x0E,0x1E,0x1E,0x36,0x36,0x66,0x7E,0x06,0x06,0x00,//4
0x00,0x7E,0x60,0x60,0x60,0x7C,0x66,0x06,0x06,0x66,0x3C,0x00,//5
0x00,0x3C,0x66,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x3C,0x00,//6
0x00,0x7E,0x06,0x0C,0x0C,0x18,0x18,0x18,0x30,0x30,0x30,0x00,//7
0x00,0x3C,0x66,0x66,0x66,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,//8
0x00,0x3C,0x66,0x66,0x66,0x66,0x3E,0x06,0x06,0x66,0x3C,0x00,//9
0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,//:
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空格
0x00,0x00,0x42,0x66,0x24,0x18,0x7E,0x18,0x24,0x66,0x42,0x00,// *
0x00,0x38,0x44,0x84,0x80,0x80,0x80,0x84,0x44,0x38,0x00,0x00,//C
0x00,0x44,0x44,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x00,0x00,//M
0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,//H
0x00,0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,//z
0x00,0x84,0x88,0x90,0xA0,0xE0,0x90,0x88,0x88,0x84,0x00,0x00,//K
0x00,0x00,0x00,0x00,0x3C,0x48,0x78,0x40,0x78,0x44,0x38,0x00,//g
0x40,0xA0,0x4E,0x13,0x31,0x60,0x60,0x60,0x61,0x33,0x0E,0x00//温度符号
};
///////////////////////////////////////////////////////////////
//Function of LCD Control
//////////////////////////////////////////////////////////////
void ClearLcd(void); //液晶屏清屏
void InitLcd(void); //显示器初始化
void Dishz(uchar x1,uchar y1,uint position,uchar matrix);//显示汉字
void MidLine(uchar x0,uchar y0,uchar x1,uchar y1,uchar cha);
//显示半条钱(屏幕被分成上下两部分,当一条线跨过中线时,需用此函数)
void Line(uchar x0,uchar y0,uchar x1,uchar y1,uchar cha);//画直线
void Rec(uchar x0,uchar y0,uchar x1,uchar y1,uchar qq);//画矩形
void FullRec(uchar x0,uchar y0,uchar x1,uchar y1,uchar);//画实心矩形
void DisSNum(uchar,uchar,uchar);//显示单个数字
void DisSNumCpl(uchar,uchar,uchar);//反白显示单个数字
void ReadBuffer(uchar x0,uchar y0,uchar x1,uchar y1);//读显示缓冲区
void DisplayBuffer(uchar x0,uchar y0,uchar x1,uchar y1);//显示显示缓冲区内容
void DrawCursor(uchar x0,uchar y0,uchar state); //画光棒
void ClearArea(uchar,uchar,uchar,uchar); //清除某区域
void DisplayNum(uchar x0,uchar y0,uint d0); //显示数字,本程序中只显示整数
void DisplayNumCpl(uchar x0,uchar y0,uint d0);//反白显示数字
void DisplayTwoNum(uchar x0,uchar y0,uchar d0);//显示两位的数字
void DisplayBigNum(uchar x0,uchar y0,uint d0);//显示较大的数字,超过三位
void DisplayTwoNumCpl(uchar x0,uchar y0,uchar d0);//反白显示两位数字
void InitLcd(void) //LCD初始化
{
uchar j;
WC_ADD=0x40;
for(j=0;j<0x08;j++) //写入系统设置指令代码
WD_ADD=systab[j]; //初始化,显示窗口设置
WC_ADD=0x44;
for(j=0;j<0x0a;j++) //写入SCROLL指令代码
WD_ADD=scrtab[j]; //设置显示区域,卷动
WC_ADD=0x5a;
WD_ADD=0x00; //设置点单元卷动位置
WC_ADD=0x5b;
WD_ADD=0x0c; //设置合成显示方式
ClearLcd(); //清屏
WC_ADD=0x59; //显示开,设置显示方式
WD_ADD=0x04;
}
//屏幕为320*240分辩率,因每个字节显示RAM可以代表屏幕上的一行8位的像素点
//故一个屏幕上的点要清屏只需对40*240个显示RAM清0
void ClearLcd(void) //LCD清屏
{
uchar i,j;
WC_ADD=0x4c; //光标向右移动
WC_ADD=0x46; //设置光标起始地址
WD_ADD=0x00; //光标起始地址0000H
WD_ADD=0x00;
WC_ADD=0x42; //从0000H开始数据写入显示RAM
for(i=0;i<=0x60;i++)
{
for(j=0;j<255;j++)
WD_ADD=0; //写入的数据为0
}
}
//输入参数x、y是要显示的数字所在的屏幕位置坐标,dat是所要显示的数字
//光标的位置与显示RAM的地址是一致的
//此处的数字是笔者特制的8*12点阵
void DisSNum(uchar x,uchar y,uchar dat)
{
uchar code *q;
uchar flag;
uint dd;
q=num8p[dat];
OXL=x;OY=y;
dd=OY*0x30+OXL;// 计算对应的显示RAM地址
OXL=dd%256;//16位地址的低8位
OY=dd/256;//16位地址的高8位
flag=0;
WC_ADD=0x4f; //光标移动方向向下
WC_ADD=0x46; //设置光标起始位置
WD_ADD=OXL; //16位地址的低8位
WD_ADD=OY; //16位地址的高8位
WC_ADD=0x42; //从该地址开始写数据
for(Char_Var_Count2=0;Char_Var_Count2<12;Char_Var_Count2++)
WD_ADD=q[Char_Var_Count2]; //逐行输出
}
//坐标为(x0,y0)、(x1,y1)的两点分别为所清屏区域的对角线的两点
//清屏时先逐列清0
void ClearArea(uchar x0,uchar y0,uchar x1,uchar y1)
{
uint dd;
OXL=x0;OY=y0;
if(y0<180&&y1>180)
dd=0;
dd=OY*0x30+OXL;
OXL=dd%256;
OY=dd/256; ////+kk;
WC_ADD=0x4f; ////the cursor go down
for(Char_Var_Count1=0;Char_Var_Count1<cabs(x1-x0);Char_Var_Count1++)
{
WC_ADD=0x46; //set the point of cursor
WD_ADD=OXL; // x direction
WD_ADD=OY; // y direction
WC_ADD=0x42; //Write data to display buffer
for(Char_Var_Count2=0;Char_Var_Count2<cabs(y1-y0);Char_Var_Count2++)
{
WD_ADD=0x00;
}
OXL=OXL+1;
kk_0=CY;
OY=OY+kk;
}
}
//x,y是要显示的汉字在屏幕的坐标,matrix是用来选择汉字的矩阵大小
//matrix=1,汉字点阵为8*8,matrix=1,汉字点阵为16*16,matrix=1,汉字点阵为24*24
void Dishz(uchar x,uchar y,uint position,uchar matrix)
{
uchar code *q;
uchar flag;
uint dd;
hzp16=ZK16;
hzp24=ZK24;
if(matrix==1)
q=num8p[position];
else
if (matrix==2)
q=hzp16+position*8*matrix*matrix;
else
q=hzp24+position*8*matrix*matrix;
OXL=x;OY=y;
dd=OY*0x30+OXL;
OXL=dd%256;
OY=dd/256;//+kk;
flag=0;
WC_ADD=0x4f; //the cursor go down
for(Char_Var_Count1=0;Char_Var_Count1<matrix;Char_Var_Count1++)
{
WC_ADD=0x46; //set the point of cursor
WD_ADD=OXL; // x direction
WD_ADD=OY; // y direction
WC_ADD=0x42; //Write data to display buffer
for(Char_Var_Count2=0;Char_Var_Count2<(8*matrix);Char_Var_Count2++)
{
if(flag==0)
WD_ADD=q[Char_Var_Count2];
else
if(flag==1)
WD_ADD=q[Char_Var_Count2+8*matrix];
else
WD_ADD=q[Char_Var_Count2+48];
}
OXL=OXL+1;
kk_0=CY;
OY=OY+kk;
flag=flag+1;
}
}
//屏幕上被分了上下两个显示区
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -