我做本实验的软件平台为MDK软件,选用STM32VET6,12864液晶屏5v供电采用并行接法。之前本来想网上找一个现成的程序实验一下,但都没找到合适的,于是就自己编写了一个,最终可在12864液晶屏上面任意位置显示任意内容。在此贴出整个工程文件,希望对大家有帮助!

本实验的整个工程文件可在此处下载:http://download.csdn.net/detail/u010173859/5908815

  1. /**********************************************************************************
  2. * 文件名 :main.c
  3. * 描述 :利用12864液晶屏显示汉字和图片,且可在任意位置画点、横线、竖线、斜线。
  4. * 实验平台:THE_ONE_1 STM32开发板
  5. * 库版本 :ST 3.5.0
  6. * 硬件连接:并行接法
  7. * --------------------------------------------
  8. * | |
  9. * | DB0~7 -- GPIOE0~7 |
  10. * | RS -- GPIOE8 |
  11. * | RW -- GPIOE9 |
  12. * | E -- GPIOE10 |
  13. * | PSB -- GPIOE11 |
  14. * | |
  15. * --------------------------------------------
  16. *
  17. * 作者 :ZXL
  18. * 日期 :2013.8
  19. * 备注 :无
  20. **********************************************************************************/
  21. #include "stm32f10x.h"
  22. #include "12864.h"
  23.  
  24. __IO u8 hang0[] = "别人笑我太疯癫, ";
  25. __IO u8 hang1[] = "我笑他人看不穿;";
  26. __IO u8 hang2[] = "不见武陵豪杰墓,";
  27. __IO u8 hang3[] = "无花无酒锄作田。";
  28.  
  29. /*
  30. * 函数名:main
  31. * 描述 : 主函数
  32. * 输入 :无
  33. * 输出 : 无
  34. */
  35. int main(void)
  36. {
  37. u8 i;
  38. LCD_Init(); //液晶屏初始化
  39. LCD_Clear_Screen(); //清屏操作
  40.  
  41. LCD_Draw_Point(2,3,24); //画小点,在X列的第xx个小列的第y行中画一个小点
  42. LCD_Draw_Point(2,3,25); //画小点,在X列的第xx个小列的第y行中画一个小点
  43. LCD_Draw_Point(2,4,24); //画小点,在X列的第xx个小列的第y行中画一个小点
  44. LCD_Draw_Point(2,4,25); //画小点,在X列的第xx个小列的第y行中画一个小点
  45.  
  46. LCD_Draw_Horizontal(1,0,8,12); //画横线,在y行的x列中画一条从x1小列到x2小列的横线
  47. LCD_Draw_Horizontal(1,0,8,20); //画横线,在y行的x列中画一条从x1小列到x2小列的横线
  48. LCD_Draw_Column(1,0,12,20); //画竖线,在X列的第xx个小列中画一条从y1到y2的竖线
  49. LCD_Draw_Column(1,8,12,20); //画竖线,在X列的第xx个小列中画一条从y1到y2的竖线
  50.  
  51. LCD_Draw_Column(1,10,8,24); //画竖线,在X列的第xx个小列中画一条从y1到y2的竖线
  52. LCD_Draw_Oblique(1,10,16,15,21);//画斜线,在X列中画一条(x1,y1)到(x2,y2)的斜线
  53. LCD_Draw_Oblique(1,10,16,15,11);//画斜线,在X列中画一条(x1,y1)到(x2,y2)的斜线
  54.  
  55. LCD_Display(1); //显示x1
  56. LCD_Display(2); //显示x7
  57. /*
  58. LCD_Position(0,0); //第0行第0个位置显示
  59. i = 0;
  60. while(hang0[i] != '\0')
  61. {
  62. LCD_Write_Data(hang0[i]);
  63. i ++;
  64. }
  65.  
  66. LCD_Position(1,0); //第1行第0个位置显示
  67. i = 0;
  68. while(hang1[i] != '\0')
  69. {
  70. LCD_Write_Data(hang1[i]);
  71. i ++;
  72. }
  73. */
  74. LCD_Position(2,0); //第2行第0个位置显示
  75. i = 0;
  76. while(hang2[i] != '\0')
  77. {
  78. LCD_Write_Data(hang2[i]);
  79. i ++;
  80. }
  81.  
  82. LCD_Position(3,0); //第3行第0个位置显示
  83. i = 0;
  84. while(hang3[i] != '\0')
  85. {
  86. LCD_Write_Data(hang3[i]);
  87. i ++;
  88. }
  89.  
  90. // LCD_Draw_Picture(); //此函数用来画一幅十六进制的monkey1图片
  91. while(1); // add your code here ^_^。
  92.  
  93. }
  1. /**********************************************************************************
  2. * 文件名 :12864.c
  3. * 描述 :利用12864液晶屏显示汉字和图片,且可在任意位置画点、横线、竖线、斜线。
  4. * 实验平台:THE_ONE_1 STM32开发板
  5. * 库版本 :ST 3.5.0
  6. * 硬件连接:并行接法
  7. * --------------------------------------------
  8. * | |
  9. * | DB0~7 -- GPIOE0~7 |
  10. * | RS -- GPIOE8 |
  11. * | RW -- GPIOE9 |
  12. * | E -- GPIOE10 |
  13. * | PSB -- GPIOE11 |
  14. * | |
  15. * --------------------------------------------
  16. *
  17. * 作者 :ZXL
  18. * 日期 :2013.8
  19. * 备注 :无
  20. **********************************************************************************/
  21. #include "12864.h"
  22. #include "monkey.h"
  23. u16 data[512]; //定义一个16*32大小的数组来存放X[0~15]共16组的Y[0~31]数据
  24.  
  25. #define RS GPIO_Pin_8 // 数据/命令选择端
  26. #define RS_H GPIO_SetBits(GPIOE,GPIO_Pin_8)
  27. #define RS_L GPIO_ResetBits(GPIOE,GPIO_Pin_8)
  28.  
  29. #define RW GPIO_Pin_9 // 读/写选择端
  30. #define RW_H GPIO_SetBits(GPIOE,GPIO_Pin_9)
  31. #define RW_L GPIO_ResetBits(GPIOE,GPIO_Pin_9)
  32.  
  33. #define E GPIO_Pin_10 // 使能信号
  34. #define E_H GPIO_SetBits(GPIOE,GPIO_Pin_10)
  35. #define E_L GPIO_ResetBits(GPIOE,GPIO_Pin_10)
  36.  
  37. #define PSB_H GPIO_SetBits(GPIOE,GPIO_Pin_11) // 并/串行选择端
  38. #define DATA GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7
  39.  
  40. void delay(u16 x ) //延时
  41. {
  42. u16 i,j;
  43. for(i=0;i<x;i++)
  44. for(j=0;j<1000;j++);
  45. }
  46.  
  47. void LCD_Write_Cmd(u8 cmd) //写命令
  48. {
  49. RS_L;
  50. RW_L;
  51. E_L;
  52. GPIOE->ODR = (GPIOE->ODR & 0xFF00) | cmd;
  53. delay(5);
  54. E_H;
  55. delay(5);
  56. E_L;
  57. }
  58.  
  59. void LCD_Write_Data(u16 data) //写数据
  60. {
  61. RS_H;
  62. RW_L;
  63. E_L;
  64. GPIOE->ODR = (GPIOE->ODR & 0xFF00) | data;
  65. delay(5);
  66. E_H;
  67. delay(5);
  68. E_L;
  69. }
  70.  
  71. void LCD_Init(void)
  72. {
  73. GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO_InitTypeDef类型的结构体
  74. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //开启GPIOE的外设时钟
  75.  
  76. GPIO_InitStructure.GPIO_Pin = RS | RW | E | DATA;//选择要控制的GPIOE引脚
  77. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置引脚模式为推挽输出
  78. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为50MHZ
  79. GPIO_Init(GPIOE,&GPIO_InitStructure); //调用库函数,初始化GPIOE
  80. delay(10);
  81.  
  82. PSB_H; //并行方式
  83. LCD_Write_Cmd(0x30);delay(5);//基本指令集
  84. LCD_Write_Cmd(0x0c);delay(5);//整体显示打开,关光标
  85. LCD_Write_Cmd(0x01);delay(5);//清除LCD的显示内容
  86.  
  87. LCD_Write_Cmd(0x02);delay(5);// 地址归位
  88. LCD_Write_Cmd(0x06);delay(5);//游标右移
  89. LCD_Write_Cmd(0x80);delay(5);//设定显示的起始地址
  90. }
  91.  
  92. void LCD_Clear_Screen(void) //清屏操作
  93. {
  94. u8 i,j;
  95. LCD_Write_Cmd(0x34);//打开拓展指令集,绘图指令关
  96. for(j=0;j<8;j++) //清除第一行
  97. {
  98. for(i=0;i<32;i++)
  99. {
  100. LCD_Write_Cmd(0x80+i);//行
  101. LCD_Write_Cmd(0x80+j);//列
  102. LCD_Write_Data(0x00);//写高八位数据
  103. LCD_Write_Data(0x00);//写低八位数据
  104. }
  105. }
  106.  
  107. for(j=0;j<8;j++) //清除第二行
  108. {
  109. for(i=0;i<32;i++)
  110. {
  111. LCD_Write_Cmd(0x80+i);
  112. LCD_Write_Cmd(0x88+j);
  113. LCD_Write_Data(0x00);
  114. LCD_Write_Data(0x00);
  115. }
  116. }
  117. LCD_Write_Cmd(0x30);//打开基本指令集
  118. }
  119.  
  120. void LCD_Position(u8 x,u8 y) //定位在第几行第y个位置显示
  121. {
  122. u8 position;
  123. if(x==0) x=0x80; //第一行
  124. else if(x==1) x=0x90; //第二行
  125. else if(x==2) x=0x88; //第三行
  126. else if(x==3) x=0x98; //第四行
  127. position = x + y;
  128. LCD_Write_Cmd(position);
  129. }
  130.  
  131. u16 Exchange(u8 xx) //自定义一个转换函数
  132. {
  133. u16 data;
  134. if(xx==0) data=0x8000;
  135. if(xx==1) data=0x4000;
  136. if(xx==2) data=0x2000;
  137. if(xx==3) data=0x1000;
  138. if(xx==4) data=0x0800;
  139. if(xx==5) data=0x0400;
  140. if(xx==6) data=0x0200;
  141. if(xx==7) data=0x0100;
  142.  
  143. if(xx==8) data=0x0080;
  144. if(xx==9) data=0x0040;
  145. if(xx==10) data=0x0020;
  146. if(xx==11) data=0x0010;
  147. if(xx==12) data=0x0008;
  148. if(xx==13) data=0x0004;
  149. if(xx==14) data=0x0002;
  150. if(xx==15) data=0x0001;
  151.  
  152. return data;
  153. }
  154.  
  155. void LCD_Draw_Point(u8 x,u8 xx,u8 y) //画小点,在X列的第xx个小列的第y行中画一个小点
  156. {
  157. data[y+x*32] |= Exchange(xx);
  158. }
  159.  
  160. void LCD_Draw_Column(u8 x,u8 xx,u8 y1,u8 y2) //画竖线,在X列的第xx个小列中画一条从y1到y2的竖线
  161. {
  162. u8 i;
  163. for(i=y1;i<=y2;i++)
  164. {
  165. data[i+x*32] |= Exchange(xx); //数据转换
  166. }
  167. }
  168.  
  169. void LCD_Draw_Horizontal(u8 x,u8 x1,u8 x2,u8 y) //画横线,在y行的x列中画一条从x1小列到x2小列的横线
  170. {
  171. u8 i;
  172. u16 temp;
  173. for(i=x1;i<=x2;i++)
  174. {
  175. temp=Exchange(i); //数据转换
  176. data[y+x*32] |= temp;
  177. }
  178. }
  179.  
  180. void LCD_Draw_Oblique (u8 x,u8 x1,u8 y1,u8 x2,u8 y2)//画斜线,在X列中画一条(x1,y1)到(x2,y2)的斜线
  181. {
  182. u8 i,yy;
  183. if(y1<=y2)
  184. {
  185. for(i=y1;i<=y2;i++)
  186. {
  187. data[i+x*32] |= Exchange(x1); //数据转换
  188. x1 ++;
  189. }
  190. }
  191.  
  192. else if(y1>y2)
  193. {
  194. yy=y1;
  195. y1=y2;
  196. y2=yy;
  197. for(i=y1;i<=y2;i++)
  198. {
  199. data[i+x*32] |= Exchange(x2); //数据转换
  200. x2 --;
  201. }
  202. }
  203. }
  204.  
  205. void LCD_Display(u8 x) //画点、横线、竖线、斜线的显示函数
  206. {
  207. u8 i;
  208. LCD_Write_Cmd(0x34); //打开拓展指令集,绘图指令关闭
  209. for(i=0;i<32;i++)
  210. {
  211. LCD_Write_Cmd(0x80+i); //写Y值坐标
  212. LCD_Write_Cmd(0x80+x); //写X值坐标
  213. LCD_Write_Data( (data[i+x*32] >> 8)& 0xff ); //D0-D7, 写低八位
  214. LCD_Write_Data( data[i+x*32] & 0xff ); //D8-D15,写高八位
  215. }
  216. LCD_Write_Cmd(0x36); //打开绘图显示
  217. LCD_Write_Cmd(0x30); //打开基本指令集
  218. }
  219.  
  220. void LCD_Draw_Picture(void) //画图片函数
  221. {
  222. u8 i,j;
  223. u16 add=0;
  224. LCD_Write_Cmd(0x34);//打开拓展指令集,绘图指令关
  225. for(i=0;i<32;i++) //写第一行,先写完一行再写下一行
  226. {
  227. for(j=0;j<8;j++)
  228. {
  229. LCD_Write_Cmd(0x80+i);
  230. LCD_Write_Cmd(0x80+j);
  231. LCD_Write_Data( monkey1[add++] ); //D0-D7
  232. LCD_Write_Data( monkey1[add++] ); //D8-D15
  233. }
  234. }
  235. for(i=0;i<32;i++) //写第二行,先写完一行再写下一行
  236. {
  237. for(j=0;j<8;j++)
  238. {
  239. LCD_Write_Cmd(0x80+i);
  240. LCD_Write_Cmd(0x88+j);
  241. LCD_Write_Data( monkey1[add++] ); //D0-D7
  242. LCD_Write_Data( monkey1[add++] ); //D8-D15
  243. }
  244. }
  245. LCD_Write_Cmd(0x36);//打开绘图显示
  246. LCD_Write_Cmd(0x30);//打开基本指令集
  247. }

