找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3143|回复: 0
打印 上一主题 下一主题
收起左侧

1.8寸LCD-51单片机(模拟SPI英文显示)ST7735芯片

[复制链接]
跳转到指定楼层
楼主
ID:880136 发表于 2021-1-24 13:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //////////////////////////////////////////////////////////////////////////////////         
  2. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  3. //测试硬件:STC51
  4. //1.8寸TFT_ST7735液晶驱动
  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. //单片机IO推挽输出设置定义
  15. //#define USE_LANDSCAPE//测试程序横竖屏切换,横屏请开启此宏,竖屏请屏蔽
  16. #define MCU_STC12//如果您使用的单片机不是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位数据
  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; //输出数据
  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位数据
  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位数据
  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位数据
  91.         SPI_WriteData(Data);                         //写入低8位数据
  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. 函数名:LCD_Set_Region
  217. 功能:设置lcd显示区域,在此区域写点数据自动换行
  218. 入口参数:xy起点和终点
  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);//蓝色
  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. 余下代码见附件
复制代码

1.8寸LCD-51(模拟SPI英文显示).rar (67.44 KB, 下载次数: 85)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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