#include "JLX240-00301-BN.h" #include "main.h" #include "stdio.h" #include "stm32f407xx.h" #include "mux_signal.h" #include "tm1650.h" // LCM resolution:240x320, // driver IC:ST7789V, #include typedef struct { GPIO_TypeDef *port; uint16_t pin; } st_lcd_data; st_lcd_data lcd_data[8] = { {LCD_DB0_GPIO_Port, LCD_DB0_Pin}, {LCD_DB1_GPIO_Port, LCD_DB1_Pin}, {LCD_DB2_GPIO_Port, LCD_DB2_Pin}, {LCD_DB3_GPIO_Port, LCD_DB3_Pin}, {LCD_DB4_GPIO_Port, LCD_DB4_Pin}, {LCD_DB5_GPIO_Port, LCD_DB5_Pin}, {LCD_DB6_GPIO_Port, LCD_DB6_Pin}, {LCD_DB7_GPIO_Port, LCD_DB7_Pin}, }; static void lcd_data2pin(uint8_t *data) { if (!data) return; uint8_t i; uint8_t data_temp; data_temp = *data; for (i = 0; i < 8; i++) { if (data_temp & 0x01) HAL_GPIO_WritePin(lcd_data[i].port, lcd_data[i].pin, GPIO_PIN_SET); else HAL_GPIO_WritePin(lcd_data[i].port, lcd_data[i].pin, GPIO_PIN_RESET); data_temp >>= 1; } } void transfer_command(uint8_t com1) { CS_RESET(); // CS0 = 0; RS_RESET(); // DC0 = 0; RD_SET(); // RD0 = 1; lcd_data2pin(&com1); // P1 = com1; WR_RESET(); // WR0 = 0; WR_RESET(); // delay_us(1); WR_SET(); // WR0 = 1; CS_SET(); // CS0 = 1; } void transfer_data(uint8_t data1) { CS_RESET(); // CS0 = 0; RS_SET(); // DC0 = 1; RD_SET(); // RD0 = 1; lcd_data2pin(&data1); // P1 = data1; WR_RESET(); // WR0 = 0; WR_RESET(); // WR0 = 0; WR_SET(); // WR0 = 1; CS_SET(); // CS0 = 1; } // 杩炲啓2锟???瀛楄妭锛堝嵆16浣嶏級鏁版嵁鍒癓CD妯″潡 void transfer_data_16(uint16_t data_16bit) { transfer_data(data_16bit >> 8); transfer_data(data_16bit); } void delay(long i) { int j, k; for (j = 0; j < i; j++) for (k = 0; k < 110; k++) ; } void delay_us(long i) { int j, k; for (j = 0; j < i; j++) ; for (k = 0; k < 1; k++) ; } // uint8_t key = 0; void Switch() { repeat: if (key == 1) goto repeat; else delay(1000); if (key) goto repeat; else ; } void lcd_initial() { RST_RESET(); // reset = 0; delay(200); RST_SET(); // reset = 1; delay(200); //------------------------------display and color format setting--------------------------------// transfer_command(0x36); // 琛屾壂鎻忛『搴忓強RGB锛屽垪锟???鎻忛『搴忥紝锟???锟???/绔栨斁 transfer_data(0x00); transfer_data(0x48); transfer_command(0xB6); // 鏄剧ず鍔熻兘璁剧疆锛氬垪/锟??? 鏄剧ず椤哄簭 transfer_data(0x0A); transfer_data(0x82); // 鏀瑰彉SOURCE绾跨殑鏂瑰悜锟???0xa2锛氬乏鍒板彸锟???0x82锛氬彸鍒板乏 transfer_command(0x3a); // 256K 16bit/pixel transfer_data(0x05); //--------------------------------ST7789V Frame rate setting----------------------------------// transfer_command(0xb2); transfer_data(0x0c); transfer_data(0x0c); transfer_data(0x00); transfer_data(0x33); transfer_data(0x33); transfer_command(0xb7); transfer_data(0x35); //---------------------------------ST7789V Power setting--------------------------------------// transfer_command(0xbb); transfer_data(0x28); transfer_command(0xc0); transfer_data(0x2c); transfer_command(0xc2); transfer_data(0x01); transfer_command(0xc3); transfer_data(0x10); transfer_command(0xc4); transfer_data(0x20); transfer_command(0xc6); transfer_data(0x0f); transfer_command(0xd0); transfer_data(0xa4); transfer_data(0xa1); //--------------------------------ST7789V gamma setting---------------------------------------// transfer_command(0xe0); transfer_data(0xd0); transfer_data(0x00); transfer_data(0x02); transfer_data(0x07); transfer_data(0x0a); transfer_data(0x28); transfer_data(0x32); transfer_data(0x44); transfer_data(0x42); transfer_data(0x06); transfer_data(0x0e); transfer_data(0x12); transfer_data(0x14); transfer_data(0x17); transfer_command(0xe1); transfer_data(0xd0); transfer_data(0x00); transfer_data(0x02); transfer_data(0x07); transfer_data(0x0a); transfer_data(0x28); transfer_data(0x31); transfer_data(0x54); transfer_data(0x47); transfer_data(0x0e); transfer_data(0x1c); transfer_data(0x17); transfer_data(0x1b); transfer_data(0x1e); transfer_command(0x11); // 閫€鍑虹潯锟??? delay(200); transfer_command(0x29); // 鎵撳紑鏄剧ず } // 瀹氫箟绐楀彛鍧愭爣锛氬紑濮嬪潗鏍囷紙XS,YS)浠ュ強绐楀彛澶у皬锛坸_total,y_total) void lcd_address(int XS, int YS, int x_total, int y_total) { int XE, YE; XE = XS + x_total - 1; YE = YS + y_total - 1; transfer_command(0x2a); // 璁剧疆X寮€濮嬪強缁撴潫鐨勫湴鍧€ transfer_data_16(XS); // X寮€濮嬪湴鍧€(16浣嶏級 transfer_data_16(XE); // X缁撴潫鍦板潃(16浣嶏級 transfer_command(0x2b); // 璁剧疆Y寮€濮嬪強缁撴潫鐨勫湴鍧€ transfer_data_16(YS); // Y寮€濮嬪湴鍧€(16浣嶏級 transfer_data_16(YE); // Y缁撴潫鍦板潃(16浣嶏級 transfer_command(0x2c); // 鍐欐暟锟???寮€锟??? } void mono_transfer_data_16(int mono_data, int font_color, int back_color) { int i; for (i = 0; i < 8; i++) { if (mono_data & 0x80) { transfer_data_16(font_color); // 褰撴暟锟???锟???1鏃讹紝鏄剧ず瀛椾綋棰滆壊 } else { transfer_data_16(back_color); // 褰撴暟锟???锟???0鏃讹紝鏄剧ず搴曡壊 } mono_data <<= 1; } } // 鍏ㄥ睆鏄剧ず涓€绉嶏拷?锟借壊 void display_color(int color_data) { int i, j; lcd_address(0, 0, 240, 320); for (i = 0; i < 240; i++) { for (j = 0; j < 320; j++) { transfer_data_16(color_data); } } } void display_black(void) { int i, j, k; transfer_command(0x2c); // 鍐欐暟锟???寮€锟??? for (i = 0; i < 240; i++) { transfer_data_16(0xffff); } for (i = 0; i < 318; i++) { for (k = 0; k < 1; k++) { transfer_data_16(0xffff); } for (j = 0; j < 238; j++) { transfer_data_16(0x0000); } for (k = 0; k < 1; k++) { transfer_data_16(0xffff); } } for (i = 0; i < 320; i++) { transfer_data_16(0xffff); } } // 鏄剧ず8x16鐐归樀鐨勫瓧绗︿覆 void disp_string_8x16(int x, int y, const char *text, int font_color, int back_color) { int i = 0, j, k; while (text[i] > 0x00) { if ((text[i] >= 0x20) && (text[i] <= 0x7e)) { j = text[i] - 0x20; lcd_address(x, y, 8, 16); for (k = 0; k < 16; k++) { mono_transfer_data_16(ascii_table_8x16[j * 16 + k], font_color, back_color); //?a??"ascii_table_8x16[]"?a??锚y脳茅?煤"ASCII_TABLE_5X8_8X16_horizontal.h"脿? } x += 8; i++; } else i++; } } void display_string_16x16(int x, int y, const char *text, int font_color, int back_color) { uchar i, j, k; uint address; j = 0; while (text[j] != '\0') //'\0' 瀛楋拷?锟戒覆缁撴潫鏍囧織 { i = 0; address = 1; while (Chinese_horizontal_text_16x16[i] > 0x7e) // >0x7f鍗筹拷?锟芥槑涓嶆槸ASCII鐮佸瓧锟??? { if (Chinese_horizontal_text_16x16[i] == text[j]) { if (Chinese_horizontal_text_16x16[i + 1] == text[j + 1]) { address = i * 16; break; } } i += 2; } if (y > 320) { y = 0; x += 16; } if (address != 1) // 鏄剧ず姹夊瓧 { lcd_address(x, y, 16, 16); for (i = 0; i < 2; i++) { for (k = 0; k < 16; k++) { mono_transfer_data_16(Chinese_horizontal_code_16x16[address], font_color, back_color); address++; } } j += 2; } else // 鏄剧ず绌虹櫧瀛楋拷?? { lcd_address(x, y, 16, 16); for (i = 0; i < 2; i++) { for (k = 0; k < 16; k++) { mono_transfer_data_16(0x00, font_color, back_color); } } j += 2; } x = x + 16; } } // 鏄剧ず32x32鐐归樀鐨勫崟鑹茬殑鍥惧儚 void disp_32x32(int x, int y, const char *dp, int font_color, int back_color) { int i, j; lcd_address(x, y, 32, 32); for (i = 0; i < 32; i++) { for (j = 0; j < 4; j++) { mono_transfer_data_16(*dp, font_color, back_color); dp++; } } } // 鏄剧ず涓€骞呭僵锟??? void display_image(int x, int y, const uchar *dp) { uchar i, j, k = 0; lcd_address(x, y, 120, 160); for (i = 0; i < 120; i++) { for (j = 0; j < 160; j++) { transfer_data(*dp); // 浼犱竴锟???鍍忕礌鐨勫浘鐗囨暟锟???鐨勯珮锟??? dp++; transfer_data(*dp); // 浼犱竴锟???鍍忕礌鐨勫浘鐗囨暟锟???鐨勪綆锟??? dp++; } } } void lcd_menu(void) { static uint8_t init_flag = 0; char content[128]; if (init_flag == 0) { init_flag = 1; display_color(blue); } sprintf(content, "AI:ch[%02d] vol[%2.4f]V.", mux_signal.channel, mux_signal.data_sv / 1000.0f); disp_string_8x16(10, 10, content, white, blue); sprintf(content, "AO:ch[%02d] vol[%2.4f]V.", mux_signal.channel, mux_signal.data_sv / 1000.0f); disp_string_8x16(10, 30, content, white, blue); sprintf(content, "AI:ch[%02d] vol[%2.4f]V.", mux_signal.channel, mux_signal.data_sv / 1000.0f); disp_string_8x16(10, 50, content, white, blue); sprintf(content, "AO:ch[%02d] vol[%2.4f]V.", mux_signal.channel, mux_signal.data_sv / 1000.0f); disp_string_8x16(10, 70, content, white, blue); }