找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1896|回复: 1
收起左侧

STM32单片机+LCD12864显示一个点的程序

[复制链接]
ID:753618 发表于 2022-4-22 16:24 | 显示全部楼层 |阅读模式
12864显示一个点

单片机源程序如下:
#include "delay.h"
#include "12864.h"

    unsigned char x,y;
int main(void)
{
    SystemInit();         //系统初始化
    delay_init(72);      //延时初始化
    LCD12864_InitPort(); //端口初始化
    LCD12864_Init();     //液晶初始化
   
   
     
    for(x=0;x<4;x++)
    {
         for(y=0;y<16;y++)
        {
           LCD12864_Pos(x,y);
           LCD12864_Wdat(0x2E);
           delay_ms(1000);
           LCD12864_Clr();         //    清屏            
        }
   
    }   
   

    while(1);      
}



  1. #include "stm32f10x.h"
  2. #include"12864.h"
  3. #include"delay.h"       
  4. /************************************************************************************************
  5. @f_name: void GPIO_Init(void)
  6. @brief:         初始化硬件端口配置
  7. @param:         None
  8. @return: None
  9. ************************************************************************************************/
  10. void LCD12864_InitPort(void)
  11. {
  12.         GPIO_InitTypeDef  GPIO_InitStructure;        //定义结构体               
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);   
  14.         GPIO_InitStructure.GPIO_Pin  = LCD_GPIO_CMD;       // 指令口配置
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出模式   
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.         GPIO_Init(GPIOD,&GPIO_InitStructure);
  18.        
  19.         GPIO_InitStructure.GPIO_Pin  = LCD_GPIO_DAT;                //数据口配置
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;    //开漏输出模式
  21.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  22.         GPIO_Init(GPIOG,&GPIO_InitStructure);          //初始化IO口配置
  23.        
  24.         GPIO_Write(GPIOG,0xff00);        //该行指令似乎可以去掉     
  25. }

  26. /************************************************************************************************
  27. @f_name:      LCD12864_busy()
  28. @brief:              检测忙状态
  29. @Function:    读取引脚15的输入数据.
  30. @annotation:  结合前文 RS=0、RW=1, 以及12864中文字库说明书之基本指令表: 读取忙碌标志和地址,  
  31.                   可知:该行指令的实际作用是: 判断12864是否处于(读取数据)忙状态.
  32. @note:        因为判断的是数据位(DB0-DB7)忙状态, 所以忙状态位必须与DB7位一致.
  33. @param:         None
  34. @return: None
  35. ************************************************************************************************/
  36. u8 LCD12864_busy(void)
  37. {
  38.         u8 x;
  39.         LCD_RS(0);
  40.         LCD_RW(1);  
  41.         LCD_EN(1);
  42.         NOP();
  43.         NOP();
  44.         x = Text_Busy;  // 读取引脚15的输入数据.  
  45.         LCD_EN(0);
  46.         return x;
  47. }
  48. /************************************************************************************************
  49. @f_name: void LCD12864_Wcmd(u8 dat)
  50. @brief:         写指令
  51. @param:         u8 dat  输入指令
  52. @return: None
  53. ************************************************************************************************/
  54. void LCD12864_Wcmd(u8 dat)  // 写指令
  55. {
  56.         while(LCD12864_busy()); //忙检测
  57.         LCD_RS(0);      
  58.         LCD_RW(0);
  59.         LCD_EN(0);
  60.         NOP();
  61.         NOP();
  62.         LCD_WriteData(dat);          
  63.         NOP();
  64.         NOP();
  65.         LCD_EN(1);
  66.         NOP();
  67.         NOP();
  68.         LCD_EN(0);
  69. }
  70. /************************************************************************************************
  71. @f_name: void LCD12864_Wdat(u8 dat)
  72. @brief:         写数据
  73. @param:         u8 dat 输入数据
  74. @return: None
  75. ************************************************************************************************/
  76. void LCD12864_Wdat(u8 dat)  //写数据
  77. {
  78.         while(LCD12864_busy()); //忙检测
  79.         LCD_RS(1);      
  80.         LCD_RW(0);
  81.         LCD_EN(0);
  82.         NOP();
  83.         NOP();
  84.         LCD_WriteData(dat);         
  85.         NOP();
  86.         NOP();
  87.         LCD_EN(1);
  88.         NOP();
  89.         NOP();
  90.         LCD_EN(0);
  91. }
  92. /************************************************************************************************
  93. @f_name: void LCD12864_Init(void)
  94. @brief:         液晶初始化
  95. @param:         None
  96. @return: None
  97. ************************************************************************************************/
  98. void LCD12864_Init(void)
  99. {       
  100.         LCD_PSB(1);     //并口方式   
  101.         LCD_RST(0);     //液晶复位         
  102.     delay_ms(3);                  
  103.     LCD_RST(1);          //置高电平等待复位
  104.     delay_ms(3);
  105. //        LCD12864_Wcmd(0x34);    //扩充指令操作
  106.     delay_ms(5);
  107.     LCD12864_Wcmd(0x30);    //基本指令操作
  108.     delay_ms(5);
  109.     LCD12864_Wcmd(0x0C);    //显示开,关光标
  110.     delay_ms(5);
  111.     LCD12864_Wcmd(0x01);    //清屏
  112.     delay_ms(5);
  113. }
  114. /************************************************************************************************
  115. @f_name: void LCD12864_Clr(void)
  116. @brief:         清屏
  117. @param:         None
  118. @return: None
  119. ************************************************************************************************/
  120. void LCD12864_Clr(void)
  121. {
  122.         LCD12864_Wcmd(0x34);    //扩充指令操作        “绘图”
  123.     delay_ms(5);
  124.     LCD12864_Wcmd(0x30);    //基本指令操作
  125.     delay_ms(5);
  126.         LCD12864_Wcmd(0x01);    //清屏   
  127.     delay_ms(5);
  128. }
  129. /************************************************************************************************
  130. @f_name: void LCD12864_Pos(u8 x,u8 y)
  131. @brief:         设置显示位置
  132. @param:         u8 x:X轴    u8 y:Y轴  
  133. @return: None
  134. ************************************************************************************************/
  135. void LCD12864_Pos(u8 x,u8 y)
  136. {
  137.         u8  pos;
  138.         if (x==1)                   {x=0x80;}          
  139.         else if (x==2)         {x=0x90;}       
  140.         else if (x==3)         {x=0x88;}         
  141.         else if (x==4)   {x=0x98;}         
  142.         else x=0x80;
  143.         pos = x+y ;        
  144.         LCD12864_Wcmd(pos);  //显示地址  
  145. }
  146. /************************************************************************************************
  147. @f_name: void LCD12864_PhotoDis(u8 *bmp)
  148. @brief:         显示图形
  149. @param:         u8 *bmp 图形数组
  150. @return: None
  151. ************************************************************************************************/
  152. void LCD12864_PhotoDis(u8 *bmp)
  153. {
  154.         u8 i,j;
  155.         LCD12864_Wcmd(0x34); //关闭图形显示
  156.        
  157.         for(i=0;i<32;i++)
  158.         {
  159.                 LCD12864_Wcmd(0x80+i);  //先写入水平坐标值
  160.                 LCD12864_Wcmd(0x80);      //写入垂直坐标值
  161.                 for(j=0;j<16;j++)                     //再写入两个8位元的数据   
  162.                 LCD12864_Wdat(*bmp++);     
  163.                 delay_ms(1);
  164.         }
  165.        
  166.         for(i=0;i<32;i++)
  167.         {
  168.                 LCD12864_Wcmd(0x80+i);
  169.                 LCD12864_Wcmd(0x88);
  170.                 for(j=0;j<16;j++)         
  171.                 LCD12864_Wdat(*bmp++);   
  172.                 delay_ms(1);
  173.         }
  174.         LCD12864_Wcmd(0x36);       //写完数据,开图形显示        
  175. }
  176. /************************************************************************************************
  177. @f_name: void LCD_ShowString(u8 x,u8 y,const u8 *p)
  178. @brief:         显示字符串
  179. @param:         u8 *bmp 图形数组
  180. @return: None
  181. ************************************************************************************************/
  182. void LCD_ShowString(u8 x,u8 y,const u8 *p)
  183. {
  184.         u8 temp;
  185.         if(x>4) {x=1;}
  186.         if(y>4) {y=0;}
  187.        
  188.         LCD12864_Pos(x,y);
  189.        
  190.         temp=*p;
  191.         while(temp!='\0')            
  192.         {
  193.                 LCD12864_Wdat(temp);
  194.                 temp=*(++p);
  195.         }
  196. }
  197. /************************************************************************************************
  198. @f_name: void NOP(void)
  199. @brief:         延时函数
  200. @param:         None
  201. @return: None
  202. ************************************************************************************************/
  203. void NOP(void)
  204. { u8 i;        for(i=0; i<100; i++); }
复制代码

Keil代码下载:
12864_poi_display.7z (190.16 KB, 下载次数: 39)

评分

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

查看全部评分

回复

使用道具 举报

ID:440028 发表于 2022-5-6 16:36 | 显示全部楼层
stm32的仿真图可以做一个比较好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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