STM32 驱动12864液晶显示汉字、图片、画点、横线、竖线、斜线的更多相关文章

  1. STM32驱动ILI9341控制器控制TFTLCD显示

    STM32驱动ILI9341控制器控制TFTLCD显示 一.用STM32控制TFTLCD显示的编程方法,在编程驱动TFTLCD液晶显示器之前,我们先熟悉以下概念: 1.色彩深度,这是一个与TFTLCD ...

  2. esp8266的STM32驱动

    esp8266的STM32驱动,数据发送接收由DMA完成,释放CPU. 目前只能发送返回消息为成功或失败的AT命令,并判断是否成功,详见esp8266_cmd():其它返回消息不可预知的命令(如查看A ...

  3. STM32驱动OV7725摄像头颜色识别

    实验目的: 使用stm32驱动OV7725摄像头进行图像实时采集,在tft屏幕上实时显示并识别图像中的特定颜色,在颜色的周围画上框. 实验现象: 我的工程代码链接: http://download.c ...

  4. Android 实现图片画画板

    本文主要讲述了Android 实现图片画画板 设计项目布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk ...

  5. STM32驱动DS18B20

    DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线”接口的温度传感器.与传 统的热敏电阻等测温元件相比,它是一种新型的体积小.适用电压宽.与微处理器接口简单的 数字化温度传感器.一线 ...

  6. 把图片画到画布上,适应PC和移动端

    画一张图片到画布上 <canvas id="myCanvas" width="1000px" height="200px" >您 ...

  7. AMS5601的ardunio和STM32驱动开发

    AMS5601的ardunio和STM32驱动开发 本文有麦粒电子撰写,并提供相应产品服务. 前言 目前ams关于磁编码芯片用的比较多的可能是ams5600,能够输出pwm信号,电压信号以及I2C通信 ...

  8. STM32驱动LCD实战

    前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文章,本文将对STM32驱动LCD进行实战应用.LCD是深圳市拓普微科技开发有限公司的LMT028 ...

  9. STM32—驱动GY85-IMU模块

    GY85是一个惯性测量模块,内部集成了三轴加速度计.三轴陀螺仪.电子罗盘.气压传感器等芯片,用于测量和报告设备速度.方向.重力,模块可以将加速度计.陀螺仪.电子罗盘等传感器的数据进行综合,在上位机可以 ...

随机推荐

  1. Vases and Flowers

    hdu4614:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意:给你n个花瓶,然后有两种操作:1从a开始选择b个花瓶,放进花,输出左端点,右端点 2 ...

  2. UVALive - 4287 Proving Equivalences

    给定n个命题之间的已经证明的关系如 a b表示已经证明蕴含式a→b,要求还需要再作多少次证明使得所有的命题都是等价的.将每个命题看成一个点,已经证明的命题之间连一条边,问题转化为添加多少条单向边使得图 ...

  3. [wikioi]二叉树最大宽度和高度

    简单的DFS,用数组w记录每一层的宽度就行了,就是遇到一层就++.中间发现在C++里面,如果int未初始化就是用也是有异常的.还有二叉树的数组表示时,从1开始计数会比较好.还有后来学会了数组这样的初始 ...

  4. ANDROID_MARS学习笔记_S01原始版_008_Handler(异步消息处理机制)

    一.流程 1.点击按钮,则代码会使handler把updateThread压到队列里去,从而执行updateThread的run() 2.run()里会通过msg.arg1 = i 和bundle来写 ...

  5. altium6.x中自动删除重复走线的位置

    在protel 2004 DXP中,“自动删除走线”的位置就在"PCB Editor"的默认页面,非常好找. 但是升级到了altium 6.7,6.9之后,很多人就找不到这个了. ...

  6. vi编辑器的三种模式

    1.命令模式(command mode)—执行命令 在该模式中,可以输入命令来执行许多种功能.控制屏幕光标的移动,字符.字或行的删除,移动复制某区段及进入Insert mode下,或者到 last l ...

  7. WCF - Windows Service Hosting

    WCF - Windows Service Hosting The operation of Windows service hosting is a simple one. Given below ...

  8. Nginx+Keepalived 做负载均衡器

    1.安装 keepalived   1 2 3 4 5 6 7 8 9 tar zxvf keepalived-XXXX.tar.gz ./configure --prefix=/usr/local/ ...

  9. NOI 2014 感想

    NOI2014结束了,我卡线登上了领奖台... 这是我第一次NOI,我觉得我收获了很多东西: 1.考前心态不重要,重要的是实力 真正考试的时候是顾不得想其他事情的 2.测试数据是人出的!不是随机的!不 ...

  10. Java开发心得

    1. Spring概述 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson创建的.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J ...