当前位置: 首页 > news >正文

黄页网络的推广网站有哪些网页修改工具

黄页网络的推广网站有哪些,网页修改工具,用腾讯云做会员网站,为自己做的网站申请域名为了在STM32103CBT6微控制器上通过SPI接口驱动ST7789 LCD显示屏并显示柬埔寨文,我们需要完成以下几个步骤: 初始化硬件:配置STM32的GPIO和SPI外设。编写LCD驱动代码:实现ST7789的基本操作函数。处理字符集:加载支持Ca…

为了在STM32103CBT6微控制器上通过SPI接口驱动ST7789 LCD显示屏并显示柬埔寨文,我们需要完成以下几个步骤:

  1. 初始化硬件:配置STM32的GPIO和SPI外设。
  2. 编写LCD驱动代码:实现ST7789的基本操作函数。
  3. 处理字符集:加载支持Cambodia字体的数据,并将其转换为屏幕上的像素点。
  4. 显示文本:编写函数来将字符串渲染到LCD上。

下面是一个完整的示例代码,展示了如何在STM32103CBT6上通过SPI接口驱动ST7789 LCD显示屏并显示“សួស្តី”(意思是“你好”)。

硬件准备

  • STM32F103CBT6开发板
  • ST7789VW LCD显示屏

软件准备

  • STM32CubeMX用于初始化外设配置
  • STM32CubeIDE用于编写代码

示例代码

1. 使用STM32CubeMX配置项目

使用STM32CubeMX生成初始化代码。以下是关键配置:

  • SPI1: Mode -> Master, Data Size -> 8 Bits, Clock Polarity -> High, Clock Phase -> 2 Edge, NSS -> Software, Baud Rate Prescaler -> 256 (1 MHz), First Bit -> MSB, CRC Calculation -> Disable
  • GPIO:
    • PA5 -> SCK (SPI1_SCK)
    • PA6 -> MISO (SPI1_MISO)
    • PA7 -> MOSI (SPI1_MOSI)
    • PB1 -> RST (Reset Pin)
    • PB0 -> DC (Data/Command Control Pin)
    • PE1 -> CS (Chip Select Pin)
2. 编写LCD驱动代码

创建一个文件lcd_st7789.hlcd_st7789.c来包含ST7789的基本操作函数。

lcd_st7789.h
#ifndef LCD_ST7789_H_
#define LCD_ST7789_H_#include "stm32f1xx_hal.h"void LCD_Init(void);
void LCD_SetCursor(uint16_t x, uint16_t y);
void LCD_WritePixel(uint16_t color);
void LCD_FillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color);#endif /* LCD_ST7789_H_ */
lcd_st7789.c
#include "lcd_st7789.h"
#include "main.h"#define LCD_WIDTH   240
#define LCD_HEIGHT  240static SPI_HandleTypeDef hspi1;void LCD_Reset(void) {HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);HAL_Delay(10);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);HAL_Delay(10);
}void LCD_Command(uint8_t cmd) {HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);HAL_SPI_Transmit(&hspi1, &cmd, 1, 100);
}void LCD_Data(uint8_t data) {HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);HAL_SPI_Transmit(&hspi1, &data, 1, 100);
}void LCD_Init(void) {hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 10;if (HAL_SPI_Init(&hspi1) != HAL_OK) {// Initialization ErrorError_Handler();}LCD_Reset();LCD_Command(0x11); // Sleep OutHAL_Delay(120);LCD_Command(0xB1);LCD_Data(0x01);LCD_Data(0x2C);LCD_Data(0x2D);LCD_Command(0xB2);LCD_Data(0x01);LCD_Data(0x2C);LCD_Data(0x2D);LCD_Command(0xB3);LCD_Data(0x01);LCD_Data(0x2C);LCD_Data(0x2D);LCD_Data(0x01);LCD_Data(0x2C);LCD_Data(0x2D);LCD_Command(0xB4);LCD_Data(0x07);LCD_Command(0xC0);LCD_Data(0xA2);LCD_Data(0x02);LCD_Data(0x84);LCD_Command(0xC1);LCD_Data(0xC5);LCD_Command(0xC2);LCD_Data(0x0A);LCD_Data(0x00);LCD_Command(0xC3);LCD_Data(0x8A);LCD_Data(0x2A);LCD_Command(0xC4);LCD_Data(0x8A);LCD_Data(0xEE);LCD_Command(0xC5);LCD_Data(0x0E);LCD_Command(0xE0);LCD_Data(0xF0);LCD_Data(0x09);LCD_Data(0x0B);LCD_Data(0x06);LCD_Data(0x04);LCD_Data(0x15);LCD_Data(0x07);LCD_Data(0x31);LCD_Data(0xD8);LCD_Data(0x4D);LCD_Data(0x40);LCD_Data(0x15);LCD_Data(0x12);LCD_Data(0x12);LCD_Data(0x18);LCD_Command(0xE1);LCD_Data(0xF0);LCD_Data(0x09);LCD_Data(0x0B);LCD_Data(0x06);LCD_Data(0x04);LCD_Data(0x15);LCD_Data(0x07);LCD_Data(0x31);LCD_Data(0xD8);LCD_Data(0x4D);LCD_Data(0x40);LCD_Data(0x15);LCD_Data(0x12);LCD_Data(0x12);LCD_Data(0x18);LCD_Command(0x21); // Inversion OnLCD_Command(0x11); // Sleep OutHAL_Delay(120);LCD_Command(0x29); // Display On
}void LCD_SetCursor(uint16_t x, uint16_t y) {LCD_Command(0x2A);LCD_Data((x >> 8) & 0xFF);LCD_Data(x & 0xFF);LCD_Data(((x + 1) >> 8) & 0xFF);LCD_Data((x + 1) & 0xFF);LCD_Command(0x2B);LCD_Data((y >> 8) & 0xFF);LCD_Data(y & 0xFF);LCD_Data(((y + 1) >> 8) & 0xFF);LCD_Data((y + 1) & 0xFF);LCD_Command(0x2C);
}void LCD_WritePixel(uint16_t color) {uint8_t data[] = {color >> 8, color & 0xFF};HAL_SPI_Transmit(&hspi1, data, 2, 100);
}void LCD_FillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) {LCD_SetCursor(x, y);for (uint16_t i = 0; i < h; i++) {for (uint16_t j = 0; j < w; j++) {LCD_WritePixel(color);}}
}

3. 处理字符集

创建一个文件font.hfont.c来包含Cambodia字体的数据。

font.h
 
#ifndef FONT_H_
#define FONT_H_#include <stdint.h>extern const uint8_t cambodia_font[];typedef struct {uint16_t unicode;uint8_t width;uint8_t height;uint8_t data[];
} FontChar;const FontChar* GetFontChar(uint16_t unicode);#endif /* FONT_H_ */

font.c

这个文件包含了Cambodia字体的数据。这里假设你已经有了这样的数据。

#include "font.h"const uint8_t cambodia_font[] = {// Cambodian font data in a specific format// Example entry for Unicode U+1780 (ក)0x17, 0x80, 0x08, 0x08,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// Add more characters as needed0x00, 0x00 // End marker
};const FontChar* GetFontChar(uint16_t unicode) {for (int i = 0; ; i++) {if (cambodia_font[i * 5] == (unicode >> 8) &&cambodia_font[i * 5 + 1] == (unicode & 0xFF)) {static FontChar fc;fc.unicode = unicode;fc.width = cambodia_font[i * 5 + 2];fc.height = cambodia_font[i * 5 + 3];fc.data = &cambodia_font[i * 5 + 4];return &fc;}if (cambodia_font[i * 5] == 0 && cambodia_font[i * 5 + 1] == 0)break;}return NULL;
}
4. 显示文本

