找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD12864任意位置显示文字 基于STM32F103C8T6单片机程序

[复制链接]
跳转到指定楼层
楼主
LCD12864大液晶任意位置显示文字

单片机源程序如下:
  1. #include "LCD12864.h"

  2. #include "U_Font.h"

  3. uint8_t         LCD12864_GRAM[1024]; /* LCD12864 显存 */

  4. /*=======================================================================================*/

  5. void LCD12864_Init(void)
  6. {
  7.         LCD12864_GPIO_Config();
  8.         LCD12864_Write_CMD(0x30);  //选择基本指令操作
  9.         LCD12864_Write_CMD(0x0c);  //显示开,关光标
  10.         LCD12864_Write_CMD(0x01);  //清除LCD12864的显示内容       
  11. }

  12. void LCD12864_GPIO_Config(void)
  13. {
  14.         GPIO_InitTypeDef                 h_GPIO_LCD12864;
  15.        
  16.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
  17.        
  18.         h_GPIO_LCD12864.GPIO_Mode = GPIO_Mode_Out_PP;
  19.        
  20.         h_GPIO_LCD12864.GPIO_Pin =         LCD12864_RS_Pin|
  21.                                                                                                                                 LCD12864_RW_Pin|
  22.                                                                                                                                 LCD12864_EN_Pin;
  23.        
  24.         h_GPIO_LCD12864.GPIO_Speed = GPIO_Speed_50MHz;
  25.        
  26.         GPIO_Init(LCD12864_CMD_Port,&h_GPIO_LCD12864);
  27. }

  28. void LCD12864_DAT_Port_Switch_InPut(void) /*LCD12864 Dat Port 切换为输入*/
  29. {
  30.         GPIO_InitTypeDef                                         h_GPIO_LCD12864;
  31.        
  32.         h_GPIO_LCD12864.GPIO_Mode = GPIO_Mode_IPU;
  33.        
  34.         h_GPIO_LCD12864.GPIO_Pin =         GPIO_Pin_0|
  35.                                                                                                                                 GPIO_Pin_1|
  36.                                                                                                                                 GPIO_Pin_2|
  37.                                                                                                                                 GPIO_Pin_3|
  38.                                                                                                                                 GPIO_Pin_4|
  39.                                                                                                                                 GPIO_Pin_5|
  40.                                                                                                                                 GPIO_Pin_6|
  41.                                                                                                                                 GPIO_Pin_7;
  42.                
  43.         GPIO_Init(LCD12864_DAT_Port,&h_GPIO_LCD12864);       
  44. }
  45. void LCD12864_DAT_Port_Switch_OutPut(void) /*LCD12864 Dat Port 切换为输出*/
  46. {
  47.         GPIO_InitTypeDef                                         h_GPIO_LCD12864;
  48.        
  49.         h_GPIO_LCD12864.GPIO_Mode = GPIO_Mode_Out_PP;
  50.        
  51.         h_GPIO_LCD12864.GPIO_Pin =         GPIO_Pin_0|
  52.                                                                                                                                 GPIO_Pin_1|
  53.                                                                                                                                 GPIO_Pin_2|
  54.                                                                                                                                 GPIO_Pin_3|
  55.                                                                                                                                 GPIO_Pin_4|
  56.                                                                                                                                 GPIO_Pin_5|
  57.                                                                                                                                 GPIO_Pin_6|
  58.                                                                                                                                 GPIO_Pin_7;
  59.                
  60.         h_GPIO_LCD12864.GPIO_Speed = GPIO_Speed_50MHz;
  61.        
  62.         GPIO_Init(LCD12864_DAT_Port,&h_GPIO_LCD12864);       
  63. }

  64. uint8_t LCD12864_Check_Busy(void)
  65. {
  66.         uint8_t outTime;
  67.        
  68.         LCD12864_RS_Low();
  69.         LCD12864_RW_High();
  70.         LCD12864_EN_High();
  71.        
  72.         LCD12864_DAT_Port_Switch_InPut();
  73.        
  74.         while((GPIO_ReadInputData(LCD12864_DAT_Port) & 0x80) == 0x80)
  75.         {
  76.                 outTime++;
  77.                 if(outTime > 100)
  78.                 {
  79.                         LCD12864_EN_Low();
  80.                         return 1;          
  81.                 }
  82.         }

  83.         LCD12864_EN_Low();

  84.         return 0;       
  85. }
  86. void LCD12864_Write_CMD(uint8_t cmd)
  87. {
  88.         while(LCD12864_Check_Busy());
  89.                
  90.         LCD12864_RS_Low();
  91.         LCD12864_RW_Low();
  92.         LCD12864_EN_Low();
  93.        
  94.         LCD12864_DAT_Port_Switch_OutPut();
  95.        
  96.         GPIO_Write(LCD12864_DAT_Port,(uint16_t)cmd);
  97.        
  98.         LCD12864_EN_High();
  99.        
  100.         LCD12864_EN_Low();
  101.        
  102. }
  103. void LCD12864_Write_DAT(uint8_t dat)
  104. {
  105.         while(LCD12864_Check_Busy());
  106.                
  107.         LCD12864_RS_High();
  108.        
  109.         LCD12864_RW_Low();
  110.        
  111.         LCD12864_EN_Low();
  112.        
  113.         LCD12864_DAT_Port_Switch_OutPut();
  114.        
  115.         GPIO_Write(LCD12864_DAT_Port,(uint16_t)dat);
  116.        
  117.         LCD12864_EN_High();
  118.        
  119.         LCD12864_EN_Low();
  120. }

  121. /*=======================================================================================*/

  122. void LCD12864_GRAM_SetPoint /* 画点在LCD12864_GRAM里 */
  123. (
  124.         uint8_t x,                                                                        /* 点的坐标X 0~127 */
  125.         uint8_t y,                                                                         /* 点的坐标Y 0~63  */
  126.         uint8_t color                                            /* 点的颜色 0 or 1 */
  127. )
  128. {
  129.         if( x > 127 )                return;
  130.         if( y > 63 )                return;

  131.         if(color == 1)
  132.         {
  133.                         LCD12864_GRAM[y*16+(x/8)] |= 0x80 >> (x % 8);
  134.         }
  135.         else
  136.         {
  137.                 LCD12864_GRAM[y*16+(x/8)] &= ~(0x80 >> (x % 8));
  138.         }
  139. }

  140. void LCD12864_GRAM_Refresh(void) /* 用LCD12864_GRAM里的数据刷新LCD12864*/
  141. {
  142.         uint16_t i,ii,count,count2;
  143.        
  144.         count = 0;
  145.         count2 = 0;
  146.        
  147.         LCD12864_Write_CMD(0x34);        
  148.        
  149.         for(ii=0;ii<32;ii++)
  150.         {
  151.                 LCD12864_Write_CMD(0x80+ii);
  152.                 LCD12864_Write_CMD(0x80);
  153.                
  154.                 for(i=0;i<8;i++)
  155.                 {
  156.                         LCD12864_Write_DAT(LCD12864_GRAM[count]);
  157.                         LCD12864_Write_DAT(LCD12864_GRAM[count+1]);
  158.                         count+=2;
  159.                 }
  160.                 for(i=8;i<16;i++)                               
  161.                 {
  162.                         LCD12864_Write_DAT(LCD12864_GRAM[count2+512]);
  163.                         LCD12864_Write_DAT(LCD12864_GRAM[count2+1+512]);
  164.                         count2+=2;
  165.                 }               
  166.         }
  167.        
  168.         LCD12864_Write_CMD(0x36);       
  169.         LCD12864_Write_CMD(0x30);                
  170. }

  171. void LCD12864_Clear /* LCD12864清屏 */
  172. (
  173.         uint8_t state     /* LCD12864清屏的状态 0x00 ~ 0xFF */
  174. )
  175. {
  176.         uint16_t i;
  177.        
  178.         for(i=0;i<1024;i++)
  179.         {
  180.                 LCD12864_GRAM[i] = state;
  181.         }
  182.         LCD12864_GRAM_Refresh();
  183. }

  184. void LCD12864_Show8X16_Char         /* 显示8*16像素大小的字符串 */
  185. (
  186.         uint8_t x,
  187.         uint8_t y,
  188.         uint8_t chr
  189. )
  190. {
  191.         uint8_t i,ii;
  192.         uint8_t xx,yy;
  193.         uint8_t chrr;
  194.        
  195.         chrr = chr - 32;

  196.         xx = x;
  197.         yy = y;
  198.        
  199.         for(i=0;i<16;i++)
  200.         {
  201.                 for(ii=0;ii<8;ii++)
  202.                 {
  203.                         if( ( ( ASCII_8X16[chrr * 16 + i] >> ii ) & 0x01 ) == 1 )
  204.                         {
  205.                                 LCD12864_GRAM_SetPoint(xx+ii,yy+i,1);
  206.                         }
  207.                         else
  208.                         {
  209.                                 LCD12864_GRAM_SetPoint(xx+ii,yy+i,0);
  210.                         }
  211.                 }
  212.         }
  213. }

  214. void LCD12864_GRAM_Show6X8_Char                /* 显示6*8像素大小的字符串 */
  215. (       
  216.         uint8_t x,
  217.         uint8_t y,
  218.         uint8_t chr
  219. )
  220. {
  221.         uint8_t i,ii;
  222.        
  223.         chr -= 32;
  224.        
  225.         for(i=0;i<6;i++)
  226.         {
  227.                 for(ii=0;ii<8;ii++)
  228.                 {
  229.                         if( ( ( ASCII_6X6[chr*6+i] >> ii ) & 0x01 ) == 1)
  230.                         {
  231.                                 LCD12864_GRAM_SetPoint(x+i,y+ii,1);
  232.                         }
  233.                         else
  234.                         {
  235.                                 LCD12864_GRAM_SetPoint(x+i,y+ii,0);
  236.                         }
  237.                 }
  238.         }
  239. }

  240. void LCD12864_Show8X16_Str         /* 显示单个字符像素为8*16的字符串 自带刷新LCD12864*/
  241. (
  242.         uint8_t x,                                                                         /* 字符左上角起始坐标X */
  243.         uint8_t y,                                                                         /* 字符左上角起始坐标Y */
  244.         uint8_t *str                                                                 /* 要显示的字符串      */
  245. )
  246. {
  247.         while(*str != '\0')
  248.         {
  249.                 LCD12864_Show8X16_Char(x,y,*str);
  250.                 x += 8;
  251.                 str++;
  252.         }
  253.         LCD12864_GRAM_Refresh();
  254. }

  255. void LCD12864_Show6X8_Str                /* 显示单个字符像素为6*8的字符串 自带刷新LCD12864*/
  256. (       
  257.         uint8_t x,                                                                         /* 字符左上角起始坐标X */
  258.         uint8_t y,                                                                        /* 字符左上角起始坐标Y */
  259.         uint8_t *str                                                                /* 要显示的字符串      */
  260. )
  261. {
  262.         while(*str != '\0')
  263.         {
  264.                 LCD12864_GRAM_Show6X8_Char(x,y,*str);
  265.                 x += 6;
  266.                 str++;
  267.         }
  268.         LCD12864_GRAM_Refresh();
  269. }

  270. /*=======================================================================================*/
复制代码

全部资料51hei下载地址:
代码资料.7z (1.11 MB, 下载次数: 81)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:885163 发表于 2021-5-16 01:06 | 只看该作者
这种帖子居然能给50分?请问GPIOwrite();在哪里?关键部分不给出来。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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