Files
stc32g128k/Drivers/lcd.c

449 lines
12 KiB
C
Raw Normal View History

#include "lcd.h"
#include "lcd_font.h"
#include "../App/config.h"
#include "intrins.h"
// ====== LHS114TC-IF03 (ST7789V) <20><>Ļ SPI <20><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3> ======
sbit LCD_RST = P1^0; // <20><>ĻӲ<C4BB><D3B2><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> (RESET)<29><><EFBFBD>͵<EFBFBD>ƽ<EFBFBD><C6BD>λ
sbit LCD_DCX = P1^1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (1:<3A><><EFBFBD><EFBFBD>, 0:ָ<><D6B8>)
sbit LCD_SDI = P1^4; // SPI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (MOSI)
sbit LCD_SCL = P1^5; // SPI <20><><EFBFBD>й<EFBFBD><D0B9><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> (SCLK)
sbit LCD_CS = P1^6; // SPI <20><><EFBFBD><EFBFBD>Ƭѡѡ<D1A1><D1A1><EFBFBD><EFBFBD> (CS)<29><><EFBFBD>͵<EFBFBD>ƽѡͨ<D1A1><CDA8>Ļ
// ====== LHS114TC-IF03 LEDA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ======
sbit SGM_CTRL = P1^7; // LEDA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 1:<3A>ر<EFBFBD>Ϩ<EFBFBD><CFA8> - PMOS<4F><53><EFBFBD><EFBFBD>)
// <20><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> system.c <20><>)
extern void Delay_ms(u16 ms);
extern void Delay10us(void);
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> 8 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD>
* @param dat <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD> 1 <EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void SPI_SendData(u8 dat)
{
u8 i;
for(i = 0; i < 8; i++)
{
LCD_SCL = 0; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>ӣ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(dat & 0x80)
LCD_SDI = 1;
else
LCD_SDI = 0;
_nop_();
LCD_SCL = 1; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
_nop_();
dat <<= 1; // <20><><EFBFBD><EFBFBD>һλ<D2BB><CEBB>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һλ
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>ֽڿ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD> (DCX=0)
*/
void WriteComm(u8 cmd)
{
LCD_CS = 0; // <20><><EFBFBD><EFBFBD>Ƭѡ
LCD_DCX = 0; // <20>л<EFBFBD>Ϊָ<CEAA><EFBFBD><EEB4AB>ģʽ
SPI_SendData(cmd);
LCD_CS = 1; // <20>ر<EFBFBD>Ƭѡ
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (DCX=1)
*/
void WriteData(u8 dat)
{
LCD_CS = 0; // <20><><EFBFBD><EFBFBD>Ƭѡ
LCD_DCX = 1; // <20>л<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>ģʽ
SPI_SendData(dat);
LCD_CS = 1; // <20>ر<EFBFBD>Ƭѡ
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĻӲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
*/
void LCD_Reset(void)
{
LCD_RST = 1;
Delay_ms(10);
LCD_RST = 0; // <20><><EFBFBD>͸<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>Ž<EFBFBD><C5BD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>λ״̬
Delay_ms(20);
LCD_RST = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Delay_ms(120); // <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD> 120ms <20><><EFBFBD><EFBFBD>ִ<EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC>
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> LHS114TC-IF03 (ST7789V) <EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void LCD_Init(void)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ SFR <20><><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8> (EAXFR = 1)<29><>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> P1M1 <20><> P1M0 ģʽ<C4A3>Ĵ<EFBFBD><C4B4><EFBFBD>
P_SW2 |= 0x80;
// <20><><EFBFBD><EFBFBD> P1 <20>˿ڵ<CBBF> LCD_RST(P1.0)/DCX(P1.1)/SDI(P1.4)/SCL(P1.5)/CS(P1.6)/LEDA(P1.7) Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ (M1=0, M0=1)
P1M1 &= ~((1<<0) | (1<<1) | (1<<4) | (1<<5) | (1<<6) | (1<<7));
P1M0 |= ((1<<0) | (1<<1) | (1<<4) | (1<<5) | (1<<6) | (1<<7));
// <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>ʼĬ<CABC>ϵ<EFBFBD>ƽ
SGM_CTRL = 0; // PMOS<4F>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (LEDA = 0)
LCD_CS = 1;
LCD_SCL = 1;
LCD_RST = 1;
LCD_DCX = 1;
LCD_Reset(); // Ӳ<><D3B2><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ļ
// ====== д<><D0B4> ST7789V ԭ<><D4AD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ======
WriteComm(0x11); // Sleep Out <20>˳<EFBFBD>˯<EFBFBD><CBAF>
Delay_ms(120); // <20>˳<EFBFBD>˯<EFBFBD>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> 120ms
// Memory Data Access Control (MADCTL) ɨ<><EFBFBD><E8B7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 0x00: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>RGB <20><>ʽ
WriteComm(0x36);
WriteData(0x00);
// Interface Pixel Format (COLMOD)
// 0x05 <20><><EFBFBD><EFBFBD> 16-bit/pixel (RGB565<36><35>ʽ)
WriteComm(0x3A);
WriteData(0x05);
// Porch Setting (B2h)
WriteComm(0xB2);
WriteData(0x0C);
WriteData(0x0C);
WriteData(0x00);
WriteData(0x33);
WriteData(0x33);
// Gate Control (B7h)
// VGH=13.65V, VGL=-10.43V
WriteComm(0xB7);
WriteData(0x35);
// VCOM Setting (BBh)
// VCOM=1.175V
WriteComm(0xBB);
WriteData(0x19);
// LCM Control (C0h)
WriteComm(0xC0);
WriteData(0x2C);
// VDV and VRH Command Enable (C2h)
WriteComm(0xC2);
WriteData(0x01);
// VRH Set (C3h)
// VRH=4.3V
WriteComm(0xC3);
WriteData(0x12);
// VDV Set (C4h)
// VDV=0V
WriteComm(0xC4);
WriteData(0x20);
// Frame Rate Control in Normal Mode (C6h)
// 0x0F: 60Hz
WriteComm(0xC6);
WriteData(0x0F);
// Power Control 1 (D0h)
WriteComm(0xD0);
WriteData(0xA4);
WriteData(0xA1);
// Positive Gamma Correction (E0h) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>٤<EFBFBD><D9A4>
WriteComm(0xE0);
WriteData(0xD0); WriteData(0x04); WriteData(0x0D); WriteData(0x11);
WriteData(0x13); WriteData(0x2B); WriteData(0x3F); WriteData(0x54);
WriteData(0x4C); WriteData(0x18); WriteData(0x0D); WriteData(0x0B);
WriteData(0x1F); WriteData(0x23);
// Negative Gamma Correction (E1h) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>٤<EFBFBD><D9A4>
WriteComm(0xE1);
WriteData(0xD0); WriteData(0x04); WriteData(0x0C); WriteData(0x11);
WriteData(0x13); WriteData(0x2C); WriteData(0x3F); WriteData(0x44);
WriteData(0x51); WriteData(0x2F); WriteData(0x1F); WriteData(0x1F);
WriteData(0x20); WriteData(0x23);
// Display Inversion On (21h) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>ST7789 IPS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WriteComm(0x21);
// Display On (29h) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
WriteComm(0x29);
Delay_ms(20);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LCD_Clear(COLOR_BLACK);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD>»<EFBFBD><EFBFBD>ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void LCD_SetWindow(u16 x_start, u16 x_end, u16 y_start, u16 y_end)
{
// <20>ڵײ㴰<D7B2><E3B4B0><EFBFBD><EFBFBD>У<EFBFBD>ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>õ<EFBFBD>͸<EFBFBD><CDB8>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD>
x_start += LCD_X_OFFSET;
x_end += LCD_X_OFFSET;
y_start += LCD_Y_OFFSET;
y_end += LCD_Y_OFFSET;
// д<><D0B4> Column Address Set <20>е<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0x2A)
WriteComm(0x2A);
WriteData((u8)(x_start >> 8));
WriteData((u8)(x_start & 0xFF));
WriteData((u8)(x_end >> 8));
WriteData((u8)(x_end & 0xFF));
// д<><D0B4> Row Address Set <20>е<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0x2B)
WriteComm(0x2B);
WriteData((u8)(y_start >> 8));
WriteData((u8)(y_start & 0xFF));
WriteData((u8)(y_end >> 8));
WriteData((u8)(y_end & 0xFF));
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD>ˢд<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD>Ļ
* @param color 16λ RGB565 <EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*/
void LCD_Clear(u16 color)
{
u16 i, j;
LCD_SetWindow(0, LCD_WIDTH - 1, 0, LCD_HEIGHT - 1);
WriteComm(0x2C); // <20><><EFBFBD><EFBFBD> RAM Write (0x2C) <20>Դ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i = 0; i < LCD_WIDTH; i++)
{
for(j = 0; j < LCD_HEIGHT; j++)
{
WriteData((u8)(color >> 8)); // <20><><EFBFBD><EFBFBD> RGB565 <20><> 8 λ<>ֽ<EFBFBD>
WriteData((u8)(color & 0xFF)); // <20><><EFBFBD><EFBFBD> RGB565 <20><> 8 λ<>ֽ<EFBFBD>
}
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļָ<EFBFBD><EFBFBD><EFBFBD>ӿڻ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ľ<EFBFBD><EFBFBD><EFBFBD>
*/
void LCD_FillRect(u16 x, u16 y, u16 w, u16 h, u16 color)
{
u16 i, count;
u8 ch = (u8)(color >> 8);
u8 cl = (u8)(color & 0xFF);
LCD_SetWindow(x, x + w - 1, y, y + h - 1);
WriteComm(0x2C); // д<><D0B4><EFBFBD>Դ<EFBFBD>
count = w * h; // ʵ<>ľ<EFBFBD><C4BE>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i = 0; i < count; i++)
{
WriteData(ch);
WriteData(cl);
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD>ľ<EFBFBD><EFBFBD>α߽<EFBFBD><EFBFBD><EFBFBD>
* @details ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD> LCD_FillRect ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><EFBFBD>ε<EFBFBD><EFBFBD>ϡ<EFBFBD><EFBFBD>¡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߡ<EFBFBD>
*/
void LCD_DrawRectBorder(u16 x, u16 y, u16 w, u16 h, u16 color)
{
LCD_FillRect(x, y, w, 1, color); // <20>ϱ߿<CFB1><DFBF><EFBFBD>
LCD_FillRect(x, y + h - 1, w, 1, color); // <20>±߿<C2B1><DFBF><EFBFBD>
LCD_FillRect(x, y, 1, h, color); // <20><><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
LCD_FillRect(x + w - 1, y, 1, h, color); // <20>ұ߿<D2B1><DFBF><EFBFBD>
}
/**
* @brief <EFBFBD><EFBFBD>Ⱦ<EFBFBD><EFBFBD>ʾһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD>ģλͼ<EFBFBD><EFBFBD>Դ
* @param x <EFBFBD><EFBFBD>Ⱦ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> X
* @param y <EFBFBD><EFBFBD>Ⱦ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Y
* @param w λͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<EFBFBD><EFBFBD>λ: <EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD>)
* @param h λͼ<EFBFBD>߶<EFBFBD> (<EFBFBD><EFBFBD>λ: <EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD>)
* @param bmp FLASH <EFBFBD>еĵ<EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD> (1<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ)
* @param color 16λǰ<EFBFBD><EFBFBD>ɫ
* @param bg_color 16λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
*/
void LCD_DrawMonoBitmap(u16 x, u16 y, u16 w, u16 h, unsigned char code *bmp, u16 color, u16 bg_color)
{
u16 r, c;
u16 byte_width = (w + 7) / 8; // <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>һ<EFBFBD><D2BB>ͼ<EFBFBD><CDBC>ռ<EFBFBD>õ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
u8 ch = (u8)(color >> 8);
u8 cl = (u8)(color & 0xFF);
u8 bgh = (u8)(bg_color >> 8);
u8 bgl = (u8)(bg_color & 0xFF);
LCD_SetWindow(x, x + w - 1, y, y + h - 1); // <20><><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD>Դ洰<D4B4><E6B4B0>
WriteComm(0x2C);
// Ƕ<><C7B6>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD> 0 <20>е<EFBFBD> 0 <20>п<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
for(r = 0; r < h; r++)
{
for(c = 0; c < w; c++)
{
u16 byte_idx = r * byte_width + (c / 8); // <20><>λ<EFBFBD><CEBB>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ɫͼ<C9AB><CDBC><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
u8 bit_shift = 7 - (c % 8); // <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8>ֽ<EFBFBD><D6BD>ж<EFBFBD>Ӧ<EFBFBD><D3A6> bit λ<><CEBB> (<28><>λ<EFBFBD><CEBB>ǰ)
if(bmp[byte_idx] & (1 << bit_shift))
{
WriteData(ch); // <20><>λΪ 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>ɫ
WriteData(cl);
}
else
{
WriteData(bgh); // <20><>λΪ 0<><30><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>ɫ
WriteData(bgl);
}
}
}
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> 8x16 <EFBFBD>ߴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨӢ<EFBFBD><EFBFBD> ASCII <EFBFBD>ַ<EFBFBD>
* @param ch ASCII <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void LCD_ShowChar8x16(u16 x, u16 y, char ch, u16 color, u16 bg_color)
{
u8 r, c;
u8 char_idx = ch - 0x20; // ƫ<>Ƽ<EFBFBD><C6BC>㣺ASCII <20>ɴ<EFBFBD>ӡ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> 0x20 (<28>ո<EFBFBD>) <20><>ʼ
u8 f_h = (u8)(color >> 8);
u8 f_l = (u8)(color & 0xFF);
u8 b_h = (u8)(bg_color >> 8);
u8 b_l = (u8)(bg_color & 0xFF);
if(ch < 0x20 || ch > 0x7E) return; // <20><><EFBFBD>˲<EFBFBD><CBB2>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
LCD_SetWindow(x, x + 8 - 1, y, y + 16 - 1);
WriteComm(0x2C);
// ѭ<><D1AD> 16 <20>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD> 8x16 <20><><EFBFBD><EFBFBD>
for(r = 0; r < 16; r++)
{
u8 line = FONT_8x16[char_idx][r]; // <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD>ж<EFBFBD>Ӧ<EFBFBD><D3A6> 8 λ<><CEBB>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
for(c = 0; c < 8; c++)
{
// <20>Ӹߵ<D3B8><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ص<EFBFBD>
if(line & (0x80 >> c))
{
WriteData(f_h);
WriteData(f_l);
}
else
{
WriteData(b_h);
WriteData(b_l);
}
}
}
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨӢ<EFBFBD><EFBFBD> ASCII <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD> (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
*/
void LCD_ShowString(u16 x, u16 y, char *str, u16 color, u16 bg_color)
{
while(*str)
{
LCD_ShowChar8x16(x, y, *str, color, bg_color); // <20><>Ⱦ<EFBFBD><C8BE>ǰ<EFBFBD>ַ<EFBFBD>
x += 8; // X <20><><EFBFBD><EFBFBD>ʼλ<CABC><CEBB>ƫ<EFBFBD><C6AB> 8 <20><><EFBFBD>أ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD>
str++; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD>
}
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD> Y <EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ˮƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
*/
void LCD_ShowStringCentered(u16 y, char *str, u16 color, u16 bg_color)
{
u16 len = 0;
char *p = str;
while(*p++) len++; // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(len * 8 >= LCD_WIDTH)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>Ч<EFBFBD><D0A7><EFBFBD>ȣ<EFBFBD>ǿ<EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LCD_ShowString(0, y, str, color, bg_color);
else
// <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ʽ (LCD_WIDTH - <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>) / 2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˮƽ<CBAE><C6BD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼƫ<CABC><C6AB> X <20><><EFBFBD><EFBFBD><EAB2A2>Ⱦ
LCD_ShowString((LCD_WIDTH - len * 8) / 2, y, str, color, bg_color);
}
/**
* @brief <EFBFBD><EFBFBD>Ⱦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> 16x32 <EFBFBD>ߴ<EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
*/
void LCD_ShowChar16x32(u16 x, u16 y, char ch, u16 color, u16 bg_color)
{
u8 r, c, i, j;
u8 val_bit;
u8 char_idx = ch - 0x20;
u8 f_h = (u8)(color >> 8);
u8 f_l = (u8)(color & 0xFF);
u8 b_h = (u8)(bg_color >> 8);
u8 b_l = (u8)(bg_color & 0xFF);
if(ch < 0x20 || ch > 0x7E) return;
LCD_SetWindow(x, x + 16 - 1, y, y + 32 - 1); // <20><><EFBFBD><EFBFBD> 16x32 <20>Ļ<EFBFBD>ͼ<EFBFBD>Ӵ<EFBFBD>
WriteComm(0x2C);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD> 16 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> data
for(r = 0; r < 16; r++)
{
u8 line = FONT_8x16[char_idx][r];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B7AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (i = 0 <20><> i = 1)
for(i = 0; i < 2; i++)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> 8 <20><> bit <20><><EFBFBD>ص<EFBFBD>
for(c = 0; c < 8; c++)
{
val_bit = (line & (0x80 >> c));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B7AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4> 2 <20><> (j = 0 <20><> j = 1)
for(j = 0; j < 2; j++)
{
if(val_bit)
{
WriteData(f_h);
WriteData(f_l);
}
else
{
WriteData(b_h);
WriteData(b_l);
}
}
}
}
}
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> 16x32 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/Ӣ<EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>
*/
void LCD_ShowString16x32(u16 x, u16 y, char *str, u16 color, u16 bg_color)
{
while(*str)
{
LCD_ShowChar16x32(x, y, *str, color, bg_color);
x += 16; // ÿ<><C3BF><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> 16 <20><><EFBFBD><EFBFBD>
str++;
}
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD> Y <EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><EFBFBD>ϣ<EFBFBD>ˮƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD><EFBFBD>ʾ<EFBFBD>ش<EFBFBD> 16x32 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
*/
void LCD_ShowString16x32Centered(u16 y, char *str, u16 color, u16 bg_color)
{
u16 len = 0;
char *p = str;
while(*p++) len++; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(len * 16 >= LCD_WIDTH)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LCD_ShowString16x32(0, y, str, color, bg_color);
else
// ˮƽ<CBAE><C6BD><EFBFBD>м<EFBFBD><D0BC><EFBFBD>
LCD_ShowString16x32((LCD_WIDTH - len * 16) / 2, y, str, color, bg_color);
}