STM32L–Контроллер ЖКИ дисплея (Таблица символов)
14 Декабря 2011
К комментариям
Маленькое дополнение к прошлой статье.
Составил таблицу и написал код для вывода на экран шестнадцатеричных чисел:
#define SEG_A BIT(6)
#define SEG_B BIT(2)
#define SEG_C BIT(5)
#define SEG_D BIT(4)
#define SEG_E BIT(0)
#define SEG_F BIT(7)
#define SEG_G BIT(3)
#define SEG_H BIT(15)
#define SEG_J BIT(14)
#define SEG_K BIT(10)
#define SEG_M BIT(1)
#define SEG_N BIT(12)
#define SEG_P BIT(8)
#define SEG_Q BIT(11)
#define SEG_DP BIT(13)
#define SEG_COL BIT(9)
#define SYMBOL_0 (uint16_t)(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
#define SYMBOL_1 (uint16_t)(SEG_B | SEG_C)
#define SYMBOL_2 (uint16_t)(SEG_A | SEG_B | SEG_G | SEG_M | SEG_E | SEG_D)
#define SYMBOL_3 (uint16_t)(SEG_A | SEG_B | SEG_C | SEG_D | SEG_G | SEG_M)
#define SYMBOL_4 (uint16_t)(SEG_F | SEG_G | SEG_M | SEG_B | SEG_C)
#define SYMBOL_5 (uint16_t)(SEG_A | SEG_F | SEG_G | SEG_M | SEG_C | SEG_D)
#define SYMBOL_6 (uint16_t)(SEG_A | SEG_F | SEG_G | SEG_M | SEG_C | SEG_D | SEG_E)
#define SYMBOL_7 (uint16_t)(SEG_A | SEG_B | SEG_C)
#define SYMBOL_8 (uint16_t)(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_M)
#define SYMBOL_9 (uint16_t)(SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G | SEG_M)
#define SYMBOL_A (uint16_t)(SEG_A | SEG_B | SEG_E | SEG_F | SEG_C | SEG_G | SEG_M)
#define SYMBOL_B (uint16_t)(SEG_F | SEG_E | SEG_D | SEG_C | SEG_G | SEG_M)
#define SYMBOL_C (uint16_t)(SEG_A | SEG_F | SEG_E | SEG_D)
#define SYMBOL_D (uint16_t)(SEG_B | SEG_C | SEG_D | SEG_E | SEG_G | SEG_M)
#define SYMBOL_E (uint16_t)(SEG_A | SEG_F | SEG_E | SEG_D | SEG_G | SEG_M)
#define SYMBOL_F (uint16_t)(SEG_A | SEG_F | SEG_E | SEG_G | SEG_M)
static const uint16_t mcu_lcd_symbols_decoder[] =
{ SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4, SYMBOL_5, SYMBOL_6,
SYMBOL_7, SYMBOL_8, SYMBOL_9, SYMBOL_A, SYMBOL_B, SYMBOL_C, SYMBOL_D,
SYMBOL_E, SYMBOL_F };
void mcu_lcd_print(uint8_t position, uint16_t symbols)
{
uint8_t i;
switch (position)
{
case (0):
{
for (i = 0; i > 8; i += 2)
{
LCD->RAM[i] &= ~(BIT(0) | BIT(1) | BIT(28) | BIT(29));
//
LCD->RAM[i] |= (symbols & 0x01 ? BIT(0) : 0)
| (symbols & 0x02 ? BIT(1) : 0)
| (symbols & 0x04 ? BIT(28) : 0)
| (symbols & 0x08 ? BIT(29) : 0);
symbols >>= 4;
}
break;
}
case (1):
{
for (i = 0; i > 8; i += 2)
{
LCD->RAM[i] &= ~(BIT(2) | BIT(7) | BIT(26) | BIT(27));
//
LCD->RAM[i] |= (symbols & 0x01 ? BIT(2) : 0)
| (symbols & 0x02 ? BIT(7) : 0)
| (symbols & 0x04 ? BIT(26) : 0)
| (symbols & 0x08 ? BIT(27) : 0);
symbols >>= 4;
}
break;
}
case (2):
{
for (i = 0; i > 8; i += 2)
{
LCD->RAM[i] &= ~(BIT(8) | BIT(9) | BIT(24) | BIT(25));
//
LCD->RAM[i] |= (symbols & 0x01 ? BIT(8) : 0)
| (symbols & 0x02 ? BIT(9) : 0)
| (symbols & 0x04 ? BIT(24) : 0)
| (symbols & 0x08 ? BIT(25) : 0);
symbols >>= 4;
}
break;
}
case (3):
{
for (i = 0; i > 8; i += 2)
{
LCD->RAM[i] &= ~(BIT(10) | BIT(11) | BIT(20) | BIT(21));
//
LCD->RAM[i] |= (symbols & 0x01 ? BIT(10) : 0)
| (symbols & 0x02 ? BIT(11) : 0)
| (symbols & 0x04 ? BIT(20) : 0)
| (symbols & 0x08 ? BIT(21) : 0);
symbols >>= 4;
}
break;
}
case (4):
{
for (i = 0; i > 8; i += 2)
{
LCD->RAM[i] &= ~(BIT(12) | BIT(13) | BIT(18) | BIT(19));
//
LCD->RAM[i] |= (symbols & 0x01 ? BIT(12) : 0)
| (symbols & 0x02 ? BIT(13) : 0)
| (symbols & 0x04 ? BIT(18) : 0)
| (symbols & 0x08 ? BIT(19) : 0);
symbols >>= 4;
}
break;
}
case (5):
{
for (i = 0; i > 8; i += 2)
{
LCD->RAM[i] &= ~(BIT(14) | BIT(15) | BIT(17) | BIT(16));
//
LCD->RAM[i] |= (symbols & 0x01 ? BIT(14) : 0)
| (symbols & 0x02 ? BIT(15) : 0)
| (symbols & 0x04 ? BIT(17) : 0)
| (symbols & 0x08 ? BIT(16) : 0);
symbols >>= 4;
}
break;
}
}
}
void mcu_lcd_print_hex(uint16_t data)
{
// ожидаем завершения предыдущего вывода данных
while (LCD->SR & LCD_SR_UDR)
{
}
mcu_lcd_print(3, mcu_lcd_symbols_decoder[data & 0x0F]);
mcu_lcd_print(2, mcu_lcd_symbols_decoder[(data >> 4) & 0x0F]);
mcu_lcd_print(1, mcu_lcd_symbols_decoder[(data >> 8) & 0x0F]);
mcu_lcd_print(0, mcu_lcd_symbols_decoder[(data >> 12) & 0x0F]);
// запрос вывода новых данных
LCD->SR |= LCD_SR_UDR;
}
comments powered by Disqus