久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2195|回復: 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, 下載次數: 49)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一二三区免费视频 | 久久免费香蕉视频 | 欧美久久久久久久久 | 免费av观看 | 在线天堂免费中文字幕视频 | 国产精品一区二区免费 | 自拍偷拍亚洲一区 | 国产1区2区3区 | 久久久综合 | 亚洲一二三区在线观看 | 日韩精品一区二区三区在线播放 | 日韩精品一区在线 | 午夜在线视频 | 特级生活片 | 欧美久久久久久 | 久久草视频 | 日韩电影一区二区三区 | 日韩av免费在线观看 | 中文字幕日本一区二区 | 理论片免费在线观看 | 911精品美国片911久久久 | 成人免费视频一区 | 仙人掌旅馆在线观看 | av免费看在线| 日韩精品一区二区三区高清免费 | 欧美一级小视频 | 三级黄视频在线观看 | 色999日韩 | 精品久久影院 | 羞羞视频在线观免费观看 | 久久精品一区二 | 成人在线不卡 | 午夜免费福利片 | 成年男女免费视频网站 | 有码一区 | 久久久久久综合 | 欧美综合一区二区三区 | 免费黄色的视频 | 精品国产一区二区三区性色av | 国产乱一区二区三区视频 | 国产精品视频久久久 |