Stillness_Tr

t6963驱动直接方式

0
阅读(2307)

最近几天做了一下T6963的直接方式的操作,明显比间接方式方式要快的多。就是焊板子比较麻烦。

16位地址线使用低8做数据,A15 A14作为控制线 其他的该怎么接怎么接

/***********************************************************
   内置T6963C液晶控制器驱动程序(直接方式)
***********************************************************/
#define uchar unsigned char
#define uint unsigned int
#define LCD_C_ADD (*(volatile unsigned char *)0xc000) //指令地址 //A14--CD
#define LCD_D_ADD (*(volatile unsigned char *)0x8000) //数据地址 //A15--CE 接了非门
/*************************************************************/
//读取LCD状态字
uchar readstate(void)
{
uchar lcd_state;
lcd_state=(LCD_C_ADD)&0xff;   // 读取引脚A物理电平
NOP();
NOP();
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();
LCD_C_ADD =comd0;   //送数据到A口寄存器
NOP();
}
//数据写入函数
void writedata(uchar onedata)
{
st01();
LCD_D_ADD=onedata; //送数据到A口寄存器
NOP();
}
//数据自动写入函数
void writeauto(uchar onedata)
{
st3();
LCD_D_ADD=onedata; //送数据到A口寄存器
NOP();
}
//一字节参数指令写入函数
void oneparameter(uchar onep1,uchar comd1)
{
writedata(onep1);
writecode(comd1);
}
//两字节参数指令写入函数
void twoparameter(uchar twop1,uchar twop2,uchar comd2)
{
writedata(twop1);
writedata(twop2);
writecode(comd2);
}
//lcd数据总线初始化
void lcd_IOinit()
{
MCUCR=0X80;
XMCRA=0X00;
XMCRB=0X00;//释放A15
DDRC|=1<<PC7;
PORTC|=0<<PC7;
}
/***********************************************************
液晶初始化,清屏
***********************************************************/
//内置T6963C控制器液晶初始化函数
void lcd_init(void)
{
lcd_IOinit();
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); //显示开关(开文本和图形显示方式,禁止光标显示和闪烁)
}
//清除屏幕(清所有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); //关闭自动写状态  
}
/********************************************************
    西文字符,汉字,点阵显示函数
********************************************************/
//西文字符写入函数
//x_asc:0~29; y_asc:0~15
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); //装入字符代码,写入数据,地址不变
}
//显示一个点函数
//x:0~239; y:0~127(消除点)128~255(显示点)
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); //写入数据
}
//显示矩形框
//x:0~239; y:0~127
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);
}
}

//擦除矩形框
//x:0~239; y:0~127
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);
}
}

//8*8点阵显示
//x:0~239; y:0~127
void disp88(uchar x,uchar y, const uchar *ptr0)
{
uchar i,datpt,x_temp,y_temp;
y_temp=y;
for(i=8;i>0;i--)
{
    datpt=*ptr0++; //取数据
x_temp=x; //重装x值
if(datpt&0x80)
   writepoint(x_temp++,(y_temp+128));
else writepoint(x_temp++,y_temp);
if(datpt&0x40)
   writepoint(x_temp++,(y_temp+128));
else writepoint(x_temp++,y_temp);
if(datpt&0x20)
   writepoint(x_temp++,(y_temp+128));
else writepoint(x_temp++,y_temp);
if(datpt&0x10)
   writepoint(x_temp++,(y_temp+128));
else writepoint(x_temp++,y_temp);
if(datpt&0x08)
   writepoint(x_temp++,(y_temp+128));
else writepoint(x_temp++,y_temp);
if(datpt&0x04)
   writepoint(x_temp++,(y_temp+128));
else writepoint(x_temp++,y_temp);
if(datpt&0x02)
   writepoint(x_temp++,(y_temp+128));
else writepoint(x_temp++,y_temp);
if(datpt&0x01)
   writepoint(x_temp++,(y_temp+128));
else writepoint(x_temp++,y_temp);
y_temp++;
}
}

//16*8点阵显示
//x:0~29; y:0~127
void disp168(uchar x,uchar y,const uchar *ptr0)
{
uchar i;
uint address;
address=y*32+x+0x0800; //计算显示存储器地址
for(i=8;i>0;i--)
{
    twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
    oneparameter(*ptr0++,0xc0); //点阵左部
oneparameter(*ptr0++,0xc0); //点阵右部
address+=32; //修改显示存储器地址
}
}
//连续写点阵
//x:0~29; y:0~127
void dispauto(uchar x,uchar y,uchar line,uchar column,const uchar *ptr0)
{
uchar i,j;
uint address;
address=y*32+x+0x0800; //计算显示存储器地址
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+=32; //修改显示存储器地址
}
}