找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32的lcd12864程序

  [复制链接]
跳转到指定楼层
楼主


12864的stm32单片机显示程序下载: 显示.rar (3.14 MB, 下载次数: 153)

主要的程序预览:
  1. #include "stm32f10x.h"
  2. #include "delay.h"    //必须配合delay.c和delay.h文件使用,所以要包含delay.h。
  3. #include "display12864.h"

  4. #define u16 unsigned short   //为了可移植性好,对这两个 STM 32 已经定义过的变量,再定义一次。
  5. #define u8 unsigned char

  6. /********** 以下是相关引脚定义。**************/

  7. #define DisIO GPIOC                 //定义12864要使用的I/O端口。
  8. #define DisClk RCC_APB2Periph_GPIOC  //定义12864要使用的I/O端口的时钟。
  9. #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
  10.                                        //定义12864使用的数据引脚。
  11. #define RS GPIO_Pin_9
  12. #define RW GPIO_Pin_10
  13. #define EN GPIO_Pin_11       //定义使能端使用的引脚。
  14. #define PSB GPIO_Pin_12      //定义并,串行数据模式的选择端口使用的引脚。

  15. /*********************************************/
  16.                                                             
  17. GPIO_InitTypeDef  GPIOStru;  //定义用于定义所以引脚为输出的变量。

  18. void IOInitOut(void)           //把所有端口初始化为推挽输出模式的函数。
  19. {
  20.     GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;//定义所有的引脚为推挽输出的变量初始化。
  21.     GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
  22.     GPIOStru.GPIO_Pin = Data|RS|RW|EN|PSB;

  23.     RCC_APB2PeriphClockCmd(DisClk,ENABLE);
  24.     GPIO_Init(DisIO,&GPIOStru);        
  25. }

  26. void IOInitIn(void)           //把数据引脚初始化为浮空输入的函数。
  27. {
  28.     GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;//定义数据引脚为浮空输入的变量初始化。
  29.     GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
  30.     GPIOStru.GPIO_Pin = Data;

  31.     RCC_APB2PeriphClockCmd(DisClk,ENABLE);   //把所有端口初始化为输出模式的函数。   
  32.     GPIO_Init(DisIO,&GPIOStru);        
  33. }

  34. void WaitBusy(void)          //等待12864的忙状态结束的函数。
  35. {
  36.     IOInitIn();        //把数据引脚定义为浮空输入;
  37.     GPIO_ResetBits(DisIO,RS);  //RS = 0.
  38.     GPIO_SetBits(DisIO,RW);    //RW = 1.
  39.     GPIO_SetBits(DisIO,EN);    //EN = 1.
  40.     while(GPIO_ReadInputData(DisIO) & 0x0080); //只要位7的值,位7是忙标志位。
  41.     GPIO_ResetBits(DisIO,EN);  //EN = 0;
  42.     IOInitOut();      //把所有引脚定义为输出。
  43. }

  44. void WriteCmd(u8 cmd)    //写命令函数。
  45. {
  46.           WaitBusy();
  47.     GPIO_ResetBits(DisIO,RS);  //RS = 0.
  48.     GPIO_ResetBits(DisIO,RW);  //RW = 0.
  49.     GPIO_SetBits(DisIO,EN);    //EN = 1.
  50.     DisIO->ODR=((DisIO->ODR & 0xff00)|cmd); //此处,只有直接操作寄存器才能
  51.                   //达到,只改变输出数据寄存器ODR的低8位,其它位
  52.                   //不变的目的。因为,只有低8位是数据引脚,
  53.                   //其它位可能是控制引脚,不能改变。
  54.     delay_ms(2);
  55.     GPIO_ResetBits(DisIO,EN);  //EN = 0;
  56.     delay_ms(2);         
  57. }

  58. void WriteData(u8 data)  //写数据函数。
  59. {
  60.         WaitBusy();
  61.     GPIO_SetBits(DisIO,RS);  //RS = 1.
  62.     GPIO_ResetBits(DisIO,RW);  //RW = 0.
  63.     GPIO_SetBits(DisIO,EN);    //EN = 1.
  64.     DisIO->ODR=((DisIO->ODR & 0xff00)|data);  //同上。
  65.     delay_ms(2);
  66.     GPIO_ResetBits(DisIO,EN);  //EN = 0;
  67.     delay_ms(2);
  68. }

  69. void InitDis(void)   //初始化 12864 和要用到的 STM 32 的引脚。
  70. {
  71.     IOInitOut();         
  72.     delay_init(8);   //初始化延时函数的微妙计数基数。  
  73.     GPIO_SetBits(DisIO,PSB);  //令PSB=1,设置为并行数据模式。
  74.     delay_ms(2);
  75.     WriteCmd(0x30);  //选择基本指令集,和,8位数据模式。
  76.     delay_ms(2);
  77.     WriteCmd(0x0c);  //开显示,无游标,不反白.
  78.     delay_ms(2);
  79.     WriteCmd(0x01);  //清除显示,并将 DDRAM 的地址计数器 AC 设为 00H.
  80.     delay_ms(2);
  81.     WriteCmd(0x06);  //设置,外部读写数据后,地址记数器 AC 会自动加 1。
  82.     delay_ms(2);
  83.     WriteCmd(0x80);  //将 DDRAM 地址计数器 AC 设为 0.
  84.     delay_ms(2);        
  85. }

  86. void DisStr(u8 *s)    //显示字符串的函数。
  87. {
  88.     while(*s != '')
  89.     {
  90.         WriteData(*s);
  91.         s++;
  92.         delay_ms(2);
  93.     }
  94. }

  95. void DisInt(long int num)  //显示整型变量的函数,最多显示16位的整数。只能显示正数。
  96. {
  97.         u8 temp[17];
  98.         u8 str[17];
  99.         int i=0,j=0;
  100.         while(num != 0)          //这里不能用num%10 != 0,如果num是10的整数倍,
  101.                           //例如,100,这样就会出错,根本就不能进入循环体。
  102.         {
  103.                 temp[i] = (num%10)+0x30;
  104.                 num/=10;
  105.                 i++;
  106.         }
  107.         i--;           //因为i在退出循环之前还自加了一次,此时,
  108.                         //指向最后一个存储有用值的元素的后一个位置。
  109.         while(i != -1)         //因为i=0时,temp[0]还是有用值。
  110.         {
  111.                 str[j] = temp[i];
  112.                 j++;
  113.                 i--;        
  114.         }
  115.         str[j]='';  //因为i在退出循环之前还自加了一次,此时,
  116.                       //指向最后一个存储有用值的元素的后一个位置。
  117.         DisStr(str);        
  118. }

  119. void DisFloat(float fnum) //显示有4位小数的浮点数,总位数不超过16位。
  120. {
  121.         long int num = fnum*10000;
  122.         u8 temp[17];
  123.         u8 str[17];
  124.         int i=0,j=0;
  125.         while(num != 0)                          
  126.         {
  127.                 temp[i] = (num%10)+0x30;
  128.                 num/=10;
  129.                 i++;
  130.                 if(i == 4)         //4位小数处理完后,加入小数点。
  131.                 {
  132.                         temp[i] = '.';
  133.                         i++;
  134.                 }
  135.         }
  136.         i--;   
  137.         while(i != -1)        
  138.         {
  139.                 str[j] = temp[i];
  140.                 j++;
  141.                 i--;        
  142.         }
  143.         str[j]='';  
  144.         DisStr(str);                        
  145. }

  146. /*以下是光标定位函数,第一个参数为行坐标,第二个为列坐标,起始坐标是1行1列。
  147. 只能以16个点的宽度为单位移动。*/

  148. void locate16(int row, int col)
  149. {
  150.         switch(row)
  151.         {
  152.                 case 1: WriteCmd(0x80+col-1); break;
  153.                 case 2: WriteCmd(0x90+col-1); break;
  154.                 case 3: WriteCmd(0x88+col-1); break;
  155.                 case 4: WriteCmd(0x98+col-1); break;
  156.         }
  157. }

  158. /*光标定位函数定义结束。*/

