找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1561|回复: 0
收起左侧

STM32采用串口驱动lcd12864显示屏的程序,请大家鉴赏下

[复制链接]
ID:436785 发表于 2020-8-13 10:45 | 显示全部楼层 |阅读模式
STM32采用串口驱动lcd12864显示屏的程序,请大家鉴赏下,后续会更新程序!!!

单片机源程序如下:
  1. /*****************************************************************************************/
  2. /*                                                                                                                                                                                 */
  3. /*                               LCD串行驱动程序  2008年12月20日晚 by cihu               */
  4. /*                                                                                                                                                                                 */
  5. /*        实测写8条液晶要接近40ms,故不能频繁写液晶,写时在操作系统里最好要大于200ms刷新频率                                                                                         */                                                       
  6. /*                                                                                                                                                                                 */
  7. /*****************************************************************************************/
  8. #include "stm32f10x.h"
  9. #include "12864.h"
  10.                                                  
  11. #define DLY  25
  12. #define COMM  0
  13. #define CDAT  1

  14. u8 lcd_temp;
  15. u8 h_x[4]={0x80,0x90,0x88,0x98};                                                        //行地址                                               

  16. u8   flag_LCD;                                                                                //为0时关闭液晶显示,1时打开


  17. RCC_ClocksTypeDef RCC_ClockFreq;

  18. void RCC_Configuration(void)
  19. {
  20.         SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置.具体请看2_RCC

  21.         /**************************************************
  22.         获取RCC的信息,调试用
  23.         请参考RCC_ClocksTypeDef结构体的内容,当时钟配置完成后,
  24.         里面变量的值就直接反映了器件各个部分的运行频率
  25.         ***************************************************/
  26.         RCC_GetClocksFreq(&RCC_ClockFreq);
  27.        
  28.         /* 这个配置可使外部晶振停振的时候,产生一个NMI中断,不需要用的可屏蔽掉*/
  29.         //RCC_ClockSecuritySystemCmd(ENABLE);
  30. }

  31. /*******************************************************************************
  32. * Function Name  : GPIO_Configuration
  33. * 设置PB5,7,9;
  34. *******************************************************************************/
  35. void GPIO_Configuration(void)
  36. {
  37.         GPIO_InitTypeDef GPIO_InitStructure;

  38.        
  39.         /*允许总线CLOCK,在使用GPIO之前必须允许相应端的时钟.
  40.         从STM32的设计角度上说,没被允许的端将不接入时钟,也就不会耗能,
  41.         这是STM32节能的一种技巧,*/
  42.        
  43.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  44.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  45.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  46.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

  47.         /* PB5,7,9输出 */
  48.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_9;
  49.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  50.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //50M时钟速度
  51.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  52.        

  53. }
  54. /*----------------延时函数-------------------*/

  55. void ldelay (u32 us)   //delay time
  56. {
  57.   u8 i,temp;  
  58.   for(i=0;i<10;i++)
  59.   for(temp=us;temp>0;temp--);
  60. }


  61. /*-----------write string------------*/

  62. /*------------------初始化-----------------*/
  63. void LCD_Init (void)                                                                                //使用前须调用此函数初始化         
  64. {
  65.   flag_LCD=1;

  66. //  IO2DIR=IO2DIR|CS_IO|STD_IO|SCLK_IO;                                                                //PINSEL2已经在startup.s中配置完,现只需配置方向
  67.   
  68.   wr_lcd (COMM,0x30);  /*30---基本指令动作*/   
  69.   wr_lcd (COMM,0x01);  /*清屏,地址指针指向00H*/
  70.   ldelay (100);
  71.   wr_lcd (COMM,0x06);  /*光标的移动方向*/
  72.   wr_lcd (COMM,0x0c);  /*开显示,关游标*/
  73. }
  74. /*******************************
  75. **函数名:ChipHalInit()
  76. **功能:片内硬件初始化
  77. *******************************/
  78. void  ChipHalInit(void)
  79. {

  80.         RCC_Configuration();        //初始化时钟源
  81.         GPIO_Configuration();        //初始化GPIO
  82. }


  83. /*--------------清DDRAM------------------*/
  84. void clrram (void)
  85. {
  86.   wr_lcd (COMM,0x30);
  87.   wr_lcd (COMM,0x01);
  88.    ldelay (180);
  89. }
  90. /*---------------------------------------*/

  91. void wr_lcd(u8 dat_COMM,u8 content)
  92. {
  93.   u8 a,i,j;
  94.   ldelay (30);
  95.   lcd_temp=(1<<7);
  96.   a=content;
  97.   CS_H;
  98.   CLK_L;
  99.   SID_H;
  100.   for(i=0;i<5;i++)
  101.   {
  102.     CLK_H;
  103.     ldelay(DLY);
  104.     CLK_L;
  105.   }
  106.   SID_L;
  107.   CLK_H;
  108.   ldelay(DLY);
  109.   CLK_L;
  110.   if(dat_COMM)
  111.     SID_H;   //data
  112.   else
  113.     SID_L;   //COMMand
  114.    
  115.   CLK_H;
  116.   ldelay(DLY);
  117.   CLK_L;
  118.   SID_L;
  119.   CLK_H;
  120.   ldelay(DLY);
  121.   CLK_L;
  122.   for(j=0;j<2;j++)
  123.   {
  124.     for(i=0;i<4;i++)
  125.     {
  126.       if(lcd_temp&a)  SID_H;
  127.       else SID_L;
  128.       lcd_temp=lcd_temp>>1;
  129.       CLK_H;
  130.       ldelay(DLY);
  131.       CLK_L;
  132.     }
  133.     SID_L;
  134.     for(i=0;i<4;i++)
  135.     {
  136.       CLK_H;
  137.       ldelay(DLY);
  138.       CLK_L;
  139.     }
  140.   }
  141. }


  142. void PutString(char *str,u8 line)                        //在第line行输出一个字符串
  143. {
  144.         u8 i=0;
  145.        
  146.         if(!flag_LCD)
  147.         {
  148.                 return;
  149.         }       

  150.         wr_lcd (COMM,0x30);
  151.         wr_lcd (COMM,h_x[line-1]);

  152.         while(str[i] != '\0' )
  153.         {
  154.                    if(str[i]=='\n')       
  155.                         {
  156.                                 wr_lcd (COMM,h_x[line]);       
  157.                                 i++;
  158.                                 continue;
  159.                         }           
  160.                 if(str[i]=='\t')       
  161.                         {
  162.                                 wr_lcd (COMM,h_x[line-1]+8);
  163.                                 i++;       
  164.                                 continue;
  165.                         }

  166.                 wr_lcd (CDAT,str[i++]);
  167.           }
  168. }

  169. void PutChar(char *str)                                             //在默认位置输出一个字符串               
  170. {
  171.         u8 i=0;
  172.         if(!flag_LCD)
  173.         {
  174.                 return;
  175.         }
  176.         while(str[i] != '\0' )
  177.         {
  178.                 wr_lcd (CDAT,str[i++]);
  179.           }
  180. }

  181. /*-----------write number------------*/

  182. void PutIntNum(int value,u8 num,u8 choose)
  183. {
  184.         char string[20],*str,i=0;
  185.        
  186.         if(!flag_LCD)
  187.         {
  188.                 return;
  189.         }

  190.         str=string;

  191.         if(value<0)
  192.         {
  193.                 wr_lcd(CDAT,'-');
  194.                 value=0-value;       
  195.         }

  196.         if (choose==10)                                    //显示10进制
  197.         {
  198.    
  199.                 while(str[i]!= '\0' )
  200.                 {
  201.                   wr_lcd (CDAT,str[i++]);
  202.                   }
  203.     }
  204.    
  205.         else if (choose==16)                                        //显示16进制
  206.         {

  207.                 while(str[i]!='\0' )
  208.                 {
  209.                   wr_lcd (CDAT,str[i++]);
  210.                   }
  211.         }
  212. }

  213. void PutFloatNum(float value,u8 num1,u8 num2)
  214. {
  215.         char string[20],*str,i=0;

  216.         str=string;
  217.        
  218.         if(!flag_LCD)
  219.         {
  220.                 return;
  221.         }

  222.         if(value<0)
  223.         {
  224.                 wr_lcd(CDAT,'-');
  225.                 value=0-value;       
  226.         }
  227.        
  228.         while(str[i]!='\0' )
  229.         {
  230.                 wr_lcd (CDAT,str[i++]);
  231.           }
  232. }
复制代码

代码下载: 12864串行显示程序.zip (5.86 MB, 下载次数: 48)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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