社区导航

 
查看: 488|回复: 1

[经验分享] 【GD32F350开发分享五】GPIO模拟SPI控制液晶显示屏

[复制链接]

109

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-10-8 21:22:48 | 显示全部楼层 |阅读模式
大家都应该知道,用GPIO模拟SPI的话,涉及GPIO的输出高低电平、读取电平,先来看GPIO的寄存器
QQ截图20181008211313.png

(1)GPIOx_CTL寄存器控制GPIO的模式(Pin0~Pin15)
00:输入模式(复位值) 01:GPIO输出模式 10:备用功能模式 11:模拟模式
(2)GPIOx_OMODE寄存器控制GPIO的输出模式(Pin0~Pin15)
该位由软件置位和清除。 0:输出推挽模式(复位值) 1:输出开漏模式
(3)GPIOx_OSPD0寄存器控制GPIO的输出速度(Pin0~Pin15)
该位由软件置位和清除。 x0:输出最大速度2M(复位值) 01:输出最大速度10M 11:输出最大速度50M
(4)GPIOx_PUD寄存器控制GPIO的上下拉
该位由软件置位和清除。 00:悬空模式,无上拉和下拉(复位值) 01:端口上拉模式 10:端口下拉模式 11:保留
(5)GPIOx_ISTAT寄存器为端口输入状态寄存器,低16位有效
这些位由软件置位和清除。 0:引脚输入信号为低电平 1:引脚输入信号为高电平
(6)GPIOx_OCTL寄存器为端口输出控制寄存器,低16位有效
该位由软件置位和清除。 0:引脚输出低电平 1:引脚输出高电平

