找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11275|回复: 7
打印 上一主题 下一主题
收起左侧

51单片机驱动320X240液晶屏(RA8803)源程序-多图

  [复制链接]
跳转到指定楼层
楼主
ID:72705 发表于 2015-1-24 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天完成了320X240液晶屏的测试,先上个效果图,然后上程序。
这是我的测试环境:


这个是图形模式:

再上个文字模式:

350大洋呀,在单色屏里这是我玩的最贵的屏了.
        我把程序放到另一个文章中吧,因为比较多。一个主文件,一个头文件,大家用的时候看一下,不要复杂然后不能用,再来骂我。
        用这个屏比较讨厌的地方就是,如果程序不对了,调节对比度的电位器是没反应的,不知道别人用过的屏是不是这个样子的。电位器中间接VO,一端接VOUT,另外一端接地。INT和BUSY脚没接。来了背光,屏的工作电流在250mA左右,挺大的。

  1. 主程序(RA8803.C):
  2. /****************************************************
  3. 图片横向取模
  4. *********************************************************/
  5. #include <reg52.h>
  6. #include <driver.h>

  7. code uchar s1[]={"320X240液晶驱动"};
  8. code uchar s2[]={"-- RA8803控制器 Crasyboye"};
  9. code uchar s3[]={"RA8803是一款双图层文字/图形LCD控制器,"
  10.                  "支持320X240,扩展模式可支持640X240和320X480。"
  11.                  "RA8803支持屏幕水平卷动及垂直卷动"
  12.                  "支持512Byte sRAM可自行造字等等"};
  13. code uchar s4[]={"本驱动来源于网络,经修参照资料改后显示稳定,"
  14.                  "可以用来测试采用RA8803控制器的液晶屏,"
  15.                  "如转摘请注明出处:"};
  16. code uchar s5[]={"http*//hi*baidu*com*crasyboye"};
  17. /***************************************************
  18. 函数:void display_NET()
  19. 功能:网点的显示,大小四种网点
  20. ****************************************************/
  21. void display_NET(uchar s,uchar n)
  22. {
  23. lcd_cmdwrite(0x00,0xc5); //图形显示模式
  24. lcd_cursorxy(0,0);

  25. for(i=0;i<240;i++) //行画点控制
  26. {
  27. for(j=0;j<40;j++)   //同时进行8列
  28. {
  29.       if(n==1)lcd_datawrite(s);
  30.       if(n==2) lcd_datawrite(s);
  31.       if(n==4)lcd_datawrite(s);
  32.    if(n==8)
  33.      if(j%2)lcd_datawrite(s);
  34.     else lcd_datawrite(~s);
  35. }
  36.    if(n==1) s=~s;
  37.    if(n==2) if((i)%2) s=~s;
  38.    if(n==4) if((i+1)%4==0) s=~s;
  39.    if(n==8) if((i+1)%8==0) s=~s;

  40. }
  41. }
  42. /*************************************************
  43.             主程序
  44. ***************************************************/
  45. void main(void)
  46. {
  47. delay(10);
  48. lcd_Initial();
  49. while(1)
  50.    {

  51.     lcd_clear();
  52.     display_NET(0x0f,4);
  53.     DelayKey(1,4);

  54. lcd_clear();
  55.     display_NET(0x00,8);
  56.     DelayKey(1,4);

  57. lcd_clear();
  58.     lcd_clear();
  59.     lcd_cursorxy(5,10);
  60.     display_Bstring(s1);

  61.     lcd_cursorxy(7,50);
  62.     display_string(s2);

  63.     lcd_cursorxy(4,74);
  64.     display_string(s3);
  65.     lcd_cursorxy(4,145);
  66.     display_string(s4);
  67.    lcd_cursorxy(4,200);
  68.     display_string(s5);
  69. DelayKey(1,4);
  70.    }  
  71. }

  72.      头文件(driver.h):
  73. #ifndef _driver_h
  74. #define _driver_h
  75. #define uchar unsigned char
  76. #define uint unsigned int

  77. #define x 320
  78. #define y 240
  79. #define xy (x/8)*y

  80. sbit lcd_RS=     P3^1; //A0
  81. sbit lcd_WR=     P3^4;
  82. sbit lcd_RD=     P3^3;
  83. sbit lcd_CS=     P3^2 ; //CE27
  84. sbit lcd_RES=    P3^0;
  85. #define lcd_data    P0
  86. sbit key=       P3^4;    //用来定住显示的

  87. uint i,j;
  88. void melay(unsigned int MS)
  89. {
  90. unsigned char us,usn;
  91. while(MS!=0)
  92. {
  93.    usn = 2; //for 12M
  94.    while(usn!=0)
  95.    {
  96.     us=0xf6;
  97.     while (us!=0){us--;};
  98.     usn--;
  99.    }
  100.    MS--;
  101. }
  102. }

  103. void DelayKey(unsigned int Second , unsigned int MS100)
  104. {       //输入精确到0.1S,是用,
  105. unsigned int i;
  106. for(i=0;i<Second*100+MS100;i++)
  107. {
  108.    if(key==0)
  109.    {
  110.     melay(20);
  111.     while(key==0) melay(100);
  112.     break;
  113.    }
  114.    else melay(50);
  115. }   
  116. }
  117. /**********************************************
  118. 函数:void delay(uint t)
  119. 功能:延时微秒的设定
  120. **************************************************/
  121. void delay(uint t)
  122. {
  123. while(t--);
  124. }
  125. /**************************************************
  126. 函数:void lcd_cmdwrite (uchar cmdx , uchar cmdy)
  127. 功能:在指定的寄存器写下命令
  128. ********************************************************/
  129. void lcd_cmdwrite (uchar cmdx , uchar cmdy)
  130. {
  131. lcd_data=cmdx;
  132. lcd_CS=0;
  133. lcd_RD=1;
  134. lcd_RS=0;   
  135. lcd_WR=0;
  136. lcd_WR=1;   
  137. lcd_RS=1;
  138. lcd_CS=1;
  139.    
  140. lcd_data=cmdy;
  141. lcd_CS=0;
  142. lcd_RD=1;
  143. lcd_RS=0;   
  144. lcd_WR=0;
  145. lcd_WR=1;
  146. lcd_RS=1;
  147. lcd_CS=1;
  148. }
  149. /*************************************************
  150. 函数:void lcd_datawrite(unsigned char datax)
  151. 功能:写下显示的数据
  152. *****************************************************/
  153. void lcd_datawrite(unsigned char datax)
  154. {
  155.     lcd_data=datax;
  156. lcd_CS=0;
  157. lcd_RD=1;
  158. lcd_RS=1;
  159. lcd_WR=0;
  160. lcd_WR=1;
  161. lcd_RS=0;
  162. lcd_CS=1;
  163. }
  164. /****************************************************
  165. 函数:uchar lcd_cmdread(unsigned char cmdx)
  166. 功能:读回一个值
  167. *********************************************************/
  168. uchar lcd_cmdread(uchar cmdx)
  169. {
  170.     uchar address_cmd;
  171. lcd_data=cmdx;
  172. lcd_CS=0;
  173. lcd_RD=1;
  174. lcd_RS=0;
  175. lcd_WR=0;
  176. lcd_WR=1;  
  177. lcd_RS=1;
  178. lcd_CS=1;

  179. lcd_data=0xff;
  180. lcd_CS=0;
  181. lcd_WR=1;
  182. lcd_RS=0;  
  183. lcd_RD=0;
  184. address_cmd=lcd_data;
  185. lcd_RD=1;
  186. lcd_RS=1;
  187. lcd_CS=1;
  188. return(address_cmd);
  189. }
  190. /******************************************************
  191. 函数:void lcd_Initial(void)
  192. 功能:初始化好多寄存器
  193. **********************************************************/
  194. void lcd_Initial(void)
  195. {
  196. lcd_cmdwrite(0x00,0xcd);   //WLCR 正常模式;文字模式;屏幕开启;不闪烁;不反白;
  197. lcd_cmdwrite(0x01,0x03);   //MISC 系统频率选择:8M
  198. lcd_cmdwrite(0x02,0x10);   //APSR  
  199. lcd_cmdwrite(0x03,0x80);   //ADSR 平移方向动控制
  200. lcd_cmdwrite(0x10,0x6b);   //WCCR 正常显示,不加粗

  201. lcd_cmdwrite(0x12,0xb3);   //MAMR   

  202. lcd_cmdwrite(0x20,0x27);   //AWRR  
  203. lcd_cmdwrite(0x30,0xef);   //AWBR  
  204. lcd_cmdwrite(0x40,0x00);   //AWLR  
  205. lcd_cmdwrite(0x50,0x00);   //AWTR  

  206. lcd_cmdwrite(0x21,0x27);   //DWRR  
  207. lcd_cmdwrite(0x31,0xef);   //DWBR  
  208. lcd_cmdwrite(0x41,0x00);   //DWLR
  209. lcd_cmdwrite(0x51,0x00);   //DWTR

  210. lcd_cmdwrite(0x60,0x00);   //CPXR
  211. lcd_cmdwrite(0x61,0x00);   //BGSG
  212. lcd_cmdwrite(0x70,0x00);   //CPYR
  213. lcd_cmdwrite(0x71,0x00);   //BGCM
  214. lcd_cmdwrite(0x72,0xef);   //EDCM      
  215. lcd_cmdwrite(0x90,0x09);   //SCCR  
  216. lcd_cmdwrite(0xc0,0xc8);   //TPCR  
  217. lcd_cmdwrite(0xc1,0x3a);   //TPSR  
  218. lcd_cmdwrite(0xc8,0x80);   //TPXR
  219. lcd_cmdwrite(0xc9,0x80);   //TPYR
  220. lcd_cmdwrite(0xca,0x00);   //TPZR
  221. lcd_cmdwrite(0xd0,0x0f);   //LCCR  
  222. lcd_cmdwrite(0xe0,0x00);   //PNTR
  223. lcd_cmdwrite(0xf0,0xa0);   //FNCR  
  224. lcd_cmdwrite(0xf1,0x0f);   //FVHT      字体不放大
  225. }

  226. /*****************************************************
  227. 函数:void lcd_clear()
  228. 功能:清除内存
  229. ********************************************************/
  230. void lcd_clear()
  231. {
  232. uchar reg;
  233. lcd_cmdwrite(0xe0,0x00);
  234. reg = lcd_cmdread(0xf0);
  235.     reg &=0xf7;
  236. reg |=0x08;
  237. lcd_cmdwrite(0xf0,reg);
  238.     delay(300);
  239. }
  240. /******************************************************
  241. 函数:void lcd_cursorxy(unsigned int xn,unsigned int yn)
  242. 功能:设定要显示数据的地址
  243. **********************************************************/
  244. void lcd_cursorxy(uint xn,uint yn)
  245. {
  246. lcd_cmdwrite(0x60,xn);
  247. lcd_cmdwrite(0x70,yn);
  248. }
  249. /***********************************************
  250. 函数:void lcd_showbig(uchar *text,uint xn)
  251. 功能:显示字符,汉字
  252. ******************************************************/
  253. void display_string(uchar *text)
  254. {
  255.     lcd_cmdwrite(0x00,0xcd);
  256. lcd_cmdwrite(0xf1,0x0f); //不放大
  257.     while(*text != '\0')         
  258. {
  259.     lcd_datawrite(*text);
  260.     ++text;
  261.     }
  262. }

  263. void display_Bstring(uchar *text)
  264. {
  265.     lcd_cmdwrite(0x00,0xcd);
  266. lcd_cmdwrite(0xf1,0x5f); //放大一倍
  267.     while(*text != '\0')         
  268. {
  269.     lcd_datawrite(*text);
  270.     ++text;
  271.     }
  272. }
  273. /***********************************************
  274. 函数:void display_img(uchar code *p)
  275. 功能:显示一幅320*240的完美图片,但分正显和反显
  276.       显示,我用的S52,放不下了。
  277. ***********************************************
  278. void display_img(uchar code *p,bit c)
  279. {
  280. lcd_cmdwrite(0x00,0xc5);         
  281. lcd_cursorxy(0,0);
  282. for(i=0;i<xy;i++)
  283.      {
  284.       if(c)lcd_datawrite(p[i]);     //320*240
  285.       else lcd_datawrite(~p[i]);
  286.      }
  287. }
  288. */
  289. #endif
  290.                
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:89971 发表于 2015-9-12 20:26 | 只看该作者
楼主你好!.#include <driver.h>里的程序怎么没放上来
回复

使用道具 举报

板凳
ID:84147 发表于 2015-11-11 14:33 | 只看该作者
你这个屏幕是带字库的吗,控制器是集成在上面的吗
回复

使用道具 举报

地板
ID:104638 发表于 2017-8-11 11:01 | 只看该作者
我用这个不能用,不知为什么,管配重新配置了的
回复

使用道具 举报

5#
ID:245473 发表于 2018-10-16 19:04 | 只看该作者
好,楼下无私
回复

使用道具 举报

6#
ID:314908 发表于 2020-3-31 21:19 | 只看该作者
谢谢分享,我把程序烧录到51后,从驱字开始显示乱码,后在网上提问,说是Keil软件本身的一个“BUG”,keil编译器会忽略0xFD值的字符串,就是要打一个关于oxfd的补丁,用12864的也是这个问题,打了补丁后显示正常。
回复

使用道具 举报

7#
ID:860649 发表于 2020-12-15 16:00 | 只看该作者
RA8803要停产,要改用RA8806了
回复

使用道具 举报

8#
ID:157849 发表于 2020-12-18 13:08 | 只看该作者
调节对比度的电位器,中间接VO,一端接VOUT,另外一端不是接地,而是要接电源(5V)
这样才能调节对比度.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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