main.c中调用上述库函数来显示文本

#include "main.h"
#include "lcd_st7789.h"
#include "font.h"#define SCREEN_WIDTH  240
#define SCREEN_HEIGHT 240void DrawString(uint16_t x, uint16_t y, const char* str) {while (*str) {uint32_t c = *(uint8_t*)str++;if ((c & 0xE0) == 0xC0) { // Two-byte UTF-8 characterc = (c & 0x1F) << 6;c |= (*(uint8_t*)str++ & 0x3F);} else if ((c & 0xF0) == 0xE0) { // Three-byte UTF-8 characterc = (c & 0x0F) << 12;c |= (*(uint8_t*)str++ & 0x3F) << 6;c |= (*(uint8_t*)str++ & 0x3F);}const FontChar* fc = GetFontChar(c);if (fc) {LCD_SetCursor(x, y);for (int h = 0; h < fc->height; h++) {for (int w = 0; w < fc->width; w++) {uint8_t pixel = fc->data[h * fc->width + w];LCD_WritePixel(pixel ? 0xFFFF : 0x0000); // White background black text}x += fc->width;}y += fc->height;}}
}int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_SPI1_UART_Init();LCD_Init();LCD_FillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0x0000); // Clear screen with blackDrawString(10, 10, "សួស្តី");while (1) {// Main loop}
}void SystemClock_Config(void) {RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {Error_Handler();}
}static void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOE_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_1;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_1;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}static void MX_SPI1_UART_Init(void) {hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 10;if (HAL_SPI_Init(&hspi1) != HAL_OK) {Error_Handler();}
}void Error_Handler(void) {while (1) {// User can add his own implementation to report the HAL error return state}
}

这段代码包括了所有必要的部分来初始化STM32F103CBT6、配置SPI接口、初始化ST7789 LCD显示屏,并显示“សួស្តី”。你需要确保cambodia_font数组包含足够的Cambodia字体数据,并根据实际情况调整字体数据的格式和查找逻辑。

http://www.yayakq.cn/news/577920/

相关文章:

  • qq群推广网站免费秒进旅游网站哪个做的好
  • 网站 授权书wordpress 能做门户吗
  • 申请域名后可以做自己的网站吗深圳网站建设在哪里可以
  • 外国语学校网站建设方案关于网站建设新闻
  • 滕州网站制作哪家好discuz培训网站模板下载
  • 采购公告 校园网站建设短视频营销优势
  • 网站建设分金手指专业二九东阳网络科技有限公司
  • 陕西煤业化工建设集团网站网站(网店)建设方案范文
  • 免费素材视频网站唐山网络运营推广
  • 怎样在内网建设一个网站山东莱州市建设局网站
  • 有关做橡胶品的网站wordpress网站打开慢
  • 西安企业网站备案一般得多少天自己做网站的劣势
  • 给个网站做填空题做游戏和做网站哪个难
  • iis网站右键没有属性网上做名片的网站
  • 太仓新网站优化wordpress怎么分段
  • 沈阳什么行业做网站的最多阿坝网站制作
  • 卖东西的网站怎么做wordpress订阅邮箱
  • 曲沃县做网站公司wordpress 树状目录结构
  • 设计师网站兼职网站开发合同模版
  • 京华建设科技有限公司网站北京app开发公司有哪些
  • 怎么用别人网站做模板网站建设课程概要
  • 外包建站公司wordpress 中国提速
  • 网站主页设计代码网站建设市场行情
  • 昆山建设工程信息网站程序员wordpress模板
  • 哪个网站做视频挣钱深圳互联网公司集中在哪个区
  • 律师网站建设方案移动端的网站模板
  • 中国建设人才服务信息网是正规网站网站说建设中
  • 上海免费网站建站模板网站建设合约具体内容
  • dedecms网站版权信息360搜索引擎下载
  • 网站域名的密码网站目录字典