下面为液晶显示屏的驱动程序

  1. #include "gd32f3x0.h"
  2. #include <stdio.h>
  3. #include "gd32f3x0_eval.h"
  4. #include "systick.h"
  5. #include "lcd.h"

  6. static unsigned char LcdSystab[] = {0x30,0x87,0x07,0x28,0x2f,0x0f0,0x28,0x00};         
  7. static unsigned char LcdScrtab[] = {0x00,0x00,0x0f0,0x00,0x40,0x0f0,0x00,0x80,0x00,0x00};

  8. #define CLOCK 9
  9. /*------------------------------------------------------------
  10.                          usÑóê±oˉêy
  11. ------------------------------------------------------------*/
  12. void Delay_Nus(unsigned int us)
  13. {
  14.         uint8_t n;                    
  15.         while(us--)for(n=0;n<CLOCK;n++);          
  16. }

  17. /*------------------------------------------------------------
  18.                          msÑóê±oˉêy
  19. ------------------------------------------------------------*/
  20. void Delay_Nms(unsigned int ms)
  21. {
  22.         while(ms--)Delay_Nus(1000);         
  23. }

  24. void LcdDelay(void)
  25. {
  26.    Delay_Nus(5);
  27. }
  28. void chk_busy(void)
  29. {
  30.     GPIO_BC(GPIOC)=GPIO_PIN_6;
  31.     GPIO_CTL(GPIOB) = (GPIO_CTL(GPIOB)  & 0xf0ffffff) | 0x08000000;
  32.    
  33.     WR_1;   
  34.     A0_0;
  35.     RD_0;
  36.     Delay_Nus(0);
  37.     while(BUSY==1)
  38.     {
  39.     }
  40.     RD_1;   
  41.     GPIO_CTL(GPIOB)= (GPIO_CTL(GPIOB) & 0xf0ffffff) | 0x03000000;
  42. }

  43. void send_cmd(uchar cmd)
  44. {
  45.     chk_busy();

  46.     RD_1;
  47.     A0_1;
  48.     DataOUT = ((DataOUT & 0x00ff) | (((uint16_t)cmd)<<8));
  49.     WR_0;
  50.     Delay_Nus(1);
  51.     WR_1;
  52. }

  53. void send_dat(uchar dat)        
  54. {
  55.     chk_busy ();
  56.    
  57.     RD_1;
  58.     A0_0;   
  59.     DataOUT = ((DataOUT & 0x00ff) | (((uint16_t)dat)<<8));
  60.     WR_0;
  61.     Delay_Nus(1);
  62.     WR_1;
  63. }

  64. uchar Read_data(void)
  65. {
  66.     uint8_t temp = 0;
  67.    
  68.     GPIO_OCTL(GPIOB) &= 0x00ff;
  69.     GPIO_CTL(GPIOB) = (GPIO_CTL(GPIOB) & 0x00000000) | 0x88888888;
  70.    
  71.     A0_1;
  72.     WR_1;
  73.     RD_0;
  74.     temp = DataIN>>8;
  75.     RD_1;
  76.     GPIO_CTL(GPIOB) = (GPIO_CTL(GPIOB) & 0x00000000) | 0x33333333;  
  77.     return temp;
  78. }

  79. // -------------------?????????------------------
  80. void  LcdCsrW ( unsigned char x, unsigned char y)
  81. {
  82.         send_cmd(CsrW);
  83.         LcdDelay();
  84.         send_dat(x);
  85.         LcdDelay();
  86.         send_dat(y);
  87.         LcdDelay();
  88.         return;         
  89. }
  90. // ????===================================     
  91. void LcdClear(void)
  92. {
  93.     unsigned int x,y;
  94.     send_cmd(CsrDirR); //????
  95.     LcdDelay();

  96.     LcdCsrW (0,0);
  97.     send_cmd(mWrite);                                       
  98.     for(x = 0;x<40;x++)
  99.       for(y = 0;y<240;y++)
  100.       {   
  101.         LcdDelay();  
  102.         send_dat(0x0ff);      
  103.       }
  104. }

  105. void LcdHZ(unsigned char x, unsigned int y,unsigned char *pdata,unsigned char flag)
  106. {
  107.     unsigned char i,j;
  108.     unsigned int Addr,tpInt;
  109.     unsigned char a ,b;
  110.     send_cmd(CsrDirR);
  111.     LcdDelay();                  

  112.     for(j = 0; j<2; j++)
  113.     {
  114.     if (x+j>=40)  
  115.        return;
  116.       
  117.     for (i = 0; i<16; i++)
  118.       {
  119.         Addr  =  (y+i)*40 + (x + j);
  120.         a  =  Addr & 0x0FF;
  121.         b  =  Addr >> 8;
  122.    
  123.         LcdCsrW (a,b);
  124.         LcdDelay();
  125.         
  126.         send_cmd(mWrite);
  127.         LcdDelay();
  128.         
  129.         a=j*16+i;
  130.         
  131.         tpInt=pdata[a>>1];
  132.         if (a & 0x0001)
  133.           b=tpInt & 0x00FF;
  134.         else
  135.           b=(tpInt>>8) & 0x00FF;  
  136.         
  137.         if(!flag)  
  138.         {
  139.           b=~b;
  140.         }
  141.         send_dat(b);
  142.            
  143.     }
  144.   }
  145. }


  146. //---------------------??------x 0?39   y 0?239 ------8 X 16---------------
  147. void LcdChar(unsigned char x, unsigned char y, unsigned char *pdata, unsigned char flag) //flag  0??  1??
  148. {
  149.     unsigned char i,a,b;
  150.     unsigned int Addr,tpInt;

  151.     send_cmd(CsrDirD);  //????
  152.     LcdDelay();      

  153.     if (x>=40)  //  x 0?39
  154.        return;
  155.       
  156.     for (i = 0; i<16; i++)
  157.     {
  158.         Addr  =  (y+i)*40 + x ;
  159.         a  =  Addr & 0x0FF;
  160.         b  =  Addr >> 8;
  161.    
  162.         LcdCsrW (a,b);
  163.         LcdDelay();
  164.         
  165.         send_cmd(mWrite);
  166.         LcdDelay();

  167.         tpInt=pdata[i>>1];
  168.         if (i & 0x0001)
  169.             b=tpInt & 0x00FF;
  170.         else
  171.             b=(tpInt>>8) & 0x00FF;
  172.         
  173.         if(!flag)  
  174.         {
  175.           b=~b;
  176.         }      
  177.         send_dat(b);
  178.     }
  179. }

  180. //-----------x=0 ? 319   y=0 ? 239 ----------------------------
  181. void LcdPoint( unsigned int x, unsigned int y, unsigned char flag) //flag = 0 ??(?), bf=1 ??(?), bf=2 ????(??)
  182. {
  183.     unsigned int Addr;
  184.     unsigned int a ,b;
  185.     unsigned char temp ;
  186.     unsigned int bitAddr = 0;
  187.     unsigned char bit1;

  188.     a  =  x >> 3;
  189.     //temp  = Sed[a][y];
  190.     bitAddr = x - ( a << 3 );
  191.         
  192.     b  =  y*40;
  193.     Addr  =  b + a;
  194.    
  195.     a  =  Addr & 0x0FF;
  196.     b  =  Addr >> 8;

  197.     bit1 = 0x80;
  198.     if(bitAddr)
  199.       bit1 =  bit1>>bitAddr;

  200.     if(flag  ==  0)//?
  201.        temp = bit1 | temp;
  202.     else if(flag  ==  1) //?
  203.     {
  204.        bit1 = 255- bit1;
  205.        temp = (bit1 & temp);
  206.     }   
  207.     else if(flag  ==  2)//??
  208.        temp = bit1 ^ temp;
  209.    
  210.     send_cmd(CsrDirD);  //????
  211.     LcdDelay();
  212.     LcdCsrW( a, b);
  213.     LcdDelay();
  214.     send_cmd(mWrite);
  215.     LcdDelay();

  216.     //Sed[x >> 3][y] = temp; //should be here,befor LcdWDataAddr  = temp;
  217.     send_dat(temp);

  218. }

  219. //-------------x=0 ? 319   y=0 ? 239 ------------------------
  220. void LcdLine(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1, unsigned char flag)//flag 0 ??, bf=1 ??, bf=2 ????
  221. {
  222.     register unsigned char t;
  223.     int    xerr=0,yerr=0,delta_x,delta_y,distance;
  224.     int    incx,incy;
  225.     unsigned int row,col;
  226.    
  227.     if (x0>x1)
  228.     {
  229.       t=x0;
  230.       x0=x1;
  231.       x1=t;
  232.     }// x0?  x1?

  233.     if (y0>y1)
  234.     {
  235.       t=y0;
  236.       y0=y1;
  237.       y1=t;
  238.     }// y0?  y1?
  239.    
  240.     if (x1>319)
  241.       x1=319;
  242.     if (y1>239)
  243.       y1=239;
  244.       
  245.     delta_x    = x1-x0;                                        //??????
  246.     delta_y    = y1-y0;
  247.     col    = x0;
  248.     row    = y0;
  249.     if(delta_x>0) incx=1;                                    //??????
  250.     else
  251.     {
  252.         if( delta_x==0    ) incx=0;                            //???
  253.         else {incx=-1;delta_x=-delta_x;}
  254.     }
  255.     if(delta_y>0) incy=1;
  256.     else
  257.     {
  258.         if( delta_y==0    ) incy=0;                            //???
  259.         else {incy=-1;delta_y=-delta_y;}
  260.     }
  261.     if(    delta_x    > delta_y )    distance=delta_x;                //?????????
  262.     else distance=delta_y;

  263.     for( t=0;t <= distance+1; t++ )                            //????
  264.     {                           
  265.         LcdPoint(col, row, flag);                        //??
  266.         xerr +=    delta_x    ;
  267.         yerr +=    delta_y    ;

  268.         if(    xerr > distance    )
  269.         {
  270.             xerr-=distance;
  271.             col+=incx;
  272.         }
  273.         if(    yerr > distance )
  274.         {
  275.             yerr-=distance;
  276.             row+=incy;
  277.         }
  278.     }

  279. }

  280. // ==========????????=========================================
  281. void LcdInit(void)
  282. {
  283.     unsigned char    i = 0;     
  284.     send_cmd(SystemSet);
  285.     LcdDelay();
  286.     for ( i = 0; i<8; i++){
  287.         LcdDelay();
  288.         send_dat(LcdSystab[i]);
  289.         }
  290.    
  291.     send_cmd(Scroll);
  292.     LcdDelay();
  293.     for ( i = 0; i<10; i++){
  294.         LcdDelay();  
  295.         send_dat(LcdScrtab[i]);            
  296.         }
  297.         
  298.     send_cmd(HdotSet);
  299.     LcdDelay();
  300.     send_dat(0x00);
  301.     LcdDelay();
  302.    
  303.     send_cmd(Ovlay);
  304.     LcdDelay();
  305.     send_dat(0x0C);
  306.     LcdDelay();                  
  307.    
  308.     LcdClear();   
  309.    
  310.     send_cmd(DispOn);
  311.     LcdDelay();
  312.     send_dat(0x04);
  313.     LcdDelay();         
  314. }
