📄 ylf240128a-3.c
字号:
/*ATMega16 */
/* T6963C LCD Controller */
/*
D0-D7 -- PORTB
C/D -- PORTA.1
RD -- PORTA.2
WR -- PORTA.3
*/
/***********************************************************
内置T6963C液晶控制器驱动程序(间接方式)
***********************************************************/
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
//文字地址
#define TXHOME 0x40
//文字区域
#define TXAREA 0x41
//图形地址
#define GRHOME 0x42
//图形区域
#define GRAREA 0x43
//偏移****特别注意
#define OFFSET 0x22
//设置指针
#define ADPSET 0x24
//自动写打开
#define AWRON 0xB0
//自动写关闭
#define AWROFF 0xB2
//偏移地址量
#define OFFSET 0x22
const uchar EXTCG[64]={0x01,0x01,0xff,0x01,0x3f,0x21,0x3f,0x21,//upper left dong 80H
0x00,0x00,0xff,0x00,0xfc,0x04,0xfc,0x04,//upper right dong 81H
0x21,0x3f,0x05,0x0d,0x19,0x31,0xe1,0x01,//lower left dong 82H
0x04,0xfc,0x40,0x60,0x30,0x1c,0x07,0x00,//lower right dong 83
0x08,0x08,0xff,0x08,0x09,0x01,0x01,0x7f,//upper left zhi 84H
0x10,0x10,0xff,0x10,0x10,0x00,0x00,0xfc,//upper right zhi 85H
0x00,0x00,0x00,0x01,0x07,0x3c,0xe7,0x00,//lower left zhi 86H
0x18,0x30,0x60,0xc0,0x00,0x00,0xe0,0x3f};//lower right zhi 87H
const uchar TXPRT[13]={0x34,0x00,0x2f,0x00,0x33,0x00,
0x28,0x00,0x29,0x00,0x22,0x00,0x21};//TOSHIBA
const uchar EXPRT1[6]={0x80,0x81,0x00,0x00,0x84,0x85};//东芝上半部分
const uchar EXPRT2[6]={0x82,0x83,0x00,0x00,0x86,0x87};//东芝下半部分
//读取LCD状态字
uchar readstate(void)
{
uchar lcd_state;
DDRB=0x00;
DDRA|=(1<<1);
DDRA|=(1<<2); // /RD
PORTA|=(1<<1); // C/D=1
PORTA&=~(1<<2); // /RD=0
lcd_state=PINB&0xff; // 读取引脚B物理电平
NOP();
NOP();
PORTA|=(1<<2); // /RD=1
return lcd_state;
}
//判断指令(数据)读写状态
void st01(void)
{
while((readstate()&0x03)!=3)
;
}
//判断数据自动读状态
void st2(void)
{
while((readstate()&0x04)!=4)
;
}
//判断数据自动写状态
void st3(void)
{
while((readstate()&0x08)!=8)
;
}
//指令写入函数
void writecode(uchar comd0)
{
st01();
DDRA|=(1<<1);
PORTA|=(1<<1); // C/D=0,数据通道
DDRB=0xff; //B口方向为输出
PORTB=comd0; //送数据到B口寄存器
DDRA|=(1<<3);
PORTA&=~(1<<3); // /WR=0
NOP();
PORTA|=(1<<3); // /WR=1
}
//数据写入函数
void writedata(uchar onedata)
{
st01();
DDRA|=(1<<1);
PORTA&=~(1<<1); // C/D=0,数据通道
DDRB=0xff; //B口方向为输出
PORTB=onedata; //送数据到B口寄存器
DDRA|=(1<<3);
PORTA&=~(1<<3); // /WR=0
NOP();
PORTA|=(1<<3); // /WR=1
}
//数据自动写入函数
void writeauto(const uchar onedata)
{
st3();
DDRA|=(1<<1);
PORTA&=~(1<<1); // C/D=0,数据通道
DDRB=0xff; //B口方向为输出
PORTB=onedata; //送数据到B口寄存器
DDRA|=(1<<3);
PORTA&=~(1<<3); // /WR=0
NOP();
PORTA|=(1<<3); // /WR=1
}
//一字节参数指令写入函数
void oneparameter(uchar onep1,uchar comd1)
{
writedata(onep1);
writecode(comd1);
}
//两字节参数指令写入函数
void twoparameter(uchar twop1,uchar twop2,uchar comd2)
{
writedata(twop1);
writedata(twop2);
writecode(comd2);
}
/***********************************************************
液晶初始化,清屏
***********************************************************/
//内置T6963C控制器液晶初始化函数
void lcd_init(void)
{
twoparameter(0x00,0x00,TXHOME); //文本显示区域首地址0x0000
twoparameter(0x00,0x02,GRHOME); //图形显示区域首地址0x0200
twoparameter(0x1E,0x00,TXAREA); //文本显示区域宽度30字节
twoparameter(0x1E,0x00,GRAREA); //图形显示区域宽度30字节
writecode(0x80); //显示方式设置(使用内部CGROM,OR合成)
twoparameter(0x02,0x00,OFFSET);//偏移地址,1400
writecode(0x94); //显示开关(Text on,graphics off,cursor off)
}
//清除屏幕(清所有8K存储空间)
void lcd_clear(void)
{
uint cl_count;
twoparameter(0x00,0x00,ADPSET); //设置显示存储器首地址
writecode(AWRON); //设置自动写状态
for(cl_count=960;cl_count>0;cl_count--)
writeauto(0x05);
writecode(AWROFF); //关闭自动写状态
}
//16*8点阵显示
//x:0~29; y:0~127
/*
void disp168(uchar x,uchar y)
{
uchar i;
uint address;
address=y*30+x+0x0800; //计算显示存储器地址
for(i=8;i>0;i--)
{
twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
oneparameter(*ptr0++,0xc0); //点阵左部
oneparameter(*ptr0++,0xc0); //点阵右部
address+=30; //修改显示存储器地址
}
}
*/
//连续写点阵
//x:0~29; y:0~127
void dispauto(uchar x,uchar y,uchar line,uchar column)
{
uchar i,j;
uint address;
address=y*30+x+480; //计算显示存储器地址
for(i=line;i>0;i--) //显示line行
{
twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
writecode(0xb0); //数据自动写状态
for(j=column;j>0;j--) //共column列
{
//writeauto(*ptr0); //自动写入数据
}
writecode(0xb2); //关闭自动写状态
address+=30; //修改显示存储器地址
}
}
void main()
{
unsigned char count;
DDRA|=0xff;
DDRB|=0xff;
PORTA|=0xff;
PORTB|=0xff;
lcd_init();
lcd_clear();
twoparameter(0x00,0x14,ADPSET);
writecode(AWRON); //数据自动写状态
for(count=0;count<64;count++)//写入CG
{
writeauto(EXTCG[count]);
}
writecode(AWROFF);
twoparameter(0x40,0x00,ADPSET);
writecode(AWRON); //数据自动写状态
for(count=0;count<13;count++)//写入CG
{
writeauto(TXPRT[count]);
}
writecode(AWROFF);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -