4462 views|1 replies

98

Posts

0

Resources
The OP
 

[GD32F350 Development Sharing 5] GPIO simulates SPI to control LCD display [Copy link]

Everyone should know that if GPIO is used to simulate SPI, it involves the output high and low levels and read levels of GPIO. Let's first look at the GPIO registers
(1) GPIOx_CTL register controls the GPIO mode (Pin0~Pin15) 00: Input mode (reset value) 01: GPIO output mode 10: Alternate function mode 11: Analog mode (2) GPIOx_OMODE register controls the GPIO output mode (Pin0~Pin15) This bit is set and cleared by software. 0: Output push-pull mode (reset value) 1: Output open-drain mode (3) GPIOx_OSPD0 register controls the GPIO output speed (Pin0~Pin15) This bit is set and cleared by software. x0: Output maximum speed 2M (reset value) 01: Output maximum speed 10M 11: Output maximum speed 50M (4) GPIOx_PUD register controls the pull-up and pull-down of GPIO. This bit is set and cleared by software. 00: Floating mode, no pull-up and pull-down (reset value) 01: Port pull-up mode 10: Port pull-down mode 11: Reserved (5) GPIOx_ISTAT register is the port input status register, the lower 16 bits are valid. These bits are set and cleared by software. 0: Pin input signal is low level 1: Pin input signal is high level (6) GPIOx_OCTL register is the port output control register, the lower 16 bits are valid. This bit is set and cleared by software. 0: Pin outputs low level 1: Pin outputs high level The following is the driver for the LCD display
  1. #include "gd32f3x0.h" #include<stdio.h>
  2. #include "gd32f3x0_eval.h"
  3. #include "systick.h"
  4. #include "lcd.h"
  5. static unsigned char LcdSystab[] = {0x30,0x87,0x07,0x28,0x2f,0x0f0,0x28,0x00};         
  6. static unsigned char LcdScrtab[] = {0x00,0x00,0x0f0,0x00,0x40,0x0f0,0x00,0x80,0x00,0x00};
  7. #define CLOCK 9
  8. /*------------------------------------------------------------
  9.                          usóê±oˉêy
  10. ------------------------------------------------------------*/
  11. void Delay_Nus(unsigned int us)
  12. {
  13.         uint8_t n;                    
  14.         while(us--)for(n=0;n<clock;n++); &="" (((uint16_t)cmd)<<8));="" (((uint16_t)dat)<<8));="" ();="" *------------------------------------------------------------="" ------------------------------------------------------------*="" 0x00000000)="" 0x00ff)="" 0x03000000;="" 0x08000000;="" 0x88888888;="" 0xf0ffffff)="" a0_0;="" a0_1;="" chk_busy="" chk_busy();="" chk_busy(void)="" cmd)="" dat)="" dataout="((DataOUT" delay_nms(unsigned="" delay_nus(0);="" delay_nus(1);="" delay_nus(5);="" gpio_bc(gpioc)="GPIO_PIN_6;" gpio_ctl(gpiob)="(GPIO_CTL(GPIOB)" gpio_octl(gpiob)="" int="" lcddelay(void)="" msÑóê±oˉêy="" ms)="" rd_0;="" rd_1;="" read_data(void)="" send_cmd(uchar="" send_dat(uchar="" temp="0;" uchar="" uint8_t="" void="" while(busy="=1)" while(ms--)delay_nus(1000);="" wr_0;="" wr_1;="" {="" |="" }="">&gt;8;
  15.     RD_1;
  16.     GPIO_CTL(GPIOB) = (GPIO_CTL(GPIOB) &amp; 0x00000000) | 0x33333333;  
  17.     return temp;
  18. }
  19. // -------------------?????????------------------
  20. void  LcdCsrW ( unsigned char x, unsigned char y)
  21. {
  22.         send_cmd(CsrW);
  23.         LcdDelay();
  24.         send_dat(x);
  25.         LcdDelay();
  26.         send_dat(y);
  27.         LcdDelay();
  28.         return;         
  29. }
  30. // ????===================================     
  31. void LcdClear(void)
  32. {
  33.     unsigned int x,y;
  34.     send_cmd(CsrDirR); //????
  35.     LcdDelay();
  36.     LcdCsrW (0,0);
  37.     send_cmd(mWrite);                                       
  38.     for(x = 0;x&lt;40;x++)
  39.       for(y = 0;y&lt;240;y++)
  40.       {   
  41.         LcdDelay();  
  42.         send_dat(0x0ff);      
  43.       }
  44. }
  45. void LcdHZ(unsigned char x, unsigned int y,unsigned char *pdata,unsigned char flag)
  46. {
  47.     unsigned char i,j;
  48.     unsigned int Addr,tpInt;
  49.     unsigned char a ,b;
  50.     send_cmd(CsrDirR);
  51.     LcdDelay();                  
  52.     for(j = 0; j&lt;2; j++)
  53.     {
  54.     if (x+j&gt;=40)  
  55.        return;
  56.       
  57.     for (i = 0; i&lt;16; i++)
  58.       {
  59.         Addr  =  (y+i)*40 + (x + j);
  60.         a  =  Addr &amp; 0x0FF;
  61.         b  =  Addr &gt;&gt; 8;
  62.    
  63.         LcdCsrW (a,b);
  64.         LcdDelay();
  65.         
  66.         send_cmd(mWrite);
  67.         LcdDelay();
  68.         
  69.         a=j*16+i;
  70.         
  71.         tpInt=pdata[a&gt;&gt;1];
  72.         if (a &amp; 0x0001)
  73.           b=tpInt &amp; 0x00FF;
  74.         else
  75.           b=(tpInt&gt;&gt;8) &amp; 0x00FF;  
  76.         
  77.         if(!flag)  
  78.         {
  79.           b=~b;
  80.         }
  81.         send_dat(b);
  82.            
  83.     }
  84.   }
  85. }
  86. //---------------------??------x 0?39   y 0?239 ------8 X 16---------------
  87. void LcdChar(unsigned char x, unsigned char y, unsigned char *pdata, unsigned char flag) //flag  0??  1??
  88. {
  89.     unsigned char i,a,b;
  90.     unsigned int Addr,tpInt;
  91.     send_cmd(CsrDirD);  //????
  92.     LcdDelay();      
  93.     if (x&gt;=40)  //  x 0?39
  94.        return;
  95.       
  96.     for (i = 0; i&lt;16; i++)
  97.     {
  98.         Addr  =  (y+i)*40 + x ;
  99.         a  =  Addr &amp; 0x0FF;
  100.         b  =  Addr &gt;&gt; 8;
  101.    
  102.         LcdCsrW (a,b);
  103.         LcdDelay();
  104.         
  105.         send_cmd(mWrite);
  106.         LcdDelay();
  107.         tpInt=pdata[i&gt;&gt;1];
  108.         if (i &amp; 0x0001)
  109.             b=tpInt &amp; 0x00FF;
  110.         else
  111.             b=(tpInt&gt;&gt;8) &amp; 0x00FF;
  112.         
  113.         if(!flag)  
  114.         {
  115.           b=~b;
  116.         }      
  117.         send_dat(b);
  118.     }
  119. }
  120. //-----------x=0 ? 319   y=0 ? 239 ----------------------------
  121. void LcdPoint( unsigned int x, unsigned int y, unsigned char flag) //flag = 0 ??(?), bf=1 ??(?), bf=2 ????(??)
  122. {
  123.     unsigned int Addr;
  124.     unsigned int a ,b;
  125.     unsigned char temp ;
  126.     unsigned int bitAddr = 0;
  127.     unsigned char bit1;
  128.     a  =  x &gt;&gt; 3;
  129.     //temp  = Sed[a][y];
  130.     bitAddr = x - ( a &lt;&lt; 3 );
  131.         
  132.     b  =  y*40;
  133.     Addr  =  b + a;
  134.    
  135.     a  =  Addr &amp; 0x0FF;
  136.     b  =  Addr &gt;&gt; 8;
  137.     bit1 = 0x80;
  138.     if(bitAddr)
  139.       bit1 =  bit1&gt;&gt;bitAddr;
  140.     if(flag  ==  0)//?
  141.        temp = bit1 | temp;
  142.     else if(flag  ==  1) //?
  143.     {
  144.        bit1 = 255- bit1;
  145.        temp = (bit1 &amp; temp);
  146.     }   
  147.     else if(flag  ==  2)//??
  148.        temp = bit1 ^ temp;
  149.    
  150.     send_cmd(CsrDirD);  //????
  151.     LcdDelay();
  152.     LcdCsrW( a, b);
  153.     LcdDelay();
  154.     send_cmd(mWrite);
  155.     LcdDelay();
  156.     //Sed[x &gt;&gt; 3][y] = temp; //should be here,befor LcdWDataAddr  = temp;
  157.     send_dat(temp);
  158. }
  159. //-------------x=0 ? 319   y=0 ? 239 ------------------------
  160. void LcdLine(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1, unsigned char flag)//flag 0 ??, bf=1 ??, bf=2 ????
  161. {
  162.     register unsigned char t;
  163.     int    xerr=0,yerr=0,delta_x,delta_y,distance;
  164.     int    incx,incy;
  165.     unsigned int row,col;
  166.    
  167.     if (x0&gt;x1)
  168.     {
  169.       t=x0;
  170.       x0=x1;
  171.       x1=t;
  172.     }// x0?  x1?
  173.     if (y0&gt;y1)
  174.     {
  175.       t=y0;
  176.       y0=y1;
  177.       y1=t;
  178.     }// y0?  y1?
  179.    
  180.     if (x1&gt;319)
  181.       x1=319;
  182.     if (y1&gt;239)
  183.       y1=239;
  184.       
  185.     delta_x    = x1-x0;                                        //??????
  186.     delta_y    = y1-y0;
  187.     col    = x0;
  188.     row    = y0;
  189.     if(delta_x&gt;0) incx=1;                                    //??????
  190.     else
  191.     {
  192.         if( delta_x==0    ) incx=0;                            //???
  193.         else {incx=-1;delta_x=-delta_x;}
  194.     }
  195.     if(delta_y&gt;0) incy=1;
  196.     else
  197.     {
  198.         if( delta_y==0    ) incy=0;                            //???
  199.         else {incy=-1;delta_y=-delta_y;}
  200.     }
  201.     if(    delta_x    &gt; delta_y )    distance=delta_x;                //?????????
  202.     else distance=delta_y;
  203.     for( t=0;t &lt;= distance+1; t++ )                            //????
  204.     {                           
  205.         LcdPoint(col, row, flag);                        //??
  206.         xerr +=    delta_x    ;
  207.         yerr +=    delta_y    ;
  208.         if(    xerr &gt; distance    )
  209.         {
  210.             xerr-=distance;
  211.             col+=incx;
  212.         }
  213.         if(    yerr &gt; distance )
  214.         {
  215.             yerr-=distance;
  216.             row+=incy;
  217.         }
  218.     }
  219. }
  220. // ==========????????=========================================
  221. void LcdInit(void)
  222. {
  223.     unsigned char    i = 0;     
  224.     send_cmd(SystemSet);
  225.     LcdDelay();
  226.     for ( i = 0; i&lt;8; i++){
  227.         LcdDelay();
  228.         send_dat(LcdSystab[i]);
  229.         }
  230.    
  231.     send_cmd(Scroll);
  232.     LcdDelay();
  233.     for ( i = 0; i&lt;10; i++){
  234.         LcdDelay();  
  235.         send_dat(LcdScrtab[i]);            
  236.         }
  237.         
  238.     send_cmd(HdotSet);
  239.     LcdDelay();
  240.     send_dat(0x00);
  241.     LcdDelay();
  242.    
  243.     send_cmd(Ovlay);
  244.     LcdDelay();
  245.     send_dat(0x0C);
  246.     LcdDelay();                  
  247.    
  248.     LcdClear();   
  249.    
  250.     send_cmd(DispOn);
  251.     LcdDelay();
  252.     send_dat(0x04);
  253.     LcdDelay();         
  254. }
复制代码
  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
复制代码


This post is from GD32 MCU
 

98

Posts

0

Resources
2
 
            /* 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);
补上
This post is from GD32 MCU
 
 
 

Just looking around
Find a datasheet?

EEWorld Datasheet Technical Support

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号
快速回复 返回顶部 Return list