📄 lcd240128.c
字号:
/************************************************
文件名:LCD240128.c
功 能:内嵌T6963C240×128LCD显示驱动
作 者:
日 期:2007-10-7 20:5:34
备 注:PA数据口 PC0-C/D PC1-RD PC3-WR
************************************************/
#include "include.h"
#define uchar unsigned char
#define uint unsigned int
uchar cctab[2][32]=
{
//1_老
0x02,0x00,0x02,0x00,0x02,0x88,0x3F,0xD8,
0x02,0x20,0x02,0x44,0xFF,0xFE,0x01,0x00,
0x02,0x00,0x04,0x10,0x0C,0x30,0x14,0xC0,
0x27,0x00,0x44,0x04,0x84,0x04,0x03,0xFC,
//2_婆
0x20,0x20,0x1B,0xFE,0x4A,0x22,0x22,0x24,
0x03,0xF8,0x12,0x88,0x22,0x50,0x64,0x20,
0x28,0x50,0x22,0x8C,0xFF,0xFE,0x08,0x20,
0x04,0x40,0x03,0x80,0x0C,0x60,0x30,0x10
};
/************************************************
函数名称:readstate(void)
函数功能:读取LCD状态字
输 入:无
输 出:返回状态字
备 注:
************************************************/
uchar readstate(void)
{
uchar lcd_state;
DDRA=0x00;
DDRC|=(1<<0);
DDRC|=(1<<1);
PORTC|=(1<<0); // C/D=1
PORTC&=~(1<<1); // /RD=0
lcd_state=PINA&0xff; // 读取引脚A物理电平
asm("nop");
asm("nop");
PORTC|=(1<<1); // /RD=1
return lcd_state;
}
/************************************************
函数名称:st01(void)
函数功能:判断指令(数据)读写状态
输 入:无
输 出:无
备 注:
************************************************/
void st01(void)
{
while((readstate()&0x03)!=3);
}
/************************************************
函数名称:st02(void)
函数功能:判断数据自动读状态
输 入:无
输 出:无
备 注:
************************************************/
void st02(void)
{
while((readstate()&0x04)!=4);
}
/************************************************
函数名称:st03(void)
函数功能:判断数据自动写状态
输 入:无
输 出:无
备 注:
************************************************/
void st03(void)
{
while((readstate()&0x08)!=8);
}
/************************************************
函数名称:writecode(uchar comd0)
函数功能:指令写入函数
输 入:指令
输 出:无
备 注:
************************************************/
void writecode(uchar comd0)
{
st01();
DDRA=0xff; //A口方向为输出
PORTA=comd0; //送数据到A口寄存器
DDRC|=(1<<3);
PORTC&=~(1<<3); // /WR=0
asm("nop");
PORTC|=(1<<3); // /WR=1
}
/************************************************
函数名称:writedata(uchar onedata)
函数功能:数据写入函数
输 入:数据
输 出:无
备 注:
************************************************/
void writedata(uchar onedata)
{
st01();
DDRC|=(1<<0);
PORTC&=~(1<<0); // C/D=0,数据通道
DDRA=0xff; //A口方向为输出
PORTA=onedata; //送数据到A口寄存器
DDRC|=(1<<3);
PORTC&=~(1<<3); // /WR=0
asm("nop");
PORTC|=(1<<3); // /WR=1
}
/************************************************
函数名称:writeauto(uchar onedata)
函数功能:数据自动写入函数
输 入:数据
输 出:无
备 注:
************************************************/
void writeauto(uchar onedata)
{
st03();
DDRC|=(1<<0);
PORTC&=~(1<<0); // C/D=0,数据通道
DDRA=0xff; //A口方向为输出
PORTA=onedata; //送数据到A口寄存器
DDRC|=(1<<3);
PORTC&=~(1<<3); // /WR=0
asm("nop");
PORTC|=(1<<3); // /WR=1
}
/************************************************
函数名称:oneparameter(uchar onep1,uchar comd1)
函数功能:一字节参数指令写入函数
输 入:参数1 指令代码
输 出:无
备 注:
************************************************/
void oneparameter(uchar onep1,uchar comd1)
{
writedata(onep1);
writecode(comd1);
}
/************************************************
函数名称:twoparameter(uchar twop1,uchar twop2,uchar comd2)
函数功能:两字节参数指令写入函数
输 入:参数1 参数2 指令代码
输 出:无
备 注:
************************************************/
void twoparameter(uchar twop1,uchar twop2,uchar comd2)
{
writedata(twop1);
writedata(twop2);
writecode(comd2);
}
/************************************************
函数名称:lcd_init(void)
函数功能:内置T6963C控制器液晶初始化函数
输 入:无
输 出:无
备 注:
************************************************/
void lcd_init(void)
{
twoparameter(0x00,0x00,0x40); //文本显示区域首地址0x0000
twoparameter(0x20,0x00,0x41); //文本显示区域宽度32字节
twoparameter(0x00,0x08,0x42); //图形显示区域首地址0x0800
twoparameter(0x20,0x00,0x43); //图形显示区域宽度32字节
writecode(0xa7); //光标形状
writecode(0x80); //显示方式设置(使用内部CGROM,逻辑或合成)
writecode(0x9c); //显示开关(开文本和图形显示方式,禁止光标显示和闪烁)
}
/************************************************
函数名称:lcd_clear(void)
函数功能:清除屏幕(清所有8K存储空间)
输 入:无
输 出:无
备 注:
************************************************/
void lcd_clear(void)
{
uint cl_count;
twoparameter(0x00,0x00,0x24); //设置显示存储器首地址
writecode(0xb0); //设置自动写状态
for(cl_count=8192;cl_count>0;cl_count--)
{
writeauto(0x00);
}
writecode(0xb2); //关闭自动写状态
}
/************************************************
函数名称:writeasc(uchar x_asc,uchar y_asc,uchar code_asc)
函数功能:西文字符写入函数
输 入:x坐标 y坐标 字符
输 出:无
备 注:
************************************************/
void writeasc(uchar x_asc,uchar y_asc,uchar code_asc)
{
uint address;
address=y_asc*32+x_asc;
twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
oneparameter(code_asc,0xc4); //装入字符代码,写入数据,地址不变
}
/************************************************
函数名称:writestring(uchar x,uchar y,*point)
函数功能:字符串写入函数
输 入:x坐标 y坐标 字符串首地址
输 出:无
备 注:
************************************************/
void writestring(uchar x,uchar y,uchar *point)
{
if(x>=30) //对x地限制
{
x=29;
}
y=y&0x0f; //对y地址限制
while((*point)!='\0')
{
writeasc(x,y,*point-32);
point++; //指针地址加一
x++;
if(x>=30) //换页控制
{
x=0;
y++;
}
if(y==16) //如果超出屏幕范围则退出
{
break;
}
}
}
/************************************************
函数名称:writehz(uchar x,uchar y,uchar hzpoint)
函数功能:汉字显示
输 入:x坐标 y坐标 汉字地址
输 出:无
备 注:
************************************************/
void writehz(uchar x,uchar y,uchar hzpoint)
{
uchar i,k=0;
uint address;
address=y*32+x+0x0800; //计算显示存储器地址
for(i=0;i<16;i++) //计数值16
{
twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
oneparameter((cctab[hzpoint][k]),0xc0); //写入汉字字模左部
k++;
oneparameter((cctab[hzpoint][k]),0xc0); //写入汉字字模右部
k++;
address+=32; //修改显示存储器地址,显示下一列(共16列)
}
}
/************************************************
函数名称:writepoint(uchar x,uchar y)
函数功能:显示一个点函数
输 入:x坐标 y坐标
输 出:无
备 注:
************************************************/
void writepoint(uchar x,uchar y)
{
uchar x_pt,y_pt;
uint address;
x_pt=x;
y_pt=y;
address=(y_pt&0x7f)*32+x_pt/8+0x0800; //计算显示存储器地址
twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
x_pt=(~(x_pt%8))&0x07; //计算位置
y_pt=((y_pt&0x80)>>4)|0xf0; //计算点亮或灭
writecode(x_pt|y_pt); //写入数据 (位操作指令)
}
/************************************************
函数名称:rectangle(uchar xstar,uchar xend,uchar ystar,uchar yend)
函数功能:显示矩形框
输 入:起始x坐标 结束x坐标 起始y坐标 结束y坐标
输 出:无
备 注:
************************************************/
void rectangle(uchar xstar,uchar xend,uchar ystar,uchar yend)
{
uchar i;
ystar+=128; //显示点
yend+=128;
for(i=xstar;i<=xend;i++) //两水平线
{
writepoint(i,ystar);
writepoint(i,yend);
}
for(i=ystar;i<=yend;i++) //两垂直线
{
writepoint(xstar,i);
writepoint(xend,i);
}
}
/************************************************
函数名称:clrrect(uchar xstar,uchar xend,uchar ystar,uchar yend)
函数功能:擦除矩形框
输 入:起始x坐标 结束x坐标 起始y坐标 结束y坐标
输 出:无
备 注:
************************************************/
void clrrect(uchar xstar,uchar xend,uchar ystar,uchar yend)
{
uchar i;
for(i=xstar;i<=xend;i++) //两水平线
{
writepoint(i,ystar);
writepoint(i,yend);
}
for(i=ystar;i<=yend;i++) //两垂直线
{
writepoint(xstar,i);
writepoint(xend,i);
}
}
/************************************************
函数名称:writeline(uchar xstar,uchar ystar,uchar xend,uchar yend)
函数功能:画直线
输 入:起始x坐标 结束x坐标 起始y坐标 结束y坐标
输 出:无
备 注:
************************************************/
void writeline(uchar xstar,uchar ystar,uchar xend,uchar yend)
{
uchar x,y;
uchar d_x,d_y;
uchar temp=0;
signed char err=0;
if(yend<ystar)
{
x=xstar;
y=ystar;
xstar=xend;
ystar=yend;
xend=x;
yend=y;
}
d_y=yend-ystar;
if(d_y==0)
{
if(xstar>xend)
{
x=xstar;
xstar=xend;
xend=x;
}
for(x=xstar;x<=xend;x++)
{
writepoint(x,(ystar+128));
}
}
else
{
if(xend>=xstar)
{
temp=1;
d_x=xend-xstar;
}
else
{
d_x=xstar-xend;
}
x=xstar;
y=ystar;
writepoint(x,(y+128));
if(temp&&(d_y<=d_x))
{
while(x!=xend)
{
if(err<0)
{
x=x+1;
err=err+(yend-y);
}
else
{
x=x+1;
y=y+1;
err=err+(yend-y)-(xend-x);
}
writepoint(x,(y+128));
}
}
else if(temp&&(d_y>d_x))
{
while(y!=yend)
{
d_x=xend-x;
d_y=yend-y;
if(err<0)
{
x=x+1;
y=y+1;
err=err+d_y-d_x;
}
else
{
y=y+1;
err=err-d_x;
}
writepoint(x,(y+128));
}
}
else if(!temp&&(d_y<=d_x))
{
while(x!=xend)
{
d_x=x-xend;
d_y=yend-y;
if(err<0)
{
x=x-1;
err=err+d_y;
}
else
{
x=x-1;
y=y+1;
err=err+d_y-d_x;
}
writepoint(x,(y+128));
}
}
else if(!temp&&(d_y>d_x))
{
while(y!=yend)
{
d_x=x-xend;
d_y=yend-y;
if(err<0)
{
x=x-1;
y=y+1;
err=err+d_y-d_x;
}
else
{
y=y+1;
err=err-d_x;
}
writepoint(x,(y+128));
}
}
}
}
/************************************************
函数名称:clearline(uchar xstar,uchar xend,uchar ystar,uchar yend);
函数功能:擦除直线
输 入:起始x坐标 结束x坐标 起始y坐标 结束y坐标
输 出:无
备 注:
************************************************/
void clearline(uchar xstar,uchar xend,uchar ystar,uchar yend)
{
uchar x,y;
uchar d_x,d_y;
uchar temp=0;
signed char err=0;
if(yend<ystar)
{
x=xstar;
y=ystar;
xstar=xend;
ystar=yend;
xend=x;
yend=y;
}
d_y=yend-ystar;
if(d_y==0)
{
if(xstar>xend)
{
x=xstar;
xstar=xend;
xend=x;
}
for(x=xstar;x<=xend;x++)
{
writepoint(x,ystar);
}
}
else
{
if(xend>=xstar)
{
temp=1;
d_x=xend-xstar;
}
else
{
d_x=xstar-xend;
}
x=xstar;
y=ystar;
writepoint(x,y);
if(temp&&(d_y<=d_x))
{
while(x!=xend)
{
if(err<0)
{
x=x+1;
err=err+(yend-y);
}
else
{
x=x+1;
y=y+1;
err=err+(yend-y)-(xend-x);
}
writepoint(x,y);
}
}
else if(temp&&(d_y>d_x))
{
while(y!=yend)
{
d_x=xend-x;
d_y=yend-y;
if(err<0)
{
x=x+1;
y=y+1;
err=err+d_y-d_x;
}
else
{
y=y+1;
err=err-d_x;
}
writepoint(x,y);
}
}
else if(!temp&&(d_y<=d_x))
{
while(x!=xend)
{
d_x=x-xend;
d_y=yend-y;
if(err<0)
{
x=x-1;
err=err+d_y;
}
else
{
x=x-1;
y=y+1;
err=err+d_y-d_x;
}
writepoint(x,y);
}
}
else if(!temp&&(d_y>d_x))
{
while(y!=yend)
{
d_x=x-xend;
d_y=yend-y;
if(err<0)
{
x=x-1;
y=y+1;
err=err+d_y-d_x;
}
else
{
y=y+1;
err=err-d_x;
}
writepoint(x,y);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -