esp32 驱动st7735s 显示数字

图片

下一步把ascii 8*8点阵输入程序,屏幕就可以显示ascii字符了,最终把此显示程序写成函数,输入参数为要显示字符的数组,这样就是st7735的显示驱动程序了。当然还要加入显示自动换行功能。

至于怎样显示ascii,我想到查表法,比如点阵字库a在数组中的序号为10,如要显示数组遇到a,则.直接去查找显示10号ascii就行了。

f93c125ec6e14fe08d2a93af85d4ae25.jpg

 

#include "driver/spi_master.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "string.h"

#define PIN_NUM_MOSI 12
#define PIN_NUM_CLK  13
#define PIN_NUM_CS   5
#define PIN_NUM_DC   19
#define PIN_NUM_RST  18

spi_device_handle_t spi;

void spi_init() {
    spi_bus_config_t buscfg = {
        .mosi_io_num = PIN_NUM_MOSI,
        .miso_io_num = -1,
        .sclk_io_num = PIN_NUM_CLK,
        .quadwp_io_num = -1,
        .quadhd_io_num = -1,
        .max_transfer_sz = 4096,
    };

    spi_bus_initialize(HSPI_HOST, &buscfg, 1);

    spi_device_interface_config_t devcfg = {
        .clock_speed_hz = 25 * 1000 * 1000,   // 10 MHz
        .mode = 0,                            // SPI mode 0
        .spics_io_num = PIN_NUM_CS,           // CS pin
        .queue_size = 7,
    };

    spi_bus_add_device(HSPI_HOST, &devcfg, &spi);
}

void st7735_send_cmd(uint8_t cmd) {
    gpio_set_level(PIN_NUM_DC, 0); // Command mode
    spi_transaction_t t;
    memset(&t, 0, sizeof(t));
    t.length = 8;
    t.tx_buffer = &cmd;
    spi_device_transmit(spi, &t);
}

void st7735_send_data(uint8_t data) {
    gpio_set_level(PIN_NUM_DC, 1); // Data mode
    spi_transaction_t t;
    memset(&t, 0, sizeof(t));
    t.length = 8;
    t.tx_buffer = &data;
    spi_device_transmit(spi, &t);
}

void st7735_reset() {
    gpio_set_level(PIN_NUM_RST, 0);
    vTaskDelay(1 / portTICK_PERIOD_MS);
    gpio_set_level(PIN_NUM_RST, 1);
    vTaskDelay(200 / portTICK_PERIOD_MS);
}

void st7735_init() {
    // Reset the display
    st7735_reset();
        // Initialization commands for ST7735S
    st7735_send_cmd(0x01); // Software reset
    vTaskDelay(150 / portTICK_PERIOD_MS);
 
    st7735_send_cmd(0x11); // Sleep out
    vTaskDelay(120 / portTICK_PERIOD_MS);
	
	st7735_send_cmd(0xB1);
	st7735_send_data(0x01);
	st7735_send_data(0x2c);
	st7735_send_data(0x2D);
	
	st7735_send_cmd(0xB2);
	st7735_send_data(0x01);
	st7735_send_data(0x2c);
	st7735_send_data(0x2D);
	
	st7735_send_cmd(0xB3);
	st7735_send_data(0x01);
	st7735_send_data(0x2c);
	st7735_send_data(0x2D);
	st7735_send_data(0x01);
	st7735_send_data(0x2c);
	st7735_send_data(0x2D);
	
	st7735_send_cmd(0xB4);
	st7735_send_data(0x00);
	
	st7735_send_cmd(0xc0);
	st7735_send_data(0xa2);
	st7735_send_data(0x02);
	st7735_send_data(0x84);
	st7735_send_cmd(0xc1);
	st7735_send_data(0xc5);
	
	st7735_send_cmd(0xc2);
	st7735_send_data(0x0d);
	
	st7735_send_cmd(0xc3);
	st7735_send_data(0x8d);
	st7735_send_data(0x2a);
	
	st7735_send_cmd(0xc4);
	st7735_send_data(0x8d);
	st7735_send_data(0xee);
	
	st7735_send_cmd(0xc5);
	st7735_send_data(0x0e);
	
	st7735_send_cmd(0x36);
	st7735_send_data(0b01000000);   //40
	
	st7735_send_cmd(0xe0);
	st7735_send_data(0x0f);
	st7735_send_data(0x1a);
	st7735_send_data(0x0f);
	st7735_send_data(0x18);
	st7735_send_data(0x2f);
	st7735_send_data(0x28);
	st7735_send_data(0x20);
	st7735_send_data(0x22);
	st7735_send_data(0x1f);
	st7735_send_data(0x1b);
	st7735_send_data(0x23);
	st7735_send_data(0x37);
	st7735_send_data(0x00);
	st7735_send_data(0x07);
	st7735_send_data(0x02);
	st7735_send_data(0x10);
    
	st7735_send_cmd(0xe1);
	st7735_send_data(0x0f);
	st7735_send_data(0x1b);
	st7735_send_data(0x0f);
	st7735_send_data(0x17);
	st7735_send_data(0x33);
	st7735_send_data(0x2c);
	st7735_send_data(0x29);
	st7735_send_data(0x2e);
	st7735_send_data(0x30);
	st7735_send_data(0x30);
	st7735_send_data(0x39);
	st7735_send_data(0x3f);
	st7735_send_data(0x00);
	st7735_send_data(0x07);
	st7735_send_data(0x03);
	st7735_send_data(0x10);
	
	st7735_send_cmd(0x2a);
	st7735_send_data(0x00);
	st7735_send_data(0x00);
	st7735_send_data(0x00);
	st7735_send_data(127);
	
	st7735_send_cmd(0x2b);
	st7735_send_data(0x00);
	st7735_send_data(0x00);
	st7735_send_data(0x00);
	st7735_send_data(160);

	st7735_send_cmd(0xf0);
	st7735_send_data(0x01);
	st7735_send_cmd(0xf6);
	st7735_send_data(0x00);
	
	st7735_send_cmd(0x3a);
	st7735_send_data(0x05);
   
     st7735_send_cmd(0x29); // Display on
     vTaskDelay(100 / portTICK_PERIOD_MS);
}

void qp(uint8_t xs, uint8_t xe,uint8_t ys,uint8_t ye) {
    // Set 列
    st7735_send_cmd(0x2A);
    st7735_send_data(0x00);
    st7735_send_data(xs);
    st7735_send_data(0x00);
    st7735_send_data(xe);

    // Set 行
    st7735_send_cmd(0x2B);
    st7735_send_data(0x00);
    st7735_send_data(ys);
    st7735_send_data(0x00);
    st7735_send_data(ye);
    // Write memory
    st7735_send_cmd(0x2C);       
}
    void cls(){
       qp(0,127,0,159);                              // lcd  全屏刷成白屏
       for (uint16_t a = 0; a < 159; a++) {
		   for(uint8_t b=0;b<127;b++){
             st7735_send_data(0xff);
			 st7735_send_data(0xff);
		}
	   }  
	}	
void app_main() {
 
    gpio_set_direction(PIN_NUM_DC, GPIO_MODE_OUTPUT);
    gpio_set_direction(PIN_NUM_RST, GPIO_MODE_OUTPUT);

    spi_init();
    st7735_init();                             //lcd 初始化后是花屏
	cls();
	
	uint8_t font[][8] ={ 
	    {0x1C, 0x22, 0x26, 0x2A, 0x32, 0x22, 0x1C, 0x00},   // '0'
	    {0x04, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x0E, 0x00}, // 数字 '1'
	     {0x0E, 0x11,  0x01,  0x06,   0x08, 0x10,  0x1F,  0x00 },  // 2 
	     {0x1C, 0x22, 0x02, 0x1C, 0x02, 0x22, 0x1C, 0x00}, // '3'
          {0x08, 0x18, 0x28, 0x48, 0x7E, 0x08, 0x08, 0x00},  // '4'
          {0x3E, 0x20, 0x3E, 0x02, 0x02, 0x22, 0x1C, 0x00},  // '5'
	     {0x1C, 0x22, 0x20, 0x3C, 0x22, 0x22, 0x1C, 0x00},  // '6'
        {0x3E, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x00}, // '7'
         {0x1C, 0x22, 0x22, 0x1C, 0x22, 0x22, 0x1C, 0x00},  // '8'
         {0x1C, 0x22, 0x22, 0x1E, 0x02, 0x22, 0x1C, 0x00},  // '9'
    };
	void xs(uint8_t ls,uint8_t le,uint8_t hs,uint8_t he,uint8_t *ci){
		qp(127-le,127-ls,hs,he);
		for (uint16_t a = 0; a < 8; a++) {
		for(uint8_t b=0;b<8;b++){
			     if((int)(((ci[a]>>b)&0b00000001))==1){   //如果像素点为1
                     st7735_send_data(0xf8);
			         st7735_send_data(0x00);
				 }else{
					   st7735_send_data(0xff);
			           st7735_send_data(0xff); 
		
			 }
	
		}
	  }
	}

    uint8_t  i[]={6,1,8,3,7,3,6,7,8,7,1,7};  
	
	uint16_t len=(int)sizeof(i);
	uint8_t	 lc=0;                  //lcd 显示起始列        
	uint8_t  hc=50;                   // lcd 显示行
	for(uint8_t a=0;a<len;a++){
		uint8_t ls=lc;
		uint8_t le=ls+7;
		uint8_t hs=hc;     
		uint8_t he=hs+7;		
	    xs(ls,le,hs,he,&font[i[a]][0]);
        lc=le;		                    //列自动加7,相当于光标后移一个字符
	
    }
}

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ST7735S是一款低功耗、高分辨率驱动器芯片,常用于TFT液晶屏的驱动ESP32是一款强大的Wi-Fi和蓝牙双模芯片,可以作为驱动器的控制器。 要驱动ST7735S液晶屏,需要先连接ESP32ST7735S。连接方法可以参考ST7735S的数据手册和ESP32的开发板原理图。一般来说,需要连接SPI接口和一些控制引脚(如复位引脚、片选引脚、数据/命令选择引脚等)。 连接好后,就可以使用ESP32的SPI库来控制ST7735S。以下是一个简单的示例代码: ```c #include <SPI.h> //定义ST7735S的控制引脚 #define TFT_CS 10 #define TFT_DC 9 #define TFT_RST 8 void setup() { //初始化SPI SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV2); //设置ST7735S的控制引脚 pinMode(TFT_CS, OUTPUT); pinMode(TFT_DC, OUTPUT); pinMode(TFT_RST, OUTPUT); digitalWrite(TFT_RST, HIGH); //初始化ST7735S digitalWrite(TFT_CS, LOW); digitalWrite(TFT_DC, LOW); SPI.transfer(0x01); //软复位 digitalWrite(TFT_DC, HIGH); SPI.transfer(0x11); //退出睡眠模式 digitalWrite(TFT_CS, HIGH); } void loop() { //显示一些内容 digitalWrite(TFT_CS, LOW); digitalWrite(TFT_DC, LOW); SPI.transfer(0x2A); //列地址设置 digitalWrite(TFT_DC, HIGH); SPI.transfer16(0); //起始地址 SPI.transfer16(127); //终止地址 digitalWrite(TFT_DC, LOW); SPI.transfer(0x2B); //行地址设置 digitalWrite(TFT_DC, HIGH); SPI.transfer16(0); //起始地址 SPI.transfer16(127); //终止地址 digitalWrite(TFT_DC, LOW); SPI.transfer(0x2C); //内存写入 digitalWrite(TFT_DC, HIGH); for (int i = 0; i < 128 * 128; i++) { SPI.transfer16(0xFFFF); //白色 } digitalWrite(TFT_CS, HIGH); } ``` 这个示例代码使用了ESP32的SPI库来控制ST7735S,首先初始化SPI、ST7735S的控制引脚和ST7735S本身,然后在循环中向ST7735S写入一些内容。 需要注意的是,ST7735S的具体控制命令和数据格式可以参考其数据手册。同时,SPI的时序和速率也需要根据ST7735S的要求进行设置,以确保数据传输的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值