標(biāo)題: STM32單片機(jī)+LCD12864顯示一個(gè)點(diǎn)的程序 [打印本頁]

作者: zirencharles    時(shí)間: 2022-4-22 16:24
標(biāo)題: STM32單片機(jī)+LCD12864顯示一個(gè)點(diǎn)的程序
12864顯示一個(gè)點(diǎn)

單片機(jī)源程序如下:
#include "delay.h"
#include "12864.h"

    unsigned char x,y;
int main(void)
{
    SystemInit();         //系統(tǒng)初始化
    delay_init(72);      //延時(shí)初始化
    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;        //定義結(jié)構(gòu)體               
  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;                //數(shù)據(jù)口配置
  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:              檢測忙狀態(tài)
  29. @Function:    讀取引腳15的輸入數(shù)據(jù).
  30. @annotation:  結(jié)合前文 RS=0、RW=1, 以及12864中文字庫說明書之基本指令表: 讀取忙碌標(biāo)志和地址,  
  31.                   可知:該行指令的實(shí)際作用是: 判斷12864是否處于(讀取數(shù)據(jù))忙狀態(tài).
  32. @note:        因?yàn)榕袛嗟氖菙?shù)據(jù)位(DB0-DB7)忙狀態(tài), 所以忙狀態(tài)位必須與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的輸入數(shù)據(jù).  
  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:         寫數(shù)據(jù)
  73. @param:         u8 dat 輸入數(shù)據(jù)
  74. @return: None
  75. ************************************************************************************************/
  76. void LCD12864_Wdat(u8 dat)  //寫數(shù)據(jù)
  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);     //液晶復(fù)位         
  102.     delay_ms(3);                  
  103.     LCD_RST(1);          //置高電平等待復(fù)位
  104.     delay_ms(3);
  105. //        LCD12864_Wcmd(0x34);    //擴(kuò)充指令操作
  106.     delay_ms(5);
  107.     LCD12864_Wcmd(0x30);    //基本指令操作
  108.     delay_ms(5);
  109.     LCD12864_Wcmd(0x0C);    //顯示開,關(guān)光標(biāo)
  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);    //擴(kuò)充指令操作        “繪圖”
  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:         設(shè)置顯示位置
  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 圖形數(shù)組
  150. @return: None
  151. ************************************************************************************************/
  152. void LCD12864_PhotoDis(u8 *bmp)
  153. {
  154.         u8 i,j;
  155.         LCD12864_Wcmd(0x34); //關(guān)閉圖形顯示
  156.        
  157.         for(i=0;i<32;i++)
  158.         {
  159.                 LCD12864_Wcmd(0x80+i);  //先寫入水平坐標(biāo)值
  160.                 LCD12864_Wcmd(0x80);      //寫入垂直坐標(biāo)值
  161.                 for(j=0;j<16;j++)                     //再寫入兩個(gè)8位元的數(shù)據(jù)   
  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);       //寫完數(shù)據(jù),開圖形顯示        
  175. }
  176. /************************************************************************************************
  177. @f_name: void LCD_ShowString(u8 x,u8 y,const u8 *p)
  178. @brief:         顯示字符串
  179. @param:         u8 *bmp 圖形數(shù)組
  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:         延時(shí)函數(shù)
  200. @param:         None
  201. @return: None
  202. ************************************************************************************************/
  203. void NOP(void)
  204. { u8 i;        for(i=0; i<100; i++); }
復(fù)制代碼

Keil代碼下載:
12864_poi_display.7z (190.16 KB, 下載次數(shù): 39)



作者: liuyiyi    時(shí)間: 2022-5-6 16:36
stm32的仿真圖可以做一個(gè)比較好




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1