mirror of
https://github.com/eddyem/STM8_samples.git
synced 2025-12-06 02:35:21 +03:00
add LCD 5110
This commit is contained in:
parent
5b3733f12d
commit
6afd060f98
37
uart_lcd5110/Makefile
Normal file
37
uart_lcd5110/Makefile
Normal file
@ -0,0 +1,37 @@
|
||||
NAME=uartlcd
|
||||
SDCC=sdcc
|
||||
|
||||
CCFLAGS=-DSTM8S105 -I../ -I/usr/share/sdcc/include -mstm8 --out-fmt-ihx
|
||||
LDFLAGS= -mstm8 --out-fmt-ihx -lstm8
|
||||
FLASHFLAGS=-cstlinkv2 -pstm8s105?4
|
||||
|
||||
SRC=$(wildcard *.c)
|
||||
|
||||
OBJ=$(SRC:%.c=%.rel)
|
||||
TRASH=$(OBJ) $(SRC:%.c=%.rst) $(SRC:%.c=%.asm) $(SRC:%.c=%.lst)
|
||||
TRASH+=$(SRC:%.c=%.sym) $(NAME).lk $(NAME).map
|
||||
INDEPENDENT_HEADERS=../stm8l.h ports_definition.h Makefile
|
||||
|
||||
all: $(NAME).ihx
|
||||
|
||||
#$(SRC) : %.c : %.h $(INDEPENDENT_HEADERS)
|
||||
# @touch $@
|
||||
#
|
||||
#%.h: ;
|
||||
|
||||
clean:
|
||||
rm -f $(TRASH)
|
||||
|
||||
load: $(NAME).ihx
|
||||
stm8flash $(FLASHFLAGS) -w $(NAME).ihx
|
||||
|
||||
%.rel: %.c
|
||||
$(SDCC) $(CCFLAGS) -c $<
|
||||
|
||||
$(NAME).ihx: $(OBJ)
|
||||
$(SDCC) $(LDFLAGS) $(OBJ) -o $(NAME).ihx
|
||||
|
||||
bin: $(NAME).ihx
|
||||
hex2bin $(NAME).ihx
|
||||
|
||||
.PHONY: all
|
||||
260
uart_lcd5110/font.c
Normal file
260
uart_lcd5110/font.c
Normal file
@ -0,0 +1,260 @@
|
||||
/*
|
||||
* font.c - russian font
|
||||
*
|
||||
* Copyright 2015 Edward V. Emelianoff <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "font.h"
|
||||
|
||||
const U8 rusfont [] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// 32 [0x20] -
|
||||
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,// 33 [0x21] - !
|
||||
0x00, 0x07, 0x00, 0x07, 0x00, 0x00,// 34 [0x22] - "
|
||||
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,// 35 [0x23] - #
|
||||
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,// 36 [0x24] - $
|
||||
0x23, 0x13, 0x08, 0x64, 0x62, 0x00,// 37 [0x25] - %
|
||||
0x36, 0x49, 0x55, 0x22, 0x50, 0x00,// 38 [0x26] - &
|
||||
0x00, 0x05, 0x03, 0x00, 0x00, 0x00,// 39 [0x27] - '
|
||||
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,// 40 [0x28] - (
|
||||
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,// 41 [0x29] - )
|
||||
0x08, 0x2A, 0x1C, 0x2A, 0x08, 0x00,// 42 [0x2a] - *
|
||||
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,// 43 [0x2b] - +
|
||||
0x00, 0x50, 0x30, 0x00, 0x00, 0x00,// 44 [0x2c] - ,
|
||||
0x08, 0x08, 0x08, 0x08, 0x08, 0x00,// 45 [0x2d] - -
|
||||
0x00, 0x60, 0x60, 0x00, 0x00, 0x00,// 46 [0x2e] - .
|
||||
0x20, 0x10, 0x08, 0x04, 0x02, 0x00,// 47 [0x2f] - /
|
||||
0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,// 48 [0x30] - 0
|
||||
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,// 49 [0x31] - 1
|
||||
0x42, 0x61, 0x51, 0x49, 0x46, 0x00,// 50 [0x32] - 2
|
||||
0x21, 0x41, 0x45, 0x4B, 0x31, 0x00,// 51 [0x33] - 3
|
||||
0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,// 52 [0x34] - 4
|
||||
0x27, 0x45, 0x45, 0x45, 0x39, 0x00,// 53 [0x35] - 5
|
||||
0x3C, 0x4A, 0x49, 0x49, 0x30, 0x00,// 54 [0x36] - 6
|
||||
0x01, 0x71, 0x09, 0x05, 0x03, 0x00,// 55 [0x37] - 7
|
||||
0x36, 0x49, 0x49, 0x49, 0x36, 0x00,// 56 [0x38] - 8
|
||||
0x06, 0x49, 0x49, 0x29, 0x1E, 0x00,// 57 [0x39] - 9
|
||||
0x00, 0x36, 0x36, 0x00, 0x00, 0x00,// 58 [0x3a] - :
|
||||
0x00, 0x56, 0x36, 0x00, 0x00, 0x00,// 59 [0x3b] - ;
|
||||
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// 60 [0x3c] - <
|
||||
0x14, 0x14, 0x14, 0x14, 0x14, 0x00,// 61 [0x3d] - =
|
||||
0x41, 0x22, 0x14, 0x08, 0x00, 0x00,// 62 [0x3e] - >
|
||||
0x02, 0x01, 0x51, 0x09, 0x06, 0x00,// 63 [0x3f] - ?
|
||||
0x32, 0x49, 0x79, 0x41, 0x3E, 0x00,// 64 [0x40] - @
|
||||
0x7E, 0x11, 0x11, 0x11, 0x7E, 0x00,// 65 [0x41] - A
|
||||
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,// 66 [0x42] - B
|
||||
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,// 67 [0x43] - C
|
||||
0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00,// 68 [0x44] - D
|
||||
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,// 69 [0x45] - E
|
||||
0x7F, 0x09, 0x09, 0x01, 0x01, 0x00,// 70 [0x46] - F
|
||||
0x3E, 0x41, 0x41, 0x51, 0x32, 0x00,// 71 [0x47] - G
|
||||
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,// 72 [0x48] - H
|
||||
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,// 73 [0x49] - I
|
||||
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,// 74 [0x4a] - J
|
||||
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,// 75 [0x4b] - K
|
||||
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,// 76 [0x4c] - L
|
||||
0x7F, 0x02, 0x04, 0x02, 0x7F, 0x00,// 77 [0x4d] - M
|
||||
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,// 78 [0x4e] - N
|
||||
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,// 79 [0x4f] - O
|
||||
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,// 80 [0x50] - P
|
||||
0x3e, 0x41, 0x51, 0x21, 0xde, 0x00,// 81 [0x51] - Q
|
||||
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,// 82 [0x52] - R
|
||||
0x46, 0x49, 0x49, 0x49, 0x31, 0x00,// 83 [0x53] - S
|
||||
0x01, 0x01, 0x7F, 0x01, 0x01, 0x00,// 84 [0x54] - T
|
||||
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,// 85 [0x55] - U
|
||||
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,// 86 [0x56] - V
|
||||
0x7F, 0x20, 0x18, 0x20, 0x7F, 0x00,// 87 [0x57] - W
|
||||
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,// 88 [0x58] - X
|
||||
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,// 89 [0x59] - Y
|
||||
0x61, 0x51, 0x49, 0x45, 0x43, 0x00,// 90 [0x5a] - Z
|
||||
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// 91 [0x5b] - [
|
||||
0x02, 0x04, 0x08, 0x10, 0x20, 0x00,// 92 [0x5c] - "\"
|
||||
0x41, 0x41, 0x7F, 0x00, 0x00, 0x00,// 93 [0x5d] - ]
|
||||
0x04, 0x02, 0x01, 0x02, 0x04, 0x00,// 94 [0x5e] - ^
|
||||
0x40, 0x40, 0x40, 0x40, 0x40, 0x00,// 95 [0x5f] - _
|
||||
0x00, 0x01, 0x02, 0x04, 0x00, 0x00,// 96 [0x60] - `
|
||||
0x20, 0x54, 0x54, 0x54, 0x78, 0x00,// 97 [0x61] - a
|
||||
0x7F, 0x48, 0x44, 0x44, 0x38, 0x00,// 98 [0x62] - b
|
||||
0x38, 0x44, 0x44, 0x44, 0x20, 0x00,// 99 [0x63] - c
|
||||
0x38, 0x44, 0x44, 0x48, 0x7F, 0x00,//100 [0x64] - d
|
||||
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,//101 [0x65] - e
|
||||
0x00, 0x08, 0xfe, 0x09, 0x02, 0x00,//102 [0x66] - f
|
||||
0x18, 0xa4, 0xa4, 0x94, 0x78, 0x00,//103 [0x67] - g
|
||||
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,//104 [0x68] - h
|
||||
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,//105 [0x69] - i
|
||||
0x40, 0x80, 0x84, 0x7d, 0x00, 0x00,//106 [0x6a] - j
|
||||
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,//107 [0x6b] - k
|
||||
0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,//108 [0x6c] - l
|
||||
0x7C, 0x04, 0x18, 0x04, 0x78, 0x00,//109 [0x6d] - m
|
||||
0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,//110 [0x6e] - n
|
||||
0x38, 0x44, 0x44, 0x44, 0x38, 0x00,//111 [0x6f] - o
|
||||
0xfc, 0x28, 0x24, 0x24, 0x18, 0x00,//112 [0x70] - p
|
||||
0x18, 0x24, 0x24, 0x28, 0xfc, 0x00,//113 [0x71] - q
|
||||
0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,//114 [0x72] - r
|
||||
0x48, 0x54, 0x54, 0x54, 0x20, 0x00,//115 [0x73] - s
|
||||
0x04, 0x3F, 0x44, 0x40, 0x20, 0x00,//116 [0x74] - t
|
||||
0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,//117 [0x75] - u
|
||||
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,//118 [0x76] - v
|
||||
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,//119 [0x77] - w
|
||||
0x44, 0x28, 0x10, 0x28, 0x44, 0x00,//120 [0x78] - x
|
||||
0x0C, 0x50, 0x50, 0x50, 0x3C, 0x00,//121 [0x79] - y
|
||||
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,//122 [0x7a] - z
|
||||
0x00, 0x08, 0x36, 0x41, 0x00, 0x00,//123 [0x7b] - {
|
||||
0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,//124 [0x7c] - |
|
||||
0x00, 0x41, 0x36, 0x08, 0x00, 0x00,//125 [0x7d] - }
|
||||
0x08, 0x04, 0x08, 0x10, 0x08, 0x00,//126 [0x7e] - ~
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//127 [0x7f] -
|
||||
0x08, 0x08, 0x08, 0x08, 0x08, 0x08,//128 [0x80] - €
|
||||
0x00, 0x00, 0xff, 0x00, 0x00, 0x00,//129 [0x81] - <20>
|
||||
0x00, 0x00, 0xf8, 0x08, 0x08, 0x08,//130 [0x82] - ‚
|
||||
0x08, 0x08, 0xf8, 0x00, 0x00, 0x00,//131 [0x83] - ƒ
|
||||
0x00, 0x00, 0x0f, 0x08, 0x08, 0x08,//132 [0x84] - „
|
||||
0x08, 0x08, 0x0f, 0x00, 0x00, 0x00,//133 [0x85] - …
|
||||
0x00, 0x00, 0xff, 0x08, 0x08, 0x08,//134 [0x86] - †
|
||||
0x08, 0x08, 0xff, 0x00, 0x00, 0x00,//135 [0x87] - ‡
|
||||
0x08, 0x08, 0xf8, 0x08, 0x08, 0x08,//136 [0x88] - ˆ
|
||||
0x08, 0x08, 0x0f, 0x08, 0x08, 0x08,//137 [0x89] - ‰
|
||||
0x08, 0x08, 0xff, 0x08, 0x08, 0x08,//138 [0x8a] - Š
|
||||
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,//139 [0x8b] - ‹
|
||||
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,//140 [0x8c] - Œ
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//141 [0x8d] - <20>
|
||||
0xff, 0xff, 0xff, 0x00, 0x00, 0x00,//142 [0x8e] - Ž
|
||||
0x00, 0x00, 0x00, 0xff, 0xff, 0xff,//143 [0x8f] - <20>
|
||||
0x00, 0xaa, 0x00, 0x55, 0x00, 0xaa,//144 [0x90] - <20>
|
||||
0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,//145 [0x91] - ‘
|
||||
0x55, 0xff, 0x55, 0xff, 0x55, 0xff,//146 [0x92] - ’
|
||||
0x00, 0x00, 0xfc, 0x02, 0x04, 0x00,//147 [0x93] - “
|
||||
0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c,//148 [0x94] - ”
|
||||
0x00, 0x00, 0x18, 0x18, 0x00, 0x00,//149 [0x95] - •
|
||||
0x08, 0x38, 0x40, 0x30, 0x0e, 0x01,//150 [0x96] - –
|
||||
0x24, 0x12, 0x24, 0x48, 0x24, 0x00,//151 [0x97] - —
|
||||
0x00, 0x44, 0x4a, 0x51, 0x00, 0x00,//152 [0x98] - ˜
|
||||
0x00, 0x51, 0x4a, 0x44, 0x00, 0x00,//153 [0x99] - ™
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//154 [0x9a] - š
|
||||
0x20, 0x40, 0x3f, 0x00, 0x00, 0x00,//155 [0x9b] - ›
|
||||
0x00, 0x06, 0x09, 0x06, 0x00, 0x00,//156 [0x9c] - œ
|
||||
0x00, 0x0d, 0x0b, 0x00, 0x00, 0x00,//157 [0x9d] - <20>
|
||||
0x00, 0x00, 0x08, 0x00, 0x00, 0x00,//158 [0x9e] - ž
|
||||
0x08, 0x08, 0x2a, 0x08, 0x08, 0x00,//159 [0x9f] - Ÿ
|
||||
0x14, 0x14, 0x14, 0x14, 0x14, 0x14,//160 [0xa0] -
|
||||
0x00, 0xff, 0x00, 0xff, 0x00, 0x00,//161 [0xa1] - ¡
|
||||
0x00, 0x00, 0xfc, 0x14, 0x14, 0x14,//162 [0xa2] - ¢
|
||||
0x38, 0x55, 0x54, 0x55, 0x18, 0x00,//163 [0xa3] - £
|
||||
0x00, 0xf8, 0x08, 0xf8, 0x08, 0x08,//164 [0xa4] - ¤
|
||||
0x00, 0xfc, 0x04, 0xf4, 0x14, 0x14,//165 [0xa5] - ¥
|
||||
0x14, 0x14, 0xfc, 0x00, 0x00, 0x00,//166 [0xa6] - ¦
|
||||
0x08, 0xf8, 0x08, 0xf8, 0x00, 0x00,//167 [0xa7] - §
|
||||
0x14, 0xf4, 0x04, 0xfc, 0x00, 0x00,//168 [0xa8] - ¨
|
||||
0x00, 0x00, 0x1f, 0x14, 0x14, 0x14,//169 [0xa9] - ©
|
||||
0x00, 0x0f, 0x08, 0x0f, 0x08, 0x08,//170 [0xaa] - ª
|
||||
0x00, 0x1f, 0x10, 0x17, 0x14, 0x14,//171 [0xab] - «
|
||||
0x14, 0x14, 0x1f, 0x00, 0x00, 0x00,//172 [0xac] - ¬
|
||||
0x08, 0x0f, 0x08, 0x0f, 0x00, 0x00,//173 [0xad] -
|
||||
0x14, 0x17, 0x10, 0x1f, 0x00, 0x00,//174 [0xae] - ®
|
||||
0x00, 0x00, 0xff, 0x14, 0x14, 0x14,//175 [0xaf] - ¯
|
||||
0x00, 0xff, 0x00, 0xff, 0x08, 0x08,//176 [0xb0] - °
|
||||
0x00, 0xff, 0x00, 0xf7, 0x14, 0x14,//177 [0xb1] - ±
|
||||
0x14, 0x14, 0xff, 0x00, 0x00, 0x00,//178 [0xb2] - ²
|
||||
0x7e, 0x4b, 0x4a, 0x43, 0x42, 0x00,//179 [0xb3] - ³
|
||||
0x08, 0xff, 0x00, 0xff, 0x00, 0x00,//180 [0xb4] - ´
|
||||
0x14, 0xf7, 0x00, 0xff, 0x00, 0x00,//181 [0xb5] - µ
|
||||
0x14, 0x14, 0xf4, 0x14, 0x14, 0x14,//182 [0xb6] - ¶
|
||||
0x08, 0xf8, 0x08, 0xf8, 0x08, 0x08,//183 [0xb7] - ·
|
||||
0x14, 0xf4, 0x04, 0xf4, 0x14, 0x14,//184 [0xb8] - ¸
|
||||
0x14, 0x14, 0x17, 0x14, 0x14, 0x14,//185 [0xb9] - ¹
|
||||
0x08, 0x0f, 0x08, 0x0f, 0x08, 0x08,//186 [0xba] - º
|
||||
0x14, 0x17, 0x14, 0x17, 0x14, 0x14,//187 [0xbb] - »
|
||||
0x14, 0x14, 0xff, 0x14, 0x14, 0x14,//188 [0xbc] - ¼
|
||||
0x08, 0xff, 0x08, 0xff, 0x08, 0x08,//189 [0xbd] - ½
|
||||
0x14, 0xf7, 0x00, 0xf7, 0x14, 0x14,//190 [0xbe] - ¾
|
||||
0x3e, 0x5d, 0x55, 0x41, 0x3e, 0x00,//191 [0xbf] - ¿
|
||||
0x7c, 0x10, 0x38, 0x44, 0x38, 0x00,//192 [0xc0] - À
|
||||
0x20, 0x54, 0x54, 0x54, 0x78, 0x00,//193 [0xc1] - Á
|
||||
0x3c, 0x4a, 0x4a, 0x49, 0x31, 0x00,//194 [0xc2] - Â
|
||||
0x7c, 0x40, 0x40, 0x40, 0xfc, 0x00,//195 [0xc3] - Ã
|
||||
0xe0, 0x54, 0x4c, 0x44, 0xfc, 0x00,//196 [0xc4] - Ä
|
||||
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,//197 [0xc5] - Å
|
||||
0x30, 0x48, 0xfc, 0x48, 0x30, 0x00,//198 [0xc6] - Æ
|
||||
0x7c, 0x04, 0x04, 0x04, 0x0c, 0x00,//199 [0xc7] - Ç
|
||||
0x44, 0x28, 0x10, 0x28, 0x44, 0x00,//200 [0xc8] - È
|
||||
0x7c, 0x20, 0x10, 0x08, 0x7c, 0x00,//201 [0xc9] - É
|
||||
0x7c, 0x41, 0x22, 0x11, 0x7c, 0x00,//202 [0xca] - Ê
|
||||
0x7c, 0x10, 0x28, 0x44, 0x00, 0x00,//203 [0xcb] - Ë
|
||||
0x20, 0x44, 0x3c, 0x04, 0x7c, 0x00,//204 [0xcc] - Ì
|
||||
0x7c, 0x08, 0x10, 0x08, 0x7c, 0x00,//205 [0xcd] - Í
|
||||
0x7c, 0x10, 0x10, 0x10, 0x7c, 0x00,//206 [0xce] - Î
|
||||
0x38, 0x44, 0x44, 0x44, 0x38, 0x00,//207 [0xcf] - Ï
|
||||
0x7c, 0x04, 0x04, 0x04, 0x7c, 0x00,//208 [0xd0] - Ð
|
||||
0x08, 0x54, 0x34, 0x14, 0x7c, 0x00,//209 [0xd1] - Ñ
|
||||
0x7C, 0x14, 0x14, 0x14, 0x08, 0x00,//210 [0xd2] - Ò
|
||||
0x38, 0x44, 0x44, 0x44, 0x20, 0x00,//211 [0xd3] - Ó
|
||||
0x04, 0x04, 0x7c, 0x04, 0x04, 0x00,//212 [0xd4] - Ô
|
||||
0x0C, 0x50, 0x50, 0x50, 0x3C, 0x00,//213 [0xd5] - Õ
|
||||
0x6c, 0x10, 0x7c, 0x10, 0x6c, 0x00,//214 [0xd6] - Ö
|
||||
0x7c, 0x54, 0x54, 0x28, 0x00, 0x00,//215 [0xd7] - ×
|
||||
0x7c, 0x50, 0x50, 0x20, 0x00, 0x00,//216 [0xd8] - Ø
|
||||
0x7c, 0x50, 0x50, 0x20, 0x7c, 0x00,//217 [0xd9] - Ù
|
||||
0x44, 0x44, 0x54, 0x54, 0x28, 0x00,//218 [0xda] - Ú
|
||||
0x7c, 0x40, 0x7c, 0x40, 0x7c, 0x00,//219 [0xdb] - Û
|
||||
0x28, 0x44, 0x54, 0x54, 0x38, 0x00,//220 [0xdc] - Ü
|
||||
0x7c, 0x40, 0x7c, 0x40, 0xfc, 0x00,//221 [0xdd] - Ý
|
||||
0x0c, 0x10, 0x10, 0x10, 0x7c, 0x00,//222 [0xde] - Þ
|
||||
0x04, 0x7c, 0x50, 0x50, 0x20, 0x00,//223 [0xdf] - ß
|
||||
0x7f, 0x08, 0x3e, 0x41, 0x3e, 0x00,//224 [0xe0] - à
|
||||
0x7e, 0x11, 0x11, 0x11, 0x7e, 0x00,//225 [0xe1] - á
|
||||
0x7f, 0x49, 0x49, 0x49, 0x33, 0x00,//226 [0xe2] - â
|
||||
0x7f, 0x40, 0x40, 0x40, 0xff, 0x00,//227 [0xe3] - ã
|
||||
0xe0, 0x51, 0x4f, 0x41, 0xff, 0x00,//228 [0xe4] - ä
|
||||
0x7f, 0x49, 0x49, 0x49, 0x41, 0x00,//229 [0xe5] - å
|
||||
0x1c, 0x22, 0x7f, 0x22, 0x1c, 0x00,//230 [0xe6] - æ
|
||||
0x7f, 0x01, 0x01, 0x01, 0x03, 0x00,//231 [0xe7] - ç
|
||||
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,//232 [0xe8] - è
|
||||
0x7f, 0x10, 0x08, 0x04, 0x7f, 0x00,//233 [0xe9] - é
|
||||
0x7c, 0x21, 0x12, 0x09, 0x7c, 0x00,//234 [0xea] - ê
|
||||
0x7f, 0x08, 0x14, 0x22, 0x41, 0x00,//235 [0xeb] - ë
|
||||
0x20, 0x41, 0x3f, 0x01, 0x7f, 0x00,//236 [0xec] - ì
|
||||
0x7f, 0x02, 0x0c, 0x02, 0x7f, 0x00,//237 [0xed] - í
|
||||
0x7f, 0x08, 0x08, 0x08, 0x7f, 0x00,//238 [0xee] - î
|
||||
0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00,//239 [0xef] - ï
|
||||
0x7f, 0x01, 0x01, 0x01, 0x7f, 0x00,//240 [0xf0] - ð
|
||||
0x46, 0x29, 0x19, 0x09, 0x7f, 0x00,//241 [0xf1] - ñ
|
||||
0x7f, 0x09, 0x09, 0x09, 0x06, 0x00,//242 [0xf2] - ò
|
||||
0x3e, 0x41, 0x41, 0x41, 0x22, 0x00,//243 [0xf3] - ó
|
||||
0x01, 0x01, 0x7f, 0x01, 0x01, 0x00,//244 [0xf4] - ô
|
||||
0x47, 0x28, 0x10, 0x08, 0x07, 0x00,//245 [0xf5] - õ
|
||||
0x77, 0x08, 0x7f, 0x08, 0x77, 0x00,//246 [0xf6] - ö
|
||||
0x7f, 0x49, 0x49, 0x49, 0x36, 0x00,//247 [0xf7] - ÷
|
||||
0x22, 0x41, 0x49, 0x49, 0x3e, 0x00,//248 [0xf8] - ø
|
||||
0x7f, 0x48, 0x30, 0x00, 0x7f, 0x00,//249 [0xf9] - ù
|
||||
0x41, 0x49, 0x49, 0x49, 0x36, 0x00,//250 [0xfa] - ú
|
||||
0x7f, 0x40, 0x7f, 0x40, 0x7f, 0x00,//251 [0xfb] - û
|
||||
0x00, 0x7f, 0x48, 0x48, 0x30, 0x00,//252 [0xfc] - ü
|
||||
0x7f, 0x40, 0x7f, 0x40, 0xff, 0x00,//253 [0xfd] - ý
|
||||
0x07, 0x08, 0x08, 0x08, 0x7f, 0x00,//254 [0xfe] - þ
|
||||
0x01, 0x7f, 0x48, 0x48, 0x30, 0x00,//255 [0xff] - ÿ
|
||||
};
|
||||
|
||||
/**
|
||||
* Return letter array
|
||||
*/
|
||||
U8 *letter(U8 koi8){
|
||||
U16 idx;
|
||||
if(koi8 < 32) koi8 = 32;
|
||||
idx = (koi8 - 32) * LTR_WIDTH;
|
||||
return &rusfont[idx];
|
||||
}
|
||||
|
||||
31
uart_lcd5110/font.h
Normal file
31
uart_lcd5110/font.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* font.h
|
||||
*
|
||||
* Copyright 2015 Edward V. Emelianoff <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef __FONT_H__
|
||||
#define __FONT_H__
|
||||
#include <stdint.h>
|
||||
|
||||
#include "stm8l.h"
|
||||
#define LTR_WIDTH (6)
|
||||
|
||||
U8 *letter(U8 koi8);
|
||||
|
||||
#endif // __FONT_H__
|
||||
171
uart_lcd5110/interrupts.c
Normal file
171
uart_lcd5110/interrupts.c
Normal file
@ -0,0 +1,171 @@
|
||||
/*
|
||||
* interrupts.c
|
||||
*
|
||||
* Copyright 2014 Edward V. Emelianoff <eddy@sao.ru>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "ports_definition.h"
|
||||
#include "uart.h"
|
||||
#include "spi.h"
|
||||
|
||||
// Top Level Interrupt
|
||||
INTERRUPT_HANDLER(TLI_IRQHandler, 0){}
|
||||
|
||||
// Auto Wake Up Interrupt
|
||||
INTERRUPT_HANDLER(AWU_IRQHandler, 1){}
|
||||
|
||||
// Clock Controller Interrupt
|
||||
INTERRUPT_HANDLER(CLK_IRQHandler, 2){}
|
||||
|
||||
// External Interrupt PORTA
|
||||
INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3){}
|
||||
|
||||
// External Interrupt PORTB
|
||||
INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4){}
|
||||
|
||||
// External Interrupt PORTC
|
||||
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5){
|
||||
}
|
||||
|
||||
// External Interrupt PORTD
|
||||
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6){
|
||||
}
|
||||
|
||||
// External Interrupt PORTE
|
||||
INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7){}
|
||||
|
||||
#ifdef STM8S903
|
||||
// External Interrupt PORTF
|
||||
INTERRUPT_HANDLER(EXTI_PORTF_IRQHandler, 8){}
|
||||
#endif // STM8S903
|
||||
|
||||
#if defined (STM8S208) || defined (STM8AF52Ax)
|
||||
// CAN RX Interrupt routine.
|
||||
INTERRUPT_HANDLER(CAN_RX_IRQHandler, 8){}
|
||||
|
||||
// CAN TX Interrupt routine.
|
||||
INTERRUPT_HANDLER(CAN_TX_IRQHandler, 9){}
|
||||
#endif // STM8S208 || STM8AF52Ax
|
||||
|
||||
// SPI Interrupt routine.
|
||||
INTERRUPT_HANDLER(SPI_IRQHandler, 10){
|
||||
if(SPI_SR & SPI_SR_RXNE){ // RX not empty - send next byte
|
||||
spi_send_next();
|
||||
}
|
||||
}
|
||||
|
||||
// Timer1 Update/Overflow/Trigger/Break Interrupt
|
||||
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11){
|
||||
}
|
||||
|
||||
// Timer1 Capture/Compare Interrupt routine.
|
||||
INTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12){}
|
||||
|
||||
#ifdef STM8S903
|
||||
// Timer5 Update/Overflow/Break/Trigger Interrupt
|
||||
INTERRUPT_HANDLER(TIM5_UPD_OVF_BRK_TRG_IRQHandler, 13){}
|
||||
|
||||
// Timer5 Capture/Compare Interrupt
|
||||
INTERRUPT_HANDLER(TIM5_CAP_COM_IRQHandler, 14){}
|
||||
|
||||
#else // STM8S208, STM8S207, STM8S105 or STM8S103 or STM8AF62Ax or STM8AF52Ax or STM8AF626x
|
||||
|
||||
// Timer2 Update/Overflow/Break Interrupt
|
||||
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13){
|
||||
}
|
||||
|
||||
// Timer2 Capture/Compare Interrupt
|
||||
// manage with sending/receiving
|
||||
INTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler, 14){
|
||||
}
|
||||
#endif // STM8S903
|
||||
|
||||
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \
|
||||
defined(STM8S005) || defined (STM8AF62Ax) || defined (STM8AF52Ax) || defined (STM8AF626x)
|
||||
// Timer3 Update/Overflow/Break Interrupt
|
||||
INTERRUPT_HANDLER(TIM3_UPD_OVF_BRK_IRQHandler, 15){}
|
||||
|
||||
// Timer3 Capture/Compare Interrupt
|
||||
INTERRUPT_HANDLER(TIM3_CAP_COM_IRQHandler, 16){}
|
||||
#endif // STM8S208, STM8S207 or STM8S105 or STM8AF62Ax or STM8AF52Ax or STM8AF626x
|
||||
|
||||
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S103) || \
|
||||
defined(STM8S003) || defined (STM8AF62Ax) || defined (STM8AF52Ax) || defined (STM8S903)
|
||||
// UART1 TX Interrupt
|
||||
INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17){}
|
||||
|
||||
// UART1 RX Interrupt
|
||||
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18){}
|
||||
#endif // STM8S208 or STM8S207 or STM8S103 or STM8S903 or STM8AF62Ax or STM8AF52Ax
|
||||
|
||||
// I2C Interrupt
|
||||
INTERRUPT_HANDLER(I2C_IRQHandler, 19){}
|
||||
|
||||
#if defined(STM8S105) || defined(STM8S005) || defined (STM8AF626x)
|
||||
// UART2 TX interrupt
|
||||
INTERRUPT_HANDLER(UART2_TX_IRQHandler, 20){}
|
||||
|
||||
// UART2 RX interrupt
|
||||
INTERRUPT_HANDLER(UART2_RX_IRQHandler, 21){
|
||||
U8 rb;
|
||||
if(UART2_SR & UART_SR_RXNE){ // data received
|
||||
rb = UART2_DR; // read received byte & clear RXNE flag
|
||||
while(!(UART2_SR & UART_SR_TXE));
|
||||
// UART2_DR = rb; // echo received symbol
|
||||
UART_rx[UART_rx_cur_i++] = rb; // put received byte into cycled buffer
|
||||
if(UART_rx_cur_i == UART_rx_start_i){ // Oops: buffer overflow! Just forget old data
|
||||
UART_rx_start_i++;
|
||||
check_UART_pointer(UART_rx_start_i);
|
||||
}
|
||||
check_UART_pointer(UART_rx_cur_i);
|
||||
}
|
||||
}
|
||||
#endif // STM8S105 or STM8AF626x
|
||||
|
||||
#if defined(STM8S207) || defined(STM8S007) || defined(STM8S208) || defined (STM8AF52Ax) || defined (STM8AF62Ax)
|
||||
// UART3 TX interrupt
|
||||
INTERRUPT_HANDLER(UART3_TX_IRQHandler, 20){}
|
||||
|
||||
// UART3 RX interrupt
|
||||
INTERRUPT_HANDLER(UART3_RX_IRQHandler, 21){}
|
||||
#endif // STM8S208 or STM8S207 or STM8AF52Ax or STM8AF62Ax
|
||||
|
||||
#if defined(STM8S207) || defined(STM8S007) || defined(STM8S208) || defined (STM8AF52Ax) || defined (STM8AF62Ax)
|
||||
// ADC2 interrupt
|
||||
INTERRUPT_HANDLER(ADC2_IRQHandler, 22){}
|
||||
#else
|
||||
// ADC1 interrupt
|
||||
INTERRUPT_HANDLER(ADC1_IRQHandler, 22){
|
||||
}
|
||||
#endif // STM8S208 or STM8S207 or STM8AF52Ax or STM8AF62Ax
|
||||
|
||||
#ifdef STM8S903
|
||||
// Timer6 Update/Overflow/Trigger Interrupt
|
||||
INTERRUPT_HANDLER(TIM6_UPD_OVF_TRG_IRQHandler, 23){}
|
||||
#else // STM8S208, STM8S207, STM8S105 or STM8S103 or STM8AF52Ax or STM8AF62Ax or STM8AF626x
|
||||
// Timer4 Update/Overflow Interrupt
|
||||
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23){
|
||||
if(TIM4_SR & TIM_SR1_UIF){ // update interrupt
|
||||
Global_time++; // increase timer
|
||||
}
|
||||
TIM4_SR = 0; // clear all interrupt flags
|
||||
}
|
||||
#endif // STM8S903
|
||||
|
||||
// Eeprom EEC Interrupt
|
||||
INTERRUPT_HANDLER(EEPROM_EEC_IRQHandler, 24){}
|
||||
144
uart_lcd5110/interrupts.h
Normal file
144
uart_lcd5110/interrupts.h
Normal file
@ -0,0 +1,144 @@
|
||||
/*
|
||||
* interrupts.h
|
||||
*
|
||||
* Copyright 2014 Edward V. Emelianoff <eddy@sao.ru>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef __INTERRUPTS_H__
|
||||
#define __INTERRUPTS_H__
|
||||
|
||||
#include "stm8l.h"
|
||||
|
||||
// Top Level Interrupt
|
||||
INTERRUPT_DEFINITION(TLI_IRQHandler, 0);
|
||||
|
||||
// Auto Wake Up Interrupt
|
||||
INTERRUPT_DEFINITION(AWU_IRQHandler, 1);
|
||||
|
||||
// Clock Controller Interrupt
|
||||
INTERRUPT_DEFINITION(CLK_IRQHandler, 2);
|
||||
|
||||
// External Interrupt PORTA
|
||||
INTERRUPT_DEFINITION(EXTI_PORTA_IRQHandler, 3);
|
||||
|
||||
// External Interrupt PORTB
|
||||
INTERRUPT_DEFINITION(EXTI_PORTB_IRQHandler, 4);
|
||||
|
||||
// External Interrupt PORTC
|
||||
INTERRUPT_DEFINITION(EXTI_PORTC_IRQHandler, 5);
|
||||
|
||||
// External Interrupt PORTD
|
||||
INTERRUPT_DEFINITION(EXTI_PORTD_IRQHandler, 6);
|
||||
|
||||
// External Interrupt PORTE
|
||||
INTERRUPT_DEFINITION(EXTI_PORTE_IRQHandler, 7);
|
||||
|
||||
#ifdef STM8S903
|
||||
// External Interrupt PORTF
|
||||
INTERRUPT_DEFINITION(EXTI_PORTF_IRQHandler, 8);
|
||||
#endif // STM8S903
|
||||
|
||||
#if defined (STM8S208) || defined (STM8AF52Ax)
|
||||
// CAN RX Interrupt routine.
|
||||
INTERRUPT_DEFINITION(CAN_RX_IRQHandler, 8);
|
||||
|
||||
// CAN TX Interrupt routine.
|
||||
INTERRUPT_DEFINITION(CAN_TX_IRQHandler, 9);
|
||||
#endif // STM8S208 || STM8AF52Ax
|
||||
|
||||
// SPI Interrupt routine.
|
||||
INTERRUPT_DEFINITION(SPI_IRQHandler, 10);
|
||||
|
||||
// Timer1 Update/Overflow/Trigger/Break Interrupt
|
||||
INTERRUPT_DEFINITION(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11);
|
||||
|
||||
// Timer1 Capture/Compare Interrupt routine.
|
||||
INTERRUPT_DEFINITION(TIM1_CAP_COM_IRQHandler, 12);
|
||||
|
||||
#ifdef STM8S903
|
||||
// Timer5 Update/Overflow/Break/Trigger Interrupt
|
||||
INTERRUPT_DEFINITION(TIM5_UPD_OVF_BRK_TRG_IRQHandler, 13);
|
||||
|
||||
// Timer5 Capture/Compare Interrupt
|
||||
INTERRUPT_DEFINITION(TIM5_CAP_COM_IRQHandler, 14);
|
||||
|
||||
#else // STM8S208, STM8S207, STM8S105 or STM8S103 or STM8AF62Ax or STM8AF52Ax or STM8AF626x
|
||||
// Timer2 Update/Overflow/Break Interrupt
|
||||
INTERRUPT_DEFINITION(TIM2_UPD_OVF_BRK_IRQHandler, 13);
|
||||
|
||||
// Timer2 Capture/Compare Interrupt
|
||||
INTERRUPT_DEFINITION(TIM2_CAP_COM_IRQHandler, 14);
|
||||
#endif // STM8S903
|
||||
|
||||
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \
|
||||
defined(STM8S005) || defined (STM8AF62Ax) || defined (STM8AF52Ax) || defined (STM8AF626x)
|
||||
// Timer3 Update/Overflow/Break Interrupt
|
||||
INTERRUPT_DEFINITION(TIM3_UPD_OVF_BRK_IRQHandler, 15);
|
||||
|
||||
// Timer3 Capture/Compare Interrupt
|
||||
INTERRUPT_DEFINITION(TIM3_CAP_COM_IRQHandler, 16);
|
||||
#endif // STM8S208, STM8S207 or STM8S105 or STM8AF62Ax or STM8AF52Ax or STM8AF626x
|
||||
|
||||
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S103) || \
|
||||
defined(STM8S003) || defined (STM8AF62Ax) || defined (STM8AF52Ax) || defined (STM8S903)
|
||||
// UART1 TX Interrupt
|
||||
INTERRUPT_DEFINITION(UART1_TX_IRQHandler, 17);
|
||||
|
||||
// UART1 RX Interrupt
|
||||
INTERRUPT_DEFINITION(UART1_RX_IRQHandler, 18);
|
||||
#endif // STM8S208 or STM8S207 or STM8S103 or STM8S903 or STM8AF62Ax or STM8AF52Ax
|
||||
|
||||
// I2C Interrupt
|
||||
INTERRUPT_DEFINITION(I2C_IRQHandler, 19);
|
||||
|
||||
#if defined(STM8S105) || defined(STM8S005) || defined (STM8AF626x)
|
||||
// UART2 TX interrupt
|
||||
INTERRUPT_DEFINITION(UART2_TX_IRQHandler, 20);
|
||||
|
||||
// UART2 RX interrupt
|
||||
INTERRUPT_DEFINITION(UART2_RX_IRQHandler, 21);
|
||||
#endif // STM8S105 or STM8AF626x
|
||||
|
||||
#if defined(STM8S207) || defined(STM8S007) || defined(STM8S208) || defined (STM8AF52Ax) || defined (STM8AF62Ax)
|
||||
// UART3 TX interrupt
|
||||
INTERRUPT_DEFINITION(UART3_TX_IRQHandler, 20);
|
||||
|
||||
// UART3 RX interrupt
|
||||
INTERRUPT_DEFINITION(UART3_RX_IRQHandler, 21);
|
||||
#endif // STM8S208 or STM8S207 or STM8AF52Ax or STM8AF62Ax
|
||||
|
||||
#if defined(STM8S207) || defined(STM8S007) || defined(STM8S208) || defined (STM8AF52Ax) || defined (STM8AF62Ax)
|
||||
// ADC2 interrupt
|
||||
INTERRUPT_DEFINITION(ADC2_IRQHandler, 22);
|
||||
#else // STM8S105, STM8S103 or STM8S903 or STM8AF626x
|
||||
// ADC1 interrupt
|
||||
INTERRUPT_DEFINITION(ADC1_IRQHandler, 22);
|
||||
#endif // STM8S208 or STM8S207 or STM8AF52Ax or STM8AF62Ax
|
||||
|
||||
#ifdef STM8S903
|
||||
// Timer6 Update/Overflow/Trigger Interrupt
|
||||
INTERRUPT_DEFINITION(TIM6_UPD_OVF_TRG_IRQHandler, 23);
|
||||
#else // STM8S208, STM8S207, STM8S105 or STM8S103 or STM8AF52Ax or STM8AF62Ax or STM8AF626x
|
||||
// Timer4 Update/Overflow Interrupt
|
||||
INTERRUPT_DEFINITION(TIM4_UPD_OVF_IRQHandler, 23);
|
||||
#endif // STM8S903
|
||||
|
||||
// Eeprom EEC Interrupt
|
||||
INTERRUPT_DEFINITION(EEPROM_EEC_IRQHandler, 24);
|
||||
|
||||
#endif // __INTERRUPTS_H__
|
||||
159
uart_lcd5110/main.c
Normal file
159
uart_lcd5110/main.c
Normal file
@ -0,0 +1,159 @@
|
||||
/*
|
||||
* blinky.c
|
||||
*
|
||||
* Copyright 2014 Edward V. Emelianoff <eddy@sao.ru>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
#include "ports_definition.h"
|
||||
#include "interrupts.h"
|
||||
#include "uart.h"
|
||||
#include "pcd8544.h"
|
||||
#include "spi.h"
|
||||
|
||||
volatile unsigned long Global_time = 0L; // global time in ms
|
||||
U16 paused_val = 500; // interval between LED flashing
|
||||
U8 bias = 4, vop = 60, temp = 1;
|
||||
|
||||
void setbias(){
|
||||
pcd8544_setbias(bias);
|
||||
uart_write("\nbias value: ");
|
||||
UART_send_byte('0' + bias);
|
||||
UART_send_byte('\n');
|
||||
}
|
||||
void setvop(){
|
||||
pcd8544_setvop(vop);
|
||||
uart_write("\nvop value: ");
|
||||
printUint(&vop, 1);
|
||||
UART_send_byte('\n');
|
||||
}
|
||||
void settemp(){
|
||||
pcd8544_settemp(temp);
|
||||
uart_write("\ntemp. value: ");
|
||||
UART_send_byte('0' + temp);
|
||||
UART_send_byte('\n');
|
||||
}
|
||||
|
||||
int main() {
|
||||
unsigned long T = 0L;
|
||||
U8 rb, wb;
|
||||
CFG_GCR |= 1; // disable SWIM
|
||||
// Configure clocking
|
||||
CLK_CKDIVR = 0; // F_HSI = 16MHz, f_CPU = 16MHz
|
||||
// Timer 4 (8 bit) used as system tick timer
|
||||
// prescaler == 128 (2^7), Tfreq = 125kHz
|
||||
// period = 1ms, so ARR = 125
|
||||
TIM4_PSCR = 7;
|
||||
TIM4_ARR = 125;
|
||||
// interrupts: update
|
||||
TIM4_IER = TIM_IER_UIE;
|
||||
// auto-reload + interrupt on overflow + enable
|
||||
TIM4_CR1 = TIM_CR1_APRE | TIM_CR1_URS | TIM_CR1_CEN;
|
||||
|
||||
// PC2 - PP output (on-board LED)
|
||||
PORT(LED_PORT, DDR) |= LED_PIN;
|
||||
PORT(LED_PORT, CR1) |= LED_PIN;
|
||||
// LCD ~RST, ~CE and D/~C configuration: all PP outputs, clear all at start
|
||||
PORT(LCD_PORT, ODR) &= ~(LCD_DC_PIN | LCD_CE_PIN | LCD_RST_PIN);
|
||||
PORT(LCD_PORT, DDR) |= LCD_DC_PIN | LCD_CE_PIN | LCD_RST_PIN;
|
||||
PORT(LCD_PORT, CR1) |= LCD_DC_PIN | LCD_CE_PIN | LCD_RST_PIN;
|
||||
|
||||
uart_init();
|
||||
spi_init();
|
||||
// enable all interrupts
|
||||
enableInterrupts();
|
||||
|
||||
pcd8544_init();
|
||||
pcd8544_print("÷ÓÅÍ ÐÒÉ×ÅÔ!\n");
|
||||
|
||||
// Loop
|
||||
do{
|
||||
if((Global_time - T > paused_val) || (T > Global_time)){
|
||||
T = Global_time;
|
||||
PORT(LED_PORT, ODR) ^= LED_PIN; // blink on-board LED
|
||||
}
|
||||
if(UART_read_byte(&rb)){ // buffer isn't empty
|
||||
switch(rb){
|
||||
case 'h': // help
|
||||
case 'H':
|
||||
UART_send_byte(rb);
|
||||
uart_write("\nPROTO:\n"
|
||||
"i - init LCD\n"
|
||||
"+/- Contrast\n"
|
||||
"V/v +/- vop\n"
|
||||
"T/t +/- temp\n"
|
||||
);
|
||||
break;
|
||||
case 'i':
|
||||
PORT(LCD_PORT, ODR) &= ~(LCD_DC_PIN | LCD_CE_PIN | LCD_RST_PIN);
|
||||
spi_init();
|
||||
pcd8544_init();
|
||||
break;
|
||||
case '+':
|
||||
if(bias < PCD8544_BIAS_MASK){
|
||||
++bias;
|
||||
setbias();
|
||||
}
|
||||
break;
|
||||
case '-':
|
||||
if(bias > 0){
|
||||
--bias;
|
||||
setbias();
|
||||
}
|
||||
break;
|
||||
case 'V':
|
||||
if(vop < PCD8544_VOP_MASK){
|
||||
++vop;
|
||||
setvop();
|
||||
}
|
||||
break;
|
||||
case 'v':
|
||||
if(vop > 0){
|
||||
--vop;
|
||||
setvop();
|
||||
}
|
||||
break;
|
||||
case 'T':
|
||||
if(temp < PCD8544_TEMP_MASK){
|
||||
++temp;
|
||||
settemp();
|
||||
}
|
||||
break;
|
||||
case 't':
|
||||
if(temp > 0){
|
||||
--temp;
|
||||
settemp();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
wb = pcd8544_putch(rb);
|
||||
if(wb == rb){
|
||||
pcd8544_roll_screen();
|
||||
wb = pcd8544_putch(rb);
|
||||
}
|
||||
if(wb != rb){
|
||||
UART_send_byte(rb);
|
||||
if(wb == '\n') UART_send_byte('\n');
|
||||
}
|
||||
}
|
||||
}
|
||||
}while(1);
|
||||
}
|
||||
|
||||
void msleep(U16 pause){
|
||||
unsigned long T = Global_time + pause;
|
||||
while(T > Global_time);
|
||||
}
|
||||
237
uart_lcd5110/pcd8544.c
Normal file
237
uart_lcd5110/pcd8544.c
Normal file
@ -0,0 +1,237 @@
|
||||
/*
|
||||
* pcd8544.c - functions for work with display controller
|
||||
*
|
||||
* Copyright 2015 Edward V. Emelianoff <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* we have two modes: direct write into LCD (with local buffer update) - for text
|
||||
* and refresh whole buffer - for graphics
|
||||
* all writings are in horizontal addressing mode
|
||||
*/
|
||||
|
||||
#include "pcd8544.h"
|
||||
// here should be functions spiWrite(U8 *data, bufsz_t size) & spi_write_byte(U8 onebyte)
|
||||
// max SPI speed is 4MHz
|
||||
#include "spi.h"
|
||||
/* here are functions & macros for changing command pins state:
|
||||
* SET_DC() - set D/~C pin high (data)
|
||||
* CLEAR_DC() - clear D/~C (command)
|
||||
* CHIP_EN() - clear ~SCE
|
||||
* CHIP_DIS() - set ~SCE (disable chip)
|
||||
* CLEAR_RST() - set 1 on RST pin (SHOULD BE 0 AT START - USE PULLING RESISTOR!!!)
|
||||
*/
|
||||
#include "ports_definition.h"
|
||||
#include <string.h>
|
||||
|
||||
extern void msleep(U16 pause);
|
||||
|
||||
const scrnsz_t LTRS_IN_ROW = XSIZE / LTR_WIDTH;
|
||||
const scrnsz_t ROW_MAX = YSIZE / 8;
|
||||
// array for fast pixel set/reset
|
||||
const U8 const pixels_set[] = {1,2,4,8,0x10,0x20,0x40,0x80};
|
||||
const U8 const pixels_reset[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
|
||||
/**
|
||||
* I use horizontal addressing of PCD8544, so data in buffer
|
||||
* stored line by line, each byte is 8 vertical pixels (LSB upper)
|
||||
*
|
||||
* As refresh speed is fast enough, I don't use partial update for graphics
|
||||
* (but use for letters)
|
||||
*/
|
||||
#define DISPLAYBUFSIZE (XSIZE*YCHARSZ)
|
||||
static U8 displaybuf[DISPLAYBUFSIZE];
|
||||
|
||||
// current letter coordinates - for "printf"
|
||||
static scrnsz_t cur_x = 0, cur_y = 0;
|
||||
extern U8 bias, vop, temp;
|
||||
|
||||
void pcd8544_setbias(U8 val){
|
||||
CMD(PCD8544_EXTENDEDINSTRUCTION);
|
||||
SETBIAS(val);
|
||||
CMD(PCD8544_DEFAULTMODE);
|
||||
}
|
||||
|
||||
void pcd8544_setvop(U8 val){
|
||||
CMD(PCD8544_EXTENDEDINSTRUCTION);
|
||||
SETVOP(val);
|
||||
CMD(PCD8544_DEFAULTMODE);
|
||||
}
|
||||
|
||||
void pcd8544_settemp(U8 val){
|
||||
CMD(PCD8544_EXTENDEDINSTRUCTION);
|
||||
SETTEMP(val);
|
||||
CMD(PCD8544_DEFAULTMODE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Init SPI & display
|
||||
*/
|
||||
void pcd8544_init(){
|
||||
CHIP_DIS();
|
||||
SET_DC();
|
||||
LCD_RST();
|
||||
msleep(10);
|
||||
CLEAR_RST(); // set ~RST to 1, performing out of RESET stage
|
||||
// CMD(0x21); CMD(0xc8); CMD(0x06); CMD(0x13); CMD(0x20); CMD(0x0c);
|
||||
|
||||
// set LCD to optimal mode by datasheet: bias 1/48 (n=4), Vlcd 6.06 (Vop=50), normal Tcorr (1)
|
||||
CMD(PCD8544_EXTENDEDINSTRUCTION);
|
||||
SETBIAS(bias);
|
||||
SETVOP(vop);
|
||||
SETTEMP(temp);
|
||||
// return to regular instructions set, horizontal addressing & prepare normal display mode
|
||||
CMD(PCD8544_DEFAULTMODE);
|
||||
CMD(PCD8544_DISPLAYNORMAL);
|
||||
|
||||
pcd8544_cls();
|
||||
}
|
||||
|
||||
/**
|
||||
* Send command (cmd != 0) or data (cmd == 0) byte
|
||||
*/
|
||||
void pcd8544_send_byte(U8 byte, U8 cmd){
|
||||
CHIP_EN();
|
||||
if(cmd)
|
||||
CLEAR_DC();
|
||||
else
|
||||
SET_DC();
|
||||
spi_write_byte(byte);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send data sequence
|
||||
*/
|
||||
void pcd8544_send_data(U8 *data, bufsz_t size, U8 cmd){
|
||||
CHIP_EN();
|
||||
if(cmd)
|
||||
CLEAR_DC();
|
||||
else
|
||||
SET_DC();
|
||||
spiWrite(data, size);
|
||||
CHIP_DIS();
|
||||
}
|
||||
|
||||
void draw_pixel(scrnsz_t x, scrnsz_t y, U8 set){
|
||||
bufsz_t idx;
|
||||
if(bad_coords(x,y)) return;
|
||||
idx = x + (y/8) * XSIZE;
|
||||
y %= 8;
|
||||
if(set)
|
||||
displaybuf[idx] |= pixels_set[y];
|
||||
else
|
||||
displaybuf[idx] &= pixels_reset[y];
|
||||
}
|
||||
|
||||
void pcd8544_cls(){
|
||||
memset(displaybuf, 0, DISPLAYBUFSIZE);
|
||||
cur_x = cur_y = 0;
|
||||
pcd8544_refresh();
|
||||
}
|
||||
|
||||
/**
|
||||
* send full data buffer onto display
|
||||
*/
|
||||
void pcd8544_refresh(){
|
||||
SETXADDR(0);
|
||||
SETYADDR(0);
|
||||
DBUF(displaybuf, DISPLAYBUFSIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* draw letter at x,y position in char coordinates (XCHARSZ x YCHARSZ)
|
||||
* @return 0 if fail
|
||||
*/
|
||||
int pcd8544_put(U8 koi8, scrnsz_t x, scrnsz_t y){
|
||||
U8 *symbol;
|
||||
bufsz_t idx;
|
||||
if(x >= XCHARSZ || y >= YCHARSZ) return 0;
|
||||
if(koi8 < 32) return 0;
|
||||
symbol = (U8*)letter(koi8);
|
||||
x *= LTR_WIDTH;
|
||||
idx = x + y*XSIZE;
|
||||
// put letter into display buffer
|
||||
memcpy(&displaybuf[idx], symbol, LTR_WIDTH);
|
||||
// and show it on display
|
||||
SETXADDR(x);
|
||||
SETYADDR(y);
|
||||
DBUF(symbol, LTR_WIDTH);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* put char into current position or next line; return char if couldn't be printed
|
||||
* (if OK return 0 or '\n' if newline was made)
|
||||
*/
|
||||
U8 pcd8544_putch(U8 chr){
|
||||
scrnsz_t tabpos;
|
||||
U8 ret = 0;
|
||||
if(cur_x >= XCHARSZ || cur_y >= YCHARSZ) return chr;
|
||||
if(chr < 32){ // special symbols
|
||||
switch(chr){
|
||||
case '\n': // carriage return - return to beginning of current line
|
||||
++cur_y;
|
||||
// here shouldn't be a "break" because '\n' == "\r\n"
|
||||
case '\r': // newline
|
||||
cur_x = 0;
|
||||
break;
|
||||
case '\b': // return to previous position (backspace)
|
||||
if(cur_x) --cur_x;
|
||||
break;
|
||||
case '\t': // tabulation by 4 symbols
|
||||
tabpos = ((cur_x>>2)<<2) + 4;
|
||||
if(tabpos < XCHARSZ) cur_x = tabpos;
|
||||
else return chr;
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
// increment x position here (there could be not writeable letters)
|
||||
pcd8544_put(chr, cur_x++, cur_y);
|
||||
}
|
||||
if(cur_x == XCHARSZ){
|
||||
cur_x = 0;
|
||||
++cur_y;
|
||||
return '\n';
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* print zero-terminated string from current (cur_x, cur_y)
|
||||
* truncate long strings that don't fit into display
|
||||
* @return NULL if all OK or pointer to non-printed string
|
||||
*/
|
||||
U8 *pcd8544_print(U8 *koi8){
|
||||
while(*koi8){
|
||||
U8 chr = *koi8;
|
||||
if(pcd8544_putch(chr) == chr) return koi8;
|
||||
++koi8;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* roll screen by 1 line up
|
||||
*/
|
||||
void pcd8544_roll_screen(){
|
||||
bufsz_t idx = DISPLAYBUFSIZE-XSIZE;
|
||||
memmove(displaybuf, displaybuf + XSIZE, idx);
|
||||
memset(displaybuf+idx, 0, XSIZE);
|
||||
pcd8544_refresh();
|
||||
if(cur_y) --cur_y;
|
||||
}
|
||||
|
||||
122
uart_lcd5110/pcd8544.h
Normal file
122
uart_lcd5110/pcd8544.h
Normal file
@ -0,0 +1,122 @@
|
||||
/*
|
||||
* pcd8544.h
|
||||
*
|
||||
* Copyright 2015 Edward V. Emelianoff <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef __PCD8544_H__
|
||||
#define __PCD8544_H__
|
||||
|
||||
#include "font.h"
|
||||
#include "stm8l.h"
|
||||
|
||||
// sizes in graphics (84x48) & char(letter 6x8 -> 14x6) mode
|
||||
#define XSIZE (84)
|
||||
#define XCHARSZ (XSIZE/LTR_WIDTH)
|
||||
#define YSIZE (48)
|
||||
#define YCHARSZ (YSIZE/8)
|
||||
|
||||
// type of screen size
|
||||
typedef U8 scrnsz_t;
|
||||
// type of screen buffer index (scrnsz_t^2)
|
||||
typedef U16 bufsz_t;
|
||||
|
||||
extern const scrnsz_t LTRS_IN_ROW;
|
||||
extern const scrnsz_t ROW_MAX;
|
||||
|
||||
#define bad_coords(x, y) (!(x < XSIZE && y < YSIZE))
|
||||
#define bad_text_coords(col, row) (!(col < LTRS_IN_ROW && row < ROW_MAX))
|
||||
|
||||
/*
|
||||
// bounding box
|
||||
typedef struct{
|
||||
scrnsz_t xmin,
|
||||
scrnsz_t ymin,
|
||||
scrnsz_t xmax,
|
||||
scrnsz_t ymax
|
||||
} bbox_t;
|
||||
*/
|
||||
|
||||
void pcd8544_init();
|
||||
void pcd8544_send_byte(U8 byte, U8 cmd);
|
||||
void pcd8544_send_data(U8 *data, bufsz_t size, U8 cmd);
|
||||
void draw_pixel(scrnsz_t x, scrnsz_t y, U8 set);
|
||||
void pcd8544_cls();
|
||||
void pcd8544_refresh();
|
||||
int pcd8544_put(U8 koi8, scrnsz_t x, scrnsz_t y);
|
||||
U8 *pcd8544_print(U8 *koi8);
|
||||
U8 pcd8544_putch(U8 koi8);
|
||||
void pcd8544_roll_screen();
|
||||
|
||||
void pcd8544_setbias(U8 val);
|
||||
void pcd8544_setvop(U8 val);
|
||||
void pcd8544_settemp(U8 val);
|
||||
|
||||
#define set_pixel(x,y) do{draw_pixel(x,y,1);}while(0)
|
||||
#define clear_pixel(x,y) do{draw_pixel(x,y,0);}while(0)
|
||||
|
||||
/********************** PCD8544 protocol **********************/
|
||||
// Function set: | 0 | 0 | 1 | 0 | 0 | PD | V | H |
|
||||
#define PCD8544_POWERDOWN (0x24)
|
||||
#define PCD8544_VERTADDRESSING (0x22)
|
||||
#define PCD8544_EXTENDEDINSTRUCTION (0x21)
|
||||
#define PCD8544_DEFAULTMODE (0x20)
|
||||
/*
|
||||
* functions with H=0 (basic)
|
||||
*/
|
||||
// Display control: | 0 | 0 | 0 | 0 | 1 | D | 0 | E |
|
||||
#define PCD8544_DISPLAYBLANK (8)
|
||||
#define PCD8544_DISPLAYFILLED (9)
|
||||
#define PCD8544_DISPLAYNORMAL (0xc)
|
||||
#define PCD8544_DISPLAYINVERTED (0xd)
|
||||
// Set Xaddr: | 1 | X6 | X5 | X4 | X3 | X2 | X1 | X0 |
|
||||
#define PCD8544_SETXADDR (0x80)
|
||||
#define PCD8544_XADDR_MASK (0x7f)
|
||||
// Set Yaddr: | 0 | 1 | 0 | 0 | 0 | Y2 | Y1 | Y0 |
|
||||
#define PCD8544_SETYADDR (0x40)
|
||||
#define PCD8544_YADDR_MASK (7)
|
||||
/*
|
||||
* functions with H=1 (extended)
|
||||
*/
|
||||
// Temperature control: | 0 | 0 | 0 | 0 | 0 | 1 | TC1 | TC0 |
|
||||
#define PCD8544_SETTEMP (4)
|
||||
#define PCD8544_TEMP_MASK (3)
|
||||
// BIAS: | 0 | 0 | 0 | 1 | 0 | BS2 | BS1 | BS0 |
|
||||
#define PCD8544_SETBIAS (0x10)
|
||||
#define PCD8544_BIAS_MASK (7)
|
||||
// VOP: | 1 | VOP6 | VOP5 | VOP4 | VOP3 | VOP2 | VOP1 | VOP0 |
|
||||
#define PCD8544_SETVOP (0x80)
|
||||
#define PCD8544_VOP_MASK (0x7f)
|
||||
// | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||
|
||||
/********************** Shortened macros **********************/
|
||||
#define CMD(x) do{pcd8544_send_byte(x, 1);}while(0)
|
||||
#define DAT(x) do{pcd8544_send_byte(x, 0);}while(0)
|
||||
#define CBUF(x,l) do{pcd8544_send_data(x, l, 1);}while(0)
|
||||
#define DBUF(x,l) do{pcd8544_send_data(x, l, 0);}while(0)
|
||||
// set bias level (look into datasheet, 4 - recommend)
|
||||
#define SETBIAS(x) CMD(PCD8544_SETBIAS|(x&PCD8544_BIAS_MASK))
|
||||
// set operation voltage (=3.06+0.06*x)
|
||||
#define SETVOP(x) CMD(PCD8544_SETVOP |(x&PCD8544_VOP_MASK))
|
||||
// temperature compensation: 0 - high, 1 - recommended, 2 - IC, 3 - minimal
|
||||
#define SETTEMP(x) CMD(PCD8544_SETTEMP|(x&PCD8544_TEMP_MASK))
|
||||
// x,y addressing
|
||||
#define SETXADDR(x) CMD(PCD8544_SETXADDR|(x&PCD8544_XADDR_MASK))
|
||||
#define SETYADDR(x) CMD(PCD8544_SETYADDR|(x&PCD8544_YADDR_MASK))
|
||||
#endif // __PCD8544_H__
|
||||
65
uart_lcd5110/ports_definition.h
Normal file
65
uart_lcd5110/ports_definition.h
Normal file
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* ports_definition.h - definition of ports pins & so on
|
||||
*
|
||||
* Copyright 2014 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef __PORTS_DEFINITION_H__
|
||||
#define __PORTS_DEFINITION_H__
|
||||
|
||||
#include "stm8l.h"
|
||||
|
||||
// macro for using in port constructions like PORT(LED_PORT, ODR) = xx
|
||||
#define CONCAT(a, b) a ## _ ## b
|
||||
#define PORT(a, b) CONCAT(a , b)
|
||||
|
||||
// on-board LED
|
||||
#define LED_PORT PC
|
||||
#define LED_PIN GPIO_PIN2
|
||||
|
||||
// UART2_TX
|
||||
#define UART_PORT PD
|
||||
#define UART_TX_PIN GPIO_PIN5
|
||||
|
||||
// SPI pins: SCK - PC5, MOSI - PC6, MISO - PC7
|
||||
#define SPI_PORT PC
|
||||
#define SPI_SCK_PIN GPIO_PIN5
|
||||
#define SPI_MOSI_PIN GPIO_PIN6
|
||||
#define SPI_MISO_PIN GPIO_PIN7
|
||||
|
||||
// LCD5110 pins: ~RST is PD2, ~CE is PD1, D/~C is PD0
|
||||
#define LCD_PORT PD
|
||||
#define LCD_RST_PIN GPIO_PIN2
|
||||
#define LCD_CE_PIN GPIO_PIN1
|
||||
#define LCD_DC_PIN GPIO_PIN0
|
||||
/* here are functions & macros for changing command pins state:
|
||||
* SET_DC() - set D/~C pin high (data)
|
||||
* CLEAR_DC() - clear D/~C (command)
|
||||
* CHIP_EN() - clear ~SCE
|
||||
* CHIP_DIS() - set ~SCE (disable chip)
|
||||
* CLEAR_RST() - set 1 on RST pin (SHOULD BE 0 AT START)
|
||||
*/
|
||||
#define SET_DC() (PORT(LCD_PORT, ODR) |= LCD_DC_PIN)
|
||||
#define CLEAR_DC() (PORT(LCD_PORT, ODR) &= ~LCD_DC_PIN)
|
||||
#define CHIP_EN() (PORT(LCD_PORT, ODR) &= ~LCD_CE_PIN)
|
||||
#define CHIP_DIS() (PORT(LCD_PORT, ODR) |= LCD_CE_PIN)
|
||||
#define CLEAR_RST() (PORT(LCD_PORT, ODR) |= LCD_RST_PIN)
|
||||
#define LCD_RST() (PORT(LCD_PORT, ODR) &= ~LCD_RST_PIN)
|
||||
|
||||
#endif // __PORTS_DEFINITION_H__
|
||||
116
uart_lcd5110/spi.c
Normal file
116
uart_lcd5110/spi.c
Normal file
@ -0,0 +1,116 @@
|
||||
/*
|
||||
* spi.c
|
||||
*
|
||||
* Copyright 2016 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "ports_definition.h"
|
||||
#include "spi.h"
|
||||
|
||||
// global variables for sending big buffer
|
||||
static U16 sendbuflen = 0;
|
||||
static U8 *sendbuf = NULL, *inbuff = NULL;
|
||||
|
||||
/*
|
||||
* SPI registers
|
||||
* SPI_CR1 (page 271): | LSBFIRST | SPE | BR[2:0] | MSTR | CPOL | CPHA |
|
||||
* BR: xxx - f/2^{xxx+1}
|
||||
* 01111100
|
||||
* SPI_CR2 (page 272): | BDM | BDOE | CRCEN | CRCNEXT | - | RXONLY | SSM | SSI |
|
||||
* 00000000
|
||||
* SPI_ICR (page 273): | TXIE | RXIE | ERRIE | WKIE | - | - | - | - |
|
||||
* SPI_SR (page 274): | BSY | OVR | MODF | CRCERR | WKUP | - | TXE | RXNE |
|
||||
* set it to zero before send new byte
|
||||
*/
|
||||
|
||||
void spi_init(){
|
||||
// pins config: MISO is pullup in, MOSI & SCK are pp out
|
||||
PORT(SPI_PORT, DDR) |= SPI_MOSI_PIN | SPI_SCK_PIN;
|
||||
PORT(SPI_PORT, CR1) |= SPI_MOSI_PIN | SPI_SCK_PIN | SPI_MISO_PIN;
|
||||
// setup line: f/256, enable, master
|
||||
SPI_CR1 = SPI_CR1_SPE | SPI_CR1_BRMASK | SPI_CR1_MSTR;
|
||||
//SPI_CR1 = SPI_CR1_SPE | (SPI_CR1_BRMASK&0x10) | SPI_CR1_MSTR;
|
||||
SPI_CR2 = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* static routine waiting SPI free
|
||||
*/
|
||||
static void spi_wait(){
|
||||
while(!(SPI_SR & SPI_SR_TXE))
|
||||
while(SPI_SR & SPI_SR_BSY);
|
||||
}
|
||||
|
||||
/**
|
||||
* send given data buffer
|
||||
* WARNING! Buffer should have livetime at least while !spi_buf_sent()
|
||||
* set _get == 1 to put received data into the same buffer
|
||||
*/
|
||||
void spi_send_buffer(U8 *buff, U16 len, U8 *inb){
|
||||
inbuff = inb;
|
||||
sendbuflen = len;
|
||||
sendbuf = buff;
|
||||
spi_wait();
|
||||
SPI_DR = *sendbuf;
|
||||
// interrupts: RXNE
|
||||
SPI_ICR = SPI_ICR_RXIE;
|
||||
}
|
||||
|
||||
/**
|
||||
* send next byte from sendbuf (called by interrupt routine)
|
||||
*/
|
||||
void spi_send_next(){
|
||||
if(!sendbuf) return;
|
||||
if(inbuff){
|
||||
*inbuff++ = SPI_DR;
|
||||
}
|
||||
if(--sendbuflen == 0){
|
||||
sendbuf = NULL;
|
||||
SPI_ICR = 0;
|
||||
return;
|
||||
}
|
||||
SPI_DR = *(++sendbuf);
|
||||
}
|
||||
|
||||
/**
|
||||
* blocking send 1 byte & return ansver
|
||||
*/
|
||||
U8 spi_send_byte(U8 data){
|
||||
spi_wait();
|
||||
SPI_ICR = 0;
|
||||
SPI_DR = data;
|
||||
while(!(SPI_SR & SPI_SR_RXNE));
|
||||
return SPI_DR;
|
||||
}
|
||||
|
||||
void spi_send_buffer_blocking(U8 *buff, U16 len, U8 *inb){
|
||||
U16 i;
|
||||
U8 r;
|
||||
for(i = 0; i < len; ++i){
|
||||
r = spi_send_byte(buff[i]);
|
||||
if(inb) inb[i] = r;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* return 1 if there's no data in queue to send
|
||||
*/
|
||||
U8 spi_buf_sent(){
|
||||
if(!sendbuf) return 1;
|
||||
else return 0;
|
||||
}
|
||||
34
uart_lcd5110/spi.h
Normal file
34
uart_lcd5110/spi.h
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* spi.h
|
||||
*
|
||||
* Copyright 2016 Edward V. Emelianov <eddy@sao.ru, edward.emelianoff@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef __SPI_H__
|
||||
#define __SPI_H__
|
||||
|
||||
void spi_init();
|
||||
void spi_send_next();
|
||||
void spi_send_buffer_blocking(U8 *buff, U16 len, U8 *inb);
|
||||
void spi_send_buffer(U8 *buff, U16 len, U8 *inbuf);
|
||||
U8 spi_send_byte(U8 data);
|
||||
U8 spi_buf_sent();
|
||||
#define spiWrite(d, s) do{spi_send_buffer_blocking(d, s, NULL);}while(0)
|
||||
#define spi_write_byte(b) do{spi_send_byte(b);}while(0)
|
||||
|
||||
#endif // __SPI_H__
|
||||
561
uart_lcd5110/stm8l.h
Normal file
561
uart_lcd5110/stm8l.h
Normal file
@ -0,0 +1,561 @@
|
||||
/*
|
||||
* stm8l.h
|
||||
*
|
||||
* Copyright 2014 Edward V. Emelianoff <eddy@sao.ru>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
#ifndef __STM8L_H__
|
||||
#define __STM8L_H__
|
||||
|
||||
typedef unsigned char U8;
|
||||
typedef unsigned int U16;
|
||||
typedef unsigned long U32;
|
||||
#define NULL (void*)0
|
||||
|
||||
/* functions */
|
||||
#define enableInterrupts() {__asm__("rim\n");} // enable interrupts
|
||||
#define disableInterrupts() {__asm__("sim\n");} // disable interrupts
|
||||
#define iret() {__asm__("iret\n");} // Interrupt routine return
|
||||
#define pop_ccr() {__asm__("pop cc\n");} // Pop CCR from the stack
|
||||
#define push_ccr() {__asm__("push cc\n");}// Push CCR on the stack
|
||||
#define rim() {__asm__("rim\n");} // enable interrupts
|
||||
#define sim() {__asm__("sim\n");} // disable interrupts
|
||||
#define nop() {__asm__("nop\n");} // No Operation
|
||||
#define trap() {__asm__("trap\n");} // Trap (soft IT)
|
||||
#define wfi() {__asm__("wfi\n");} // Wait For Interrupt
|
||||
#define halt() {__asm__("halt\n");} // Halt
|
||||
|
||||
/*
|
||||
* Registers map is shown in short datasheet, page 26
|
||||
*/
|
||||
/* GPIO */
|
||||
#define PA_ODR *(unsigned char*)0x5000
|
||||
#define PA_IDR *(unsigned char*)0x5001
|
||||
#define PA_DDR *(unsigned char*)0x5002
|
||||
#define PA_CR1 *(unsigned char*)0x5003
|
||||
#define PA_CR2 *(unsigned char*)0x5004
|
||||
|
||||
#define PB_ODR *(unsigned char*)0x5005
|
||||
#define PB_IDR *(unsigned char*)0x5006
|
||||
#define PB_DDR *(unsigned char*)0x5007
|
||||
#define PB_CR1 *(unsigned char*)0x5008
|
||||
#define PB_CR2 *(unsigned char*)0x5009
|
||||
|
||||
#define PC_ODR *(unsigned char*)0x500A
|
||||
#define PC_IDR *(unsigned char*)0x500B
|
||||
#define PC_DDR *(unsigned char*)0x500C
|
||||
#define PC_CR1 *(unsigned char*)0x500D
|
||||
#define PC_CR2 *(unsigned char*)0x500E
|
||||
|
||||
#define PD_ODR *(unsigned char*)0x500F
|
||||
#define PD_IDR *(unsigned char*)0x5010
|
||||
#define PD_DDR *(unsigned char*)0x5011
|
||||
#define PD_CR1 *(unsigned char*)0x5012
|
||||
#define PD_CR2 *(unsigned char*)0x5013
|
||||
|
||||
#define PE_ODR *(unsigned char*)0x5014
|
||||
#define PE_IDR *(unsigned char*)0x5015
|
||||
#define PE_DDR *(unsigned char*)0x5016
|
||||
#define PE_CR1 *(unsigned char*)0x5017
|
||||
#define PE_CR2 *(unsigned char*)0x5018
|
||||
|
||||
#define PF_ODR *(unsigned char*)0x5019
|
||||
#define PF_IDR *(unsigned char*)0x501A
|
||||
#define PF_DDR *(unsigned char*)0x501B
|
||||
#define PF_CR1 *(unsigned char*)0x501C
|
||||
#define PF_CR2 *(unsigned char*)0x501D
|
||||
|
||||
#ifdef STM8S105
|
||||
#define PG_ODR *(unsigned char*)0x501E
|
||||
#define PG_IDR *(unsigned char*)0x501F
|
||||
#define PG_DDR *(unsigned char*)0x5020
|
||||
#define PG_CR1 *(unsigned char*)0x5021
|
||||
#define PG_CR2 *(unsigned char*)0x5022
|
||||
|
||||
#define PH_ODR *(unsigned char*)0x5023
|
||||
#define PH_IDR *(unsigned char*)0x5024
|
||||
#define PH_DDR *(unsigned char*)0x5025
|
||||
#define PH_CR1 *(unsigned char*)0x5026
|
||||
#define PH_CR2 *(unsigned char*)0x5027
|
||||
|
||||
#define PI_ODR *(unsigned char*)0x5028
|
||||
#define PI_IDR *(unsigned char*)0x5029
|
||||
#define PI_DDR *(unsigned char*)0x502A
|
||||
#define PI_CR1 *(unsigned char*)0x502B
|
||||
#define PI_CR2 *(unsigned char*)0x502C
|
||||
#endif // STM8S105
|
||||
|
||||
/* GPIO bits */
|
||||
#define GPIO_PIN0 (1 << 0)
|
||||
#define GPIO_PIN1 (1 << 1)
|
||||
#define GPIO_PIN2 (1 << 2)
|
||||
#define GPIO_PIN3 (1 << 3)
|
||||
#define GPIO_PIN4 (1 << 4)
|
||||
#define GPIO_PIN5 (1 << 5)
|
||||
#define GPIO_PIN6 (1 << 6)
|
||||
#define GPIO_PIN7 (1 << 7)
|
||||
|
||||
/* -------------------- FLASH/EEPROM -------------------- */
|
||||
#define FLASH_CR1 *(unsigned char*)0x505A
|
||||
#define FLASH_CR2 *(unsigned char*)0x505B
|
||||
#define FLASH_NCR2 *(unsigned char*)0x505C
|
||||
#define FLASH_FPR *(unsigned char*)0x505D
|
||||
#define FLASH_NFPR *(unsigned char*)0x505E
|
||||
#define FLASH_IAPSR *(unsigned char*)0x505F
|
||||
#define FLASH_PUKR *(unsigned char*)0x5062 // progmem unprotection
|
||||
#define FLASH_DUKR *(unsigned char*)0x5064 // EEPROM unprotection
|
||||
|
||||
#define EEPROM_KEY1 0xAE // keys to manage EEPROM's write access
|
||||
#define EEPROM_KEY2 0x56
|
||||
#define EEPROM_START_ADDR (unsigned char*)0x4000
|
||||
|
||||
/* ------------------- interrupts ------------------- */
|
||||
#define EXTI_CR1 *(unsigned char*)0x50A0
|
||||
#define EXTI_CR2 *(unsigned char*)0x50A1
|
||||
#define INTERRUPT_HANDLER(fn, num) void fn() __interrupt(num)
|
||||
#define INTERRUPT_DEFINITION(fn, num) extern void fn() __interrupt(num)
|
||||
|
||||
// Reset status register
|
||||
#define RST_SR *(unsigned char*)0x50B3
|
||||
|
||||
/* ------------------- CLOCK ------------------- */
|
||||
#define CLK_ICKR *(unsigned char*)0x50C0
|
||||
#define CLK_ECKR *(unsigned char*)0x50C1
|
||||
#define CLK_CMSR *(unsigned char*)0x50C3
|
||||
#define CLK_SWR *(unsigned char*)0x50C4
|
||||
#define CLK_SWCR *(unsigned char*)0x50C5
|
||||
#define CLK_CKDIVR *(unsigned char*)0x50C6
|
||||
#define CLK_SPCKENR1 *(unsigned char*)0x50C7
|
||||
#define CLK_CSSR *(unsigned char*)0x50C8
|
||||
#define CLK_CCOR *(unsigned char*)0x50C9
|
||||
#define CLK_PCKENR2 *(unsigned char*)0x50CA
|
||||
#define CLK_HSITRIMR *(unsigned char*)0x50CC
|
||||
#define CLK_SWIMCCR *(unsigned char*)0x50CD
|
||||
|
||||
/* ------------------- Watchdog ------------------ */
|
||||
#define WWDG_CR *(unsigned char*)0x50D1
|
||||
#define WWDG_WR *(unsigned char*)0x50D2
|
||||
#define IWDG_KR *(unsigned char*)0x50E0
|
||||
#define IWDG_PR *(unsigned char*)0x50E1
|
||||
#define IWDG_RLR *(unsigned char*)0x50E2
|
||||
|
||||
/* ------------------- AWU, BEEP ------------------- */
|
||||
#define AWU_CSR1 *(unsigned char*)0x50F0
|
||||
#define AWU_APR *(unsigned char*)0x50F1
|
||||
#define AWU_TBR *(unsigned char*)0x50F2
|
||||
#define BEEP_CSR *(unsigned char*)0x50F3
|
||||
|
||||
/* ------------------- SPI ------------------- */
|
||||
#define SPI_CR1 *(unsigned char*)0x5200
|
||||
#define SPI_CR2 *(unsigned char*)0x5201
|
||||
#define SPI_ICR *(unsigned char*)0x5202
|
||||
#define SPI_SR *(unsigned char*)0x5203
|
||||
#define SPI_DR *(unsigned char*)0x5204
|
||||
#define SPI_CRCPR *(unsigned char*)0x5205
|
||||
#define SPI_RXCRCR *(unsigned char*)0x5206
|
||||
#define SPI_TXCRCR *(unsigned char*)0x5207
|
||||
// SPI_CR1 (page 271): | LSBFIRST | SPE | BR[2:0] | MSTR | CPOL | CPHA |
|
||||
#define SPI_CR1_LSBFIRST (1<<7)
|
||||
#define SPI_CR1_SPE (1<<6)
|
||||
#define SPI_CR1_BRMASK (0x38)
|
||||
#define SPI_CR1_MSTR (1<<2)
|
||||
#define SPI_CR1_CPOL (1<<1)
|
||||
#define SPI_CR1_CPHA (1)
|
||||
// SPI_CR2 (page 272): | BDM | BDOE | CRCEN | CRCNEXT | - | RXONLY | SSM | SSI |
|
||||
#define SPI_CR2_BDM (1<<7)
|
||||
#define SPI_CR2_BDOE (1<<6)
|
||||
#define SPI_CR2_CRCEN (1<<5)
|
||||
#define SPI_CR2_CRCNEXT (1<<4)
|
||||
#define SPI_CR2_RXONLY (1<<2)
|
||||
#define SPI_CR2_SSM (1<<1)
|
||||
#define SPI_CR2_SSI (1)
|
||||
// SPI_ICR (page 273): | TXIE | RXIE | ERRIE | WKIE | - | - | - | - |
|
||||
#define SPI_ICR_TXIE (1<<7)
|
||||
#define SPI_ICR_RXIE (1<<6)
|
||||
#define SPI_ICR_ERRIE (1<<5)
|
||||
#define SPI_ICR_WKIE (1<<4)
|
||||
// SPI_SR (page 274): | BSY | OVR | MODF | CRCERR | WKUP | - | TXE | RXNE |
|
||||
#define SPI_SR_BSY (1<<7)
|
||||
#define SPI_SR_OVR (1<<6)
|
||||
#define SPI_SR_MODF (1<<5)
|
||||
#define SPI_SR_CRCERR (1<<4)
|
||||
#define SPI_SR_WKUP (1<<3)
|
||||
#define SPI_SR_TXE (1<<1)
|
||||
#define SPI_SR_RXNE (1)
|
||||
|
||||
/* ------------------- I2C ------------------- */
|
||||
#define I2C_CR1 *(unsigned char*)0x5210
|
||||
#define I2C_CR2 *(unsigned char*)0x5211
|
||||
#define I2C_FREQR *(unsigned char*)0x5212
|
||||
#define I2C_OARL *(unsigned char*)0x5213
|
||||
#define I2C_OARH *(unsigned char*)0x5214
|
||||
#define I2C_DR *(unsigned char*)0x5216
|
||||
#define I2C_SR1 *(unsigned char*)0x5217
|
||||
#define I2C_SR2 *(unsigned char*)0x5218
|
||||
#define I2C_SR3 *(unsigned char*)0x5219
|
||||
#define I2C_ITR *(unsigned char*)0x521A
|
||||
#define I2C_CCRL *(unsigned char*)0x521B
|
||||
#define I2C_CCRH *(unsigned char*)0x521C
|
||||
#define I2C_TRISER *(unsigned char*)0x521D
|
||||
#define I2C_PECR *(unsigned char*)0x521E
|
||||
|
||||
/* ------------------- UART ------------------- */
|
||||
#ifdef STM8S003
|
||||
#define UART1_SR *(unsigned char*)0x5230
|
||||
#define UART1_DR *(unsigned char*)0x5231
|
||||
#define UART1_BRR1 *(unsigned char*)0x5232
|
||||
#define UART1_BRR2 *(unsigned char*)0x5233
|
||||
#define UART1_CR1 *(unsigned char*)0x5234
|
||||
#define UART1_CR2 *(unsigned char*)0x5235
|
||||
#define UART1_CR3 *(unsigned char*)0x5236
|
||||
#define UART1_CR4 *(unsigned char*)0x5237
|
||||
#define UART1_CR5 *(unsigned char*)0x5238
|
||||
#define UART1_GTR *(unsigned char*)0x5239
|
||||
#define UART1_PSCR *(unsigned char*)0x523A
|
||||
#endif // STM8S003
|
||||
#ifdef STM8S105
|
||||
#define UART2_SR *(unsigned char*)0x5240
|
||||
#define UART2_DR *(unsigned char*)0x5241
|
||||
#define UART2_BRR1 *(unsigned char*)0x5242
|
||||
#define UART2_BRR2 *(unsigned char*)0x5243
|
||||
#define UART2_CR1 *(unsigned char*)0x5244
|
||||
#define UART2_CR2 *(unsigned char*)0x5245
|
||||
#define UART2_CR3 *(unsigned char*)0x5246
|
||||
#define UART2_CR4 *(unsigned char*)0x5247
|
||||
#define UART2_CR5 *(unsigned char*)0x5248
|
||||
#define UART2_CR6 *(unsigned char*)0x5249
|
||||
#define UART2_GTR *(unsigned char*)0x524A
|
||||
#define UART2_PSCR *(unsigned char*)0x524B
|
||||
#endif // STM8S105
|
||||
|
||||
/* UART_CR1 bits */
|
||||
#define UART_CR1_R8 (1 << 7)
|
||||
#define UART_CR1_T8 (1 << 6)
|
||||
#define UART_CR1_UARTD (1 << 5)
|
||||
#define UART_CR1_M (1 << 4)
|
||||
#define UART_CR1_WAKE (1 << 3)
|
||||
#define UART_CR1_PCEN (1 << 2)
|
||||
#define UART_CR1_PS (1 << 1)
|
||||
#define UART_CR1_PIEN (1 << 0)
|
||||
|
||||
/* UART_CR2 bits */
|
||||
#define UART_CR2_TIEN (1 << 7)
|
||||
#define UART_CR2_TCIEN (1 << 6)
|
||||
#define UART_CR2_RIEN (1 << 5)
|
||||
#define UART_CR2_ILIEN (1 << 4)
|
||||
#define UART_CR2_TEN (1 << 3)
|
||||
#define UART_CR2_REN (1 << 2)
|
||||
#define UART_CR2_RWU (1 << 1)
|
||||
#define UART_CR2_SBK (1 << 0)
|
||||
|
||||
/* USART_CR3 bits */
|
||||
#define UART_CR3_LINEN (1 << 6)
|
||||
#define UART_CR3_STOP2 (1 << 5)
|
||||
#define UART_CR3_STOP1 (1 << 4)
|
||||
#define UART_CR3_CLKEN (1 << 3)
|
||||
#define UART_CR3_CPOL (1 << 2)
|
||||
#define UART_CR3_CPHA (1 << 1)
|
||||
#define UART_CR3_LBCL (1 << 0)
|
||||
|
||||
/* UART_SR bits */
|
||||
#define UART_SR_TXE (1 << 7)
|
||||
#define UART_SR_TC (1 << 6)
|
||||
#define UART_SR_RXNE (1 << 5)
|
||||
#define UART_SR_IDLE (1 << 4)
|
||||
#define UART_SR_OR (1 << 3)
|
||||
#define UART_SR_NF (1 << 2)
|
||||
#define UART_SR_FE (1 << 1)
|
||||
#define UART_SR_PE (1 << 0)
|
||||
|
||||
|
||||
/* ------------------- TIMERS ------------------- */
|
||||
/* TIM1 */
|
||||
#define TIM1_CR1 *(unsigned char*)0x5250
|
||||
#define TIM1_CR2 *(unsigned char*)0x5251
|
||||
#define TIM1_SMCR *(unsigned char*)0x5252
|
||||
#define TIM1_ETR *(unsigned char*)0x5253
|
||||
#define TIM1_IER *(unsigned char*)0x5254
|
||||
#define TIM1_SR1 *(unsigned char*)0x5255
|
||||
#define TIM1_SR2 *(unsigned char*)0x5256
|
||||
#define TIM1_EGR *(unsigned char*)0x5257
|
||||
#define TIM1_CCMR1 *(unsigned char*)0x5258
|
||||
#define TIM1_CCMR2 *(unsigned char*)0x5259
|
||||
#define TIM1_CCMR3 *(unsigned char*)0x525A
|
||||
#define TIM1_CCMR4 *(unsigned char*)0x525B
|
||||
#define TIM1_CCER1 *(unsigned char*)0x525C
|
||||
#define TIM1_CCER2 *(unsigned char*)0x525D
|
||||
#define TIM1_CNTRH *(unsigned char*)0x525E
|
||||
#define TIM1_CNTRL *(unsigned char*)0x525F
|
||||
#define TIM1_PSCRH *(unsigned char*)0x5260
|
||||
#define TIM1_PSCRL *(unsigned char*)0x5261
|
||||
#define TIM1_ARRH *(unsigned char*)0x5262
|
||||
#define TIM1_ARRL *(unsigned char*)0x5263
|
||||
#define TIM1_RCR *(unsigned char*)0x5264
|
||||
#define TIM1_CCR1H *(unsigned char*)0x5265
|
||||
#define TIM1_CCR1L *(unsigned char*)0x5266
|
||||
#define TIM1_CCR2H *(unsigned char*)0x5267
|
||||
#define TIM1_CCR2L *(unsigned char*)0x5268
|
||||
#define TIM1_CCR3H *(unsigned char*)0x5269
|
||||
#define TIM1_CCR3L *(unsigned char*)0x526A
|
||||
#define TIM1_CCR4H *(unsigned char*)0x526B
|
||||
#define TIM1_CCR4L *(unsigned char*)0x526C
|
||||
#define TIM1_BKR *(unsigned char*)0x526D
|
||||
#define TIM1_DTR *(unsigned char*)0x526E
|
||||
#define TIM1_OISR *(unsigned char*)0x526F
|
||||
|
||||
|
||||
/* TIM_IER bits */
|
||||
#define TIM_IER_BIE (1 << 7)
|
||||
#define TIM_IER_TIE (1 << 6)
|
||||
#define TIM_IER_COMIE (1 << 5)
|
||||
#define TIM_IER_CC4IE (1 << 4)
|
||||
#define TIM_IER_CC3IE (1 << 3)
|
||||
#define TIM_IER_CC2IE (1 << 2)
|
||||
#define TIM_IER_CC1IE (1 << 1)
|
||||
#define TIM_IER_UIE (1 << 0)
|
||||
|
||||
/* TIM_CR1 bits */
|
||||
#define TIM_CR1_APRE (1 << 7)
|
||||
#define TIM_CR1_CMSH (1 << 6)
|
||||
#define TIM_CR1_CMSL (1 << 5)
|
||||
#define TIM_CR1_DIR (1 << 4)
|
||||
#define TIM_CR1_OPM (1 << 3)
|
||||
#define TIM_CR1_URS (1 << 2)
|
||||
#define TIM_CR1_UDIS (1 << 1)
|
||||
#define TIM_CR1_CEN (1 << 0)
|
||||
|
||||
/* TIM_SR1 bits */
|
||||
#define TIM_SR1_BIF (1 << 7)
|
||||
#define TIM_SR1_TIF (1 << 6)
|
||||
#define TIM_SR1_COMIF (1 << 5)
|
||||
#define TIM_SR1_CC4IF (1 << 4)
|
||||
#define TIM_SR1_CC3IF (1 << 3)
|
||||
#define TIM_SR1_CC2IF (1 << 2)
|
||||
#define TIM_SR1_CC1IF (1 << 1)
|
||||
#define TIM_SR1_UIF (1 << 0)
|
||||
|
||||
/* TIM_EGR bits */
|
||||
#define TIM_EGR_BG (1 << 7)
|
||||
#define TIM_EGR_TG (1 << 6)
|
||||
#define TIM_EGR_COMG (1 << 5)
|
||||
#define TIM_EGR_CC4G (1 << 4)
|
||||
#define TIM_EGR_CC3G (1 << 3)
|
||||
#define TIM_EGR_CC2G (1 << 2)
|
||||
#define TIM_EGR_CC1G (1 << 1)
|
||||
#define TIM_EGR_UG (1 << 0)
|
||||
|
||||
|
||||
/* TIM2 */
|
||||
#define TIM2_CR1 *(unsigned char*)0x5300
|
||||
#if defined STM8S105 || defined STM8S103
|
||||
#define TIM2_IER *(unsigned char*)0x5301
|
||||
#define TIM2_SR1 *(unsigned char*)0x5302
|
||||
#define TIM2_SR2 *(unsigned char*)0x5303
|
||||
#define TIM2_EGR *(unsigned char*)0x5304
|
||||
#define TIM2_CCMR1 *(unsigned char*)0x5305
|
||||
#define TIM2_CCMR2 *(unsigned char*)0x5306
|
||||
#define TIM2_CCMR3 *(unsigned char*)0x5307
|
||||
#define TIM2_CCER1 *(unsigned char*)0x5308
|
||||
#define TIM2_CCER2 *(unsigned char*)0x5309
|
||||
#define TIM2_CNTRH *(unsigned char*)0x530A
|
||||
#define TIM2_CNTRL *(unsigned char*)0x530B
|
||||
#define TIM2_PSCR *(unsigned char*)0x530C
|
||||
#define TIM2_ARRH *(unsigned char*)0x530D
|
||||
#define TIM2_ARRL *(unsigned char*)0x530E
|
||||
#define TIM2_CCR1H *(unsigned char*)0x530F
|
||||
#define TIM2_CCR1L *(unsigned char*)0x5310
|
||||
#define TIM2_CCR2H *(unsigned char*)0x5311
|
||||
#define TIM2_CCR2L *(unsigned char*)0x5312
|
||||
#define TIM2_CCR3H *(unsigned char*)0x5313
|
||||
#define TIM2_CCR3L *(unsigned char*)0x5314
|
||||
#elif defined STM8S003
|
||||
#define TIM2_IER *(unsigned char*)0x5303
|
||||
#define TIM2_SR1 *(unsigned char*)0x5304
|
||||
#define TIM2_SR2 *(unsigned char*)0x5305
|
||||
#define TIM2_EGR *(unsigned char*)0x5306
|
||||
#define TIM2_CCMR1 *(unsigned char*)0x5307
|
||||
#define TIM2_CCMR2 *(unsigned char*)0x5308
|
||||
#define TIM2_CCMR3 *(unsigned char*)0x5309
|
||||
#define TIM2_CCER1 *(unsigned char*)0x530A
|
||||
#define TIM2_CCER2 *(unsigned char*)0x530B
|
||||
#define TIM2_CNTRH *(unsigned char*)0x530C
|
||||
#define TIM2_CNTRL *(unsigned char*)0x530D
|
||||
#define TIM2_PSCR *(unsigned char*)0x530E
|
||||
#define TIM2_ARRH *(unsigned char*)0x530F
|
||||
#define TIM2_ARRL *(unsigned char*)0x5310
|
||||
#define TIM2_CCR1H *(unsigned char*)0x5311
|
||||
#define TIM2_CCR1L *(unsigned char*)0x5312
|
||||
#define TIM2_CCR2H *(unsigned char*)0x5313
|
||||
#define TIM2_CCR2L *(unsigned char*)0x5314
|
||||
#define TIM2_CCR3H *(unsigned char*)0x5315
|
||||
#define TIM2_CCR3L *(unsigned char*)0x5316
|
||||
#endif
|
||||
|
||||
|
||||
/* TIM3 */
|
||||
#if defined STM8S105 || defined STM8S103
|
||||
#define TIM3_CR1 *(unsigned char*)0x5320
|
||||
#define TIM3_IER *(unsigned char*)0x5321
|
||||
#define TIM3_SR1 *(unsigned char*)0x5322
|
||||
#define TIM3_SR2 *(unsigned char*)0x5323
|
||||
#define TIM3_EGR *(unsigned char*)0x5324
|
||||
#define TIM3_CCMR1 *(unsigned char*)0x5325
|
||||
#define TIM3_CCMR2 *(unsigned char*)0x5326
|
||||
#define TIM3_CCER1 *(unsigned char*)0x5327
|
||||
#define TIM3_CNTRH *(unsigned char*)0x5328
|
||||
#define TIM3_CNTRL *(unsigned char*)0x5329
|
||||
#define TIM3_PSCR *(unsigned char*)0x532A
|
||||
#define TIM3_ARRH *(unsigned char*)0x532B
|
||||
#define TIM3_ARRL *(unsigned char*)0x532C
|
||||
#define TIM3_CCR1H *(unsigned char*)0x532D
|
||||
#define TIM3_CCR1L *(unsigned char*)0x532E
|
||||
#define TIM3_CCR2H *(unsigned char*)0x532F
|
||||
#define TIM3_CCR2L *(unsigned char*)0x5330
|
||||
#endif
|
||||
|
||||
/* TIM4 */
|
||||
#define TIM4_CR1 *(unsigned char*)0x5340
|
||||
#if defined STM8S105 || defined STM8S103
|
||||
#define TIM4_IER *(unsigned char*)0x5341
|
||||
#define TIM4_SR *(unsigned char*)0x5342
|
||||
#define TIM4_EGR *(unsigned char*)0x5343
|
||||
#define TIM4_CNTR *(unsigned char*)0x5344
|
||||
#define TIM4_PSCR *(unsigned char*)0x5345
|
||||
#define TIM4_ARR *(unsigned char*)0x5346
|
||||
#elif defined STM8S003
|
||||
#define TIM4_IER *(unsigned char*)0x5343
|
||||
#define TIM4_SR *(unsigned char*)0x5344
|
||||
#define TIM4_EGR *(unsigned char*)0x5345
|
||||
#define TIM4_CNTR *(unsigned char*)0x5346
|
||||
#define TIM4_PSCR *(unsigned char*)0x5347
|
||||
#define TIM4_ARR *(unsigned char*)0x5348
|
||||
#endif
|
||||
|
||||
/* ------------------- ADC ------------------- */
|
||||
#define ADC_DB0RH *(unsigned char*)0x53E0
|
||||
#define ADC_DB0RL *(unsigned char*)0x53E1
|
||||
#define ADC_DB1RH *(unsigned char*)0x53E2
|
||||
#define ADC_DB1RL *(unsigned char*)0x53E3
|
||||
#define ADC_DB2RH *(unsigned char*)0x53E4
|
||||
#define ADC_DB2RL *(unsigned char*)0x53E5
|
||||
#define ADC_DB3RH *(unsigned char*)0x53E6
|
||||
#define ADC_DB3RL *(unsigned char*)0x53E7
|
||||
#define ADC_DB4RH *(unsigned char*)0x53E8
|
||||
#define ADC_DB4RL *(unsigned char*)0x53E9
|
||||
#define ADC_DB5RH *(unsigned char*)0x53EA
|
||||
#define ADC_DB5RL *(unsigned char*)0x53EB
|
||||
#define ADC_DB6RH *(unsigned char*)0x53EC
|
||||
#define ADC_DB6RL *(unsigned char*)0x53ED
|
||||
#define ADC_DB7RH *(unsigned char*)0x53EE
|
||||
#define ADC_DB7RL *(unsigned char*)0x53EF
|
||||
#define ADC_DB8RH *(unsigned char*)0x53F0
|
||||
#define ADC_DB8RL *(unsigned char*)0x53F1
|
||||
#define ADC_DB9RH *(unsigned char*)0x53F2
|
||||
#define ADC_DB9RL *(unsigned char*)0x53F3
|
||||
#define ADC_CSR *(unsigned char*)0x5400
|
||||
#define ADC_CR1 *(unsigned char*)0x5401
|
||||
#define ADC_CR2 *(unsigned char*)0x5402
|
||||
#define ADC_CR3 *(unsigned char*)0x5403
|
||||
#define ADC_DRH *(unsigned char*)0x5404
|
||||
#define ADC_DRL *(unsigned char*)0x5405
|
||||
#define ADC_TDRH *(unsigned char*)0x5406
|
||||
#define ADC_TDRL *(unsigned char*)0x5407
|
||||
#define ADC_HTRH *(unsigned char*)0x5408
|
||||
#define ADC_HTRL *(unsigned char*)0x5409
|
||||
#define ADC_LTRH *(unsigned char*)0x540A
|
||||
#define ADC_LTRL *(unsigned char*)0x540B
|
||||
#define ADC_AWSRH *(unsigned char*)0x540C
|
||||
#define ADC_AWSRL *(unsigned char*)0x540D
|
||||
#define ADC_AWCRH *(unsigned char*)0x540E
|
||||
#define ADC_AWCRL *(unsigned char*)0x540F
|
||||
|
||||
/* ------------------- swim control ------------------- */
|
||||
#define CFG_GCR *(unsigned char*)0x7F60
|
||||
#define SWIM_CSR *(unsigned char*)0x7F80
|
||||
|
||||
/* ------------------- ITC ------------------- */
|
||||
#define ITC_SPR1 *(unsigned char*)0x7F70
|
||||
#define ITC_SPR2 *(unsigned char*)0x7F71
|
||||
#define ITC_SPR3 *(unsigned char*)0x7F72
|
||||
#define ITC_SPR4 *(unsigned char*)0x7F73
|
||||
#define ITC_SPR5 *(unsigned char*)0x7F74
|
||||
#define ITC_SPR6 *(unsigned char*)0x7F75
|
||||
#define ITC_SPR7 *(unsigned char*)0x7F76
|
||||
#define ITC_SPR8 *(unsigned char*)0x7F77
|
||||
|
||||
|
||||
/* -------------------- UNIQUE ID -------------------- */
|
||||
#if defined STM8S105 || defined STM8S103 // maybe some other MCU have this too???
|
||||
#define U_ID00 (unsigned char*)0x48CD
|
||||
#define U_ID01 (unsigned char*)0x48CE
|
||||
#define U_ID02 (unsigned char*)0x48CF
|
||||
#define U_ID03 (unsigned char*)0x48D0
|
||||
#define U_ID04 (unsigned char*)0x48D1
|
||||
#define U_ID05 (unsigned char*)0x48D2
|
||||
#define U_ID06 (unsigned char*)0x48D3
|
||||
#define U_ID07 (unsigned char*)0x48D4
|
||||
#define U_ID08 (unsigned char*)0x48D5
|
||||
#define U_ID09 (unsigned char*)0x48D6
|
||||
#define U_ID10 (unsigned char*)0x48D7
|
||||
#define U_ID11 (unsigned char*)0x48D8
|
||||
#endif // defined STM8S105 || defined STM8S103
|
||||
|
||||
// CCR REGISTER: bits 3&5 should be 1 if you wanna change EXTI_CRx
|
||||
#define CCR *(unsigned char*)0x7F0A
|
||||
|
||||
/* -------------------- OPTION BYTES -------------------- */
|
||||
#if defined STM8S105
|
||||
// readout protection
|
||||
#define OPT0 *(unsigned char*)0x4800
|
||||
// user boot code
|
||||
#define OPT1 *(unsigned char*)0x4801
|
||||
#define NOPT1 *(unsigned char*)0x4802
|
||||
// alternate functions remapping
|
||||
// | AFR7 | ... | AFR0 |
|
||||
// AFR7 - PD4 = BEEP; AFR6 - PB4/PB5 = I2C; AFR5 - PB0..3 - TIM1
|
||||
// AFR4 - PD7 = TIM1_CH4; AFR3 - PD0 = TIM1_BKIN
|
||||
// AFR2 - PD0 = CLK_CCO; AFR1 - PA3 = TIM3_CH1, PD2 = TIM2_CH3
|
||||
// AFR0 - PD3 = ADC_ETR
|
||||
#define OPT2 *(unsigned char*)0x4803
|
||||
#define NOPT2 *(unsigned char*)0x4804
|
||||
// trim, watchdog
|
||||
#define OPT3 *(unsigned char*)0x4805
|
||||
#define NOPT3 *(unsigned char*)0x4806
|
||||
// extclc, awu
|
||||
#define OPT4 *(unsigned char*)0x4807
|
||||
#define NOPT4 *(unsigned char*)0x4808
|
||||
// HSE stab time
|
||||
#define OPT5 *(unsigned char*)0x4809
|
||||
#define NOPT5 *(unsigned char*)0x480a
|
||||
// none
|
||||
#define OPT6 *(unsigned char*)0x480b
|
||||
#define NOPT6 *(unsigned char*)0x480c
|
||||
// none
|
||||
#define OPT7 *(unsigned char*)0x480d
|
||||
#define NOPT7 *(unsigned char*)0x480e
|
||||
// bootloader opt byte
|
||||
#define OPTBL *(unsigned char*)0x487e
|
||||
#define NOPTBL *(unsigned char*)0x487f
|
||||
|
||||
#endif
|
||||
|
||||
#endif // __STM8L_H__
|
||||
|
||||
// #define *(unsigned char*)0x
|
||||
168
uart_lcd5110/uart.c
Normal file
168
uart_lcd5110/uart.c
Normal file
@ -0,0 +1,168 @@
|
||||
/*
|
||||
* blinky.c
|
||||
*
|
||||
* Copyright 2014 Edward V. Emelianoff <eddy@sao.ru>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include "ports_definition.h"
|
||||
#include "uart.h"
|
||||
#include "interrupts.h"
|
||||
|
||||
U8 UART_rx[UART_BUF_LEN]; // cycle buffer for received data
|
||||
U8 UART_rx_start_i = 0; // started index of received data (from which reading starts)
|
||||
U8 UART_rx_cur_i = 0; // index of current first byte in rx array (to which data will be written)
|
||||
|
||||
/**
|
||||
* Send one byte through UART
|
||||
* @param byte - data to send
|
||||
*/
|
||||
void UART_send_byte(U8 byte){
|
||||
while(!(UART2_SR & UART_SR_TXE)); // wait until previous byte transmitted
|
||||
UART2_DR = byte;
|
||||
}
|
||||
|
||||
void uart_write(char *str){
|
||||
while(*str){
|
||||
while(!(UART2_SR & UART_SR_TXE));
|
||||
UART2_CR2 |= UART_CR2_TEN;
|
||||
UART2_DR = *str++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read one byte from Rx buffer
|
||||
* @param byte - where to store readed data
|
||||
* @return 1 in case of non-empty buffer
|
||||
*/
|
||||
U8 UART_read_byte(U8 *byte){
|
||||
if(UART_rx_start_i == UART_rx_cur_i) // buffer is empty
|
||||
return 0;
|
||||
*byte = UART_rx[UART_rx_start_i++];
|
||||
check_UART_pointer(UART_rx_start_i);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void printUint(U8 *val, U8 len){
|
||||
unsigned long Number = 0;
|
||||
U8 i = len;
|
||||
char ch;
|
||||
U8 decimal_buff[12]; // max len of U32 == 10 + \n + \0
|
||||
if(len > 4 || len == 3 || len == 0) return;
|
||||
for(i = 0; i < 12; i++)
|
||||
decimal_buff[i] = 0;
|
||||
decimal_buff[10] = '\n';
|
||||
ch = 9;
|
||||
switch(len){
|
||||
case 1:
|
||||
Number = *((U8*)val);
|
||||
break;
|
||||
case 2:
|
||||
Number = *((U16*)val);
|
||||
break;
|
||||
case 4:
|
||||
Number = *((unsigned long*)val);
|
||||
break;
|
||||
}
|
||||
do{
|
||||
i = Number % 10L;
|
||||
decimal_buff[ch--] = i + '0';
|
||||
Number /= 10L;
|
||||
}while(Number && ch > -1);
|
||||
uart_write((char*)&decimal_buff[ch+1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* print signed long onto terminal
|
||||
* max len = 10 symbols + 1 for "-" + 1 for '\n' + 1 for 0 = 13
|
||||
*/
|
||||
void print_long(long Number){
|
||||
U8 i, L = 0;
|
||||
char ch;
|
||||
char decimal_buff[12];
|
||||
decimal_buff[11] = 0;
|
||||
ch = 11;
|
||||
if(Number < 0){
|
||||
Number = -Number;
|
||||
L = 1;
|
||||
}
|
||||
do{
|
||||
i = Number % 10L;
|
||||
decimal_buff[--ch] = i + '0';
|
||||
Number /= 10L;
|
||||
}while(Number && ch > 0);
|
||||
if(ch > 0 && L) decimal_buff[--ch] = '-';
|
||||
uart_write(&decimal_buff[ch]);
|
||||
}
|
||||
|
||||
U8 readInt(int *val){
|
||||
unsigned long T = Global_time;
|
||||
unsigned long R = 0;
|
||||
int readed;
|
||||
U8 sign = 0, rb, ret = 0, bad = 0;
|
||||
do{
|
||||
if(!UART_read_byte(&rb)) continue;
|
||||
if(rb == '-' && R == 0){ // negative number
|
||||
sign = 1;
|
||||
continue;
|
||||
}
|
||||
if(rb < '0' || rb > '9') break; // number ends with any non-digit symbol that will be omitted
|
||||
ret = 1; // there's at least one digit
|
||||
R = R * 10L + rb - '0';
|
||||
if(R > 0x7fff){ // bad value
|
||||
R = 0;
|
||||
bad = 0;
|
||||
}
|
||||
}while(Global_time - T < 10000); // wait no longer than 10s
|
||||
if(bad || !ret) return 0;
|
||||
readed = (int) R;
|
||||
if(sign) readed *= -1;
|
||||
*val = readed;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void error_msg(char *msg){
|
||||
uart_write("\nERROR: ");
|
||||
uart_write(msg);
|
||||
UART_send_byte('\n');
|
||||
}
|
||||
|
||||
U8 U8toHEX(U8 val){
|
||||
val &= 0x0f;
|
||||
if(val < 10) val += '0';
|
||||
else val += 'a' - 10;
|
||||
return val;
|
||||
}
|
||||
|
||||
void printUHEX(U8 val){
|
||||
uart_write("0x");
|
||||
UART_send_byte(U8toHEX(val>>4)); // MSB
|
||||
UART_send_byte(U8toHEX(val)); // LSB
|
||||
}
|
||||
|
||||
void uart_init(){
|
||||
// PD5 - UART2_TX
|
||||
PORT(UART_PORT, DDR) |= UART_TX_PIN;
|
||||
PORT(UART_PORT, CR1) |= UART_TX_PIN;
|
||||
// Configure UART
|
||||
// 8 bit, no parity, 1 stop (UART_CR1/3 = 0 - reset value)
|
||||
// 57600 on 16MHz: BRR1=0x11, BRR2=0x06
|
||||
UART2_BRR1 = 0x11; UART2_BRR2 = 0x06;
|
||||
UART2_CR2 = UART_CR2_TEN | UART_CR2_REN | UART_CR2_RIEN; // Allow RX/TX, generate ints on rx
|
||||
}
|
||||
|
||||
45
uart_lcd5110/uart.h
Normal file
45
uart_lcd5110/uart.h
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* blinky.h
|
||||
*
|
||||
* Copyright 2014 Edward V. Emelianoff <eddy@sao.ru>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef __MAIN_H__
|
||||
#define __MAIN_H__
|
||||
|
||||
extern volatile unsigned long Global_time; // global time in ms
|
||||
|
||||
#define UART_BUF_LEN 8 // max 7 bytes transmited in on operation
|
||||
|
||||
extern U8 UART_rx[];
|
||||
extern U8 UART_rx_start_i;
|
||||
extern U8 UART_rx_cur_i;
|
||||
|
||||
|
||||
void UART_send_byte(U8 byte);
|
||||
void uart_write(char *str);
|
||||
void printUint(U8 *val, U8 len);
|
||||
void print_long(long Number);
|
||||
void error_msg(char *msg);
|
||||
void uart_init();
|
||||
U8 UART_read_byte(U8 *byte);
|
||||
void printUHEX(U8 val);
|
||||
|
||||
#define check_UART_pointer(x) do{if(x == UART_BUF_LEN) x = 0;}while(0)
|
||||
|
||||
#endif // __MAIN_H__
|
||||
188
uart_lcd5110/uartlcd.ihx
Normal file
188
uart_lcd5110/uartlcd.ihx
Normal file
@ -0,0 +1,188 @@
|
||||
:2080A000AE5240F64824F9AE52417B03F781160390F64D271BAE5240F64824F9AE5245F6EA
|
||||
:2080C000AA08AE5245F790F6905CAE5241F720E0815202C60202C1020126034F20271605CB
|
||||
:2080E000AE00011F01C6020197C602014CC702014F9572FB01F690F7C60201A10826047295
|
||||
:208100005F0201A6015B0281521C5F1F101F0E7B21A1042303CC81DE7B21A1032603CC8107
|
||||
:20812000DE0D212603CC81DE965C1F124F5F9772FB127F4CA10C25F51E121C000AA60AF769
|
||||
:208140007B21A101270E7B21A102271C7B21A104272120301E1FF66B1C5F0F191F0F7B1C4B
|
||||
:208160006B117B196B0E201C161F90FE5F17101F0E20111E1FE6036B18E602FE6B101F0E5C
|
||||
:208180007B186B11A6096B0D4B0A5F894B001E14891E1489CD92EA5B089F887B0E6B15844B
|
||||
:2081A0000A0D5F417B144172FB12AB30F74B0A5F894B001E14891E1489CD941B5B081F10DB
|
||||
:2081C000170E1E1026041E0E27067B0DA1FF2CB87B0D4C5F9772FB1289CD80AE5B025B1C1C
|
||||
:2081E0008152110F0E965C1F101E101C000B7F1E16A300007B15A2007B14A2002E141616E1
|
||||
:2082000090504F1215974F12149517161F14A6016B0EA60B6B0D4B0A5F894B001E1A891E57
|
||||
:208220001A89CD92455B089F0A0D5F417B0D4172FB10AB30F74B0A5F894B001E1A891E1AA5
|
||||
:2082400089CD93675B081F1617147B0DA1002C034F2002A6011E1626041E1427034D26B6B8
|
||||
:20826000887B0E6B10844D27140D0E27100A0D7B0D6B0F5F7B0F9772FB10A62DF75F7B0F4B
|
||||
:208280009772FB1089CD80AE5B025B1181521ACE020B1F0DCE02091F0B5F1F091F070F04C6
|
||||
:2082A0000F020F01961C000389CD80D15B024D2603CC83317B03A12D260E1E09260A1E07F2
|
||||
:2082C0002606A6016B0420697B03A1302403CC83537B03A1392303CC8353A6016B021E0960
|
||||
:2082E000891E09894B0A5F894B00CD95085B081F1517137B030F115F90977B11909572F952
|
||||
:20830000159F1914979E19139572A200309FA2006B189EA20017096B077B186B08AE7FFF7A
|
||||
:2083200013094F12084F120724075F1F091F070F0190CE020B72F20DC6020A120C95C6023F
|
||||
:2083400009120B9790A327109EA2009FA2002403CC82A40D0126040D0226034F201A7B09DF
|
||||
:20836000887B0B6B07846B050D0427051E05501F051E1D1605FFA6015B1A81AE83FE89CD3E
|
||||
:2083800080AE5B021E0389CD80AE5B024B0ACD80A084817B03A40F6B037B03887B04A10A3A
|
||||
:2083A000842406AB306B032004AB576B037B0381AE840789CD80AE5B027B034EA40F88CD45
|
||||
:2083C00083935B0188CD80A0847B0388CD83935B0188CD80A08481AE5011F6AA20AE501195
|
||||
:2083E000F7AE5012F6AA20AE5012F7AE5242A611F7AE5243A606F7AE5245A62CF7810A45FB
|
||||
:0A84000052524F523A20003078002B
|
||||
:02966D000000FB
|
||||
:20840A008080808080808080AE5203F6442403CD84F98080808080808080805204AE52408E
|
||||
:20842A00F66B027B02A520274AAE5241F66B017B02A4804D27FDAE00011F03C6020297C66F
|
||||
:20844A0002024CC702024F9572FB037B01F7C60201C102022612C602014CC70201C60201C2
|
||||
:20846A00A1082604725F0201C60202A1082604725F02025B048080AE5342F644241B90CE60
|
||||
:1F848A00020B72A90001C6020AA90097C60209A9009590CF020BCF0209AE53427F808081
|
||||
:2084A900AE500CF6AA60AE500CF7AE500DF6AAE0AE500DF7AE5200A67CF7AE52017F81AE53
|
||||
:2084C9005203F6A5022607A4804D27F320FB811E07CF02071E05CF02031E03CF0205CD8411
|
||||
:2084E900C8CE0205F6AE5204F7AE5202A640F781CE0205273FCE0207271190CE0207AE52D4
|
||||
:2085090004F690F7CE02075CCF0207CE02035ACF0203CE0203260E725F0206725F0205AE5F
|
||||
:2085290052027F200FCE02055CCF0205CE0205F6AE5204F781CD84C8AE52027FAE52047BC9
|
||||
:2085490003F7AE5203F64424F9AE5204F6815F1305241D909372F90390F68988CD853E5B78
|
||||
:1C856900018516072707909372F90790F75C20DF81CE02052604A60120014F8196
|
||||
:06966F00000000000000F5
|
||||
:2085850052027B05A1202404A6206B055F7B05971D0020894B064B00CD91EF5B041F01AE91
|
||||
:2085A50085AD72FB015B028100000000000000005F000000000700070000147F147F140091
|
||||
:2085C500242A7F2A1200231308646200364955225000000503000000001C2241000000417B
|
||||
:2085E500221C0000082A1C2A080008083E08080000503000000008080808080000606000F2
|
||||
:2086050000002010080402003E5149453E0000427F4000004261514946002141454B310015
|
||||
:208625001814127F10002745454539003C4A494930000171090503003649494936000649D8
|
||||
:2086450049291E00003636000000005636000000000814224100141414141400412214082B
|
||||
:208665000000020151090600324979413E007E1111117E007F49494936003E41414122003D
|
||||
:208685007F4141221C007F49494941007F09090101003E41415132007F0808087F000041CE
|
||||
:2086A5007F4100002040413F01007F08142241007F40404040007F0204027F007F040810F6
|
||||
:2086C5007F003E4141413E007F09090906003E415121DE007F091929460046494949310006
|
||||
:2086E50001017F0101003F4040403F001F2040201F007F2018207F006314081463000304A3
|
||||
:208705007804030061514945430000007F41410002040810200041417F0000000402010209
|
||||
:2087250004004040404040000001020400002054545478007F4844443800384444442000AA
|
||||
:20874500384444487F003854545418000008FE09020018A4A49478007F0804047800004479
|
||||
:208765007D4000004080847D0000007F1028440000417F4000007C04180478007C080404DB
|
||||
:208785007800384444443800FC282424180018242428FC007C080404080048545454200020
|
||||
:2087A500043F444020003C4040207C001C2040201C003C4030403C004428102844000C5051
|
||||
:2087C50050503C004464544C440000083641000000007F000000004136080000080408108B
|
||||
:2087E50008000000000000000808080808080000FF0000000000F80808080808F800000025
|
||||
:2088050000000F08080808080F0000000000FF0808080808FF0000000808F80808080808B7
|
||||
:208825000F0808080808FF0808080F0F0F0F0F0FF0F0F0F0F0F0FFFFFFFFFFFFFFFFFF00F4
|
||||
:208845000000000000FFFFFF00AA005500AA55AA55AA55AA55FF55FF55FF0000FC02040072
|
||||
:208865003C3C3C3C3C3C000018180000083840300E0124122448240000444A5100000051A6
|
||||
:208885004A44000000000000000020403F000000000609060000000D0B0000000000080071
|
||||
:2088A500000008082A08080014141414141400FF00FF00000000FC1414143855545518006D
|
||||
:2088C50000F808F8080800FC04F414141414FC00000008F808F8000014F404FC0000000043
|
||||
:2088E5001F141414000F080F0808001F1017141414141F000000080F080F00001417101FA5
|
||||
:2089050000000000FF14141400FF00FF080800FF00F714141414FF0000007E4B4A4342002C
|
||||
:2089250008FF00FF000014F700FF00001414F414141408F808F8080814F404F4141414146A
|
||||
:2089450017141414080F080F08081417141714141414FF14141408FF08FF080814F700F780
|
||||
:2089650014143E5D55413E007C10384438002054545478003C4A4A4931007C404040FC0005
|
||||
:20898500E0544C44FC003854545418003048FC4830007C0404040C004428102844007C20C2
|
||||
:2089A50010087C007C4122117C007C102844000020443C047C007C0810087C007C101010D6
|
||||
:2089C5007C003844444438007C0404047C00085434147C007C1414140800384444442000D2
|
||||
:2089E50004047C0404000C5050503C006C107C106C007C54542800007C50502000007C50E6
|
||||
:208A050050207C004444545428007C407C407C002844545438007C407C40FC000C1010101D
|
||||
:208A25007C00047C505020007F083E413E007E1111117E007F49494933007F404040FF0037
|
||||
:208A4500E0514F41FF007F49494941001C227F221C007F01010103006314081463007F10B1
|
||||
:208A650008047F007C2112097C007F081422410020413F017F007F020C027F007F0808086F
|
||||
:208A85007F003E4141413E007F0101017F00462919097F007F09090906003E41414122003F
|
||||
:208AA50001017F01010047281008070077087F0877007F4949493600224149493E007F4899
|
||||
:208AC50030007F004149494936007F407F407F00007F484830007F407F40FF0007080808B8
|
||||
:088AE5007F00017F48483000CA
|
||||
:2080000082008083820000008200840A8200840B8200840C8200840D8200840E8200840FEA
|
||||
:2080200082008410820084118200000082000000820084128200841D8200841E8200841F8B
|
||||
:20804000820084208200842182008422820000008200000082008423820084248200842529
|
||||
:208060008200848082008481820084A88200000082000000820000008200000082000000BB
|
||||
:1D808300AE02002707724F00005A26F9AE00132709D6966CD702005A26F7CC8080E3
|
||||
:03808000CC8B5155
|
||||
:208AED003B020FCD8DF784AE8D8389CD80AE5B02C6020FAB3088CD80A0844B0ACD80A08438
|
||||
:208B0D00813B0210CD8E1884AE8D9189CD80AE5B02AE02104B0189CD81085B034B0ACD80EB
|
||||
:208B2D00A084813B0211CD8E3984AE8D9E89CD80AE5B02C60211AB3088CD80A0844B0ACD94
|
||||
:208B4D0080A0848152095F1F041F02AE7F60F6AA01AE7F60F7AE50C67FAE5345A607F7AE58
|
||||
:208B6D005346A67DF7AE5341A601F7AE5340A685F7AE500CF6AA04AE500CF7AE500DF6AA98
|
||||
:208B8D0004AE500DF7AE500FF6A4F8AE500FF7AE5011F6AA07AE5011F7AE5012F6AA07AEFE
|
||||
:208BAD005012F7CD83D7CD84A99ACD8E5AAE8DAD89CD90E95B02CE020B72F0041F08C6029B
|
||||
:208BCD000A12036B07C602091202CE020D905F881309909F1208909E12015B012511CE02B6
|
||||
:208BED000B1304C6020A1203C6020912022414CE020B1F04CE02091F02AE500AF6A804AEF2
|
||||
:208C0D00500AF7965C89CD80D15B024D27A87B01A12B2758A12D2603CC8C90A1482727A166
|
||||
:208C2D00542603CC8CD3A1562603CC8CA6A1682715A1692724A1742603CC8CEAA176260307
|
||||
:208C4D00CC8CBDCC8D007B0188CD80A084AE8DBB89CD80AE5B02CC8BC3AE500FF6A4F8AEE6
|
||||
:208C6D00500FF7CD84A9CD8E5ACC8BC3C6020FA1072503CC8BC3C6020F4CC7020FCD8AEDC8
|
||||
:208C8D00CC8BC3725D020F2603CC8BC3C6020F4AC7020FCD8AEDCC8BC3C60210A17F250313
|
||||
:208CAD00CC8BC3C602104CC70210CD8B0ECC8BC3725D02102603CC8BC3C602104AC70210F1
|
||||
:208CCD00CD8B0ECC8BC3C60211A1032503CC8BC3C602114CC70211CD8B30CC8BC3725D02D6
|
||||
:208CED00112603CC8BC3C602114AC70211CD8B30CC8BC37B01A12024077B0188CD83B08484
|
||||
:208D0D007B0188CD905D5B011101260BCD91087B0188CD905D5B0111012603CC8BC388414B
|
||||
:208D2D007B0241895B01CD80A08484A10A2703CC8BC34B0ACD80A084CC8BC35B0981520880
|
||||
:208D4D00160B17070F060F05CE020B72FB071F03C6020A19066B02C60209190516021702AF
|
||||
:208D6D0088CE020B1304C6020A1203C6020912018425ED5B08810A626961732076616C75A6
|
||||
:208D8D00653A20000A766F702076616C75653A20000A74656D702E2076616C75653A20008C
|
||||
:208DAD00F7D3C5CD20D0D2C9D7C5D4210A000A50524F544F3A0A69202D20696E6974204C4C
|
||||
:208DCD0043440A2B2F2D20436F6E74726173740A562F76202B2F2D20766F700A542F7420BE
|
||||
:0A8DED002B2F2D2074656D700A0015
|
||||
:099675000000000001F4043C01B6
|
||||
:208DF7004B014B21CD8ED65B027B03A407AA104B0188CD8ED65B024B014B20CD8ED65B028C
|
||||
:208E1700814B014B21CD8ED65B027B03A47FAA804B0188CD8ED65B024B014B20CD8ED65B04
|
||||
:208E370002814B014B21CD8ED65B027B03A403AA044B0188CD8ED65B024B014B20CD8ED635
|
||||
:208E57005B0281AE500FF6AA02AE500FF7AE500FF6AA01AE500FF7AE500FF6A4FBAE500F09
|
||||
:208E7700F74B0A4B00CD8D4B5B02AE500FF6AA04AE500FF74B014B21CD8ED65B02C6020F70
|
||||
:208E9700A407AA104B0188CD8ED65B02C60210A47FAA804B0188CD8ED65B02C60211A403ED
|
||||
:208EB700AA044B0188CD8ED65B024B014B20CD8ED65B024B014B0CCD8ED65B02CC8F9EAE6E
|
||||
:208ED700500FF6A4FDAE500FF7AE500FF60D042708A4FEAE500FF72006AA01AE500FF77B48
|
||||
:208EF7000388CD853E8481AE500FF6A4FDAE500FF7AE500FF60D072708A4FEAE500FF72087
|
||||
:208F170006AA01AE500FF75F891E07891E0789CD85575B06AE500FF6AA02AE500FF78152B1
|
||||
:208F3700067B09A154245D7B0AA13024577B096B050F047B0A44444441A654414272FB04C2
|
||||
:208F57001F017B0AA4076B0A0D0B271D90AE000972F90190F66B06AE91479F1B0A979EA907
|
||||
:208F77000095F61A0690F7201B90AE000972F90190F66B03AE914F9F1B0A979EA90095F60B
|
||||
:208F9700140390F75B068190AE00094BF84B015F899089CD94BA5B06725F0213725F02121C
|
||||
:208FB700CC8FBA4B014B80CD8ED65B024B014B40CD8ED65B02AE00094B004BF84B0189CD94
|
||||
:208FD7008EFE5B058152067B0AA10E24067B0BA10625035F206D7B09A12024035F20647B4C
|
||||
:208FF7000988CD8585841F037B0A97A606429F6B0A7B0A6B060F057B0B97A6544272FB0559
|
||||
:209017001F011603AE000972FB014B064B00908989CD94D95B067B0AA47FAA804B0188CD8F
|
||||
:209037008ED65B027B0BA407AA404B0188CD8ED65B024B004B064B001E0689CD8EFE5B058E
|
||||
:20905700AE00015B0681C60212A10E2407C60213A10625057B03CC90E87B03A12024467B22
|
||||
:2090770003A108271BA1092726A10A2706A10D2709204AC602134CC70213725F0212203D8F
|
||||
:20909700725D02122737C602124AC70212202EC6021244444848AB04A10E2405C7021220B7
|
||||
:2090B7001C7B03202CC6021295C602124CC702123B02139E887B0588CD8FDC5B03C6021255
|
||||
:2090D700A10E260C725F0212725C0213A60A20014F81881E04F64D27156B01897B0388CD3E
|
||||
:2090F700905D5B01851101270620005C20E75F84815202AE00091F011E011C005416014B49
|
||||
:20911700A44B01899089CD91575B06160172A901A44B544B005F899089CD94BA5B06CD8FF6
|
||||
:20913700BA725D02132704725A02135B02810E060102040810204080FEFDFBF7EFDFBF7F84
|
||||
:02967E000000EA
|
||||
:20915700521D162017051E2216201716162017141622171C16241316243E1E1472FB245AE6
|
||||
:209177001F037B03887B056B1C841E1C72FB245A1F011E011F181E181F126B107B1B6B1196
|
||||
:2091970093905A5D274D1E12F61E125A1F121E10F71E105A1F1020E87B14887B166B058409
|
||||
:2091B7001E1C1F011E011F0E6B0C7B046B0D170A160A17081E0A5A1F0A1E0827161E0EF6F4
|
||||
:2091D7006B071E0E5C1F0E1E0C7B07F71E0C5C1F0C20DD1E055B1D815210961C00131F0599
|
||||
:2091F700961C00151F03965C1F091E055C1F071E07F690971E035C1F0D1E0DF690421E09AB
|
||||
:20921700FF965C1F0B1E0BF66B101E07F697160390F642416B0F411E05F697160D90F64258
|
||||
:209237009F1B0F1B101E0BF7965CFE5B1081521D1E22A300007B21A2007B20A2002F040F18
|
||||
:209257000D2004A6016B0D0D0D27151E22504F12216B1B4F12201F186B167B1B6B17200840
|
||||
:20927700162217181620171616181714161617121E26A300007B25A2007B24A2002E1E7B2E
|
||||
:2092970027406B114F12266B104F12256B0F4F12246B0E1610170B160E17092008162617CD
|
||||
:2092B7000B16241709160B170716091E078990891E18891E1889CD92EA5B0817010D0D278A
|
||||
:2092D7000D504F120290974F12019095200216015B1D8152040F020F017B0B484F494D2687
|
||||
:2092F7002E160D1E0B905859170D1F0B1E09130D7B08120C7B07120B240D160D1E0B549066
|
||||
:2093170056170D1F0B20080C017B016B0220CA7B026B041E09130D7B08120C7B07120B25F2
|
||||
:2093370013160972F20D7B08120C977B07120B9517091F07160D1E0B549056170D1F0B7B72
|
||||
:20935700046B030A040D0326CA1E0916075B0481521E1E23A300007B22A2007B21A2002F52
|
||||
:20937700040F112004A6016B110D1127151E23504F12226B0E4F12211F076B057B0E6B0672
|
||||
:209397002008162317071621170516071714160517121E27A300007B26A2007B25A2002FBC
|
||||
:2093B700040F162004A6016B160D16271E7B28406B1E4F12276B1D4F12266B1C4F12256B3E
|
||||
:2093D7001B161D1719161B1717200816271719162517171619170B16171E0B8990891E181C
|
||||
:2093F700891E1889CD941B5B0817017B1118164D270D504F120290974F1201909520021643
|
||||
:20941700015B1E8152125F1F051F03A6206B027B15484F496B0116171E1590585917171F34
|
||||
:20943700157B036B0F1E04887B076B1384081259090F1F047B126B067B0F6B030D01271AE7
|
||||
:209457007B06AA016B0A7B056B097B046B087B036B0716091705160717031E05131B7B043C
|
||||
:20947700121A7B031219252B160572F21B7B04121A6B0C7B03121917056B037B0C6B047B50
|
||||
:2094970018AA0190977B1790957B16977B159517171F150A020D022703CC94261E1716153A
|
||||
:2094B7005B1281520216051701160993905A5D270C7B081E01F71E015C1F0120EE1E055B34
|
||||
:2094D70002815208160B1701160B1E0D1F071705160F1703905A1E0327121E07F61E075CB2
|
||||
:2094F7001F071E05F71E055C1F0520E61E015B088152409096905C961C00431F0B1E0BE697
|
||||
:2095170003961C00471F151E151F171E171F3F1E3F88E60197844290FF72A900021E0BE624
|
||||
:20953700031E151F111E111F131E131F191E1988E60397844290FF965C1F1B1E1BF66B1D6D
|
||||
:209557001E0BF697161590E603429F1B1D1E1BF71E1BF66B1E1E0BE60197161590E602420D
|
||||
:209577009F1B1E1E1BF79096905C93FE1F1F1E0BE6011E151F211E211F231E231F251E251F
|
||||
:2095970088E60397844272FB1F90FF93FE1F271E0BE6021E151F291E291F2B1E2B1F2F1E22
|
||||
:2095B7002F88E60297844272FB2790FF160B1E0BE6021E151F311E311F331E331F351E3527
|
||||
:2095D70088E6019784429F90F71E0B5C1F371E0BE60290971E15E60390421E37FF16151EE4
|
||||
:2095F7000BE6031E151F3D1E3D1F051E0588F69784429F90F71E155C1F2D1E0BE60390971A
|
||||
:209617001E15E60290421E2DFF1E151C00037F1E0B1C00037F965CE6036B0AE6026B09E6D2
|
||||
:20963700016B08F61643170D164572F909173B887B09190F6B3B84190D6B39163BEF02168B
|
||||
:1696570039FFFE16491E4772F93B9F193A979E193995515B4081E2
|
||||
:00000001FF
|
||||
Loading…
x
Reference in New Issue
Block a user