复制代码



建议把fwlib组里的.c文件生成一个.lib库吧,因为一般是不需要改这部分的代码的,
当需要重新编译的时候,全部库文件都编译的话会把速度拖慢的。。。
先把其它组的 include in target build 属性去掉



这个是默认的选择,点到没勾了就表示去掉了



然后设置项目的output属性生成lib文件

评分

参与人数 2黑币 +55 收起 理由
邰夏留 + 5 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:113502 发表于 2016-5-10 10:08 | 只看该作者
不错谢谢
回复

使用道具 举报

板凳
ID:129602 发表于 2016-7-7 20:33 | 只看该作者
想学习stm32的编程!
回复

使用道具 举报

地板
ID:138624 发表于 2016-9-7 09:02 | 只看该作者
不错哦
回复

使用道具 举报

5#
ID:126343 发表于 2016-10-30 23:07 来自手机 | 只看该作者
借鉴不错
回复

使用道具 举报

6#
ID:79034 发表于 2016-11-21 08:27 | 只看该作者
谢谢楼主分享,下载了就顶贴,养成良好的习惯。方便广大新手学习。
回复

使用道具 举报

7#
ID:171111 发表于 2017-4-11 20:41 | 只看该作者
谢谢楼主分享                           
回复

使用道具 举报

8#
ID:162382 发表于 2018-2-6 17:17 | 只看该作者
没有改代码,为什么我的12864没有显示?求解
回复

使用道具 举报

9#
ID:377872 发表于 2019-3-4 09:29 | 只看该作者
早点睡吧 发表于 2018-2-6 17:17
没有改代码,为什么我的12864没有显示?求解

会不会是对比度没调好?
回复

使用道具 举报

10#
ID:611584 发表于 2019-9-26 13:50 来自手机 | 只看该作者
谢谢分享。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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