搜索
bottom↓
回复: 31

[转帖] T6963c(240*128)液晶驱动(AVR Mega128) C语言

[复制链接]

出0入0汤圆

发表于 2005-12-31 10:00:32 | 显示全部楼层 |阅读模式
当前位置:世纪开发网 >> 应用设计 >> 单片机源程序 >> 正文



T6963c(240*128)液晶驱动(AVR Mega128) C语言

时间:2004年4月23日10:34

来源:世纪开发网 编辑:21wzadmin  



/***********************************************************

   内置T6963C液晶控制器驱动程序(间接方式)

***********************************************************/



//读取LCD状态字

uchar readstate(void)

{

  uchar lcd_state;

  DDRA=0x00;

  DDRC|=(1<<3);

  DDRE|=(1<<6);

  PORTC|=(1<<3);   // C/D=1

  PORTE&=~(1<<6);   // /RD=0

  lcd_state=PINA&0xff;   // 读取引脚A物理电平

  NOP();

  NOP();

  PORTE|=(1<<6);   // /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=0xff;   //A口方向为输出

  PORTA=comd0;   //送数据到A口寄存器

  DDRE|=(1<<7);   

  PORTE&=~(1<<7);  // /WR=0

  NOP();

  PORTE|=(1<<7);  // /WR=1

}



//数据写入函数

void writedata(uchar onedata)

{

  st01();

  DDRC|=(1<<3);

  PORTC&=~(1<<3);  // C/D=0,数据通道

  DDRA=0xff;   //A口方向为输出

  PORTA=onedata;  //送数据到A口寄存器

  DDRE|=(1<<7);   

  PORTE&=~(1<<7);  // /WR=0

  NOP();

  PORTE|=(1<<7);  // /WR=1

}



//数据自动写入函数

void writeauto(uchar onedata)

{

  st3();

  DDRC|=(1<<3);

  PORTC&=~(1<<3);  // C/D=0,数据通道

  DDRA=0xff;   //A口方向为输出

  PORTA=onedata;  //送数据到A口寄存器

  DDRE|=(1<<7);   

  PORTE&=~(1<<7);  // /WR=0

  NOP();

  PORTE|=(1<<7);  // /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,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_hz:0~29;  y_hz:0~127

void writehz(uchar x_hz,uchar y_hz,uchar code_hz)

{

  uchar i_hz;

  uint address,addr_hz;

  address=y_hz*32+x_hz+0x0800;  //计算显示存储器地址

  addr_hz=code_hz*32;  //计算汉字字模地址(cctab的下标)

  for(i_hz=0;i_hz<16;i_hz++)  //计数值16

    {

   twoparameter((uchar)(address),(uchar)(address>>8),0x24);  //设置显示存储器地址

   oneparameter(cctab[addr_hz],0xc0);  //写入汉字字模左部

   oneparameter((cctab[16+addr_hz++]),0xc0);  //写入汉字字模右部

   address+=32;  //修改显示存储器地址,显示下一列(共16列)

}

}



//显示一个点函数

//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)

{

  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)

{

  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)

{

  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;  //修改显示存储器地址

  }

}

出0入0汤圆

发表于 2005-12-31 11:27:25 | 显示全部楼层
正好取长补短!

出0入0汤圆

发表于 2005-12-31 12:34:37 | 显示全部楼层
支持

出0入0汤圆

发表于 2006-1-31 17:04:57 | 显示全部楼层
我谢,我收下了,正找这个呢!!

出0入0汤圆

发表于 2006-1-31 17:49:43 | 显示全部楼层
不好意思。GCC?ICC?

出0入0汤圆

发表于 2006-2-18 09:06:06 | 显示全部楼层
大狭,我是模仿你这个程序写的LCM128646, 显示不出啊.请指点迷津啊

出0入0汤圆

发表于 2006-2-18 09:11:24 | 显示全部楼层
点击此处打开armok01103007.pdf

就是这款液晶

出0入0汤圆

发表于 2006-11-3 16:49:55 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2007-5-21 11:56:10 | 显示全部楼层
有没有朋友知道我用用上面的软件怎么让光标显示啊

出0入0汤圆

发表于 2008-1-24 16:31:57 | 显示全部楼层
谢谢,分享是一种快乐!

出0入0汤圆

发表于 2008-8-25 15:44:27 | 显示全部楼层
ding

出0入0汤圆

发表于 2008-9-5 08:48:54 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2009-3-24 21:12:49 | 显示全部楼层
thanks

出0入0汤圆

发表于 2009-3-24 21:18:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-25 13:12:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-27 08:24:22 | 显示全部楼层
取长补短!

出0入0汤圆

发表于 2009-8-24 17:34:56 | 显示全部楼层
学习了,顶

出0入0汤圆

发表于 2009-9-10 23:08:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-13 10:35:55 | 显示全部楼层

出0入0汤圆

发表于 2009-11-2 16:32:36 | 显示全部楼层
没标 引脚 定义

出0入0汤圆

发表于 2010-1-27 19:00:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-29 18:32:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-29 18:56:27 | 显示全部楼层
有空试一下

出0入0汤圆

发表于 2010-1-30 11:26:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-6 11:09:23 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-4-15 22:58:01 | 显示全部楼层
判忙很简练,程序很精彩

出0入0汤圆

发表于 2010-6-24 21:43:26 | 显示全部楼层
请问一下
twoparameter((uchar)(address),(uchar)(address>>8),0x24);  //设置显示存储器地址 (uchar)(address),(uchar)(address>>8)是怎么来的,我怎么都想不明白了

出0入0汤圆

发表于 2010-6-24 21:57:53 | 显示全部楼层
mark,当我不记得时会查到这

出0入0汤圆

发表于 2010-6-24 23:11:22 | 显示全部楼层
谢谢分享~谢谢

出0入0汤圆

发表于 2010-10-28 22:23:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-30 10:04:40 | 显示全部楼层
保存着,肯定会有用的

出0入0汤圆

发表于 2010-11-30 10:22:15 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 14:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表