爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
不知道有没有人点过,恰巧手里有一个这玩意,就点了一下。
地上捡了个工行u盾,开机显示金融@家,然后就什么也不动了,不知道好坏,决定拆屏幕玩玩 外壳这样 
背面 
屏幕共10pin,测得4脚为gnd,其他未知 一古脑飞线出所有的pin,接逻辑分析仪 
开机捕获波形,然后得出结果如下(含之后stm8接线): 
然后拆下来焊转接板上,接stm8,刷固件点亮,一次成功: 

驱动程序如下 - /*
- * STM8S105K4T6 — ST7565-family SPI driver for FPC-G18019E-ZH-10pin
- *
- * Init sequence captured from original board boot (see ../notes/LA_BOOT.md).
- * Default pins: CS=PC3 A0=PC4 SCLK=PC5 MOSI=PC6 RST=PC7
- */
- #include <stdint.h>
- #define _SFR(addr) (*(volatile uint8_t *)(addr))
- #define CLK_CKDIVR _SFR(0x50C6)
- #define PC_ODR _SFR(0x500A)
- #define PC_DDR _SFR(0x500C)
- #define PC_CR1 _SFR(0x500D)
- #define LCD_W 128u
- #define LCD_H 64u
- #define LCD_PAGES (LCD_H / 8u)
- /* PC3..PC7 */
- #define PIN_CS (1u << 3)
- #define PIN_A0 (1u << 4)
- #define PIN_SCLK (1u << 5)
- #define PIN_MOSI (1u << 6)
- #define PIN_RST (1u << 7)
- #define PIN_ALL (PIN_CS | PIN_A0 | PIN_SCLK | PIN_MOSI | PIN_RST)
- static void delay_ms(uint16_t ms)
- {
- /* Rough busy-wait after CKDIVR=0 (fCPU ≈ 16 MHz HSI). */
- while (ms--) {
- uint16_t n = 1600u;
- while (n--) {
- __asm__("nop");
- }
- }
- }
- static void gpio_init(void)
- {
- CLK_CKDIVR = 0x00u; /* fCPU = fHSI = 16 MHz */
- PC_DDR |= PIN_ALL;
- PC_CR1 |= PIN_ALL;
- PC_ODR |= PIN_CS | PIN_A0 | PIN_SCLK | PIN_RST;
- PC_ODR &= (uint8_t)~PIN_MOSI;
- }
- static void spi_write_byte(uint8_t v)
- {
- uint8_t i;
- for (i = 0u; i < 8u; i++) {
- if (v & 0x80u)
- PC_ODR |= PIN_MOSI;
- else
- PC_ODR &= (uint8_t)~PIN_MOSI;
- PC_ODR |= PIN_SCLK;
- __asm__("nop");
- __asm__("nop");
- PC_ODR &= (uint8_t)~PIN_SCLK;
- v <<= 1;
- }
- }
- static void lcd_cmd(uint8_t c)
- {
- PC_ODR &= (uint8_t)~PIN_CS;
- PC_ODR &= (uint8_t)~PIN_A0;
- spi_write_byte(c);
- PC_ODR |= PIN_CS;
- }
- static void lcd_data(uint8_t d)
- {
- PC_ODR &= (uint8_t)~PIN_CS;
- PC_ODR |= PIN_A0;
- spi_write_byte(d);
- PC_ODR |= PIN_CS;
- }
- static void lcd_data_buf(const uint8_t *p, uint8_t n)
- {
- PC_ODR &= (uint8_t)~PIN_CS;
- PC_ODR |= PIN_A0;
- while (n--)
- spi_write_byte(*p++);
- PC_ODR |= PIN_CS;
- }
- static void lcd_set_pos(uint8_t page, uint8_t col)
- {
- lcd_cmd((uint8_t)(0xB0u | (page & 0x0Fu)));
- lcd_cmd((uint8_t)(0x10u | ((col >> 4) & 0x0Fu)));
- lcd_cmd((uint8_t)(0x00u | (col & 0x0Fu)));
- }
- /* Exact command sequence from original boot capture */
- static void lcd_init(void)
- {
- PC_ODR |= PIN_RST;
- delay_ms(10u);
- PC_ODR &= (uint8_t)~PIN_RST;
- delay_ms(5u);
- PC_ODR |= PIN_RST;
- delay_ms(10u);
- lcd_cmd(0xE2u); /* SW reset */
- delay_ms(10u);
- lcd_cmd(0xA2u); /* bias 1/9 */
- lcd_cmd(0xA0u); /* ADC normal */
- lcd_cmd(0xC8u); /* COM reverse */
- lcd_cmd(0xA4u); /* display from RAM */
- lcd_cmd(0xA6u); /* normal (not reverse video) */
- lcd_cmd(0x24u); /* regulator resistor ratio */
- lcd_cmd(0x81u); /* electronic volume */
- lcd_cmd(0x25u);
- lcd_cmd(0xF8u); /* booster ratio */
- lcd_cmd(0x00u);
- lcd_cmd(0x2Cu);
- delay_ms(5u);
- lcd_cmd(0x2Eu);
- delay_ms(5u);
- lcd_cmd(0x2Fu); /* power all on */
- delay_ms(10u);
- lcd_cmd(0x40u); /* start line 0 */
- lcd_cmd(0xAFu); /* display ON */
- }
- static void lcd_fill(uint8_t v)
- {
- uint8_t page;
- uint8_t col;
- uint8_t line[LCD_W];
- for (col = 0u; col < LCD_W; col++)
- line[col] = v;
- for (page = 0u; page < LCD_PAGES; page++) {
- lcd_set_pos(page, 0u);
- lcd_data_buf(line, LCD_W);
- }
- }
- static void lcd_checkerboard(void)
- {
- uint8_t page;
- uint8_t col;
- uint8_t line[LCD_W];
- for (page = 0u; page < LCD_PAGES; page++) {
- for (col = 0u; col < LCD_W; col++) {
- uint8_t on = ((col >> 3) ^ page) & 1u;
- line[col] = on ? 0xFFu : 0x00u;
- }
- lcd_set_pos(page, 0u);
- lcd_data_buf(line, LCD_W);
- }
- }
- /* 5x7 glyphs in 8-tall pages; columns packed MSB=top unused bit0..6 used */
- static const uint8_t FONT5[][5] = {
- { 0x3E, 0x51, 0x49, 0x45, 0x3E }, /* 0 */
- { 0x00, 0x42, 0x7F, 0x40, 0x00 }, /* 1 */
- { 0x42, 0x61, 0x51, 0x49, 0x46 }, /* 2 */
- { 0x21, 0x41, 0x45, 0x4B, 0x31 }, /* 3 */
- { 0x18, 0x14, 0x12, 0x7F, 0x10 }, /* 4 */
- { 0x27, 0x45, 0x45, 0x45, 0x39 }, /* 5 */
- { 0x3C, 0x4A, 0x49, 0x49, 0x30 }, /* 6 */
- { 0x01, 0x71, 0x09, 0x05, 0x03 }, /* 7 */
- { 0x36, 0x49, 0x49, 0x49, 0x36 }, /* 8 */
- { 0x06, 0x49, 0x49, 0x29, 0x1E }, /* 9 */
- { 0x7E, 0x11, 0x11, 0x11, 0x7E }, /* A */
- { 0x7F, 0x49, 0x49, 0x49, 0x36 }, /* B */
- { 0x3E, 0x41, 0x41, 0x41, 0x22 }, /* C */
- { 0x7F, 0x41, 0x41, 0x22, 0x1C }, /* D */
- { 0x7F, 0x49, 0x49, 0x49, 0x41 }, /* E */
- { 0x7F, 0x09, 0x09, 0x09, 0x01 }, /* F */
- { 0x3E, 0x41, 0x49, 0x49, 0x7A }, /* G */
- { 0x7F, 0x08, 0x08, 0x08, 0x7F }, /* H */
- { 0x00, 0x41, 0x7F, 0x41, 0x00 }, /* I */
- { 0x20, 0x40, 0x41, 0x3F, 0x01 }, /* J */
- { 0x7F, 0x08, 0x14, 0x22, 0x41 }, /* K */
- { 0x7F, 0x40, 0x40, 0x40, 0x40 }, /* L */
- { 0x7F, 0x02, 0x0C, 0x02, 0x7F }, /* M */
- { 0x7F, 0x04, 0x08, 0x10, 0x7F }, /* N */
- { 0x3E, 0x41, 0x41, 0x41, 0x3E }, /* O */
- { 0x7F, 0x09, 0x09, 0x09, 0x06 }, /* P */
- { 0x3E, 0x41, 0x51, 0x21, 0x5E }, /* Q */
- { 0x7F, 0x09, 0x19, 0x29, 0x46 }, /* R */
- { 0x46, 0x49, 0x49, 0x49, 0x31 }, /* S */
- { 0x01, 0x01, 0x7F, 0x01, 0x01 }, /* T */
- { 0x3F, 0x40, 0x40, 0x40, 0x3F }, /* U */
- { 0x1F, 0x20, 0x40, 0x20, 0x1F }, /* V */
- { 0x3F, 0x40, 0x38, 0x40, 0x3F }, /* W */
- { 0x63, 0x14, 0x08, 0x14, 0x63 }, /* X */
- { 0x07, 0x08, 0x70, 0x08, 0x07 }, /* Y */
- { 0x61, 0x51, 0x49, 0x45, 0x43 }, /* Z */
- { 0x00, 0x00, 0x00, 0x00, 0x00 }, /* space */
- };
- static uint8_t glyph_index(char c)
- {
- if (c >= '0' && c <= '9')
- return (uint8_t)(c - '0');
- if (c >= 'A' && c <= 'Z')
- return (uint8_t)(10u + (c - 'A'));
- if (c >= 'a' && c <= 'z')
- return (uint8_t)(10u + (c - 'a'));
- return 36u; /* space */
- }
- static void lcd_draw_char(uint8_t page, uint8_t col, char c)
- {
- uint8_t idx = glyph_index(c);
- lcd_set_pos(page, col);
- lcd_data_buf(FONT5[idx], 5u);
- lcd_data(0x00u);
- }
- static void lcd_draw_str(uint8_t page, uint8_t col, const char *s)
- {
- while (*s) {
- lcd_draw_char(page, col, *s++);
- col = (uint8_t)(col + 6u);
- if (col > LCD_W - 6u)
- break;
- }
- }
- static void lcd_hline_page(uint8_t page, uint8_t col0, uint8_t col1, uint8_t mask)
- {
- uint8_t col;
- lcd_set_pos(page, col0);
- for (col = col0; col <= col1; col++)
- lcd_data(mask);
- }
- void main(void)
- {
- gpio_init();
- lcd_init();
- lcd_fill(0x00u);
- delay_ms(200u);
- lcd_draw_str(0u, 8u, "G18019E");
- lcd_draw_str(2u, 8u, "ST7565");
- lcd_draw_str(4u, 8u, "128x64");
- lcd_hline_page(6u, 0u, 127u, 0x18u);
- delay_ms(4000u);
- lcd_checkerboard();
- for (;;) {
- delay_ms(2500u);
- lcd_fill(0xFFu);
- delay_ms(500u);
- lcd_fill(0x00u);
- delay_ms(500u);
- lcd_draw_str(1u, 16u, "OK");
- lcd_draw_str(3u, 4u, "STM8S105");
- delay_ms(2500u);
- lcd_checkerboard();
- }
- }
复制代码
|