找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

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

[复制链接]
慧龙 发表于 2010-5-14 23:57:21 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
  1. /***********************************************************
  2. 内置T6963C液晶控制器驱动程序(间接方式)
  3. ***********************************************************/

  4. //读取LCD状态字
  5. uchar readstate(void)
  6. {
  7. uchar lcd_state;
  8. DDRA=0x00;
  9. DDRC|=(1<<3);
  10. DDRE|=(1<<6);
  11. PORTC|=(1<<3); // C/D=1
  12. PORTE&=~(1<<6); // /RD=0
  13. lcd_state=PINA&0xff; // 读取引脚A物理电平
  14. NOP();
  15. NOP();
  16. PORTE|=(1<<6); // /RD=1
  17. return lcd_state;
  18. }

  19. //判断指令(数据)读写状态
  20. void st01(void)
  21. {
  22. while((readstate()&0x03)!=3)
  23. ;
  24. }

  25. //判断数据自动读状态
  26. void st2(void)
  27. {
  28. while((readstate()&0x04)!=4)
  29. ;
  30. }

  31. //判断数据自动写状态
  32. void st3(void)
  33. {
  34. while((readstate()&0x08)!=8)
  35. ;
  36. }

  37. //指令写入函数
  38. void writecode(uchar comd0)
  39. {
  40. st01();
  41. DDRA=0xff; //A口方向为输出
  42. PORTA=comd0; //送数据到A口寄存器
  43. DDRE|=(1<<7);
  44. PORTE&=~(1<<7); // /WR=0
  45. NOP();
  46. PORTE|=(1<<7); // /WR=1
  47. }

  48. //数据写入函数
  49. void writedata(uchar onedata)
  50. {
  51. st01();
  52. DDRC|=(1<<3);
  53. PORTC&=~(1<<3); // C/D=0,数据通道
  54. DDRA=0xff; //A口方向为输出
  55. PORTA=onedata; //送数据到A口寄存器
  56. DDRE|=(1<<7);
  57. PORTE&=~(1<<7); // /WR=0
  58. NOP();
  59. PORTE|=(1<<7); // /WR=1
  60. }

  61. //数据自动写入函数
  62. void writeauto(uchar onedata)
  63. {
  64. st3();
  65. DDRC|=(1<<3);
  66. PORTC&=~(1<<3); // C/D=0,数据通道
  67. DDRA=0xff; //A口方向为输出
  68. PORTA=onedata; //送数据到A口寄存器
  69. DDRE|=(1<<7);
  70. PORTE&=~(1<<7); // /WR=0
  71. NOP();
  72. PORTE|=(1<<7); // /WR=1
  73. }

  74. //一字节参数指令写入函数
  75. void oneparameter(uchar onep1,uchar comd1)
  76. {
  77. writedata(onep1);
  78. writecode(comd1);
  79. }

  80. //两字节参数指令写入函数
  81. void twoparameter(uchar twop1,uchar twop2,uchar comd2)
  82. {
  83. writedata(twop1);
  84. writedata(twop2);
  85. writecode(comd2);
  86. }

  87. /***********************************************************
  88. 液晶初始化,清屏
  89. ***********************************************************/

  90. //内置T6963C控制器液晶初始化函数
  91. void lcd_init(void)
  92. {
  93. twoparameter(0x00,0x00,0x40); //文本显示区域首地址0x0000
  94. twoparameter(0x20,0x00,0x41); //文本显示区域宽度32字节
  95. twoparameter(0x00,0x08,0x42); //图形显示区域首地址0x0800
  96. twoparameter(0x20,0x00,0x43); //图形显示区域宽度32字节
  97. writecode(0xa7); //光标形状
  98. writecode(0x80); //显示方式设置(使用内部CGROM,逻辑或合成)
  99. writecode(0x9c); //显示开关(开文本和图形显示方式,禁止光标显示和闪烁)
  100. }

  101. //清除屏幕(清所有8K存储空间)
  102. void lcd_clear(void)
  103. {
  104. uint cl_count;
  105. twoparameter(0x00,0x00,0x24); //设置显示存储器首地址
  106. writecode(0xb0); //设置自动写状态
  107. for(cl_count=8192;cl_count>0;cl_count--)
  108. writeauto(0x00);
  109. writecode(0xb2); //关闭自动写状态
  110. }

  111. /********************************************************
  112. 西文字符,汉字,点阵显示函数
  113. ********************************************************/
  114. //西文字符写入函数
  115. //x_asc:0~29; y_asc:0~15
  116. void writeasc(uchar x_asc,uchar y_asc,uchar code_asc)
  117. {
  118. uint address;
  119. address=y_asc*32+x_asc;
  120. twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
  121. oneparameter(code_asc,0xc4); //装入字符代码,写入数据,地址不变
  122. }

  123. //汉字写入函数
  124. //x_hz:0~29; y_hz:0~127
  125. void writehz(uchar x_hz,uchar y_hz,uchar code_hz)
  126. {
  127. uchar i_hz;
  128. uint address,addr_hz;
  129. address=y_hz*32+x_hz+0x0800; //计算显示存储器地址
  130. addr_hz=code_hz*32; //计算汉字字模地址(cctab的下标)
  131. for(i_hz=0;i_hz<16;i_hz++) //计数值16
  132. {
  133. twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
  134. oneparameter(cctab[addr_hz],0xc0); //写入汉字字模左部
  135. oneparameter((cctab[16+addr_hz++]),0xc0); //写入汉字字模右部
  136. address+=32; //修改显示存储器地址,显示下一列(共16列)
  137. }
  138. }

  139. //显示一个点函数
  140. //x:0~239; y:0~127(消除点)128~255(显示点)
  141. void writepoint(uchar x,uchar y)
  142. {
  143. uchar x_pt,y_pt;
  144. uint address;
  145. x_pt=x;
  146. y_pt=y;
  147. address=(y_pt&0x7f)*32+x_pt/8+0x0800; //计算显示存储器地址
  148. twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
  149. x_pt=(~(x_pt%8))&0x07;
  150. y_pt=((y_pt&0x80)>>4)|0xf0;
  151. writecode(x_pt|y_pt); //写入数据
  152. }

  153. //显示矩形框
  154. //x:0~239; y:0~127
  155. void rectangle(uchar xstar,uchar xend,uchar ystar,uchar yend)
  156. {
  157. uchar i;
  158. ystar+=128; //显示点
  159. yend+=128;
  160. for(i=xstar;i<=xend;i++) //两水平线
  161. {
  162. writepoint(i,ystar);
  163. writepoint(i,yend);
  164. }
  165. for(i=ystar;i<=yend;i++) //两垂直线
  166. {
  167. writepoint(xstar,i);
  168. writepoint(xend,i);
  169. }
  170. }


  171. //擦除矩形框
  172. //x:0~239; y:0~127
  173. void clrrect(uchar xstar,uchar xend,uchar ystar,uchar yend)
  174. {
  175. uchar i;
  176. for(i=xstar;i<=xend;i++) //两水平线
  177. {
  178. writepoint(i,ystar);
  179. writepoint(i,yend);
  180. }
  181. for(i=ystar;i<=yend;i++) //两垂直线
  182. {
  183. writepoint(xstar,i);
  184. writepoint(xend,i);
  185. }
  186. }


  187. //8*8点阵显示
  188. //x:0~239; y:0~127
  189. void disp88(uchar x,uchar y)
  190. {
  191. uchar i,datpt,x_temp,y_temp;
  192. y_temp=y;
  193. for(i=8;i>0;i--)
  194. {
  195. datpt=*ptr0++; //取数据
  196. x_temp=x; //重装x值
  197. if(datpt&0x80)
  198. writepoint(x_temp++,(y_temp+128));
  199. else writepoint(x_temp++,y_temp);
  200. if(datpt&0x40)
  201. writepoint(x_temp++,(y_temp+128));
  202. else writepoint(x_temp++,y_temp);
  203. if(datpt&0x20)
  204. writepoint(x_temp++,(y_temp+128));
  205. else writepoint(x_temp++,y_temp);
  206. if(datpt&0x10)
  207. writepoint(x_temp++,(y_temp+128));
  208. else writepoint(x_temp++,y_temp);
  209. if(datpt&0x08)
  210. writepoint(x_temp++,(y_temp+128));
  211. else writepoint(x_temp++,y_temp);
  212. if(datpt&0x04)
  213. writepoint(x_temp++,(y_temp+128));
  214. else writepoint(x_temp++,y_temp);
  215. if(datpt&0x02)
  216. writepoint(x_temp++,(y_temp+128));
  217. else writepoint(x_temp++,y_temp);
  218. if(datpt&0x01)
  219. writepoint(x_temp++,(y_temp+128));
  220. else writepoint(x_temp++,y_temp);
  221. y_temp++;
  222. }
  223. }


  224. //16*8点阵显示
  225. //x:0~29; y:0~127
  226. void disp168(uchar x,uchar y)
  227. {
  228. uchar i;
  229. uint address;
  230. address=y*32+x+0x0800; //计算显示存储器地址
  231. for(i=8;i>0;i--)
  232. {
  233. twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
  234. oneparameter(*ptr0++,0xc0); //点阵左部
  235. oneparameter(*ptr0++,0xc0); //点阵右部
  236. address+=32; //修改显示存储器地址
  237. }
  238. }


  239. //连续写点阵
  240. //x:0~29; y:0~127
  241. void dispauto(uchar x,uchar y,uchar line,uchar column)
  242. {
  243. uchar i,j;
  244. uint address;
  245. address=y*32+x+0x0800; //计算显示存储器地址
  246. for(i=line;i>0;i--) //显示line行
  247. {
  248. twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
  249. writecode(0xb0); //数据自动写状态
  250. for(j=column;j>0;j--) //共column列
  251. {
  252. writeauto(*ptr0++); //自动写入数据
  253. }
  254. writecode(0xb2); //关闭自动写状态
  255. address+=32; //修改显示存储器地址
  256. }
  257. }
复制代码
hpdell 发表于 2010-6-1 12:01:05 | 显示全部楼层
焊!!!!!!!!!!!!!!!!!!
heruihung 发表于 2010-7-2 00:00:12 | 显示全部楼层
thanks!!!!!!!!!!!!!!!!!!
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 06:40 , Processed in 0.052712 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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