复制代码
  1. #ifndef __LCD_H
  2. #define __LCD_H               
  3. #include "gd32f3x0.h"
  4. #include <stdio.h>
  5. #include "gd32f3x0_eval.h"
  6. #include "systick.h"
  7. #define uchar      unsigned char
  8. #define uint       unsigned int

  9. #define A0_0  GPIO_BOP(GPIOC)=GPIO_PIN_2
  10. #define A0_1  GPIO_BC(GPIOC)=GPIO_PIN_2

  11. #define WR_0  GPIO_BOP(GPIOC)=GPIO_PIN_3
  12. #define WR_1  GPIO_BC(GPIOC)=GPIO_PIN_3

  13. #define RD_0  GPIO_BOP(GPIOC)=GPIO_PIN_4
  14. #define RD_1  GPIO_BC(GPIOC)=GPIO_PIN_4

  15. #define CS_0  GPIO_BOP(GPIOC)=GPIO_PIN_5
  16. #define CS_1  GPIO_BC(GPIOC)=GPIO_PIN_5

  17. #define BUSY  gpio_input_bit_get(GPIOC,GPIO_PIN_6)

  18. #define DataOUT GPIO_OCTL(GPIOB)

  19. #define DataIN  GPIO_ISTAT(GPIOB)


  20. /*--------------------------------------------------------------*/
  21. //???????????

  22. #define                SystemSet        0x40
  23. #define                SleepIn                0x53
  24. #define                DispOn                0x59
  25. #define                DispOff                0x58
  26. #define                Scroll                0x44
  27. #define                Csrform                0x5d
  28. #define                CgramAdr        0x50
  29. #define                CsrDirR                0x4c
  30. #define                CsrDirL                0x4d
  31. #define                CsrDirU                0x4e
  32. #define                CsrDirD                0x4f       
  33. #define                HdotSet                0x5a
  34. #define                Ovlay                0x5b
  35. #define                CsrW                0x46
  36. #define                CsrR                0x47
  37. #define                mWrite                0x42       
  38. #define                mRead                0x43

  39. void LCD_PinInit(void);
  40. void chk_busy(void);
  41. void send_cmd(uchar cmd);
  42. void send_dat(uchar dat);

  43. void Delay_Nms(uint n);
  44. void Delay_Nus(uint n);
  45. #define LCD_SCROLL                0x44

  46. void LcdClear(void);
  47. //------------flag  0??  1??-----------------------------------------------
  48. void LcdHZ(unsigned char x, unsigned int y,unsigned char *pdata,unsigned char flag);
  49. void LcdChar(unsigned char x, unsigned char y, unsigned char *pdata, unsigned char flag);
  50. //-----------flag = 0 ??(?), bf=1 ??(?), bf=2 ????(??)-----------
  51. void LcdPoint( unsigned int x, unsigned int y, unsigned char flag);
  52. //-----------flag = 0 ??(?), bf=1 ??(?), bf=2 ????(??)-----------
  53. void LcdLine(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1, unsigned char flag);
  54. void LcdInit(void);
  55. void  LcdCsrW ( unsigned char x, unsigned char y);
  56. void Delay_ns();


  57. #endif


复制代码



此帖出自GD32 MCU论坛


回复

使用道具 举报

109

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-10-8 21:28:35 | 显示全部楼层
            /* enable the led clock */
    rcu_periph_clock_enable(RCU_GPIOC);
    /* configure led GPIO port */
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
补上


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-11-21 19:32 , Processed in 0.089605 second(s), 16 queries , Gzip On, MemCache On.

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