📄 lcm320240-function.c
字号:
#include"LCM3202403.h"
/* ------------------初始化子程序------------------------*/
void LCM_initial(void)
{
wrcmd(SystemSet);//系统设置
wrdata(0x30);//8*8 1
wrdata(0x87);//8 2
wrdata(0x07);//8 3
wrdata(0x27);//显示每行字节数40 4
wrdata(0x39);//设置显示频率 5
wrdata(0xef);//行数240 6
wrdata(0x28);//一行占缓冲区字节数 7
wrdata(0x00);
wrcmd(Scroll);//存储设置
wrdata(0x00); // 1
wrdata(0x00);//起始地址0000H 2
wrdata(0xef);//240行 3
wrdata(0x00);// 4
wrdata(0x40);//起始地址4000H 5
wrdata(0xef);//240行 6
wrdata(0x00);// 7
wrdata(0x80);//起始地址8000H 8
wrdata(0x00);// 9
wrdata(0x00);//起始地址0000H 10
wrcmd(HdotScr);//设置水平点位移
wrdata(0x00);
wrcmd(Ovlay);//第一层文本格式,三层或关系
wrdata(0x00);
wrcmd(CsrForm);//光标格式设置
wrdata(0x07);//8*8
wrdata(0x87);//block cursor
wrcmd(DispOn);//显示屏开
wrdata(0x16);//一区开不闪,二区开不闪,光标闪烁
}
/* ------------------图形写入子程序--------------------------*/
void LCM_picture(uint x, uint y, uint width, uint height, uchar *p) //write a dot on the 2nd layer
{
uchar i, j;
uint addr;
addr = 0x4000 + x + y*AP;
if(width % 8 == 0)
width = width / 8; //点阵对应到每行占用的字节数
else
width = (width + 8) / 8;//不足一字节,按一字节算,取整
for(i=0; i<height; i++) //图形点阵,像素高度
{
wrcmd(CsrW); // 光标Locate,定位0x46
wrdata(addr); // 写入参数CSRL设置参数光标指针低8位
wrdata(addr>>8); // 写入参数CSRH设置参数光标指针高8位
wrcmd(CsrDirR); // 光标移动方向定义:自动右移
wrcmd(mWrite); // 数据写入指令,代码0x42
for(j=0; j<width; j++)
{
wrdata(*p++); // 写入数据
}
addr = addr + AP; //按行写入数据,每行在内存中占用地址为AP,所以地址每次加AP
}
}
/* ------------------划线子程序--------------------------
void LCM_line(uint x1, uint y1, uint x2, uint y2) //write a line on the 2nd layer
{
int dalt_x, dalt_y, err = 0;
if(y1>y2)
{
SWAP(x1, x2);
SWAP(y1, y2);
}
LCM_dot(x1, y1);
dalt_x=x2-x1;
dalt_y=y2-y1;
if(dalt_x>=0)
{
if(dalt_y>dalt_x)
{
while(y1<y2)
{
if(err<0)
{
x1=x1+1;
y1=y1+1;
err=err+dalt_y-dalt_x;
}
else
{
y1=y1+1;
err=err-dalt_x;
}
LCM_dot(x1, y1);
}
}
else
{
if(dalt_y==0)
y1=y1-1;
while(x1<x2)
{
if(err<0)
{
x1=x1+1;
err=err+dalt_y;
}
else
{
y1=y1+1;
x1=x1+1;
err=err+dalt_y-dalt_x;
}
LCM_dot(x1, y1);
}
}
}
else
{
dalt_x=x1-x2;
if(dalt_y>dalt_x)
{
while(y1<y2)
{
if(err<0)
{
x1=x1-1;
y1=y1+1;
err=err+dalt_y-dalt_x;
}
else
{
y1=y1+1;
err=err-dalt_x;
}
LCM_dot(x1, y1);
}
}
else
{
if(dalt_y==0)
y1=y1-1;
while(x1>x2)
{
if(err<0)
{
x1=x1-1;
err=err+dalt_y;
}
else
{
x1=x1-1;
y1=y1+1;
err=err+dalt_y-dalt_x;
}
LCM_dot(x1, y1);
}
}
}
}*/
/* ------------------坐标点写入子程序--------------------------
void LCM_dot(uint x, uint y) //write a dot on the 2nd layer
{
uint addr;
uchar addrh, addrl;
uchar dotdata = 0x80, m;
addr = 0x4000 + x/8 + y*AP;
m = x%8;
dotdata = dotdata >> m;
addrl = addr;
addrh = addr>>8;
wrcmd(CsrDirR); // 光标移动方向定义:自动右移
wrcmd(CsrW); // 光标Locate,定位0x46
wrdata(addrl); // 写入参数CSRL设置参数光标指针低8位
wrdata(addrh); // 写入参数CSRH设置参数光标指针高8位
wrcmd(mRead); // 读数据命令0x43
m = rddata();
m = m|dotdata;
wrcmd(CsrDirR); // 光标移动方向定义:自动右移
wrcmd(CsrW); // 光标Locate,定位0x46
wrdata(addrl); // 写入参数CSRL设置参数光标指针低8位
wrdata(addrh); // 写入参数CSRH设置参数光标指针高8位
wrcmd( mWrite ); // 数据写入指令,代码0x42
wrdata(m); // 写入数据
wrcmd(CsrDirR);
}*/
/* ------------------汉字字符串写入子程序--------------------------*/
void LCM_gb(uint x, uint y, uchar n, uchar *p)
{
uint addr;
uchar i, j;
addr = 0x4000 + x + y*AP; //第二显示区为图形属性,计算显示ram地址
for(i=0; i<n*2; i++) //16*16点阵,每个字占用32字节,一个字分两次写入
{
wrcmd(CsrW); // 光标Locate,定位0x46
wrdata(addr); // 写入参数CSRL设置参数光标指针低8位
wrdata(addr>>8); // 写入参数CSRH设置参数光标指针高8位
wrcmd(CsrDirD); // 光标移动方向定义:自动下移
wrcmd(mWrite); // 数据写入指令,代码0x42
for(j=0; j<16; j++)
{
wrdata(*(p + 2*j + 32*(i/2) + i%2)); // 写入数据,左半边为0,右半边为1
} // 先写左半部分,表内偶数部分,地址addr
addr = addr + 1; // 再写右半部分,表内奇数部分,地址addr+1,右移一字节
}
wrcmd(CsrDirR);
}
/* ------------------ASCII字符串写入子程序--------------------------*/
void LCM_ASC(uint x, uint y, uchar n, uchar *p)
{
uint addr;
uchar i, j;
uint temp;
addr = 0x4000 + x + y*AP; //第二显示区为图形属性,计算显示ram地址
for(i=0; i<n; i++) //8*16点阵,每个字占用16字节,一个字一次写入
{
temp=*(p+i)-0x20;
wrcmd(CsrW); // 光标Locate,定位0x46
wrdata(addr); // 写入参数CSRL设置参数光标指针低8位
wrdata(addr>>8); // 写入参数CSRH设置参数光标指针高8位
wrcmd(CsrDirD); // 光标移动方向定义:自动下移
wrcmd(mWrite); // 数据写入指令,代码0x42
for(j=0; j<16; j++)
{
wrdata(ASC_MSK[temp*16+j]);// 写入数据,从上到下的顺序写入
}
addr = addr + 1; // 每次写入一个数据,地址addr+1,右移一字节的位置
}
wrcmd(CsrDirR);
}
/* ------------------ASCII字符串写入子程序--------------------------
void LCM_ascii(uint x, uint y, uchar *p)
{
uint addr;
addr = x + y * AP;//第一显示区为文本属性,计算显示ram地址
wrcmd(CsrW); // 光标Locate,定位0x46
wrdata(addr); // 写入参数CSRL设置参数光标指针低8位
wrdata(addr>>8); // 写入参数CSRH设置参数光标指针高8位
wrcmd(CsrDirR); // 光标移动方向定义:自动右移
wrcmd(mWrite); // 数据写入指令,代码0x42
while(*p>0)
{
wrdata(*p++); // 写入数据0x00
}
wrcmd(CsrDirR);
}
*/
/* ------------------清屏子程序--------------------------*/
void Lcm_clear(void)
{
uint i=32768;
wrcmd(CsrW ); // 光标Locate,定位
wrdata(0); // 写入参数CSRL设置参数光标指针低8位
wrdata(0); // 写入参数CSRH设置参数光标指针高8位
wrcmd(CsrDirR); // 光标移动方向定义:自动右移
wrcmd(mWrite); // 数据写入指令,代码0x42
while(i--)
{
wrdata(0x00); // 写入数据0x00
}
}
/* -------------------全显示子程序-----------------------*/
void Lcm_on(void)
{
uint i=32768;
wrcmd(CsrW); // 光标Locate,定位
wrdata(0); // 写入参数CSRL设置参数光标指针低8位
wrdata(0); // 写入参数CSRH设置参数光标指针高8位
wrcmd(CsrDirR); // 光标移动方向定义:自动右移
wrcmd(mWrite); // 数据写入指令,代码0x42
while(i--)
{
wrdata(0xff); // 写入数据0xff
}
}
/* ---------------------读数据子程序-------------------
uchar rddata(void)
{
uchar num = 0xff;
a0=1;
cs_=0;
databus=0xff;
_nop_();
rd_=0;
_nop_();
_nop_();
num=databus;
_nop_();
_nop_();
rd_=1;
cs_=1;
return num;
}*/
/* ---------------------写数据子程序-------------------*/
void wrdata(uchar num)
{
databus=0xff;
a0=0;
_nop_();
databus=num;
_nop_();
_nop_();
cs_=0;
wr_=0;
_nop_();
_nop_();
wr_=1;
cs_=1;
}
/* ---------------------写指令子程序-------------------*/
void wrcmd(uchar cmd)
{
databus=0xff;
a0=1;
_nop_();
databus=cmd;
_nop_();
_nop_();
cs_=0;
wr_=0;
_nop_();
_nop_();
wr_=1;
cs_=1;
}
/*----------------------延时子程序----------------------*/
void delay(ulong n)
{
while(n--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -