找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3979|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

1.8寸LCD-51單片機(jī)(模擬SPI英文顯示)ST7735芯片

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:880136 發(fā)表于 2021-1-24 13:46 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  1. //////////////////////////////////////////////////////////////////////////////////         
  2. //本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
  3. //測試硬件:STC51
  4. //1.8寸TFT_ST7735液晶驅(qū)動
  5. //********************************************************************************
  6. #include<reg51.h>
  7. #include<absacc.h>
  8. #include<intrins.h>
  9. #include<string.h>
  10. #define uchar unsigned char
  11. #define uint unsigned int


  12. //測試硬件平臺:STC12C5A60S2/STC12LE5A60S2
  13. //主頻:12MHZ
  14. //單片機(jī)IO推挽輸出設(shè)置定義
  15. //#define USE_LANDSCAPE//測試程序橫豎屏切換,橫屏請開啟此宏,豎屏請屏蔽
  16. #define MCU_STC12//如果您使用的單片機(jī)不是STC12系列(如STC89C52)請屏蔽此宏定義
  17. #ifdef MCU_STC12
  18. sfr P3M1  = 0xB1;        //P3M1.n,P3M0.n         =00--->Standard,        01--->push-pull
  19. sfr P3M0  = 0xB2;        //                                        =10--->pure input,        11--->open drain
  20. #endif


  21. //---------------------------液晶屏接線說明-------------------------------------//
  22. //---------------------------液晶屏接線說明-------------------------------------//
  23. //接線前請參考液晶屏說明書第10頁引腳定義
  24. sbit bl        =P1^5;//接模塊BL引腳,背光可以采用IO控制或者PWM控制,也可以直接接到高電平常亮
  25. sbit scl       =P1^0;//接模塊CLK引腳,接裸屏Pin9_SCL
  26. sbit sda       =P1^1;//接模塊DIN/MOSI引腳,接裸屏Pin8_SDA
  27. sbit rs        =P1^3;//接模塊D/C引腳,接裸屏Pin7_A0
  28. sbit cs        =P1^4;//接模塊CE引腳,接裸屏Pin12_CS
  29. sbit reset     =P1^2;//接模塊RST引腳,接裸屏Pin6_RES
  30. //---------------------------End of液晶屏接線---------------------------------//

  31. //定義常用顏色
  32. #define RED                  0xf800
  33. #define GREEN                0x07e0
  34. #define BLUE                 0x001f
  35. #define WHITE                0xffff
  36. #define BLACK                0x0000
  37. #define YELLOW  0xFFE0
  38. #define GRAY0   0xEF7D   
  39. #define GRAY1   0x8410              
  40. #define GRAY2   0x4208   

  41. void  Contrast_Adjust();
  42. uchar code Zk_ASCII8X16[];

  43. void Display_Desc();
  44. void Output_Pixel(uint x,uint y);
  45. void Display_ASCII8X16(uint x0,uint y0,uchar *s);



  46. void delay_ms(uint time)
  47. {
  48. uint i,j;
  49.   for(i=0;i<time;i++)
  50.    for(j=0;j<250;j++);
  51. }


  52. //向SPI總線傳輸一個8位數(shù)據(jù)
  53. void  SPI_WriteData(uchar Data)
  54. {
  55.         unsigned char i=0;
  56.         for(i=8;i>0;i--)
  57.         {
  58.                 if(Data&0x80)        
  59.                 sda=1; //輸出數(shù)據(jù)
  60.                 else sda=0;
  61.                 scl=0;
  62.                 scl=1;
  63.                 Data<<=1;
  64.         }
  65. }
  66. //向液晶屏寫一個8位指令
  67. void  Lcd_WriteIndex(uchar Data)
  68. {
  69.                
  70.                 cs=0;
  71.                 rs=0;
  72.                 SPI_WriteData(Data);                 
  73.                 cs=1;
  74. }
  75. //向液晶屏寫一個8位數(shù)據(jù)
  76. void  Lcd_WriteData(uchar Data)
  77. {        
  78.                 unsigned char i=0;
  79.                 cs=0;
  80.                 rs=1;
  81.                 SPI_WriteData(Data);         
  82.                 cs=1;
  83. }
  84. //向液晶屏寫一個16位數(shù)據(jù)
  85. void  LCD_WriteData_16Bit(unsigned int Data)
  86. {
  87.         unsigned char i=0;
  88.         cs=0;
  89.         rs=1;
  90.         SPI_WriteData(Data>>8);         //寫入高8位數(shù)據(jù)
  91.         SPI_WriteData(Data);                         //寫入低8位數(shù)據(jù)
  92.         cs=1;

  93. }

  94. void Reset()
  95. {
  96.     reset=0;
  97.     delay_ms(100);
  98.     reset=1;
  99.     delay_ms(100);
  100. }
  101. //////////////////////////////////////////////////////////////////////////////////////////////
  102. //液晶屏初始化 for S6D02A1
  103. void lcd_initial()
  104. {        Reset();//Reset before LCD Init.
  105.                
  106.         //LCD Init For 1.44Inch LCD Panel with ST7735R.
  107.         Lcd_WriteIndex(0x11);//Sleep exit
  108.         delay_ms (120);
  109.                
  110.         //ST7735R Frame Rate
  111.         Lcd_WriteIndex(0xB1);
  112.         Lcd_WriteData(0x01);
  113.         Lcd_WriteData(0x2C);
  114.         Lcd_WriteData(0x2D);

  115.         Lcd_WriteIndex(0xB2);
  116.         Lcd_WriteData(0x01);
  117.         Lcd_WriteData(0x2C);
  118.         Lcd_WriteData(0x2D);

  119.         Lcd_WriteIndex(0xB3);
  120.         Lcd_WriteData(0x01);
  121.         Lcd_WriteData(0x2C);
  122.         Lcd_WriteData(0x2D);
  123.         Lcd_WriteData(0x01);
  124.         Lcd_WriteData(0x2C);
  125.         Lcd_WriteData(0x2D);
  126.         
  127.         Lcd_WriteIndex(0xB4); //Column inversion
  128.         Lcd_WriteData(0x07);
  129.         
  130.         //ST7735R Power Sequence
  131.         Lcd_WriteIndex(0xC0);
  132.         Lcd_WriteData(0xA2);
  133.         Lcd_WriteData(0x02);
  134.         Lcd_WriteData(0x84);
  135.         Lcd_WriteIndex(0xC1);
  136.         Lcd_WriteData(0xC5);

  137.         Lcd_WriteIndex(0xC2);
  138.         Lcd_WriteData(0x0A);
  139.         Lcd_WriteData(0x00);

  140.         Lcd_WriteIndex(0xC3);
  141.         Lcd_WriteData(0x8A);
  142.         Lcd_WriteData(0x2A);
  143.         Lcd_WriteIndex(0xC4);
  144.         Lcd_WriteData(0x8A);
  145.         Lcd_WriteData(0xEE);
  146.         
  147.         Lcd_WriteIndex(0xC5); //VCOM
  148.         Lcd_WriteData(0x0E);
  149.         
  150.         Lcd_WriteIndex(0x36); //MX, MY, RGB mode
  151.         Lcd_WriteData(0xC0);
  152. #ifdef USE_LANDSCAPE
  153.         Lcd_WriteData(0xA8); //豎屏C8 橫屏08 A8
  154. #else
  155.         Lcd_WriteData(0xC8); //豎屏C8 橫屏08 A8
  156. #endif               
  157.         //ST7735R Gamma Sequence
  158.         Lcd_WriteIndex(0xe0);
  159.         Lcd_WriteData(0x0f);
  160.         Lcd_WriteData(0x1a);
  161.         Lcd_WriteData(0x0f);
  162.         Lcd_WriteData(0x18);
  163.         Lcd_WriteData(0x2f);
  164.         Lcd_WriteData(0x28);
  165.         Lcd_WriteData(0x20);
  166.         Lcd_WriteData(0x22);
  167.         Lcd_WriteData(0x1f);
  168.         Lcd_WriteData(0x1b);
  169.         Lcd_WriteData(0x23);
  170.         Lcd_WriteData(0x37);
  171.         Lcd_WriteData(0x00);         
  172.         Lcd_WriteData(0x07);
  173.         Lcd_WriteData(0x02);
  174.         Lcd_WriteData(0x10);

  175.         Lcd_WriteIndex(0xe1);
  176.         Lcd_WriteData(0x0f);
  177.         Lcd_WriteData(0x1b);
  178.         Lcd_WriteData(0x0f);
  179.         Lcd_WriteData(0x17);
  180.         Lcd_WriteData(0x33);
  181.         Lcd_WriteData(0x2c);
  182.         Lcd_WriteData(0x29);
  183.         Lcd_WriteData(0x2e);
  184.         Lcd_WriteData(0x30);
  185.         Lcd_WriteData(0x30);
  186.         Lcd_WriteData(0x39);
  187.         Lcd_WriteData(0x3f);
  188.         Lcd_WriteData(0x00);
  189.         Lcd_WriteData(0x07);
  190.         Lcd_WriteData(0x03);
  191.         Lcd_WriteData(0x10);  
  192.         
  193.         Lcd_WriteIndex(0x2a);
  194.         Lcd_WriteData(0x00);
  195.         Lcd_WriteData(0x00+2);
  196.         Lcd_WriteData(0x00);
  197.         Lcd_WriteData(0x80+2);

  198.         Lcd_WriteIndex(0x2b);
  199.         Lcd_WriteData(0x00);
  200.         Lcd_WriteData(0x00+3);
  201.         Lcd_WriteData(0x00);
  202.         Lcd_WriteData(0x80+3);
  203.         
  204.         Lcd_WriteIndex(0xF0); //Enable test command  
  205.         Lcd_WriteData(0x01);
  206.         Lcd_WriteIndex(0xF6); //Disable ram power save mode
  207.         Lcd_WriteData(0x00);
  208.         
  209.         Lcd_WriteIndex(0x3A); //65k mode
  210.         Lcd_WriteData(0x05);
  211.         
  212.         
  213.         Lcd_WriteIndex(0x29);//Display on

  214. }



  215. /*************************************************
  216. 函數(shù)名:LCD_Set_Region
  217. 功能:設(shè)置lcd顯示區(qū)域,在此區(qū)域?qū)扅c(diǎn)數(shù)據(jù)自動換行
  218. 入口參數(shù):xy起點(diǎn)和終點(diǎn)
  219. 返回值:無
  220. *************************************************/
  221. void Lcd_SetRegion(unsigned int x_start,unsigned int y_start,unsigned int x_end,unsigned int y_end)
  222. {        
  223. #ifdef USE_LANDSCAPE//使用橫屏模式
  224.         Lcd_WriteIndex(0x2a);
  225.         Lcd_WriteData(0x02);
  226.         Lcd_WriteData(x_start+2);
  227.         Lcd_WriteData(0x02);
  228.         Lcd_WriteData(x_end+2);

  229.         Lcd_WriteIndex(0x2b);
  230.         Lcd_WriteData(0x01);
  231.         Lcd_WriteData(y_start+1);
  232.         Lcd_WriteData(0x01);
  233.         Lcd_WriteData(y_end+1);

  234. #else//豎屏模式        
  235.         Lcd_WriteIndex(0x2a);
  236.         Lcd_WriteData(0x02);
  237.         Lcd_WriteData(x_start+2);
  238.         Lcd_WriteData(0x02);
  239.         Lcd_WriteData(x_end+2);

  240.         Lcd_WriteIndex(0x2b);
  241.         Lcd_WriteData(0x01);
  242.         Lcd_WriteData(y_start+1);
  243.         Lcd_WriteData(0x01);
  244.         Lcd_WriteData(y_end+1);        
  245. #endif
  246.         Lcd_WriteIndex(0x2c);
  247. }


  248. void PutPixel(uint x_start,uint y_start,uint color)
  249. {
  250.         Lcd_SetRegion(x_start,y_start,x_start+1,y_start+1);
  251.         LCD_WriteData_16Bit(color);
  252.         
  253. }



  254. void dsp_single_colour(int color)
  255. {
  256.          uchar i,j;
  257.         Lcd_SetRegion(0,0,128-1,160-1);
  258.          for (i=0;i<160;i++)
  259.             for (j=0;j<128;j++)
  260.                 LCD_WriteData_16Bit(color);
  261. }

  262. void Display_Desc()
  263. {
  264.     Display_ASCII8X16(10,10,"Welcome");
  265.     Display_ASCII8X16(10,26,"Zhongguo");
  266.     Display_ASCII8X16(10,42,"Dots:128*160");
  267.     Display_ASCII8X16(10,58,"IC: ST7735");
  268.     Display_ASCII8X16(10,74,"VA:6 o'clock");
  269.     Display_ASCII8X16(10,90,"2015.10.26");
  270. }
  271. //顯示一個英文字符
  272. void Display_ASCII8X16(uint x0,uint y0,uchar *s)
  273. {
  274.         int i,j,k,x,y,xx;
  275.         
  276.         unsigned char qm;
  277.         
  278.         long int ulOffset;
  279.         
  280.         char  ywbuf[32],temp[2];

  281.         for(i = 0; i<strlen((char*)s);i++)
  282.         {
  283.                 if(((unsigned char)(*(s+i))) >= 161)
  284.                 {
  285.                         temp[0] = *(s+i);
  286.                         temp[1] = '\0';
  287.                         return;
  288.                 }
  289.                
  290.                 else
  291.                 {
  292.                         qm = *(s+i);

  293.                         ulOffset = (long int)(qm) * 16;
  294.                         
  295.       for (j = 0; j < 16; j ++)
  296.       {
  297.                                 ywbuf[j]=Zk_ASCII8X16[ulOffset+j];
  298.       }
  299.             
  300.       for(y = 0;y < 16;y++)
  301.       {
  302.                 for(x=0;x<8;x++)
  303.                 {
  304.              k=x % 8;
  305.                         
  306.                                           if(ywbuf[y]&(0x80 >> k))
  307.                                            {
  308.                                                   xx=x0+x+i*8;
  309.                                             PutPixel(xx,y+y0,RED);
  310.                                           }
  311.                                                         
  312.                                    }
  313.       }

  314.                 }
  315.         }            
  316. }


  317. main()
  318. {
  319. #ifdef MCU_STC12
  320.         P3M1 &= ~(1<<2),        P3M0 |=  (1<<2);        //P3.2 set as push-pull output mode
  321. #endif
  322.         lcd_initial();
  323.         bl=1;
  324.   while(1)
  325.   {
  326.                 dsp_single_colour(RED);//紅色
  327.     dsp_single_colour(GREEN);//綠色        
  328.     dsp_single_colour(BLUE);//藍(lán)色
  329.     delay_ms(500);        
  330.                 dsp_single_colour(WHITE);//白色
  331.     Display_Desc();         //版本
  332.     delay_ms(500);        
  333.     }
  334. }

  335. uchar code Zk_ASCII8X16[]=
  336. {
  337.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  338.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  339.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  340. 余下代碼見附件
復(fù)制代碼

1.8寸LCD-51(模擬SPI英文顯示).rar (67.44 KB, 下載次數(shù): 94)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表