├── .gitattributes ├── .gitignore ├── Documentation ├── Doxyfile ├── Gui Class Diagram.png ├── Gui Usage Sequence Diagram.png ├── HMI Library.chm ├── Overall Class Diagram.png ├── TouchDriver Activity Diagram.png └── Use Case Diagram.png ├── Fonts.h ├── GraphicDriver ├── GraphicDriver.c └── GraphicDriver.h ├── Graphics ├── Graphics.c └── Graphics.h ├── Gui ├── Gui.c └── Gui.h ├── README ├── TouchDriver ├── TouchDriver.c └── TouchDriver.h ├── Typedefs.h ├── main.c └── src ├── Fonts.h ├── GraphicDriver ├── GraphicDriver.c └── GraphicDriver.h ├── Graphics ├── Graphics.c └── Graphics.h ├── Gui ├── Gui.c └── Gui.h ├── TouchDriver ├── TouchDriver.c └── TouchDriver.h ├── Typedefs.h └── main.c /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | [Dd]ebug/ 46 | [Rr]elease/ 47 | *_i.c 48 | *_p.c 49 | *.ilk 50 | *.meta 51 | *.obj 52 | *.pch 53 | *.pdb 54 | *.pgc 55 | *.pgd 56 | *.rsp 57 | *.sbr 58 | *.tlb 59 | *.tli 60 | *.tlh 61 | *.tmp 62 | *.vspscc 63 | .builds 64 | *.dotCover 65 | 66 | ## TODO: If you have NuGet Package Restore enabled, uncomment this 67 | #packages/ 68 | 69 | # Visual C++ cache files 70 | ipch/ 71 | *.aps 72 | *.ncb 73 | *.opensdf 74 | *.sdf 75 | 76 | # Visual Studio profiler 77 | *.psess 78 | *.vsp 79 | 80 | # ReSharper is a .NET coding add-in 81 | _ReSharper* 82 | 83 | # Installshield output folder 84 | [Ee]xpress 85 | 86 | # DocProject is a documentation generator add-in 87 | DocProject/buildhelp/ 88 | DocProject/Help/*.HxT 89 | DocProject/Help/*.HxC 90 | DocProject/Help/*.hhc 91 | DocProject/Help/*.hhk 92 | DocProject/Help/*.hhp 93 | DocProject/Help/Html2 94 | DocProject/Help/html 95 | 96 | # Click-Once directory 97 | publish 98 | 99 | # Others 100 | [Bb]in 101 | [Oo]bj 102 | sql 103 | TestResults 104 | *.Cache 105 | ClientBin 106 | stylecop.* 107 | ~$* 108 | *.dbmdl 109 | Generated_Code #added for RIA/Silverlight projects 110 | 111 | # Backup & report files from converting an old project file to a newer 112 | # Visual Studio version. Backup files are not needed, because we have git ;-) 113 | _UpgradeReport_Files/ 114 | Backup*/ 115 | UpgradeLog*.XML 116 | 117 | 118 | 119 | ############ 120 | ## Windows 121 | ############ 122 | 123 | # Windows image file caches 124 | Thumbs.db 125 | 126 | # Folder config file 127 | Desktop.ini 128 | 129 | 130 | ############# 131 | ## Python 132 | ############# 133 | 134 | *.py[co] 135 | 136 | # Packages 137 | *.egg 138 | *.egg-info 139 | dist 140 | build 141 | eggs 142 | parts 143 | bin 144 | var 145 | sdist 146 | develop-eggs 147 | .installed.cfg 148 | 149 | # Installer logs 150 | pip-log.txt 151 | 152 | # Unit test / coverage reports 153 | .coverage 154 | .tox 155 | 156 | #Translations 157 | *.mo 158 | 159 | #Mr Developer 160 | .mr.developer.cfg 161 | 162 | # Mac crap 163 | .DS_Store 164 | -------------------------------------------------------------------------------- /Documentation/Gui Class Diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgrze/HMI_Library/95135bb89b12341e3e9ea31c368562b045501427/Documentation/Gui Class Diagram.png -------------------------------------------------------------------------------- /Documentation/Gui Usage Sequence Diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgrze/HMI_Library/95135bb89b12341e3e9ea31c368562b045501427/Documentation/Gui Usage Sequence Diagram.png -------------------------------------------------------------------------------- /Documentation/HMI Library.chm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgrze/HMI_Library/95135bb89b12341e3e9ea31c368562b045501427/Documentation/HMI Library.chm -------------------------------------------------------------------------------- /Documentation/Overall Class Diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgrze/HMI_Library/95135bb89b12341e3e9ea31c368562b045501427/Documentation/Overall Class Diagram.png -------------------------------------------------------------------------------- /Documentation/TouchDriver Activity Diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgrze/HMI_Library/95135bb89b12341e3e9ea31c368562b045501427/Documentation/TouchDriver Activity Diagram.png -------------------------------------------------------------------------------- /Documentation/Use Case Diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kgrze/HMI_Library/95135bb89b12341e3e9ea31c368562b045501427/Documentation/Use Case Diagram.png -------------------------------------------------------------------------------- /Fonts.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Fonts.h 3 | * 4 | * @brief font type used in Graphics and Gui modules. 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef FONTS_H_ 16 | #define FONTS_H_ 17 | 18 | //! define font 16P width 19 | #define FONT_16P_WIDTH 16 20 | 21 | //! define font 16P height 22 | #define FONT_16P_HEIGHT 24 23 | 24 | //! define font 12P width 25 | #define FONT_12P_WIDTH 12 26 | 27 | //! define font 12P height 28 | #define FONT_12P_HEIGHT 12 29 | 30 | //! define font 8P width 31 | #define FONT_8P_WIDTH 8 32 | 33 | //! define font 8P height 34 | #define FONT_8P_HEIGHT 12 35 | 36 | //! Enumerated types of font size 37 | typedef enum 38 | { 39 | FONT_8P = 0, 40 | FONT_8P_BOLD, 41 | FONT_12P, 42 | FONT_16P 43 | } FONT_SIZE_TYPE; 44 | 45 | /** 46 | * @brief ASCII font 16x24 table definition 47 | */ 48 | static const unsigned short Font_16p_Ascii_Table[95*FONT_16P_HEIGHT] = 49 | { 50 | /** 51 | * @brief Space ' ' 52 | */ 53 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 55 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 56 | /** 57 | * @brief '!' 58 | */ 59 | 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 60 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000, 61 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 62 | /** 63 | * @brief '"' 64 | */ 65 | 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 66 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 67 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 68 | /** 69 | * @brief '#' 70 | */ 71 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60, 72 | 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318, 73 | 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000, 74 | /** 75 | * @brief '$' 76 | */ 77 | 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C, 78 | 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C, 79 | 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 80 | /** 81 | * @brief '%' 82 | */ 83 | 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611, 84 | 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460, 85 | 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000, 86 | /** 87 | * @brief '&' 88 | */ 89 | 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0, 90 | 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06, 91 | 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 92 | /** 93 | * @brief ''' 94 | */ 95 | 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 96 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 97 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 98 | /** 99 | * @brief '(' 100 | */ 101 | 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060, 102 | 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 103 | 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000, 104 | /** 105 | * @brief ')' 106 | */ 107 | 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300, 108 | 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 109 | 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000, 110 | /** 111 | * @brief '*' 112 | */ 113 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, 114 | 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000, 115 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 116 | /** 117 | * @brief '+' 118 | */ 119 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, 120 | 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180, 121 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 122 | /** 123 | * @brief ',' 124 | */ 125 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 126 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 127 | 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 128 | /** 129 | * @brief '-' 130 | */ 131 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 132 | 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000, 133 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 134 | /** 135 | * @brief '.' 136 | */ 137 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 138 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 139 | 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 140 | /** 141 | * @brief '/' 142 | */ 143 | 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, 144 | 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0, 145 | 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 146 | /** 147 | * @brief '0' 148 | */ 149 | 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C, 150 | 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38, 151 | 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 152 | /** 153 | * @brief '1' 154 | */ 155 | 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180, 156 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 157 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 158 | /** 159 | * @brief '2' 160 | */ 161 | 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800, 162 | 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 163 | 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 164 | /** 165 | * @brief '3' 166 | */ 167 | 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600, 168 | 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18, 169 | 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 170 | /** 171 | * @brief '4' 172 | */ 173 | 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60, 174 | 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00, 175 | 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 176 | /** 177 | * @brief '5' 178 | */ 179 | 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC, 180 | 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18, 181 | 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 182 | /** 183 | * @brief '6' 184 | */ 185 | 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC, 186 | 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38, 187 | 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 188 | /** 189 | * @brief '7' 190 | */ 191 | 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380, 192 | 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030, 193 | 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 194 | /** 195 | * @brief '8' 196 | */ 197 | 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638, 198 | 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38, 199 | 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 200 | /** 201 | * @brief '9' 202 | */ 203 | 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C, 204 | 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C, 205 | 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 206 | /** 207 | * @brief ':' 208 | */ 209 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, 210 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 211 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 212 | /** 213 | * @brief ';' 214 | */ 215 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, 216 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 217 | 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, 218 | /** 219 | * @brief '<' 220 | */ 221 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 222 | 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0, 223 | 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 224 | /** 225 | * @brief '=' 226 | */ 227 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 228 | 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000, 229 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 230 | /** 231 | * @brief '>' 232 | */ 233 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 234 | 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0, 235 | 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 236 | /** 237 | * @brief '?' 238 | */ 239 | 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00, 240 | 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000, 241 | 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 242 | /** 243 | * @brief '@' 244 | */ 245 | 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411, 246 | 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004, 247 | 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 248 | /** 249 | * @brief 'A' 250 | */ 251 | 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60, 252 | 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C, 253 | 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 254 | /** 255 | * @brief 'B' 256 | */ 257 | 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C, 258 | 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C, 259 | 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 260 | /** 261 | * @brief 'C' 262 | */ 263 | 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006, 264 | 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C, 265 | 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 266 | /** 267 | * @brief 'D' 268 | */ 269 | 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006, 270 | 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06, 271 | 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 272 | /** 273 | * @brief 'E' 274 | */ 275 | 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 276 | 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 277 | 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 278 | /** 279 | * @brief 'F' 280 | */ 281 | 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 282 | 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 283 | 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 284 | /** 285 | * @brief 'G' 286 | */ 287 | 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003, 288 | 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C, 289 | 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 290 | /** 291 | * @brief 'H' 292 | */ 293 | 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 294 | 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 295 | 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 296 | /** 297 | * @brief 'I' 298 | */ 299 | 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 300 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 301 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 302 | /** 303 | * @brief 'J' 304 | */ 305 | 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 306 | 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738, 307 | 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 308 | /** 309 | * @brief 'K' 310 | */ 311 | 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6, 312 | 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806, 313 | 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 314 | /** 315 | * @brief 'L' 316 | */ 317 | 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 318 | 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 319 | 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 320 | /** 321 | * @brief 'M' 322 | */ 323 | 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836, 324 | 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6, 325 | 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 326 | /** 327 | * @brief 'N' 328 | */ 329 | 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC, 330 | 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C, 331 | 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 332 | /** 333 | * @brief 'O' 334 | */ 335 | 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003, 336 | 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C, 337 | 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 338 | /** 339 | * @brief 'P' 340 | */ 341 | 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C, 342 | 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 343 | 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 344 | /** 345 | * @brief 'Q' 346 | */ 347 | 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003, 348 | 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C, 349 | 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 350 | /** 351 | * @brief 'R' 352 | */ 353 | 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806, 354 | 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006, 355 | 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 356 | /** 357 | * @brief 'S' 358 | */ 359 | 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C, 360 | 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C, 361 | 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 362 | /** 363 | * @brief 'T' 364 | */ 365 | 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 366 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 367 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 368 | /** 369 | * @brief 'U' 370 | */ 371 | 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 372 | 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818, 373 | 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 374 | /** 375 | * @brief 'V' 376 | */ 377 | 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C, 378 | 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360, 379 | 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 380 | /** 381 | * @brief 'W' 382 | */ 383 | 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366, 384 | 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C, 385 | 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 386 | /** 387 | * @brief 'X' 388 | */ 389 | 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0, 390 | 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C, 391 | 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 392 | /** 393 | * @brief 'Y' 394 | */ 395 | 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660, 396 | 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 397 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 398 | /** 399 | * @brief 'Z' 400 | */ 401 | 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600, 402 | 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006, 403 | 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 404 | /** 405 | * @brief '[' 406 | */ 407 | 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 408 | 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 409 | 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000, 410 | /** 411 | * @brief '\' 412 | */ 413 | 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0, 414 | 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300, 415 | 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 416 | /** 417 | * @brief ']' 418 | */ 419 | 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 420 | 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 421 | 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000, 422 | /** 423 | * @brief '^' 424 | */ 425 | 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630, 426 | 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 427 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 428 | /** 429 | * @brief '_' 430 | */ 431 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 432 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 433 | 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 434 | /** 435 | * @brief ''' 436 | */ 437 | 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000, 438 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 439 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 440 | /** 441 | * @brief 'a' 442 | */ 443 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8, 444 | 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C, 445 | 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 446 | /** 447 | * @brief 'b' 448 | */ 449 | 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8, 450 | 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, 451 | 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 452 | /** 453 | * @brief 'c' 454 | */ 455 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0, 456 | 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30, 457 | 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 458 | /** 459 | * @brief 'd' 460 | */ 461 | 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0, 462 | 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, 463 | 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 464 | /** 465 | * @brief 'e' 466 | */ 467 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, 468 | 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30, 469 | 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 470 | /** 471 | * @brief 'f' 472 | */ 473 | 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, 474 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 475 | 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 476 | /** 477 | * @brief 'g' 478 | */ 479 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8, 480 | 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18, 481 | 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000, 482 | /** 483 | * @brief 'h' 484 | */ 485 | 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8, 486 | 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 487 | 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 488 | /** 489 | * @brief 'i' 490 | */ 491 | 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, 492 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 493 | 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 494 | /** 495 | * @brief 'j' 496 | */ 497 | 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, 498 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 499 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000, 500 | /** 501 | * @brief 'k' 502 | */ 503 | 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C, 504 | 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C, 505 | 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 506 | /** 507 | * @brief 'l' 508 | */ 509 | 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 510 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 511 | 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 512 | /** 513 | * @brief 'm' 514 | */ 515 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF, 516 | 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 517 | 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 518 | /** 519 | * @brief 'n' 520 | */ 521 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8, 522 | 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 523 | 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 524 | /** 525 | * @brief 'o' 526 | */ 527 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, 528 | 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30, 529 | 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 530 | /** 531 | * @brief 'p' 532 | */ 533 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8, 534 | 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, 535 | 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000, 536 | /** 537 | * @brief 'q' 538 | */ 539 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0, 540 | 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, 541 | 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000, 542 | /** 543 | * @brief 'r' 544 | */ 545 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0, 546 | 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 547 | 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 548 | /** 549 | * @brief 's' 550 | */ 551 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0, 552 | 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38, 553 | 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 554 | /** 555 | * @brief 't' 556 | */ 557 | 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, 558 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 559 | 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 560 | /** 561 | * @brief 'u' 562 | */ 563 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818, 564 | 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38, 565 | 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 566 | /** 567 | * @brief 'v' 568 | */ 569 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18, 570 | 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360, 571 | 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 572 | /** 573 | * @brief 'w' 574 | */ 575 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1, 576 | 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C, 577 | 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 578 | /** 579 | * @brief 'x' 580 | */ 581 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38, 582 | 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30, 583 | 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 584 | /** 585 | * @brief 'y' 586 | */ 587 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830, 588 | 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380, 589 | 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000, 590 | /** 591 | * @brief 'z' 592 | */ 593 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC, 594 | 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 595 | 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 596 | /** 597 | * @brief '{' 598 | */ 599 | 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 600 | 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0, 601 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000, 602 | /** 603 | * @brief '|' 604 | */ 605 | 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 606 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 607 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 608 | /** 609 | * @brief '}' 610 | */ 611 | 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180, 612 | 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180, 613 | 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000, 614 | /** 615 | * @brief '~' 616 | */ 617 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 618 | 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 619 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 620 | }; 621 | 622 | /** 623 | * @brief ASCII font 12x12 table definition 624 | */ 625 | static const unsigned short Font_12p_Ascii_Table[95*FONT_12P_HEIGHT] = 626 | { 627 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 628 | 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x2000, 0x0000, 0x0000, 629 | 0x0000, 0x5000, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 630 | 0x0000, 0x0900, 0x0900, 0x1200, 0x7f00, 0x1200, 0x7f00, 0x1200, 0x2400, 0x2400, 0x0000, 0x0000, 631 | 0x1000, 0x3800, 0x5400, 0x5000, 0x5000, 0x3800, 0x1400, 0x5400, 0x5400, 0x3800, 0x1000, 0x0000, 632 | 0x0000, 0x3080, 0x4900, 0x4900, 0x4a00, 0x32c0, 0x0520, 0x0920, 0x0920, 0x10c0, 0x0000, 0x0000, 633 | 0x0000, 0x0c00, 0x1200, 0x1200, 0x1400, 0x1800, 0x2500, 0x2300, 0x2300, 0x1d80, 0x0000, 0x0000, 634 | 0x0000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 635 | 0x0000, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1000, 0x1000, 636 | 0x0000, 0x4000, 0x2000, 0x2000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 637 | 0x0000, 0x2000, 0x7000, 0x2000, 0x5000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 638 | 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x7f00, 0x0800, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 639 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x4000, 640 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 641 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 642 | 0x0000, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4000, 0x4000, 0x0000, 0x0000, 643 | 0x0000, 0x1000, 0x2800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x2800, 0x1000, 0x0000, 0x0000, 644 | 0x0000, 0x1000, 0x3000, 0x5000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 645 | 0x0000, 0x3000, 0x4800, 0x4400, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x7c00, 0x0000, 0x0000, 646 | 0x0000, 0x3000, 0x4800, 0x0400, 0x0800, 0x1000, 0x0800, 0x4400, 0x4800, 0x3000, 0x0000, 0x0000, 647 | 0x0000, 0x0800, 0x1800, 0x1800, 0x2800, 0x2800, 0x4800, 0x7c00, 0x0800, 0x0800, 0x0000, 0x0000, 648 | 0x0000, 0x3c00, 0x2000, 0x4000, 0x7000, 0x4800, 0x0400, 0x4400, 0x4800, 0x3000, 0x0000, 0x0000, 649 | 0x0000, 0x1800, 0x2400, 0x4000, 0x5000, 0x6800, 0x4400, 0x4400, 0x2800, 0x1000, 0x0000, 0x0000, 650 | 0x0000, 0x7c00, 0x0400, 0x0800, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 651 | 0x0000, 0x1000, 0x2800, 0x4400, 0x2800, 0x1000, 0x2800, 0x4400, 0x2800, 0x1000, 0x0000, 0x0000, 652 | 0x0000, 0x1000, 0x2800, 0x4400, 0x4400, 0x2c00, 0x1400, 0x0400, 0x4800, 0x3000, 0x0000, 0x0000, 653 | 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 654 | 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x4000, 655 | 0x0000, 0x0000, 0x0400, 0x0800, 0x3000, 0x4000, 0x3000, 0x0800, 0x0400, 0x0000, 0x0000, 0x0000, 656 | 0x0000, 0x0000, 0x0000, 0x7c00, 0x0000, 0x0000, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 657 | 0x0000, 0x0000, 0x4000, 0x2000, 0x1800, 0x0400, 0x1800, 0x2000, 0x4000, 0x0000, 0x0000, 0x0000, 658 | 0x0000, 0x3800, 0x6400, 0x4400, 0x0400, 0x0800, 0x1000, 0x1000, 0x0000, 0x1000, 0x0000, 0x0000, 659 | 0x0000, 0x0f80, 0x1040, 0x2ea0, 0x51a0, 0x5120, 0x5120, 0x5120, 0x5320, 0x4dc0, 0x2020, 0x1040, 660 | 0x0000, 0x0800, 0x1400, 0x1400, 0x1400, 0x2200, 0x3e00, 0x2200, 0x4100, 0x4100, 0x0000, 0x0000, 661 | 0x0000, 0x3c00, 0x2200, 0x2200, 0x2200, 0x3c00, 0x2200, 0x2200, 0x2200, 0x3c00, 0x0000, 0x0000, 662 | 0x0000, 0x0e00, 0x1100, 0x2100, 0x2000, 0x2000, 0x2000, 0x2100, 0x1100, 0x0e00, 0x0000, 0x0000, 663 | 0x0000, 0x3c00, 0x2200, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2200, 0x3c00, 0x0000, 0x0000, 664 | 0x0000, 0x3e00, 0x2000, 0x2000, 0x2000, 0x3e00, 0x2000, 0x2000, 0x2000, 0x3e00, 0x0000, 0x0000, 665 | 0x0000, 0x3e00, 0x2000, 0x2000, 0x2000, 0x3c00, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 666 | 0x0000, 0x0e00, 0x1100, 0x2100, 0x2000, 0x2700, 0x2100, 0x2100, 0x1100, 0x0e00, 0x0000, 0x0000, 667 | 0x0000, 0x2100, 0x2100, 0x2100, 0x2100, 0x3f00, 0x2100, 0x2100, 0x2100, 0x2100, 0x0000, 0x0000, 668 | 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 669 | 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x4800, 0x4800, 0x3000, 0x0000, 0x0000, 670 | 0x0000, 0x2200, 0x2400, 0x2800, 0x2800, 0x3800, 0x2800, 0x2400, 0x2400, 0x2200, 0x0000, 0x0000, 671 | 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x3e00, 0x0000, 0x0000, 672 | 0x0000, 0x2080, 0x3180, 0x3180, 0x3180, 0x2a80, 0x2a80, 0x2a80, 0x2a80, 0x2480, 0x0000, 0x0000, 673 | 0x0000, 0x2100, 0x3100, 0x3100, 0x2900, 0x2900, 0x2500, 0x2300, 0x2300, 0x2100, 0x0000, 0x0000, 674 | 0x0000, 0x0c00, 0x1200, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x1200, 0x0c00, 0x0000, 0x0000, 675 | 0x0000, 0x3c00, 0x2200, 0x2200, 0x2200, 0x3c00, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 676 | 0x0000, 0x0c00, 0x1200, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x1600, 0x0d00, 0x0100, 0x0000, 677 | 0x0000, 0x3e00, 0x2100, 0x2100, 0x2100, 0x3e00, 0x2400, 0x2200, 0x2100, 0x2080, 0x0000, 0x0000, 678 | 0x0000, 0x1c00, 0x2200, 0x2200, 0x2000, 0x1c00, 0x0200, 0x2200, 0x2200, 0x1c00, 0x0000, 0x0000, 679 | 0x0000, 0x3e00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000, 680 | 0x0000, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x1200, 0x0c00, 0x0000, 0x0000, 681 | 0x0000, 0x4100, 0x4100, 0x2200, 0x2200, 0x2200, 0x1400, 0x1400, 0x1400, 0x0800, 0x0000, 0x0000, 682 | 0x0000, 0x4440, 0x4a40, 0x2a40, 0x2a80, 0x2a80, 0x2a80, 0x2a80, 0x2a80, 0x1100, 0x0000, 0x0000, 683 | 0x0000, 0x4100, 0x2200, 0x1400, 0x1400, 0x0800, 0x1400, 0x1400, 0x2200, 0x4100, 0x0000, 0x0000, 684 | 0x0000, 0x4100, 0x2200, 0x2200, 0x1400, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000, 685 | 0x0000, 0x7e00, 0x0200, 0x0400, 0x0800, 0x1000, 0x1000, 0x2000, 0x4000, 0x7e00, 0x0000, 0x0000, 686 | 0x0000, 0x3000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 687 | 0x0000, 0x4000, 0x4000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1000, 0x1000, 0x0000, 0x0000, 688 | 0x0000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 689 | 0x0000, 0x1000, 0x2800, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 690 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e00, 691 | 0x4000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 692 | 0x0000, 0x0000, 0x0000, 0x3800, 0x4400, 0x0400, 0x3c00, 0x4400, 0x4400, 0x3c00, 0x0000, 0x0000, 693 | 0x0000, 0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x6400, 0x5800, 0x0000, 0x0000, 694 | 0x0000, 0x0000, 0x0000, 0x3000, 0x4800, 0x4000, 0x4000, 0x4000, 0x4800, 0x3000, 0x0000, 0x0000, 695 | 0x0000, 0x0400, 0x0400, 0x3400, 0x4c00, 0x4400, 0x4400, 0x4400, 0x4c00, 0x3400, 0x0000, 0x0000, 696 | 0x0000, 0x0000, 0x0000, 0x3800, 0x4400, 0x4400, 0x7c00, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, 697 | 0x0000, 0x6000, 0x4000, 0xe000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, 698 | 0x0000, 0x0000, 0x0000, 0x3400, 0x4c00, 0x4400, 0x4400, 0x4400, 0x4c00, 0x3400, 0x0400, 0x4400, 699 | 0x0000, 0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, 700 | 0x0000, 0x4000, 0x0000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, 701 | 0x0000, 0x4000, 0x0000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 702 | 0x0000, 0x4000, 0x4000, 0x4800, 0x5000, 0x6000, 0x5000, 0x5000, 0x4800, 0x4800, 0x0000, 0x0000, 703 | 0x0000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, 704 | 0x0000, 0x0000, 0x0000, 0x5200, 0x6d00, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x0000, 0x0000, 705 | 0x0000, 0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, 706 | 0x0000, 0x0000, 0x0000, 0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, 707 | 0x0000, 0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x6400, 0x5800, 0x4000, 0x4000, 708 | 0x0000, 0x0000, 0x0000, 0x3400, 0x4c00, 0x4400, 0x4400, 0x4400, 0x4c00, 0x3400, 0x0400, 0x0400, 709 | 0x0000, 0x0000, 0x0000, 0x5000, 0x6000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, 710 | 0x0000, 0x0000, 0x0000, 0x3000, 0x4800, 0x4000, 0x3000, 0x0800, 0x4800, 0x3000, 0x0000, 0x0000, 711 | 0x0000, 0x4000, 0x4000, 0xe000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x6000, 0x0000, 0x0000, 712 | 0x0000, 0x0000, 0x0000, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4c00, 0x3400, 0x0000, 0x0000, 713 | 0x0000, 0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x2800, 0x1000, 0x0000, 0x0000, 714 | 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x5500, 0x5500, 0x5500, 0x5500, 0x2200, 0x0000, 0x0000, 715 | 0x0000, 0x0000, 0x0000, 0x4400, 0x2800, 0x2800, 0x1000, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, 716 | 0x0000, 0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x1000, 717 | 0x0000, 0x0000, 0x0000, 0x7800, 0x0800, 0x1000, 0x2000, 0x2000, 0x4000, 0x7800, 0x0000, 0x0000, 718 | 0x0000, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 719 | 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 720 | 0x0000, 0x4000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 721 | 0x0000, 0x0000, 0x0000, 0x0000, 0x7400, 0x5800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 722 | }; 723 | 724 | static const unsigned char Font_8p_Ascii_Table[95*FONT_8P_HEIGHT] = 725 | { 726 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 727 | 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00, 728 | 0x00,0x00,0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00, 729 | 0x00,0x00,0x00,0x14,0x14,0x3e,0x14,0x28,0x7c,0x28,0x28,0x00, 730 | 0x00,0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x14,0x54,0x38,0x10, 731 | 0x00,0x00,0x00,0x44,0xa8,0xa8,0x50,0x14,0x1a,0x2a,0x24,0x00, 732 | 0x00,0x00,0x00,0x20,0x50,0x50,0x20,0xe8,0x98,0x98,0x60,0x00, 733 | 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 734 | 0x00,0x00,0x00,0x40,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 735 | 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 736 | 0x00,0x00,0x00,0x40,0xe0,0x40,0xa0,0x00,0x00,0x00,0x00,0x00, 737 | 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, 738 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40, 739 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00, 740 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 741 | 0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x80,0x80,0x00, 742 | 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, 743 | 0x00,0x00,0x00,0x20,0x60,0xa0,0x20,0x20,0x20,0x20,0x20,0x00, 744 | 0x00,0x00,0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x80,0xf0,0x00, 745 | 0x00,0x00,0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00, 746 | 0x00,0x00,0x00,0x10,0x30,0x50,0x50,0x90,0xf8,0x10,0x10,0x00, 747 | 0x00,0x00,0x00,0x70,0x40,0x80,0xe0,0x10,0x10,0x90,0x60,0x00, 748 | 0x00,0x00,0x00,0x60,0x90,0x80,0xa0,0xd0,0x90,0x90,0x60,0x00, 749 | 0x00,0x00,0x00,0xf0,0x10,0x20,0x20,0x20,0x40,0x40,0x40,0x00, 750 | 0x00,0x00,0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, 751 | 0x00,0x00,0x00,0x60,0x90,0x90,0xb0,0x50,0x10,0x90,0x60,0x00, 752 | 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x40,0x00, 753 | 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x40,0x40, 754 | 0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x80,0x60,0x10,0x00,0x00, 755 | 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xf0,0x00,0x00,0x00, 756 | 0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x10,0x60,0x80,0x00,0x00, 757 | 0x00,0x00,0x00,0x60,0x90,0x10,0x20,0x40,0x40,0x00,0x40,0x00, 758 | 0x00,0x00,0x00,0x1c,0x22,0x5b,0xa5,0xa5,0xa5,0xa5,0x9e,0x41, 759 | 0x00,0x00,0x00,0x20,0x50,0x50,0x50,0x50,0x70,0x88,0x88,0x00, 760 | 0x00,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0x88,0xf0,0x00, 761 | 0x00,0x00,0x00,0x38,0x44,0x84,0x80,0x80,0x84,0x44,0x38,0x00, 762 | 0x00,0x00,0x00,0xe0,0x90,0x88,0x88,0x88,0x88,0x90,0xe0,0x00, 763 | 0x00,0x00,0x00,0xf8,0x80,0x80,0xf8,0x80,0x80,0x80,0xf8,0x00, 764 | 0x00,0x00,0x00,0x78,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x00, 765 | 0x00,0x00,0x00,0x38,0x44,0x84,0x80,0x9c,0x84,0x44,0x38,0x00, 766 | 0x00,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x88,0x00, 767 | 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 768 | 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x90,0x90,0x60,0x00, 769 | 0x00,0x00,0x00,0x88,0x90,0xa0,0xe0,0xa0,0x90,0x90,0x88,0x00, 770 | 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,0x00, 771 | 0x00,0x00,0x00,0x82,0xc6,0xc6,0xaa,0xaa,0xaa,0xaa,0x92,0x00, 772 | 0x00,0x00,0x00,0x84,0xc4,0xa4,0xa4,0x94,0x94,0x8c,0x84,0x00, 773 | 0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x48,0x30,0x00, 774 | 0x00,0x00,0x00,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x80,0x00, 775 | 0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x58,0x34,0x04, 776 | 0x00,0x00,0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x42,0x00, 777 | 0x00,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x88,0x70,0x00, 778 | 0x00,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, 779 | 0x00,0x00,0x00,0x84,0x84,0x84,0x84,0x84,0x84,0x48,0x30,0x00, 780 | 0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x50,0x50,0x50,0x20,0x00, 781 | 0x00,0x00,0x00,0x92,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x44,0x00, 782 | 0x00,0x00,0x00,0x84,0x48,0x48,0x30,0x30,0x48,0x48,0x84,0x00, 783 | 0x00,0x00,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00, 784 | 0x00,0x00,0x00,0xf8,0x08,0x10,0x20,0x20,0x40,0x80,0xf8,0x00, 785 | 0x00,0x00,0x00,0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 786 | 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x20,0x20,0x00, 787 | 0x00,0x00,0x00,0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 788 | 0x00,0x00,0x00,0x40,0xa0,0xa0,0xa0,0x00,0x00,0x00,0x00,0x00, 789 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, 790 | 0x00,0x00,0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 791 | 0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x70,0x90,0x90,0x70,0x00, 792 | 0x00,0x00,0x00,0x80,0x80,0xa0,0xd0,0x90,0x90,0xd0,0xa0,0x00, 793 | 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, 794 | 0x00,0x00,0x00,0x10,0x10,0x50,0xb0,0x90,0x90,0xb0,0x50,0x00, 795 | 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0xf0,0x80,0x90,0x60,0x00, 796 | 0x00,0x00,0x00,0xc0,0x80,0xc0,0x80,0x80,0x80,0x80,0x80,0x00, 797 | 0x00,0x00,0x00,0x00,0x00,0x50,0xb0,0x90,0x90,0xb0,0x50,0x10, 798 | 0x00,0x00,0x00,0x80,0x80,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00, 799 | 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 800 | 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 801 | 0x00,0x00,0x00,0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x90,0x00, 802 | 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 803 | 0x00,0x00,0x00,0x00,0x00,0xa6,0xda,0x92,0x92,0x92,0x92,0x00, 804 | 0x00,0x00,0x00,0x00,0x00,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00, 805 | 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, 806 | 0x00,0x00,0x00,0x00,0x00,0xa0,0xd0,0x90,0x90,0xd0,0xa0,0x80, 807 | 0x00,0x00,0x00,0x00,0x00,0x50,0xb0,0x90,0x90,0xb0,0x50,0x10, 808 | 0x00,0x00,0x00,0x00,0x00,0xa0,0xc0,0x80,0x80,0x80,0x80,0x00, 809 | 0x00,0x00,0x00,0x00,0x00,0xe0,0x90,0x40,0x20,0x90,0x60,0x00, 810 | 0x00,0x00,0x00,0x80,0x80,0xc0,0x80,0x80,0x80,0x80,0xc0,0x00, 811 | 0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xb0,0x50,0x00, 812 | 0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x50,0x20,0x00, 813 | 0x00,0x00,0x00,0x00,0x00,0x92,0xaa,0xaa,0xaa,0xaa,0x44,0x00, 814 | 0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00, 815 | 0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x50,0x50,0x20,0x20,0x20, 816 | 0x00,0x00,0x00,0x00,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x00, 817 | 0x00,0x00,0x00,0xc0,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80, 818 | 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 819 | 0x00,0x00,0x00,0xc0,0x40,0x40,0x40,0x20,0x40,0x40,0x40,0x40, 820 | 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xb0,0x00,0x00,0x00,0x00 821 | }; 822 | 823 | /** 824 | * @brief ASCII font 8x12: each character is 8 column (8dots large) and 12 raw (12 dots high) 825 | */ 826 | static const unsigned char Font_8p_bold_Ascii_Table[95*FONT_8P_HEIGHT] = 827 | { 828 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ' ' 32 */ 829 | 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, /* '!' 33 */ 830 | 0x36, 0x36, 0x36, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* '"' 34 */ 831 | 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, /* '#' 35 */ 832 | 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0x78, 0x3C, 0x06, 0xC6, 0x7C, 0x18, 0x18, /* '$' 36 */ 833 | 0x00, 0x00, 0x00, 0x62, 0x66, 0x0C, 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00, /* '%' 37 */ 834 | 0x00, 0x38, 0x6C, 0x38, 0x38, 0x76, 0xF6, 0xCE, 0xCC, 0x76, 0x00, 0x00, /* '&' 38 */ 835 | 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ''' 39 */ 836 | 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, /* '(' 40 */ 837 | 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, /* ')' 41 */ 838 | 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE, 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, /* '*' 42 */ 839 | 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, /* '+' 43 */ 840 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, /* ',' 44 */ 841 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* '-' 45 */ 842 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, /* '.' 46 */ 843 | 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, /* '/' 47 */ 844 | 0x00, 0x7C, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* '0' 48 */ 845 | 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, /* '1' 49 */ 846 | 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, /* '2' 50 */ 847 | 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, /* '3' 51 */ 848 | 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x0C, 0x00, 0x00, /* '4' 52 */ 849 | 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, /* '5' 53 */ 850 | 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* '6' 54 */ 851 | 0x00, 0xFE, 0xC6, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, /* '7' 55 */ 852 | 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* '8' 56 */ 853 | 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, /* '9' 57 */ 854 | 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, /* ':' 58 */ 855 | 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, /* ';' 59 */ 856 | 0x00, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00, /* '<' 60 */ 857 | 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, /* '=' 61 */ 858 | 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, /* '>' 62 */ 859 | 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, /* '?' 63 */ 860 | 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE, 0xDE, 0xDC, 0xC0, 0x7E, 0x00, 0x00, /* '@' 64 */ 861 | 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, /* 'A' 65 */ 862 | 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, /* 'B' 66 */ 863 | 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00, 0x00, /* 'C' 67 */ 864 | 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, /* 'D' 68 */ 865 | 0x00, 0xFE, 0x66, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, /* 'E' 69 */ 866 | 0x00, 0xFE, 0x66, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, /* 'F' 70 */ 867 | 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xCE, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* 'G' 71 */ 868 | 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, /* 'H' 72 */ 869 | 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, /* 'I' 73 */ 870 | 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, /* 'J' 74 */ 871 | 0x00, 0xC6, 0xCC, 0xD8, 0xF0, 0xF0, 0xD8, 0xCC, 0xC6, 0xC6, 0x00, 0x00, /* 'K' 75 */ 872 | 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, /* 'L' 76 */ 873 | 0x00, 0xC6, 0xC6, 0xEE, 0xFE, 0xD6, 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, /* 'M' 77 */ 874 | 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xDE, 0xCE, 0xCE, 0xC6, 0x00, 0x00, /* 'N' 78 */ 875 | 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* 'O' 79 */ 876 | 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, /* 'P' 80 */ 877 | 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x06, 0x00, /* 'Q' 81 */ 878 | 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, /* 'R' 82 */ 879 | 0x00, 0x7C, 0xC6, 0xC0, 0x60, 0x38, 0x0C, 0x06, 0xC6, 0x7C, 0x00, 0x00, /* 'S' 83 */ 880 | 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, /* 'T' 84 */ 881 | 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* 'U' 85 */ 882 | 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, /* 'V' 86 */ 883 | 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0xEE, 0xC6, 0xC6, 0x00, 0x00, /* 'W' 87 */ 884 | 0x00, 0xC6, 0xC6, 0x6C, 0x38, 0x38, 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, /* 'X' 88 */ 885 | 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, /* 'Y' 89 */ 886 | 0x00, 0xFE, 0xC6, 0x8C, 0x18, 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, /* 'Z' 90 */ 887 | 0x00, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7C, 0x00, 0x00, /* '[' 91 */ 888 | 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00, 0x00, /* '\' 92 */ 889 | 0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, /* ']' 93 */ 890 | 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* '^' 94 */ 891 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, /* '_' 95 */ 892 | 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* '`' 96 */ 893 | 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xDC, 0x76, 0x00, 0x00, /* 'a' 97 */ 894 | 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, /* 'b' 98 */ 895 | 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, /* 'c' 99 */ 896 | 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, /* 'd' 100 */ 897 | 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, /* 'e' 101 */ 898 | 0x00, 0x1C, 0x36, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, /* 'f' 102 */ 899 | 0x00, 0x00, 0x00, 0x00, 0x76, 0xCE, 0xC6, 0xC6, 0x7E, 0x06, 0xC6, 0x7C, /* 'g' 103 */ 900 | 0x00, 0xE0, 0x60, 0x60, 0x6C, 0x76, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, /* 'h' 104 */ 901 | 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, /* 'i' 105 */ 902 | 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, /* 'j' 106 */ 903 | 0x00, 0xE0, 0x60, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, /* 'k' 107 */ 904 | 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, /* 'l' 108 */ 905 | 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, /* 'm' 109 */ 906 | 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, /* 'n' 110 */ 907 | 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* 'o' 111 */ 908 | 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, /* 'p' 112 */ 909 | 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, /* 'q' 113 */ 910 | 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, /* 'r' 114 */ 911 | 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x70, 0x1C, 0xC6, 0x7C, 0x00, 0x00, /* 's' 115 */ 912 | 0x00, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, /* 't' 116 */ 913 | 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, /* 'u' 117 */ 914 | 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, /* 'v' 118 */ 915 | 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, /* 'w' 119 */ 916 | 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00, /* 'x' 120 */ 917 | 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, /* 'y' 121 */ 918 | 0x00, 0x00, 0x00, 0x00, 0xFE, 0x8C, 0x18, 0x30, 0x62, 0xFE, 0x00, 0x00, /* 'z' 122 */ 919 | 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, /* '{' 123 */ 920 | 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, /* '|' 124 */ 921 | 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, /* '}' 125 */ 922 | 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* '~' 126 */ 923 | }; 924 | 925 | #endif /* FONTS_H_ */ 926 | -------------------------------------------------------------------------------- /GraphicDriver/GraphicDriver.c: -------------------------------------------------------------------------------- 1 | /** 2 | * @file GraphicDriver.c 3 | * 4 | * @brief Set of hardware dependent functions to support basic graphic functionality 5 | * 6 | * @details User needs to implement LCD driver initialization and function that draws one-pixel point at 7 | * define x and y coordinate 8 | * 9 | * @author Krzysztof Grzeszczak 10 | * 11 | * @version 1.0 12 | * 13 | * @date 2012-2013 14 | * 15 | * @copyright GNU Public License 16 | */ 17 | 18 | #include "GraphicDriver.h" 19 | 20 | /** 21 | * @brief Initialize LCD module and enable it 22 | * @todo Add specific LCD and MCU wise implementation 23 | */ 24 | void GraphicDriver_Initialize(void) 25 | { 26 | do{}while(0); 27 | } 28 | 29 | /** 30 | * @brief Draw one pixel with defined color on LCD 31 | * 32 | * @details Function draws point on the screen 33 | * x = <0, 319> px, horizontal coordinate 34 | * y = <0, 240> px, vertical coordinate 35 | * color = <0x0000, 0xFFFF> 16-bit 5-6-5 format |RRRRR-GGGGGG-BBBBB| RGB color data 36 | * 37 | * @todo Add specific LCD and MCI wise implementation 38 | */ 39 | void GraphicDriver_DrawPoint(unsigned short x, unsigned short y, unsigned int color) 40 | { 41 | do{}while(0); 42 | } 43 | 44 | /** 45 | * @brief Get color data from pixel drawn on LCD 46 | * 47 | * @details Use LCD internal memory to read color data from given coordinates x and y 48 | * 49 | * @todo This implementation is optional. 50 | */ 51 | unsigned int GraphicDriver_GetPoint(unsigned short x, unsigned short y) 52 | { 53 | return 0; 54 | } 55 | -------------------------------------------------------------------------------- /GraphicDriver/GraphicDriver.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file GraphicDriver.h 3 | * 4 | * @brief GraphicDriver module API. 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef GRAPHICDRIVER_H_ 16 | #define GRAPHICDRIVER_H_ 17 | 18 | //! Horizontal resolution in pixel unit 19 | #define H_RES 320 20 | 21 | //! Vertical resolution in pixel unit 22 | #define V_RES 240 23 | 24 | void GraphicDriver_Initialize(void); 25 | void GraphicDriver_DrawPoint(unsigned short x, unsigned short y, unsigned int color); 26 | unsigned int GraphicDriver_GetPoint(unsigned short x, unsigned short y); 27 | 28 | #endif /* GRAPHICDRIVER_H_ */ 29 | -------------------------------------------------------------------------------- /Graphics/Graphics.c: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Graphics.c 3 | * 4 | * @brief Set of functions used to draw basic graphical structures like Line, Rectangle or Character 5 | * 6 | * @details User needs to implement LCD driver initialization and function that draws one-pixel point at 7 | * define x and y coordinate 8 | * 9 | * @author Krzysztof Grzeszczak 10 | * 11 | * @version 1.0 12 | * 13 | * @date 2012-2013 14 | * 15 | * @copyright GNU Public License 16 | */ 17 | 18 | #include "Graphics.h" 19 | 20 | /** 21 | * @brief Draw Rectangle filled with defined color 22 | * 23 | * @details Graphic below will show the meaning of function arguments 24 | * -------############################# x_end, y_end------------ 25 | * -------##########################################------------ 26 | * -------################color#####################------------ 27 | * -------##########################################------------ 28 | * -------x_start,y_start###########################------------ 29 | */ 30 | void Graphics_DrawRect(unsigned short x_start, 31 | unsigned short y_start, 32 | unsigned short x_end, 33 | unsigned short y_end, 34 | unsigned int color) 35 | { 36 | unsigned short x,y; 37 | 38 | for(y = y_start; y < y_end; y++) 39 | { 40 | for(x = x_start; x < x_end; x++) 41 | { 42 | GraphicDriver_DrawPoint(x,y,color); 43 | } 44 | } 45 | } 46 | 47 | /** 48 | * @brief Draw line with defined color 49 | */ 50 | void Graphics_DrawLine(unsigned short x_start, 51 | unsigned short y_start, 52 | unsigned short x_end, 53 | unsigned short y_end, 54 | unsigned int color) 55 | { 56 | signed short x_width = 0, y_width = 0, x_abs, y_abs; 57 | signed short delta = 0; 58 | unsigned short i; 59 | 60 | x_width = x_end - x_start; 61 | y_width = y_end - y_start; 62 | 63 | x_abs = ABS(x_width); 64 | y_abs = ABS(y_width); 65 | 66 | if( x_abs > y_abs ) 67 | { 68 | //Since horizontal width is greater than vertical, incremental step will calculated from horizontal 69 | if(x_width >= 0) 70 | { 71 | //Line will increase x 72 | for(i = 0; i < x_abs; i++) 73 | { 74 | delta = (i * y_width) / x_width; 75 | GraphicDriver_DrawPoint(x_start + i, y_start + delta, color); 76 | } 77 | } 78 | else 79 | { 80 | //Line will decrease x 81 | for(i = 0; i < x_abs; i++) 82 | { 83 | delta = (i * y_width) / x_abs; 84 | GraphicDriver_DrawPoint(x_start - i, y_start + delta, color); 85 | } 86 | } 87 | } 88 | else 89 | { 90 | //Since vertical width is greater than horizontal, incremental step will calculated from vertical 91 | if(y_width >= 0) 92 | { 93 | //Line will increase y 94 | for(i = 0; i < y_abs; i++) 95 | { 96 | delta = (i * x_width) / y_width; 97 | GraphicDriver_DrawPoint(x_start + delta, y_start + i, color); 98 | } 99 | } 100 | else 101 | { 102 | //Line will decrease y 103 | for(i = 0; i < y_abs; i++) 104 | { 105 | delta = (i * x_width) / y_width; 106 | GraphicDriver_DrawPoint(x_start + delta, y_start - i, color); 107 | } 108 | } 109 | } 110 | } 111 | 112 | /** 113 | * @brief Draw ASCII character at defined coordinated with defined color 114 | * 115 | * @param x - x coordinate of leftmost corner to start drawing character 116 | * @param y - y coordinate of topmost corner to start drawing character 117 | * @param ascii_char - ASCII code character 118 | * @param font_size - FONT_SIZE_TYPE enumerated parameter defined in Fonts.h file 119 | * @param color - R5 G6 B5 unit color data 120 | */ 121 | void Graphics_DrawChar(unsigned short x, unsigned short y, unsigned char ascii_char, FONT_SIZE_TYPE font_size, unsigned int color) 122 | { 123 | unsigned char height_index = 0, width_index = 0, font_height = 0, font_width = 0; 124 | unsigned short font_row, ascii_table_index; 125 | 126 | if( (font_size == FONT_8P) || (font_size == FONT_8P_BOLD) ) 127 | { 128 | font_height = FONT_8P_HEIGHT; 129 | font_width = FONT_8P_WIDTH; 130 | } 131 | else if(font_size == FONT_12P) 132 | { 133 | font_height = FONT_12P_HEIGHT; 134 | font_width = FONT_12P_WIDTH; 135 | } 136 | else if(font_size == FONT_16P) 137 | { 138 | font_height = FONT_16P_HEIGHT; 139 | font_width = FONT_16P_WIDTH; 140 | } 141 | 142 | y += font_height; 143 | 144 | ascii_table_index = (ascii_char - 32) * font_height; 145 | 146 | for(height_index = 0; height_index < font_height; height_index++) 147 | { 148 | for(width_index = 0; width_index < font_width; width_index++) 149 | { 150 | if(font_size == FONT_16P) 151 | { 152 | font_row = Font_16p_Ascii_Table[ascii_table_index + height_index]; 153 | if( (font_row & (0x01 << width_index)) != 0x0000 ) 154 | { 155 | GraphicDriver_DrawPoint(x + width_index, y - height_index, color); 156 | } 157 | } 158 | else if(font_size == FONT_12P) 159 | { 160 | font_row = Font_12p_Ascii_Table[ascii_table_index + height_index]; 161 | if( (font_row & (0x8000 >> width_index)) != 0x0000 ) 162 | { 163 | GraphicDriver_DrawPoint(x + width_index, y - height_index, color); 164 | } 165 | } 166 | else if(font_size == FONT_8P_BOLD) 167 | { 168 | font_row = Font_8p_bold_Ascii_Table[ascii_table_index + height_index]; 169 | if( (font_row & (0x80 >> width_index)) != 0x0000 ) 170 | { 171 | GraphicDriver_DrawPoint(x + width_index, y - height_index, color); 172 | } 173 | } 174 | else if(font_size == FONT_8P) 175 | { 176 | font_row = Font_8p_Ascii_Table[ascii_table_index + height_index]; 177 | if( (font_row & (0x80 >> width_index)) != 0x0000 ) 178 | { 179 | GraphicDriver_DrawPoint(x + width_index, y - height_index, color); 180 | } 181 | } 182 | } 183 | } 184 | } 185 | 186 | -------------------------------------------------------------------------------- /Graphics/Graphics.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Graphics.h 3 | * 4 | * @brief Defined API for Graphics module 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef GRAPHICS_H_ 16 | #define GRAPHICS_H_ 17 | 18 | #include "../GraphicDriver/GraphicDriver.h" 19 | #include "../TouchDriver/TouchDriver.h" 20 | #include "../Fonts.h" 21 | 22 | //! @def Macro for calculating absolute value 23 | #define ABS(X) ((X) > 0 ? (X) : -(X)) 24 | 25 | 26 | void Graphics_DrawRect(unsigned short x_start, 27 | unsigned short y_start, 28 | unsigned short x_end, 29 | unsigned short y_end, 30 | unsigned int color); 31 | 32 | void Graphics_DrawLine(unsigned short x_start, 33 | unsigned short y_start, 34 | unsigned short x_end, 35 | unsigned short y_end, 36 | unsigned int color); 37 | 38 | void Graphics_DrawChar(unsigned short x, unsigned short y, unsigned char ascii_char, FONT_SIZE_TYPE font, unsigned int color); 39 | 40 | #endif /* GRAPHICS_H_ */ 41 | -------------------------------------------------------------------------------- /Gui/Gui.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Gui.h 3 | * 4 | * @brief Gui module API. 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef GUI_H_ 16 | #define GUI_H_ 17 | 18 | #include "../Graphics/Graphics.h" 19 | #include 20 | 21 | //! Number of Graph data point in the buffer 22 | #define GUI_NUM_OF_GRAPH_DATA 255 23 | 24 | //! Maximum absolute graph point value 25 | #define GUI_GRAPH_MAX_VALUE 127 26 | 27 | //! Graph refresh rate 28 | #define GUI_GRAPH_REFRESH_RATE (24/25) // 25 ms refresh rate 29 | 30 | //! Declaration of Event type 31 | typedef void (* GUI_EVENT_TYPE)(void); 32 | 33 | //! Text Alignment type, right, left or center 34 | typedef enum 35 | { 36 | ALIGN_RIGHT = 0, 37 | ALIGN_LEFT, 38 | ALIGN_CENTER 39 | } ALIGNMENT_TYPE; 40 | 41 | //! Orientation type Horizontal or vertical 42 | typedef enum 43 | { 44 | HORIZONTAL = 0, 45 | VERTICAL 46 | } ORIENTATION_TYPE; 47 | 48 | //! Event type Click or Release 49 | typedef enum 50 | { 51 | EVENT_TOUCH_IDLE = 0, 52 | EVENT_TOUCH_CLICK, 53 | EVENT_TOUCH_RELEASE, 54 | } TOUCH_EVENT_TYPE; 55 | 56 | //! Label type definition 57 | typedef struct 58 | { 59 | char *String; 60 | FONT_SIZE_TYPE FontSize; 61 | unsigned int FontColor; 62 | bool IsBackground; 63 | ALIGNMENT_TYPE Align; 64 | unsigned int BackgroundColor; 65 | unsigned char Id; 66 | unsigned short XPos; 67 | unsigned short YPos; 68 | unsigned short Width; 69 | unsigned short Height; 70 | } GUI_LABEL_TYPE; 71 | 72 | //! Default Label type values 73 | #define LABEL_DEFAULT (GUI_LABEL_TYPE){"", FONT_8P, 0x0000, FALSE, ALIGN_RIGHT, 0xFFFF, 0, 0, 0, 0, 0} 74 | 75 | //! Label linked list structure definition 76 | struct LabelListNode 77 | { 78 | GUI_LABEL_TYPE LabelElement; 79 | struct LabelListNode *Next; 80 | }; 81 | typedef struct LabelListNode GUI_LABEL_LIST_TYPE; 82 | 83 | //! Button type definition 84 | typedef struct 85 | { 86 | unsigned char Id; 87 | unsigned short XPos; 88 | unsigned short YPos; 89 | unsigned short Width; 90 | unsigned short Height; 91 | GUI_LABEL_TYPE caption; 92 | unsigned int ButtonColor; 93 | GUI_EVENT_TYPE OnReleaseEvent; 94 | } GUI_BUTTON_TYPE; 95 | 96 | //! Default Button type values 97 | #define BUTTON_DEFAULT (GUI_BUTTON_TYPE){0, 0, 0, 0, 0, LABEL_DEFAULT, 0x0000, NULL} 98 | 99 | //! Button linked list definition 100 | struct ButtonListNode 101 | { 102 | GUI_BUTTON_TYPE ButtonElement; 103 | struct ButtonListNode *Next; 104 | }; 105 | typedef struct ButtonListNode GUI_BUTTON_LIST_TYPE; 106 | 107 | //! Slider button type definition 108 | typedef struct 109 | { 110 | unsigned short XStart; 111 | unsigned short XEnd; 112 | unsigned short YStart; 113 | unsigned short YEnd; 114 | } GUI_SLIDER_BUTTON_TYPE; 115 | 116 | //! Slider button type default values 117 | #define SLIDER_BUTTON_DEFAULT (GUI_SLIDER_BUTTON_TYPE){0, 0, 0, 0} 118 | 119 | //! Slider type definition 120 | typedef struct 121 | { 122 | unsigned char Id; 123 | unsigned short XPos; 124 | unsigned short YPos; 125 | unsigned char Value; 126 | unsigned short Width; 127 | unsigned short Height; 128 | ORIENTATION_TYPE Orientation; 129 | GUI_SLIDER_BUTTON_TYPE SliderButton; 130 | unsigned int Color; 131 | GUI_EVENT_TYPE OnSliderChangeEvent; 132 | } GUI_SLIDER_TYPE; 133 | 134 | //! Slider type default values 135 | #define SLIDER_DEFAULT (GUI_SLIDER_TYPE){0, 0, 0, 0, 0, 0, HORIZONTAL, SLIDER_BUTTON_DEFAULT, 0x0000, NULL} 136 | 137 | //! Slider linker list definition 138 | struct SliderListNode 139 | { 140 | GUI_SLIDER_TYPE SliderElement; 141 | struct SliderListNode *Next; 142 | }; 143 | typedef struct SliderListNode GUI_SLIDER_LIST_TYPE; 144 | 145 | //! Checkbox type definition 146 | typedef struct 147 | { 148 | unsigned char Id; 149 | unsigned short XPos; 150 | unsigned short YPos; 151 | bool IsChecked; 152 | unsigned short Size; //Width = Height 153 | GUI_EVENT_TYPE OnCheckboxChangeEvent; 154 | } GUI_CHECKBOX_TYPE; 155 | 156 | //! Checkbox type default values 157 | #define CHECKBOX_DEFAULT (GUI_CHECKBOX_TYPE){0, 0, 0, FALSE, 0, NULL} 158 | 159 | //! Checkbox linked list definition 160 | struct CheckboxListNode 161 | { 162 | GUI_CHECKBOX_TYPE CheckboxElement; 163 | struct CheckboxListNode *Next; 164 | }; 165 | typedef struct CheckboxListNode GUI_CHECKBOX_LIST_TYPE; 166 | 167 | //!Led type definition 168 | typedef struct 169 | { 170 | unsigned char Id; 171 | unsigned short XPos; 172 | unsigned short YPos; 173 | bool IsOn; 174 | unsigned short Size; 175 | } GUI_LED_TYPE; 176 | 177 | //! Led type default values 178 | #define LED_DEFAULT (GUI_LED_TYPE){0, 0, 0, FALSE, 0} 179 | 180 | //! Led type linked list definition 181 | struct LedListNode 182 | { 183 | GUI_LED_TYPE LedElement; 184 | struct LedListNode *Next; 185 | }; 186 | typedef struct LedListNode GUI_LED_LIST_TYPE; 187 | 188 | //! Panel type definition 189 | typedef struct 190 | { 191 | unsigned char Id; 192 | unsigned short XPos; 193 | unsigned short YPos; 194 | unsigned short Width; 195 | unsigned short Height; 196 | unsigned int Color; 197 | } GUI_PANEL_TYPE; 198 | 199 | //! Panel type default values 200 | #define PANEL_DEFAULT (GUI_PANEL_TYPE){0, 0, 0, 0, 0, 0x0000} 201 | 202 | //! Panel type linked list definition 203 | struct PanelListNode 204 | { 205 | GUI_PANEL_TYPE PanelElement; 206 | struct PanelListNode *Next; 207 | }; 208 | typedef struct PanelListNode GUI_PANEL_LIST_TYPE; 209 | 210 | //! TextBox type definition 211 | #define GUI_TEXTBOX_MAX_SIZE 1023 //1kb for textbox string size 212 | typedef struct 213 | { 214 | unsigned char Id; 215 | unsigned short XPos; 216 | unsigned short YPos; 217 | unsigned short Width; 218 | unsigned short Height; 219 | char *String; 220 | unsigned short ScrollIndex; 221 | FONT_SIZE_TYPE FontSize; 222 | unsigned int BackgroundColor; 223 | unsigned int FontColor; 224 | } GUI_TEXTBOX_TYPE; 225 | 226 | //! TextBox type default values 227 | #define TEXTBOX_DEFAULT (GUI_TEXTBOX_TYPE){0, 0, 0, 0, 0, "", 0, FONT_8P, 0xFFFF, 0x0000} 228 | 229 | //! Graph type 230 | typedef struct 231 | { 232 | unsigned char Id; 233 | unsigned short XPos; 234 | unsigned short YPos; 235 | unsigned char Scale; //0 - 100 % 236 | unsigned char GraphData[GUI_NUM_OF_GRAPH_DATA]; 237 | } GUI_GRAPH_TYPE; 238 | 239 | //! Graph type default values 240 | #define GRAPH_DEFAULT (GUI_GRAPH_TYPE){0, 0, 0, 0, NULL} 241 | 242 | //! View type definition is a container of all GUI element lists that can be dynamically changed 243 | typedef struct 244 | { 245 | bool IsCreated; 246 | GUI_GRAPH_TYPE *Graph; 247 | GUI_TEXTBOX_TYPE *TextBox; 248 | GUI_LABEL_LIST_TYPE *LabelList; 249 | GUI_BUTTON_LIST_TYPE *ButtonList; 250 | GUI_PANEL_LIST_TYPE *PanelList; 251 | GUI_SLIDER_LIST_TYPE *SliderList; 252 | GUI_CHECKBOX_LIST_TYPE *CheckboxList; 253 | GUI_LED_LIST_TYPE *LedList; 254 | } GUI_VIEW_TYPE; 255 | 256 | //! View type default values 257 | #define VIEW_DEFAULT (GUI_VIEW_TYPE){FALSE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL} 258 | 259 | GUI_BUTTON_TYPE* Gui_NewButton(GUI_VIEW_TYPE *View); 260 | GUI_LABEL_TYPE* Gui_NewLabel(GUI_VIEW_TYPE *View); 261 | GUI_SLIDER_TYPE* Gui_NewSlider(GUI_VIEW_TYPE *View); 262 | GUI_CHECKBOX_TYPE* Gui_NewCheckbox(GUI_VIEW_TYPE *View); 263 | GUI_LED_TYPE* Gui_NewLed(GUI_VIEW_TYPE *View); 264 | GUI_PANEL_TYPE* Gui_NewPanel(GUI_VIEW_TYPE *View); 265 | GUI_GRAPH_TYPE* Gui_NewGraph(GUI_VIEW_TYPE *View); 266 | GUI_TEXTBOX_TYPE* Gui_NewTextBox(GUI_VIEW_TYPE *View); 267 | 268 | void Gui_DeleteView(GUI_VIEW_TYPE *View); 269 | 270 | void Gui_DrawLabel(GUI_LABEL_TYPE *Label); 271 | void Gui_DrawButton(GUI_BUTTON_TYPE *Button); 272 | void Gui_DrawSlider(GUI_SLIDER_TYPE *Slider); 273 | void Gui_DrawCheckbox(GUI_CHECKBOX_TYPE *Checkbox); 274 | void Gui_DrawLed(GUI_LED_TYPE *Led); 275 | void Gui_DrawPanel(GUI_PANEL_TYPE *Panel); 276 | void Gui_DrawGraph(GUI_GRAPH_TYPE *Graph); 277 | void Gui_DrawTextBox(GUI_TEXTBOX_TYPE *TextBox); 278 | void Gui_DrawView(GUI_VIEW_TYPE *View); 279 | 280 | void Gui_AddDataToGraph(GUI_GRAPH_TYPE *Graph, unsigned char Data); 281 | 282 | void Gui_TextBoxClearString(GUI_TEXTBOX_TYPE *TextBox); 283 | void Gui_TextBoxSetString(GUI_TEXTBOX_TYPE *TextBox, char *string); 284 | void Gui_TextBoxAddToString(GUI_TEXTBOX_TYPE *TextBox, char *string); 285 | char* Gui_TextBoxGetStringPointer(void); 286 | 287 | void Gui_Task(GUI_VIEW_TYPE *View); 288 | 289 | char* Gui_IntToString(char *string, int num); 290 | unsigned int Gui_RGB888To565(unsigned char red, unsigned char green, unsigned char blue); 291 | 292 | #endif /* GUI_H_ */ 293 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | HMI_Library is a package for embedded microcontroller with LCD with touchscreen support. 2 | Repository can be compiled under Eclipse CDT. Simply just import the project and "build". -------------------------------------------------------------------------------- /TouchDriver/TouchDriver.c: -------------------------------------------------------------------------------- 1 | /** 2 | * @file TouchDriver.c 3 | * 4 | * @brief This module implements 4-wire resistive touchscreen data reading 5 | * 6 | * @details This module needs hardware support from MCU side, example implementation is for STM32 micro 7 | * 8 | * @author Krzysztof Grzeszczak 9 | * 10 | * @version 1.0 11 | * 12 | * @date 2012-2013 13 | * 14 | * @copyright GNU Public License 15 | */ 16 | 17 | #include "TouchDriver.h" 18 | 19 | #define TOUCH_ALPHA_BITS 2 20 | #define TOUCH_FILTER_DEBOUNCE 40 //40 [ms] 21 | 22 | //TODO define here proper GPIO's for 4-wire resistive touchscreen. Example on STM32 Cortex-M3 23 | //#define YU GPIO_Pin_1 24 | //#define XL GPIO_Pin_0 25 | //#define YD GPIO_Pin_3 26 | //#define XR GPIO_Pin_2 27 | 28 | //TODO define here proper ADC channels to read voltage from touchscreen 29 | //#define Touch_XL ADC_Channel_10 30 | //#define Touch_YU ADC_Channel_11 31 | //#define Touch_XR ADC_Channel_12 32 | //#define Touch_YD ADC_Channel_13 33 | 34 | //! Offset values to read absolute linear x position. 35 | //! It was established empirically and will vary from touchscreen resistance value 36 | #define TOUCH_X_LOWEST_VALID_VALUE 300 37 | #define TOUCH_X_HIGHEST_VALID_VALUE 3820 38 | 39 | //! Offset values to read absolute linear y position. 40 | //! It was established empirically and will vary from touchscreen resistance value 41 | #define TOUCH_Y_LOWEST_VALID_VALUE 550 42 | #define TOUCH_Y_HIGHEST_VALID_VALUE 3630 43 | 44 | static TOUCH_DRIVIER_TYPE TouchData; 45 | static volatile unsigned short RawXData; //!< Holds raw non filtered X coordinate 46 | static volatile unsigned short RawYData; //!< Holds raw non filtered Y coordinate 47 | static volatile unsigned short FilteredXData; //!< Holds filtered X coordinate 48 | static volatile unsigned short FilteredYData; //!< Holds filtered Y coordinate 49 | static volatile unsigned short IirXData; //!< temporary filter data for X coordinate 50 | static volatile unsigned short IirYData; //!< temporary filter data for Y coordinate 51 | static volatile unsigned short Touch1msCnt; //!< Counter that is used to debounce touch event 52 | 53 | unsigned short TouchDriver_CalculateXCord(unsigned short filtered_x); 54 | unsigned short TouchDriver_CalculateYCord(unsigned short filtered_y); 55 | void TouchDriver_ConfigureToReadX(void); 56 | void TouchDriver_ConfigureToReadY(void); 57 | void TouchDriver_ConfigureToDetectTouch(void); 58 | unsigned short TouchDriver_IIRFilter(volatile unsigned short *iir_value, volatile unsigned short new_value, unsigned char alpha_bits); 59 | bool TouchDriver_DetectTouch(void); 60 | unsigned short TouchDriver_GetAdcTouchData(void); 61 | 62 | /** 63 | * @brief Initialize MCU to read analog touch screen data 64 | * 65 | * @note This function should be implemented according to proper MCU procedure 66 | */ 67 | void TouchDriver_Initialize(void) 68 | { 69 | 70 | //Example on STM32 Cortex-M3 71 | // ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 72 | // ADC_InitStructure.ADC_ScanConvMode = DISABLE; 73 | // ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 74 | // ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 75 | // ADC_InitStructure.ADC_NbrOfChannel = 1; 76 | // ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 77 | // ADC_Init(ADC1, &ADC_InitStructure); 78 | // 79 | // TouchDriver_ConfigureToReadX(); 80 | // ADC_StartCalibration(ADC1); 81 | // while(ADC_GetCalibrationStatus(ADC1)); 82 | // ADC_SoftwareStartConvCmd(ADC1, ENABLE); 83 | 84 | Touch1msCnt = 0; 85 | RawXData = 0; 86 | RawYData = 0; 87 | FilteredXData = 0; 88 | FilteredYData = 0; 89 | IirXData = 0; 90 | IirYData = 0; 91 | TouchData.State = TOUCH_WAITING_FOR_TOUCH; 92 | TouchData.IsTouchDetected = FALSE; 93 | } 94 | 95 | /** 96 | * @brief TouchDriver module periodic task 97 | * 98 | * @note This function need to be called every 1 [ms] to enable proper responsiveness. 99 | * This time can be increase but this implies touch event debouncing 100 | */ 101 | void TouchDriver_Task(void) 102 | { 103 | bool is_touch_detected = FALSE; 104 | 105 | TouchDriver_ConfigureToDetectTouch(); 106 | is_touch_detected = !TouchDriver_DetectTouch(); 107 | 108 | switch(TouchData.State) 109 | { 110 | case TOUCH_WAITING_FOR_TOUCH: 111 | // Wait for touch event 112 | if( is_touch_detected == TRUE) 113 | { 114 | TouchData.State = TOUCH_DETECT_X; 115 | } 116 | break; 117 | 118 | case TOUCH_DETECT_X: 119 | if( is_touch_detected == TRUE) 120 | { 121 | Touch1msCnt++; 122 | if(Touch1msCnt > TOUCH_FILTER_DEBOUNCE) 123 | { 124 | Touch1msCnt = 0; 125 | TouchData.Xpos = TouchDriver_CalculateXCord(FilteredXData); 126 | 127 | TouchData.State = TOUCH_DETECT_Y; 128 | } 129 | else 130 | { 131 | TouchDriver_ConfigureToReadX(); 132 | RawXData = TouchDriver_GetAdcTouchData(); 133 | FilteredXData = TouchDriver_IIRFilter(&IirXData, RawXData, TOUCH_ALPHA_BITS); 134 | } 135 | } 136 | else 137 | { 138 | TouchData.State = TOUCH_WAITING_FOR_TOUCH; 139 | TouchData.IsTouchDetected = FALSE; 140 | } 141 | break; 142 | 143 | case TOUCH_DETECT_Y: 144 | if( is_touch_detected == TRUE) 145 | { 146 | Touch1msCnt++; 147 | if(Touch1msCnt > TOUCH_FILTER_DEBOUNCE) 148 | { 149 | Touch1msCnt = 0; 150 | TouchData.Ypos = TouchDriver_CalculateYCord(FilteredYData); 151 | TouchData.IsTouchDetected = TRUE; 152 | TouchData.State = TOUCH_WAITING_FOR_TOUCH; 153 | } 154 | else 155 | { 156 | TouchDriver_ConfigureToReadY(); 157 | RawYData = TouchDriver_GetAdcTouchData(); 158 | FilteredYData = TouchDriver_IIRFilter(&IirYData, RawYData, TOUCH_ALPHA_BITS); 159 | } 160 | } 161 | else 162 | { 163 | TouchData.State = TOUCH_WAITING_FOR_TOUCH; 164 | TouchData.IsTouchDetected = FALSE; 165 | } 166 | break; 167 | 168 | default: 169 | break; 170 | } 171 | } 172 | 173 | /** 174 | * @brief Check if touch event has been detected 175 | * 176 | * @return TRUE, FALSE - bool type 177 | */ 178 | bool TouchDriver_IsTouchDetected(void) 179 | { 180 | return TouchData.IsTouchDetected; 181 | } 182 | 183 | /** 184 | * @brief Get filtered X coordinate 185 | * 186 | * @return TouchData.Xpos - unsigned short 187 | */ 188 | unsigned short TouchDriver_GetX(void) 189 | { 190 | return TouchData.Xpos; 191 | } 192 | 193 | /** 194 | * @brief Get filtered Y coordinate 195 | * 196 | * @return TouchData.Ypos - unsigned short 197 | */ 198 | unsigned short TouchDriver_GetY(void) 199 | { 200 | return TouchData.Ypos; 201 | } 202 | 203 | /** 204 | * @brief Get non filtered X coordinate 205 | * 206 | * @return X coordinate - unsigned short 207 | */ 208 | unsigned short TouchDriver_GetRawX(void) 209 | { 210 | return TouchDriver_CalculateXCord(RawXData); 211 | } 212 | 213 | /** 214 | * @brief Get non filtered Y coordinate 215 | * 216 | * @return Y coordinate - unsigned short 217 | */ 218 | unsigned short TouchDriver_GetRawY(void) 219 | { 220 | return TouchDriver_CalculateYCord(RawYData); 221 | } 222 | 223 | /** 224 | * @brief Detect touch event by hardware 225 | * 226 | * @return TRUE, FALSE - bool type 227 | * 228 | * @note This function is hardware dependent and should be implemented according to used MCU 229 | */ 230 | bool TouchDriver_DetectTouch(void) 231 | { 232 | //TODO read GPIO pin for touch detection, example on STM32 Cortex-M3 233 | // return (bool) GPIO_ReadInputDataBit(GPIOC, YU); 234 | return FALSE; 235 | } 236 | 237 | /** 238 | * @brief Get an analog voltage value from touchscreen 239 | * 240 | * @return analog value - unsigned short 241 | * 242 | * @note This function is hardware dependent and should be implemented according to used MCU 243 | */ 244 | unsigned short TouchDriver_GetAdcTouchData(void) 245 | { 246 | 247 | //TODO read analog voltage value from ADC, example on STM32 Cortex-M3 248 | // return ADC_GetConversionValue(ADC1); 249 | return 0; 250 | } 251 | 252 | /** 253 | * @brief Configure MCU to read X position data from touchscreen 254 | * 255 | * @details Configure XR and XL GPIO pins to output, YU pin to input analog, YD to input float 256 | * Set XR to high state, XL to low state, configure A/D converter to read X channel and enable conversion 257 | */ 258 | void TouchDriver_ConfigureToReadX(void) 259 | { 260 | /* 261 | //Disable ADC 262 | ADC_Cmd(ADC1, DISABLE); 263 | ADC_SoftwareStartConvCmd(ADC1, DISABLE); 264 | 265 | // Configure XR and XL to output 266 | GPIO_InitStructure.GPIO_Pin = XR | XL; 267 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 268 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 269 | GPIO_Init(GPIOC,&GPIO_InitStructure); 270 | 271 | // Configure YU to input analog 272 | GPIO_InitStructure.GPIO_Pin = YU; 273 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 274 | GPIO_Init(GPIOC,&GPIO_InitStructure); 275 | 276 | // Configure YD to input float 277 | GPIO_InitStructure.GPIO_Pin = YD; 278 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 279 | GPIO_Init(GPIOC,&GPIO_InitStructure); 280 | 281 | //Set XR to high 282 | GPIO_SetBits(GPIOC, XR); 283 | 284 | //Set XL to low 285 | GPIO_ResetBits(GPIOC, XL); 286 | 287 | //Configure ADC to read YU 288 | ADC_RegularChannelConfig(ADC1, Touch_YU, 1, ADC_SampleTime_1Cycles5); 289 | 290 | //Enable ADC conversion 291 | ADC_Cmd(ADC1, ENABLE); 292 | ADC_SoftwareStartConvCmd(ADC1, ENABLE); 293 | */ 294 | } 295 | 296 | /** 297 | * @brief Configure MCU to read Y position data from touchscreen 298 | * 299 | * @details Configure YU and YD GPIO pins to output, XR pin to input analog, XL to input float 300 | * Set YU to high state, YD to low state, configure A/D converter to read Y channel and enable conversion 301 | */ 302 | void TouchDriver_ConfigureToReadY(void) 303 | { 304 | /* 305 | //Disable ADC 306 | ADC_Cmd(ADC1, DISABLE); 307 | ADC_SoftwareStartConvCmd(ADC1, DISABLE); 308 | 309 | // Configure YU and YD to output 310 | GPIO_InitStructure.GPIO_Pin = YU | YD; 311 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 312 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 313 | GPIO_Init(GPIOC,&GPIO_InitStructure); 314 | 315 | // Configure XR to input analog 316 | GPIO_InitStructure.GPIO_Pin = XR; 317 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 318 | GPIO_Init(GPIOC,&GPIO_InitStructure); 319 | 320 | // Configure XL to input float 321 | GPIO_InitStructure.GPIO_Pin = XL; 322 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 323 | GPIO_Init(GPIOC,&GPIO_InitStructure); 324 | 325 | //Set YU to high 326 | GPIO_SetBits(GPIOC, YU); 327 | 328 | //Set YD to low 329 | GPIO_ResetBits(GPIOC, YD); 330 | 331 | //Configure ADC to read YU 332 | ADC_RegularChannelConfig(ADC1, Touch_XR, 1, ADC_SampleTime_1Cycles5); 333 | 334 | //Enable ADC conversion 335 | ADC_Cmd(ADC1, ENABLE); 336 | ADC_SoftwareStartConvCmd(ADC1, ENABLE); 337 | */ 338 | } 339 | 340 | /** 341 | * @brief Configure MCU to detect touch event from touchscreen 342 | * 343 | * @details Configure XL GPIO pin to output, YU pin to input pullup, XR and YD to input float 344 | * Set XL to low state 345 | */ 346 | void TouchDriver_ConfigureToDetectTouch(void) 347 | { 348 | /* 349 | // Configure XR and YD to input float 350 | GPIO_InitStructure.GPIO_Pin = XR | YD; 351 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 352 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 353 | GPIO_Init(GPIOC,&GPIO_InitStructure); 354 | 355 | // Configure XL to output 356 | GPIO_InitStructure.GPIO_Pin = XL; 357 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 358 | GPIO_Init(GPIOC,&GPIO_InitStructure); 359 | 360 | // Configure YU to input pullup 361 | GPIO_InitStructure.GPIO_Pin = YU; 362 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 363 | GPIO_Init(GPIOC,&GPIO_InitStructure); 364 | 365 | //Set XL to low 366 | GPIO_ResetBits(GPIOC, XL); 367 | */ 368 | } 369 | 370 | /** 371 | * @brief Determine a filtered value based on an input value. 372 | * @details The floating-point equation for an IIR filter is: 373 | *
374 |  *                  V = (alpha * new_value) + ((1 - alpha) * V)
375 |  *                  alpha is in the range (0..1]
376 |  *              
377 | * The equation can be rewritten as: 378 | *
379 |  *                  V = (alpha * new_value) + V - (alpha * V)
380 |  *                  V = V + (alpha * (new_value - V))
381 |  *              
382 | * 383 | * This function assumes that alpha is a power of 2 (i.e. 1/2, 1/4, 1/8, etc). 384 | * Therefore, alpha can be fully described by the power of 2 or the number of bits 385 | * involved. Refer to the alpha_bits parameter for details. 386 | * 387 | * This function uses fixed-point calculations. To do this without rounding errors, 388 | * the stored value must have more precision than the value used in the application. 389 | * The fixed-point equation looks like this: 390 | *
391 |  *                  V = Stored Value
392 |  *                  V = V + (new_value - (V >> alpha_bits))
393 |  *
394 |  *                  va = Value used by the application
395 |  *                  va = Round(V >> alpha_bits)
396 |  *              
397 | * 398 | * @param iir_value = A value that stores the current filtered value with additional precision. 399 | * The additional precision required depends on the alpha_bits. 400 | * @param new_value = An input to the filter system with normal precision. 401 | * @param alpha_bits = Exponent of alpha. alpha = 2 ^ (-alpha_bits). 402 | * 403 | * Sum of new_value resolution and alpha_bits must not be higher than 16 bits 404 | * 405 | * @return Returns the updated filtered value after rounding. 406 | */ 407 | unsigned short TouchDriver_IIRFilter(volatile unsigned short *iir_value, volatile unsigned short new_value, unsigned char alpha_bits) 408 | { 409 | *iir_value += new_value - (((*iir_value >> (alpha_bits - 1)) + 1) >> 1); 410 | 411 | return (((*iir_value >> (alpha_bits - 1)) + 1) >> 1); 412 | } 413 | 414 | /** 415 | * @brief Calculate X coordinate from filtered value 416 | * 417 | * @details filtered x value need to be biased, linearized and limited 418 | */ 419 | unsigned short TouchDriver_CalculateXCord(unsigned short filtered_x) 420 | { 421 | if(filtered_x <= TOUCH_X_LOWEST_VALID_VALUE) 422 | { 423 | filtered_x = TOUCH_X_LOWEST_VALID_VALUE; 424 | } 425 | else if(filtered_x >= TOUCH_X_HIGHEST_VALID_VALUE) 426 | { 427 | filtered_x = TOUCH_X_HIGHEST_VALID_VALUE; 428 | } 429 | filtered_x -= TOUCH_X_LOWEST_VALID_VALUE; 430 | 431 | return (unsigned short)(H_RES - (unsigned int)(H_RES * filtered_x)/(TOUCH_X_HIGHEST_VALID_VALUE - TOUCH_X_LOWEST_VALID_VALUE) ); 432 | } 433 | 434 | /** 435 | * @brief Calculate Y coordinate from filtered value 436 | * 437 | * @details filtered y value need to be biased, linearized and limited 438 | */ 439 | unsigned short TouchDriver_CalculateYCord(unsigned short filtered_y) 440 | { 441 | if(filtered_y <= TOUCH_Y_LOWEST_VALID_VALUE) 442 | { 443 | filtered_y = TOUCH_Y_LOWEST_VALID_VALUE; 444 | } 445 | else if(filtered_y >= TOUCH_Y_HIGHEST_VALID_VALUE) 446 | { 447 | filtered_y = TOUCH_Y_HIGHEST_VALID_VALUE; 448 | } 449 | filtered_y -= TOUCH_Y_LOWEST_VALID_VALUE; 450 | 451 | return (unsigned short)( (unsigned int)(V_RES * filtered_y)/(TOUCH_Y_HIGHEST_VALID_VALUE - TOUCH_Y_LOWEST_VALID_VALUE) ); 452 | } 453 | -------------------------------------------------------------------------------- /TouchDriver/TouchDriver.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file TouchDriver.h 3 | * 4 | * @brief TouchDriver module API. 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef TOUCHDRIVER_H_ 16 | #define TOUCHDRIVER_H_ 17 | 18 | #include "../Typedefs.h" 19 | #include "../GraphicDriver/GraphicDriver.h" 20 | 21 | //! Enumerated states of TouchDriver state machine 22 | typedef enum 23 | { 24 | TOUCH_WAITING_FOR_TOUCH, 25 | TOUCH_DETECT_X, 26 | TOUCH_DETECT_Y, 27 | } TOUCH_DRIVER_STATE; 28 | 29 | //! TouchDriver module structure 30 | typedef struct 31 | { 32 | TOUCH_DRIVER_STATE State; 33 | bool IsTouchDetected; 34 | unsigned short Xpos; 35 | unsigned short Ypos; 36 | } TOUCH_DRIVIER_TYPE; 37 | 38 | void TouchDriver_Initialize(void); 39 | void TouchDriver_Task(void); 40 | bool TouchDriver_IsTouchDetected(void); 41 | unsigned short TouchDriver_GetRawY(void); 42 | unsigned short TouchDriver_GetRawX(void); 43 | unsigned short TouchDriver_GetX(void); 44 | unsigned short TouchDriver_GetY(void); 45 | 46 | #endif /* TOUCHDRIVER_H_ */ 47 | -------------------------------------------------------------------------------- /Typedefs.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Typedefs.h 3 | * 4 | * @brief Custom type definition used in HMI embedde library 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef TYPEDEFS_H_ 16 | #define TYPEDEFS_H_ 17 | 18 | //! Enumerate Boolean type 19 | typedef enum 20 | { 21 | FALSE = 0, 22 | TRUE = !FALSE 23 | } bool; 24 | 25 | 26 | #endif /* TYPEDEFS_H_ */ 27 | -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | /** 2 | * @file main.c 3 | * 4 | * @brief Usage example of HMI library 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #include "./Gui/Gui.h" 16 | 17 | int main(void) { 18 | //For now just do nothing 19 | do{}while(0); 20 | 21 | return EXIT_SUCCESS; 22 | } 23 | -------------------------------------------------------------------------------- /src/Fonts.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Fonts.h 3 | * 4 | * @brief font type used in Graphics and Gui modules. 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef FONTS_H_ 16 | #define FONTS_H_ 17 | 18 | //! define font 16P width 19 | #define FONT_16P_WIDTH 16 20 | 21 | //! define font 16P height 22 | #define FONT_16P_HEIGHT 24 23 | 24 | //! define font 12P width 25 | #define FONT_12P_WIDTH 12 26 | 27 | //! define font 12P height 28 | #define FONT_12P_HEIGHT 12 29 | 30 | //! define font 8P width 31 | #define FONT_8P_WIDTH 8 32 | 33 | //! define font 8P height 34 | #define FONT_8P_HEIGHT 12 35 | 36 | //! Enumerated types of font size 37 | typedef enum 38 | { 39 | FONT_8P = 0, 40 | FONT_8P_BOLD, 41 | FONT_12P, 42 | FONT_16P 43 | } FONT_SIZE_TYPE; 44 | 45 | /** 46 | * @brief ASCII font 16x24 table definition 47 | */ 48 | static const unsigned short Font_16p_Ascii_Table[95*FONT_16P_HEIGHT] = 49 | { 50 | /** 51 | * @brief Space ' ' 52 | */ 53 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 55 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 56 | /** 57 | * @brief '!' 58 | */ 59 | 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 60 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000, 61 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 62 | /** 63 | * @brief '"' 64 | */ 65 | 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 66 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 67 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 68 | /** 69 | * @brief '#' 70 | */ 71 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60, 72 | 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318, 73 | 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000, 74 | /** 75 | * @brief '$' 76 | */ 77 | 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C, 78 | 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C, 79 | 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 80 | /** 81 | * @brief '%' 82 | */ 83 | 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611, 84 | 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460, 85 | 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000, 86 | /** 87 | * @brief '&' 88 | */ 89 | 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0, 90 | 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06, 91 | 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 92 | /** 93 | * @brief ''' 94 | */ 95 | 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 96 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 97 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 98 | /** 99 | * @brief '(' 100 | */ 101 | 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060, 102 | 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 103 | 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000, 104 | /** 105 | * @brief ')' 106 | */ 107 | 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300, 108 | 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 109 | 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000, 110 | /** 111 | * @brief '*' 112 | */ 113 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, 114 | 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000, 115 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 116 | /** 117 | * @brief '+' 118 | */ 119 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, 120 | 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180, 121 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 122 | /** 123 | * @brief ',' 124 | */ 125 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 126 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 127 | 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 128 | /** 129 | * @brief '-' 130 | */ 131 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 132 | 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000, 133 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 134 | /** 135 | * @brief '.' 136 | */ 137 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 138 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 139 | 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 140 | /** 141 | * @brief '/' 142 | */ 143 | 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, 144 | 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0, 145 | 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 146 | /** 147 | * @brief '0' 148 | */ 149 | 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C, 150 | 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38, 151 | 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 152 | /** 153 | * @brief '1' 154 | */ 155 | 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180, 156 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 157 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 158 | /** 159 | * @brief '2' 160 | */ 161 | 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800, 162 | 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 163 | 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 164 | /** 165 | * @brief '3' 166 | */ 167 | 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600, 168 | 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18, 169 | 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 170 | /** 171 | * @brief '4' 172 | */ 173 | 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60, 174 | 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00, 175 | 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 176 | /** 177 | * @brief '5' 178 | */ 179 | 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC, 180 | 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18, 181 | 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 182 | /** 183 | * @brief '6' 184 | */ 185 | 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC, 186 | 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38, 187 | 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 188 | /** 189 | * @brief '7' 190 | */ 191 | 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380, 192 | 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030, 193 | 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 194 | /** 195 | * @brief '8' 196 | */ 197 | 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638, 198 | 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38, 199 | 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 200 | /** 201 | * @brief '9' 202 | */ 203 | 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C, 204 | 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C, 205 | 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 206 | /** 207 | * @brief ':' 208 | */ 209 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, 210 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 211 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 212 | /** 213 | * @brief ';' 214 | */ 215 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, 216 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 217 | 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, 218 | /** 219 | * @brief '<' 220 | */ 221 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 222 | 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0, 223 | 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 224 | /** 225 | * @brief '=' 226 | */ 227 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 228 | 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000, 229 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 230 | /** 231 | * @brief '>' 232 | */ 233 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 234 | 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0, 235 | 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 236 | /** 237 | * @brief '?' 238 | */ 239 | 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00, 240 | 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000, 241 | 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 242 | /** 243 | * @brief '@' 244 | */ 245 | 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411, 246 | 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004, 247 | 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 248 | /** 249 | * @brief 'A' 250 | */ 251 | 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60, 252 | 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C, 253 | 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 254 | /** 255 | * @brief 'B' 256 | */ 257 | 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C, 258 | 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C, 259 | 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 260 | /** 261 | * @brief 'C' 262 | */ 263 | 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006, 264 | 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C, 265 | 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 266 | /** 267 | * @brief 'D' 268 | */ 269 | 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006, 270 | 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06, 271 | 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 272 | /** 273 | * @brief 'E' 274 | */ 275 | 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 276 | 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 277 | 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 278 | /** 279 | * @brief 'F' 280 | */ 281 | 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 282 | 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 283 | 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 284 | /** 285 | * @brief 'G' 286 | */ 287 | 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003, 288 | 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C, 289 | 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 290 | /** 291 | * @brief 'H' 292 | */ 293 | 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 294 | 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 295 | 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 296 | /** 297 | * @brief 'I' 298 | */ 299 | 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 300 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 301 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 302 | /** 303 | * @brief 'J' 304 | */ 305 | 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 306 | 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738, 307 | 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 308 | /** 309 | * @brief 'K' 310 | */ 311 | 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6, 312 | 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806, 313 | 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 314 | /** 315 | * @brief 'L' 316 | */ 317 | 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 318 | 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 319 | 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 320 | /** 321 | * @brief 'M' 322 | */ 323 | 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836, 324 | 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6, 325 | 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 326 | /** 327 | * @brief 'N' 328 | */ 329 | 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC, 330 | 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C, 331 | 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 332 | /** 333 | * @brief 'O' 334 | */ 335 | 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003, 336 | 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C, 337 | 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 338 | /** 339 | * @brief 'P' 340 | */ 341 | 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C, 342 | 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 343 | 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 344 | /** 345 | * @brief 'Q' 346 | */ 347 | 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003, 348 | 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C, 349 | 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 350 | /** 351 | * @brief 'R' 352 | */ 353 | 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806, 354 | 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006, 355 | 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 356 | /** 357 | * @brief 'S' 358 | */ 359 | 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C, 360 | 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C, 361 | 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 362 | /** 363 | * @brief 'T' 364 | */ 365 | 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 366 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 367 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 368 | /** 369 | * @brief 'U' 370 | */ 371 | 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 372 | 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818, 373 | 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 374 | /** 375 | * @brief 'V' 376 | */ 377 | 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C, 378 | 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360, 379 | 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 380 | /** 381 | * @brief 'W' 382 | */ 383 | 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366, 384 | 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C, 385 | 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 386 | /** 387 | * @brief 'X' 388 | */ 389 | 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0, 390 | 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C, 391 | 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 392 | /** 393 | * @brief 'Y' 394 | */ 395 | 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660, 396 | 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 397 | 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 398 | /** 399 | * @brief 'Z' 400 | */ 401 | 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600, 402 | 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006, 403 | 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 404 | /** 405 | * @brief '[' 406 | */ 407 | 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 408 | 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 409 | 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000, 410 | /** 411 | * @brief '\' 412 | */ 413 | 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0, 414 | 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300, 415 | 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 416 | /** 417 | * @brief ']' 418 | */ 419 | 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 420 | 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 421 | 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000, 422 | /** 423 | * @brief '^' 424 | */ 425 | 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630, 426 | 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 427 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 428 | /** 429 | * @brief '_' 430 | */ 431 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 432 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 433 | 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 434 | /** 435 | * @brief ''' 436 | */ 437 | 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000, 438 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 439 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 440 | /** 441 | * @brief 'a' 442 | */ 443 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8, 444 | 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C, 445 | 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 446 | /** 447 | * @brief 'b' 448 | */ 449 | 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8, 450 | 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, 451 | 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 452 | /** 453 | * @brief 'c' 454 | */ 455 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0, 456 | 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30, 457 | 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 458 | /** 459 | * @brief 'd' 460 | */ 461 | 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0, 462 | 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, 463 | 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 464 | /** 465 | * @brief 'e' 466 | */ 467 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, 468 | 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30, 469 | 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 470 | /** 471 | * @brief 'f' 472 | */ 473 | 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, 474 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 475 | 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 476 | /** 477 | * @brief 'g' 478 | */ 479 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8, 480 | 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18, 481 | 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000, 482 | /** 483 | * @brief 'h' 484 | */ 485 | 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8, 486 | 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 487 | 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 488 | /** 489 | * @brief 'i' 490 | */ 491 | 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, 492 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 493 | 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 494 | /** 495 | * @brief 'j' 496 | */ 497 | 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, 498 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 499 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000, 500 | /** 501 | * @brief 'k' 502 | */ 503 | 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C, 504 | 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C, 505 | 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 506 | /** 507 | * @brief 'l' 508 | */ 509 | 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 510 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 511 | 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 512 | /** 513 | * @brief 'm' 514 | */ 515 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF, 516 | 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 517 | 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 518 | /** 519 | * @brief 'n' 520 | */ 521 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8, 522 | 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 523 | 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 524 | /** 525 | * @brief 'o' 526 | */ 527 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, 528 | 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30, 529 | 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 530 | /** 531 | * @brief 'p' 532 | */ 533 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8, 534 | 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, 535 | 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000, 536 | /** 537 | * @brief 'q' 538 | */ 539 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0, 540 | 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, 541 | 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000, 542 | /** 543 | * @brief 'r' 544 | */ 545 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0, 546 | 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 547 | 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 548 | /** 549 | * @brief 's' 550 | */ 551 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0, 552 | 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38, 553 | 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 554 | /** 555 | * @brief 't' 556 | */ 557 | 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, 558 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 559 | 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 560 | /** 561 | * @brief 'u' 562 | */ 563 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818, 564 | 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38, 565 | 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 566 | /** 567 | * @brief 'v' 568 | */ 569 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18, 570 | 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360, 571 | 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 572 | /** 573 | * @brief 'w' 574 | */ 575 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1, 576 | 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C, 577 | 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 578 | /** 579 | * @brief 'x' 580 | */ 581 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38, 582 | 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30, 583 | 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 584 | /** 585 | * @brief 'y' 586 | */ 587 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830, 588 | 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380, 589 | 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000, 590 | /** 591 | * @brief 'z' 592 | */ 593 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC, 594 | 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 595 | 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 596 | /** 597 | * @brief '{' 598 | */ 599 | 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 600 | 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0, 601 | 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000, 602 | /** 603 | * @brief '|' 604 | */ 605 | 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 606 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 607 | 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 608 | /** 609 | * @brief '}' 610 | */ 611 | 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180, 612 | 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180, 613 | 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000, 614 | /** 615 | * @brief '~' 616 | */ 617 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 618 | 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 619 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 620 | }; 621 | 622 | /** 623 | * @brief ASCII font 12x12 table definition 624 | */ 625 | static const unsigned short Font_12p_Ascii_Table[95*FONT_12P_HEIGHT] = 626 | { 627 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 628 | 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x2000, 0x0000, 0x0000, 629 | 0x0000, 0x5000, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 630 | 0x0000, 0x0900, 0x0900, 0x1200, 0x7f00, 0x1200, 0x7f00, 0x1200, 0x2400, 0x2400, 0x0000, 0x0000, 631 | 0x1000, 0x3800, 0x5400, 0x5000, 0x5000, 0x3800, 0x1400, 0x5400, 0x5400, 0x3800, 0x1000, 0x0000, 632 | 0x0000, 0x3080, 0x4900, 0x4900, 0x4a00, 0x32c0, 0x0520, 0x0920, 0x0920, 0x10c0, 0x0000, 0x0000, 633 | 0x0000, 0x0c00, 0x1200, 0x1200, 0x1400, 0x1800, 0x2500, 0x2300, 0x2300, 0x1d80, 0x0000, 0x0000, 634 | 0x0000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 635 | 0x0000, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1000, 0x1000, 636 | 0x0000, 0x4000, 0x2000, 0x2000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 637 | 0x0000, 0x2000, 0x7000, 0x2000, 0x5000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 638 | 0x0000, 0x0000, 0x0000, 0x0800, 0x0800, 0x7f00, 0x0800, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 639 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x4000, 640 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 641 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 642 | 0x0000, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4000, 0x4000, 0x0000, 0x0000, 643 | 0x0000, 0x1000, 0x2800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x2800, 0x1000, 0x0000, 0x0000, 644 | 0x0000, 0x1000, 0x3000, 0x5000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 645 | 0x0000, 0x3000, 0x4800, 0x4400, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x7c00, 0x0000, 0x0000, 646 | 0x0000, 0x3000, 0x4800, 0x0400, 0x0800, 0x1000, 0x0800, 0x4400, 0x4800, 0x3000, 0x0000, 0x0000, 647 | 0x0000, 0x0800, 0x1800, 0x1800, 0x2800, 0x2800, 0x4800, 0x7c00, 0x0800, 0x0800, 0x0000, 0x0000, 648 | 0x0000, 0x3c00, 0x2000, 0x4000, 0x7000, 0x4800, 0x0400, 0x4400, 0x4800, 0x3000, 0x0000, 0x0000, 649 | 0x0000, 0x1800, 0x2400, 0x4000, 0x5000, 0x6800, 0x4400, 0x4400, 0x2800, 0x1000, 0x0000, 0x0000, 650 | 0x0000, 0x7c00, 0x0400, 0x0800, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 651 | 0x0000, 0x1000, 0x2800, 0x4400, 0x2800, 0x1000, 0x2800, 0x4400, 0x2800, 0x1000, 0x0000, 0x0000, 652 | 0x0000, 0x1000, 0x2800, 0x4400, 0x4400, 0x2c00, 0x1400, 0x0400, 0x4800, 0x3000, 0x0000, 0x0000, 653 | 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 654 | 0x0000, 0x0000, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x4000, 655 | 0x0000, 0x0000, 0x0400, 0x0800, 0x3000, 0x4000, 0x3000, 0x0800, 0x0400, 0x0000, 0x0000, 0x0000, 656 | 0x0000, 0x0000, 0x0000, 0x7c00, 0x0000, 0x0000, 0x7c00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 657 | 0x0000, 0x0000, 0x4000, 0x2000, 0x1800, 0x0400, 0x1800, 0x2000, 0x4000, 0x0000, 0x0000, 0x0000, 658 | 0x0000, 0x3800, 0x6400, 0x4400, 0x0400, 0x0800, 0x1000, 0x1000, 0x0000, 0x1000, 0x0000, 0x0000, 659 | 0x0000, 0x0f80, 0x1040, 0x2ea0, 0x51a0, 0x5120, 0x5120, 0x5120, 0x5320, 0x4dc0, 0x2020, 0x1040, 660 | 0x0000, 0x0800, 0x1400, 0x1400, 0x1400, 0x2200, 0x3e00, 0x2200, 0x4100, 0x4100, 0x0000, 0x0000, 661 | 0x0000, 0x3c00, 0x2200, 0x2200, 0x2200, 0x3c00, 0x2200, 0x2200, 0x2200, 0x3c00, 0x0000, 0x0000, 662 | 0x0000, 0x0e00, 0x1100, 0x2100, 0x2000, 0x2000, 0x2000, 0x2100, 0x1100, 0x0e00, 0x0000, 0x0000, 663 | 0x0000, 0x3c00, 0x2200, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2200, 0x3c00, 0x0000, 0x0000, 664 | 0x0000, 0x3e00, 0x2000, 0x2000, 0x2000, 0x3e00, 0x2000, 0x2000, 0x2000, 0x3e00, 0x0000, 0x0000, 665 | 0x0000, 0x3e00, 0x2000, 0x2000, 0x2000, 0x3c00, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 666 | 0x0000, 0x0e00, 0x1100, 0x2100, 0x2000, 0x2700, 0x2100, 0x2100, 0x1100, 0x0e00, 0x0000, 0x0000, 667 | 0x0000, 0x2100, 0x2100, 0x2100, 0x2100, 0x3f00, 0x2100, 0x2100, 0x2100, 0x2100, 0x0000, 0x0000, 668 | 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 669 | 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x4800, 0x4800, 0x3000, 0x0000, 0x0000, 670 | 0x0000, 0x2200, 0x2400, 0x2800, 0x2800, 0x3800, 0x2800, 0x2400, 0x2400, 0x2200, 0x0000, 0x0000, 671 | 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x3e00, 0x0000, 0x0000, 672 | 0x0000, 0x2080, 0x3180, 0x3180, 0x3180, 0x2a80, 0x2a80, 0x2a80, 0x2a80, 0x2480, 0x0000, 0x0000, 673 | 0x0000, 0x2100, 0x3100, 0x3100, 0x2900, 0x2900, 0x2500, 0x2300, 0x2300, 0x2100, 0x0000, 0x0000, 674 | 0x0000, 0x0c00, 0x1200, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x1200, 0x0c00, 0x0000, 0x0000, 675 | 0x0000, 0x3c00, 0x2200, 0x2200, 0x2200, 0x3c00, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 676 | 0x0000, 0x0c00, 0x1200, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x1600, 0x0d00, 0x0100, 0x0000, 677 | 0x0000, 0x3e00, 0x2100, 0x2100, 0x2100, 0x3e00, 0x2400, 0x2200, 0x2100, 0x2080, 0x0000, 0x0000, 678 | 0x0000, 0x1c00, 0x2200, 0x2200, 0x2000, 0x1c00, 0x0200, 0x2200, 0x2200, 0x1c00, 0x0000, 0x0000, 679 | 0x0000, 0x3e00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000, 680 | 0x0000, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x1200, 0x0c00, 0x0000, 0x0000, 681 | 0x0000, 0x4100, 0x4100, 0x2200, 0x2200, 0x2200, 0x1400, 0x1400, 0x1400, 0x0800, 0x0000, 0x0000, 682 | 0x0000, 0x4440, 0x4a40, 0x2a40, 0x2a80, 0x2a80, 0x2a80, 0x2a80, 0x2a80, 0x1100, 0x0000, 0x0000, 683 | 0x0000, 0x4100, 0x2200, 0x1400, 0x1400, 0x0800, 0x1400, 0x1400, 0x2200, 0x4100, 0x0000, 0x0000, 684 | 0x0000, 0x4100, 0x2200, 0x2200, 0x1400, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000, 685 | 0x0000, 0x7e00, 0x0200, 0x0400, 0x0800, 0x1000, 0x1000, 0x2000, 0x4000, 0x7e00, 0x0000, 0x0000, 686 | 0x0000, 0x3000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 687 | 0x0000, 0x4000, 0x4000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1000, 0x1000, 0x0000, 0x0000, 688 | 0x0000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 689 | 0x0000, 0x1000, 0x2800, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 690 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e00, 691 | 0x4000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 692 | 0x0000, 0x0000, 0x0000, 0x3800, 0x4400, 0x0400, 0x3c00, 0x4400, 0x4400, 0x3c00, 0x0000, 0x0000, 693 | 0x0000, 0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x6400, 0x5800, 0x0000, 0x0000, 694 | 0x0000, 0x0000, 0x0000, 0x3000, 0x4800, 0x4000, 0x4000, 0x4000, 0x4800, 0x3000, 0x0000, 0x0000, 695 | 0x0000, 0x0400, 0x0400, 0x3400, 0x4c00, 0x4400, 0x4400, 0x4400, 0x4c00, 0x3400, 0x0000, 0x0000, 696 | 0x0000, 0x0000, 0x0000, 0x3800, 0x4400, 0x4400, 0x7c00, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, 697 | 0x0000, 0x6000, 0x4000, 0xe000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, 698 | 0x0000, 0x0000, 0x0000, 0x3400, 0x4c00, 0x4400, 0x4400, 0x4400, 0x4c00, 0x3400, 0x0400, 0x4400, 699 | 0x0000, 0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, 700 | 0x0000, 0x4000, 0x0000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, 701 | 0x0000, 0x4000, 0x0000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 702 | 0x0000, 0x4000, 0x4000, 0x4800, 0x5000, 0x6000, 0x5000, 0x5000, 0x4800, 0x4800, 0x0000, 0x0000, 703 | 0x0000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, 704 | 0x0000, 0x0000, 0x0000, 0x5200, 0x6d00, 0x4900, 0x4900, 0x4900, 0x4900, 0x4900, 0x0000, 0x0000, 705 | 0x0000, 0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, 706 | 0x0000, 0x0000, 0x0000, 0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, 707 | 0x0000, 0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x6400, 0x5800, 0x4000, 0x4000, 708 | 0x0000, 0x0000, 0x0000, 0x3400, 0x4c00, 0x4400, 0x4400, 0x4400, 0x4c00, 0x3400, 0x0400, 0x0400, 709 | 0x0000, 0x0000, 0x0000, 0x5000, 0x6000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, 710 | 0x0000, 0x0000, 0x0000, 0x3000, 0x4800, 0x4000, 0x3000, 0x0800, 0x4800, 0x3000, 0x0000, 0x0000, 711 | 0x0000, 0x4000, 0x4000, 0xe000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x6000, 0x0000, 0x0000, 712 | 0x0000, 0x0000, 0x0000, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4c00, 0x3400, 0x0000, 0x0000, 713 | 0x0000, 0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x2800, 0x1000, 0x0000, 0x0000, 714 | 0x0000, 0x0000, 0x0000, 0x4900, 0x4900, 0x5500, 0x5500, 0x5500, 0x5500, 0x2200, 0x0000, 0x0000, 715 | 0x0000, 0x0000, 0x0000, 0x4400, 0x2800, 0x2800, 0x1000, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, 716 | 0x0000, 0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x1000, 717 | 0x0000, 0x0000, 0x0000, 0x7800, 0x0800, 0x1000, 0x2000, 0x2000, 0x4000, 0x7800, 0x0000, 0x0000, 718 | 0x0000, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 719 | 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 720 | 0x0000, 0x4000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 721 | 0x0000, 0x0000, 0x0000, 0x0000, 0x7400, 0x5800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 722 | }; 723 | 724 | static const unsigned char Font_8p_Ascii_Table[95*FONT_8P_HEIGHT] = 725 | { 726 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 727 | 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00, 728 | 0x00,0x00,0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00, 729 | 0x00,0x00,0x00,0x14,0x14,0x3e,0x14,0x28,0x7c,0x28,0x28,0x00, 730 | 0x00,0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x14,0x54,0x38,0x10, 731 | 0x00,0x00,0x00,0x44,0xa8,0xa8,0x50,0x14,0x1a,0x2a,0x24,0x00, 732 | 0x00,0x00,0x00,0x20,0x50,0x50,0x20,0xe8,0x98,0x98,0x60,0x00, 733 | 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 734 | 0x00,0x00,0x00,0x40,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 735 | 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 736 | 0x00,0x00,0x00,0x40,0xe0,0x40,0xa0,0x00,0x00,0x00,0x00,0x00, 737 | 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, 738 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40, 739 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00, 740 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 741 | 0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x80,0x80,0x00, 742 | 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, 743 | 0x00,0x00,0x00,0x20,0x60,0xa0,0x20,0x20,0x20,0x20,0x20,0x00, 744 | 0x00,0x00,0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x80,0xf0,0x00, 745 | 0x00,0x00,0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00, 746 | 0x00,0x00,0x00,0x10,0x30,0x50,0x50,0x90,0xf8,0x10,0x10,0x00, 747 | 0x00,0x00,0x00,0x70,0x40,0x80,0xe0,0x10,0x10,0x90,0x60,0x00, 748 | 0x00,0x00,0x00,0x60,0x90,0x80,0xa0,0xd0,0x90,0x90,0x60,0x00, 749 | 0x00,0x00,0x00,0xf0,0x10,0x20,0x20,0x20,0x40,0x40,0x40,0x00, 750 | 0x00,0x00,0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, 751 | 0x00,0x00,0x00,0x60,0x90,0x90,0xb0,0x50,0x10,0x90,0x60,0x00, 752 | 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x40,0x00, 753 | 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x40,0x40, 754 | 0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x80,0x60,0x10,0x00,0x00, 755 | 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xf0,0x00,0x00,0x00, 756 | 0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x10,0x60,0x80,0x00,0x00, 757 | 0x00,0x00,0x00,0x60,0x90,0x10,0x20,0x40,0x40,0x00,0x40,0x00, 758 | 0x00,0x00,0x00,0x1c,0x22,0x5b,0xa5,0xa5,0xa5,0xa5,0x9e,0x41, 759 | 0x00,0x00,0x00,0x20,0x50,0x50,0x50,0x50,0x70,0x88,0x88,0x00, 760 | 0x00,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0x88,0xf0,0x00, 761 | 0x00,0x00,0x00,0x38,0x44,0x84,0x80,0x80,0x84,0x44,0x38,0x00, 762 | 0x00,0x00,0x00,0xe0,0x90,0x88,0x88,0x88,0x88,0x90,0xe0,0x00, 763 | 0x00,0x00,0x00,0xf8,0x80,0x80,0xf8,0x80,0x80,0x80,0xf8,0x00, 764 | 0x00,0x00,0x00,0x78,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x00, 765 | 0x00,0x00,0x00,0x38,0x44,0x84,0x80,0x9c,0x84,0x44,0x38,0x00, 766 | 0x00,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x88,0x00, 767 | 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 768 | 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x90,0x90,0x60,0x00, 769 | 0x00,0x00,0x00,0x88,0x90,0xa0,0xe0,0xa0,0x90,0x90,0x88,0x00, 770 | 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,0x00, 771 | 0x00,0x00,0x00,0x82,0xc6,0xc6,0xaa,0xaa,0xaa,0xaa,0x92,0x00, 772 | 0x00,0x00,0x00,0x84,0xc4,0xa4,0xa4,0x94,0x94,0x8c,0x84,0x00, 773 | 0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x48,0x30,0x00, 774 | 0x00,0x00,0x00,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x80,0x00, 775 | 0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x58,0x34,0x04, 776 | 0x00,0x00,0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x42,0x00, 777 | 0x00,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x88,0x70,0x00, 778 | 0x00,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, 779 | 0x00,0x00,0x00,0x84,0x84,0x84,0x84,0x84,0x84,0x48,0x30,0x00, 780 | 0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x50,0x50,0x50,0x20,0x00, 781 | 0x00,0x00,0x00,0x92,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x44,0x00, 782 | 0x00,0x00,0x00,0x84,0x48,0x48,0x30,0x30,0x48,0x48,0x84,0x00, 783 | 0x00,0x00,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00, 784 | 0x00,0x00,0x00,0xf8,0x08,0x10,0x20,0x20,0x40,0x80,0xf8,0x00, 785 | 0x00,0x00,0x00,0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 786 | 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x20,0x20,0x00, 787 | 0x00,0x00,0x00,0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 788 | 0x00,0x00,0x00,0x40,0xa0,0xa0,0xa0,0x00,0x00,0x00,0x00,0x00, 789 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, 790 | 0x00,0x00,0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 791 | 0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x70,0x90,0x90,0x70,0x00, 792 | 0x00,0x00,0x00,0x80,0x80,0xa0,0xd0,0x90,0x90,0xd0,0xa0,0x00, 793 | 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, 794 | 0x00,0x00,0x00,0x10,0x10,0x50,0xb0,0x90,0x90,0xb0,0x50,0x00, 795 | 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0xf0,0x80,0x90,0x60,0x00, 796 | 0x00,0x00,0x00,0xc0,0x80,0xc0,0x80,0x80,0x80,0x80,0x80,0x00, 797 | 0x00,0x00,0x00,0x00,0x00,0x50,0xb0,0x90,0x90,0xb0,0x50,0x10, 798 | 0x00,0x00,0x00,0x80,0x80,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00, 799 | 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 800 | 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 801 | 0x00,0x00,0x00,0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x90,0x00, 802 | 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 803 | 0x00,0x00,0x00,0x00,0x00,0xa6,0xda,0x92,0x92,0x92,0x92,0x00, 804 | 0x00,0x00,0x00,0x00,0x00,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00, 805 | 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, 806 | 0x00,0x00,0x00,0x00,0x00,0xa0,0xd0,0x90,0x90,0xd0,0xa0,0x80, 807 | 0x00,0x00,0x00,0x00,0x00,0x50,0xb0,0x90,0x90,0xb0,0x50,0x10, 808 | 0x00,0x00,0x00,0x00,0x00,0xa0,0xc0,0x80,0x80,0x80,0x80,0x00, 809 | 0x00,0x00,0x00,0x00,0x00,0xe0,0x90,0x40,0x20,0x90,0x60,0x00, 810 | 0x00,0x00,0x00,0x80,0x80,0xc0,0x80,0x80,0x80,0x80,0xc0,0x00, 811 | 0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xb0,0x50,0x00, 812 | 0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x50,0x20,0x00, 813 | 0x00,0x00,0x00,0x00,0x00,0x92,0xaa,0xaa,0xaa,0xaa,0x44,0x00, 814 | 0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00, 815 | 0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x50,0x50,0x20,0x20,0x20, 816 | 0x00,0x00,0x00,0x00,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x00, 817 | 0x00,0x00,0x00,0xc0,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80, 818 | 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 819 | 0x00,0x00,0x00,0xc0,0x40,0x40,0x40,0x20,0x40,0x40,0x40,0x40, 820 | 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xb0,0x00,0x00,0x00,0x00 821 | }; 822 | 823 | /** 824 | * @brief ASCII font 8x12: each character is 8 column (8dots large) and 12 raw (12 dots high) 825 | */ 826 | static const unsigned char Font_8p_bold_Ascii_Table[95*FONT_8P_HEIGHT] = 827 | { 828 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ' ' 32 */ 829 | 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, /* '!' 33 */ 830 | 0x36, 0x36, 0x36, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* '"' 34 */ 831 | 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, /* '#' 35 */ 832 | 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0x78, 0x3C, 0x06, 0xC6, 0x7C, 0x18, 0x18, /* '$' 36 */ 833 | 0x00, 0x00, 0x00, 0x62, 0x66, 0x0C, 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00, /* '%' 37 */ 834 | 0x00, 0x38, 0x6C, 0x38, 0x38, 0x76, 0xF6, 0xCE, 0xCC, 0x76, 0x00, 0x00, /* '&' 38 */ 835 | 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ''' 39 */ 836 | 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, /* '(' 40 */ 837 | 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, /* ')' 41 */ 838 | 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE, 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, /* '*' 42 */ 839 | 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, /* '+' 43 */ 840 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, /* ',' 44 */ 841 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* '-' 45 */ 842 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, /* '.' 46 */ 843 | 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, /* '/' 47 */ 844 | 0x00, 0x7C, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* '0' 48 */ 845 | 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, /* '1' 49 */ 846 | 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, /* '2' 50 */ 847 | 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, /* '3' 51 */ 848 | 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x0C, 0x00, 0x00, /* '4' 52 */ 849 | 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, /* '5' 53 */ 850 | 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* '6' 54 */ 851 | 0x00, 0xFE, 0xC6, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, /* '7' 55 */ 852 | 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* '8' 56 */ 853 | 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, /* '9' 57 */ 854 | 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, /* ':' 58 */ 855 | 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, /* ';' 59 */ 856 | 0x00, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00, /* '<' 60 */ 857 | 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, /* '=' 61 */ 858 | 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, /* '>' 62 */ 859 | 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, /* '?' 63 */ 860 | 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE, 0xDE, 0xDC, 0xC0, 0x7E, 0x00, 0x00, /* '@' 64 */ 861 | 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, /* 'A' 65 */ 862 | 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, /* 'B' 66 */ 863 | 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00, 0x00, /* 'C' 67 */ 864 | 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, /* 'D' 68 */ 865 | 0x00, 0xFE, 0x66, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, /* 'E' 69 */ 866 | 0x00, 0xFE, 0x66, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, /* 'F' 70 */ 867 | 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xCE, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* 'G' 71 */ 868 | 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, /* 'H' 72 */ 869 | 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, /* 'I' 73 */ 870 | 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, /* 'J' 74 */ 871 | 0x00, 0xC6, 0xCC, 0xD8, 0xF0, 0xF0, 0xD8, 0xCC, 0xC6, 0xC6, 0x00, 0x00, /* 'K' 75 */ 872 | 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, /* 'L' 76 */ 873 | 0x00, 0xC6, 0xC6, 0xEE, 0xFE, 0xD6, 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, /* 'M' 77 */ 874 | 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xDE, 0xCE, 0xCE, 0xC6, 0x00, 0x00, /* 'N' 78 */ 875 | 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* 'O' 79 */ 876 | 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, /* 'P' 80 */ 877 | 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x06, 0x00, /* 'Q' 81 */ 878 | 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, /* 'R' 82 */ 879 | 0x00, 0x7C, 0xC6, 0xC0, 0x60, 0x38, 0x0C, 0x06, 0xC6, 0x7C, 0x00, 0x00, /* 'S' 83 */ 880 | 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, /* 'T' 84 */ 881 | 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* 'U' 85 */ 882 | 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, /* 'V' 86 */ 883 | 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0xEE, 0xC6, 0xC6, 0x00, 0x00, /* 'W' 87 */ 884 | 0x00, 0xC6, 0xC6, 0x6C, 0x38, 0x38, 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, /* 'X' 88 */ 885 | 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, /* 'Y' 89 */ 886 | 0x00, 0xFE, 0xC6, 0x8C, 0x18, 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, /* 'Z' 90 */ 887 | 0x00, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7C, 0x00, 0x00, /* '[' 91 */ 888 | 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00, 0x00, /* '\' 92 */ 889 | 0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, /* ']' 93 */ 890 | 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* '^' 94 */ 891 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, /* '_' 95 */ 892 | 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* '`' 96 */ 893 | 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xDC, 0x76, 0x00, 0x00, /* 'a' 97 */ 894 | 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, /* 'b' 98 */ 895 | 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, /* 'c' 99 */ 896 | 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, /* 'd' 100 */ 897 | 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, /* 'e' 101 */ 898 | 0x00, 0x1C, 0x36, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, /* 'f' 102 */ 899 | 0x00, 0x00, 0x00, 0x00, 0x76, 0xCE, 0xC6, 0xC6, 0x7E, 0x06, 0xC6, 0x7C, /* 'g' 103 */ 900 | 0x00, 0xE0, 0x60, 0x60, 0x6C, 0x76, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, /* 'h' 104 */ 901 | 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, /* 'i' 105 */ 902 | 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, /* 'j' 106 */ 903 | 0x00, 0xE0, 0x60, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, /* 'k' 107 */ 904 | 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, /* 'l' 108 */ 905 | 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, /* 'm' 109 */ 906 | 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, /* 'n' 110 */ 907 | 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, /* 'o' 111 */ 908 | 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, /* 'p' 112 */ 909 | 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, /* 'q' 113 */ 910 | 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, /* 'r' 114 */ 911 | 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x70, 0x1C, 0xC6, 0x7C, 0x00, 0x00, /* 's' 115 */ 912 | 0x00, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, /* 't' 116 */ 913 | 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, /* 'u' 117 */ 914 | 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, /* 'v' 118 */ 915 | 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, /* 'w' 119 */ 916 | 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00, /* 'x' 120 */ 917 | 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, /* 'y' 121 */ 918 | 0x00, 0x00, 0x00, 0x00, 0xFE, 0x8C, 0x18, 0x30, 0x62, 0xFE, 0x00, 0x00, /* 'z' 122 */ 919 | 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, /* '{' 123 */ 920 | 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, /* '|' 124 */ 921 | 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, /* '}' 125 */ 922 | 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* '~' 126 */ 923 | }; 924 | 925 | #endif /* FONTS_H_ */ 926 | -------------------------------------------------------------------------------- /src/GraphicDriver/GraphicDriver.c: -------------------------------------------------------------------------------- 1 | /** 2 | * @file GraphicDriver.c 3 | * 4 | * @brief Set of hardware dependent functions to support basic graphic functionality 5 | * 6 | * @details User needs to implement LCD driver initialization and function that draws one-pixel point at 7 | * define x and y coordinate 8 | * 9 | * @author Krzysztof Grzeszczak 10 | * 11 | * @version 1.0 12 | * 13 | * @date 2012-2013 14 | * 15 | * @copyright GNU Public License 16 | */ 17 | 18 | #include "GraphicDriver.h" 19 | 20 | /** 21 | * @brief Initialize LCD module and enable it 22 | * @todo Add specific LCD and MCU wise implementation 23 | */ 24 | void GraphicDriver_Initialize(void) 25 | { 26 | do{}while(0); 27 | } 28 | 29 | /** 30 | * @brief Draw one pixel with defined color on LCD 31 | * 32 | * @details Function draws point on the screen 33 | * x = <0, 319> px, horizontal coordinate 34 | * y = <0, 240> px, vertical coordinate 35 | * color = <0x0000, 0xFFFF> 16-bit 5-6-5 format |RRRRR-GGGGGG-BBBBB| RGB color data 36 | * 37 | * @todo Add specific LCD and MCI wise implementation 38 | */ 39 | void GraphicDriver_DrawPoint(unsigned short x, unsigned short y, unsigned int color) 40 | { 41 | do{}while(0); 42 | } 43 | 44 | /** 45 | * @brief Get color data from pixel drawn on LCD 46 | * 47 | * @details Use LCD internal memory to read color data from given coordinates x and y 48 | * 49 | * @todo This implementation is optional. 50 | */ 51 | unsigned int GraphicDriver_GetPoint(unsigned short x, unsigned short y) 52 | { 53 | return 0; 54 | } 55 | -------------------------------------------------------------------------------- /src/GraphicDriver/GraphicDriver.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file GraphicDriver.h 3 | * 4 | * @brief GraphicDriver module API. 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef GRAPHICDRIVER_H_ 16 | #define GRAPHICDRIVER_H_ 17 | 18 | //! Horizontal resolution in pixel unit 19 | #define H_RES 320 20 | 21 | //! Vertical resolution in pixel unit 22 | #define V_RES 240 23 | 24 | void GraphicDriver_Initialize(void); 25 | void GraphicDriver_DrawPoint(unsigned short x, unsigned short y, unsigned int color); 26 | unsigned int GraphicDriver_GetPoint(unsigned short x, unsigned short y); 27 | 28 | #endif /* GRAPHICDRIVER_H_ */ 29 | -------------------------------------------------------------------------------- /src/Graphics/Graphics.c: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Graphics.c 3 | * 4 | * @brief Set of functions used to draw basic graphical structures like Line, Rectangle or Character 5 | * 6 | * @details User needs to implement LCD driver initialization and function that draws one-pixel point at 7 | * define x and y coordinate 8 | * 9 | * @author Krzysztof Grzeszczak 10 | * 11 | * @version 1.0 12 | * 13 | * @date 2012-2013 14 | * 15 | * @copyright GNU Public License 16 | */ 17 | 18 | #include "Graphics.h" 19 | 20 | /** 21 | * @brief Draw Rectangle filled with defined color 22 | * 23 | * @details Graphic below will show the meaning of function arguments 24 | * -------############################# x_end, y_end------------ 25 | * -------##########################################------------ 26 | * -------################color#####################------------ 27 | * -------##########################################------------ 28 | * -------x_start,y_start###########################------------ 29 | */ 30 | void Graphics_DrawRect(unsigned short x_start, 31 | unsigned short y_start, 32 | unsigned short x_end, 33 | unsigned short y_end, 34 | unsigned int color) 35 | { 36 | unsigned short x,y; 37 | 38 | for(y = y_start; y < y_end; y++) 39 | { 40 | for(x = x_start; x < x_end; x++) 41 | { 42 | GraphicDriver_DrawPoint(x,y,color); 43 | } 44 | } 45 | } 46 | 47 | /** 48 | * @brief Draw line with defined color 49 | */ 50 | void Graphics_DrawLine(unsigned short x_start, 51 | unsigned short y_start, 52 | unsigned short x_end, 53 | unsigned short y_end, 54 | unsigned int color) 55 | { 56 | signed short x_width = 0, y_width = 0, x_abs, y_abs; 57 | signed short delta = 0; 58 | unsigned short i; 59 | 60 | x_width = x_end - x_start; 61 | y_width = y_end - y_start; 62 | 63 | x_abs = ABS(x_width); 64 | y_abs = ABS(y_width); 65 | 66 | if( x_abs > y_abs ) 67 | { 68 | //Since horizontal width is greater than vertical, incremental step will calculated from horizontal 69 | if(x_width >= 0) 70 | { 71 | //Line will increase x 72 | for(i = 0; i < x_abs; i++) 73 | { 74 | delta = (i * y_width) / x_width; 75 | GraphicDriver_DrawPoint(x_start + i, y_start + delta, color); 76 | } 77 | } 78 | else 79 | { 80 | //Line will decrease x 81 | for(i = 0; i < x_abs; i++) 82 | { 83 | delta = (i * y_width) / x_abs; 84 | GraphicDriver_DrawPoint(x_start - i, y_start + delta, color); 85 | } 86 | } 87 | } 88 | else 89 | { 90 | //Since vertical width is greater than horizontal, incremental step will calculated from vertical 91 | if(y_width >= 0) 92 | { 93 | //Line will increase y 94 | for(i = 0; i < y_abs; i++) 95 | { 96 | delta = (i * x_width) / y_width; 97 | GraphicDriver_DrawPoint(x_start + delta, y_start + i, color); 98 | } 99 | } 100 | else 101 | { 102 | //Line will decrease y 103 | for(i = 0; i < y_abs; i++) 104 | { 105 | delta = (i * x_width) / y_width; 106 | GraphicDriver_DrawPoint(x_start + delta, y_start - i, color); 107 | } 108 | } 109 | } 110 | } 111 | 112 | /** 113 | * @brief Draw ASCII character at defined coordinated with defined color 114 | * 115 | * @param x - x coordinate of leftmost corner to start drawing character 116 | * @param y - y coordinate of topmost corner to start drawing character 117 | * @param ascii_char - ASCII code character 118 | * @param font_size - FONT_SIZE_TYPE enumerated parameter defined in Fonts.h file 119 | * @param color - R5 G6 B5 unit color data 120 | */ 121 | void Graphics_DrawChar(unsigned short x, unsigned short y, unsigned char ascii_char, FONT_SIZE_TYPE font_size, unsigned int color) 122 | { 123 | unsigned char height_index = 0, width_index = 0, font_height = 0, font_width = 0; 124 | unsigned short font_row, ascii_table_index; 125 | 126 | if( (font_size == FONT_8P) || (font_size == FONT_8P_BOLD) ) 127 | { 128 | font_height = FONT_8P_HEIGHT; 129 | font_width = FONT_8P_WIDTH; 130 | } 131 | else if(font_size == FONT_12P) 132 | { 133 | font_height = FONT_12P_HEIGHT; 134 | font_width = FONT_12P_WIDTH; 135 | } 136 | else if(font_size == FONT_16P) 137 | { 138 | font_height = FONT_16P_HEIGHT; 139 | font_width = FONT_16P_WIDTH; 140 | } 141 | 142 | y += font_height; 143 | 144 | ascii_table_index = (ascii_char - 32) * font_height; 145 | 146 | for(height_index = 0; height_index < font_height; height_index++) 147 | { 148 | for(width_index = 0; width_index < font_width; width_index++) 149 | { 150 | if(font_size == FONT_16P) 151 | { 152 | font_row = Font_16p_Ascii_Table[ascii_table_index + height_index]; 153 | if( (font_row & (0x01 << width_index)) != 0x0000 ) 154 | { 155 | GraphicDriver_DrawPoint(x + width_index, y - height_index, color); 156 | } 157 | } 158 | else if(font_size == FONT_12P) 159 | { 160 | font_row = Font_12p_Ascii_Table[ascii_table_index + height_index]; 161 | if( (font_row & (0x8000 >> width_index)) != 0x0000 ) 162 | { 163 | GraphicDriver_DrawPoint(x + width_index, y - height_index, color); 164 | } 165 | } 166 | else if(font_size == FONT_8P_BOLD) 167 | { 168 | font_row = Font_8p_bold_Ascii_Table[ascii_table_index + height_index]; 169 | if( (font_row & (0x80 >> width_index)) != 0x0000 ) 170 | { 171 | GraphicDriver_DrawPoint(x + width_index, y - height_index, color); 172 | } 173 | } 174 | else if(font_size == FONT_8P) 175 | { 176 | font_row = Font_8p_Ascii_Table[ascii_table_index + height_index]; 177 | if( (font_row & (0x80 >> width_index)) != 0x0000 ) 178 | { 179 | GraphicDriver_DrawPoint(x + width_index, y - height_index, color); 180 | } 181 | } 182 | } 183 | } 184 | } 185 | 186 | -------------------------------------------------------------------------------- /src/Graphics/Graphics.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Graphics.h 3 | * 4 | * @brief Defined API for Graphics module 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef GRAPHICS_H_ 16 | #define GRAPHICS_H_ 17 | 18 | #include "../GraphicDriver/GraphicDriver.h" 19 | #include "../Fonts.h" 20 | 21 | //! @def Macro for calculating absolute value 22 | #define ABS(X) ((X) > 0 ? (X) : -(X)) 23 | 24 | 25 | void Graphics_DrawRect(unsigned short x_start, 26 | unsigned short y_start, 27 | unsigned short x_end, 28 | unsigned short y_end, 29 | unsigned int color); 30 | 31 | void Graphics_DrawLine(unsigned short x_start, 32 | unsigned short y_start, 33 | unsigned short x_end, 34 | unsigned short y_end, 35 | unsigned int color); 36 | 37 | void Graphics_DrawChar(unsigned short x, unsigned short y, unsigned char ascii_char, FONT_SIZE_TYPE font, unsigned int color); 38 | 39 | #endif /* GRAPHICS_H_ */ 40 | -------------------------------------------------------------------------------- /src/Gui/Gui.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Gui.h 3 | * 4 | * @brief Gui module API. 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef GUI_H_ 16 | #define GUI_H_ 17 | 18 | #include "../Graphics/Graphics.h" 19 | #include "../TouchDriver/TouchDriver.h" 20 | #include 21 | 22 | //! Number of Graph data point in the buffer 23 | #define GUI_NUM_OF_GRAPH_DATA 255 24 | 25 | //! Maximum absolute graph point value 26 | #define GUI_GRAPH_MAX_VALUE 127 27 | 28 | //! Graph refresh rate 29 | #define GUI_GRAPH_REFRESH_RATE (24/25) // 25 ms refresh rate 30 | 31 | //! Declaration of Event type 32 | typedef void (* GUI_EVENT_TYPE)(void); 33 | 34 | //! Text Alignment type, right, left or center 35 | typedef enum 36 | { 37 | ALIGN_RIGHT = 0, 38 | ALIGN_LEFT, 39 | ALIGN_CENTER 40 | } ALIGNMENT_TYPE; 41 | 42 | //! Orientation type Horizontal or vertical 43 | typedef enum 44 | { 45 | HORIZONTAL = 0, 46 | VERTICAL 47 | } ORIENTATION_TYPE; 48 | 49 | //! Event type Click or Release 50 | typedef enum 51 | { 52 | EVENT_TOUCH_IDLE = 0, 53 | EVENT_TOUCH_CLICK, 54 | EVENT_TOUCH_RELEASE, 55 | } TOUCH_EVENT_TYPE; 56 | 57 | //! Label type definition 58 | typedef struct 59 | { 60 | char *String; 61 | FONT_SIZE_TYPE FontSize; 62 | unsigned int FontColor; 63 | bool IsBackground; 64 | ALIGNMENT_TYPE Align; 65 | unsigned int BackgroundColor; 66 | unsigned char Id; 67 | unsigned short XPos; 68 | unsigned short YPos; 69 | unsigned short Width; 70 | unsigned short Height; 71 | } GUI_LABEL_TYPE; 72 | 73 | //! Default Label type values 74 | #define LABEL_DEFAULT (GUI_LABEL_TYPE){"", FONT_8P, 0x0000, FALSE, ALIGN_RIGHT, 0xFFFF, 0, 0, 0, 0, 0} 75 | 76 | //! Label linked list structure definition 77 | struct LabelListNode 78 | { 79 | GUI_LABEL_TYPE LabelElement; 80 | struct LabelListNode *Next; 81 | }; 82 | typedef struct LabelListNode GUI_LABEL_LIST_TYPE; 83 | 84 | //! Button type definition 85 | typedef struct 86 | { 87 | unsigned char Id; 88 | unsigned short XPos; 89 | unsigned short YPos; 90 | unsigned short Width; 91 | unsigned short Height; 92 | GUI_LABEL_TYPE caption; 93 | unsigned int ButtonColor; 94 | GUI_EVENT_TYPE OnReleaseEvent; 95 | } GUI_BUTTON_TYPE; 96 | 97 | //! Default Button type values 98 | #define BUTTON_DEFAULT (GUI_BUTTON_TYPE){0, 0, 0, 0, 0, LABEL_DEFAULT, 0x0000, NULL} 99 | 100 | //! Button linked list definition 101 | struct ButtonListNode 102 | { 103 | GUI_BUTTON_TYPE ButtonElement; 104 | struct ButtonListNode *Next; 105 | }; 106 | typedef struct ButtonListNode GUI_BUTTON_LIST_TYPE; 107 | 108 | //! Slider button type definition 109 | typedef struct 110 | { 111 | unsigned short XStart; 112 | unsigned short XEnd; 113 | unsigned short YStart; 114 | unsigned short YEnd; 115 | } GUI_SLIDER_BUTTON_TYPE; 116 | 117 | //! Slider button type default values 118 | #define SLIDER_BUTTON_DEFAULT (GUI_SLIDER_BUTTON_TYPE){0, 0, 0, 0} 119 | 120 | //! Slider type definition 121 | typedef struct 122 | { 123 | unsigned short Id; 124 | unsigned short XPos; 125 | unsigned short YPos; 126 | unsigned char Value; 127 | unsigned short Width; 128 | unsigned short Height; 129 | ORIENTATION_TYPE Orientation; 130 | GUI_SLIDER_BUTTON_TYPE SliderButton; 131 | unsigned int Color; 132 | GUI_EVENT_TYPE OnSliderChangeEvent; 133 | } GUI_SLIDER_TYPE; 134 | 135 | //! Slider type default values 136 | #define SLIDER_DEFAULT (GUI_SLIDER_TYPE){0, 0, 0, 0, 0, 0, HORIZONTAL, SLIDER_BUTTON_DEFAULT, 0x0000, NULL} 137 | 138 | //! Slider linker list definition 139 | struct SliderListNode 140 | { 141 | GUI_SLIDER_TYPE SliderElement; 142 | struct SliderListNode *Next; 143 | }; 144 | typedef struct SliderListNode GUI_SLIDER_LIST_TYPE; 145 | 146 | //! Checkbox type definition 147 | typedef struct 148 | { 149 | unsigned char Id; 150 | unsigned short XPos; 151 | unsigned short YPos; 152 | bool IsChecked; 153 | unsigned short Size; //Width = Height 154 | GUI_EVENT_TYPE OnCheckboxChangeEvent; 155 | } GUI_CHECKBOX_TYPE; 156 | 157 | //! Checkbox type default values 158 | #define CHECKBOX_DEFAULT (GUI_CHECKBOX_TYPE){0, 0, 0, FALSE, 0, NULL} 159 | 160 | //! Checkbox linked list definition 161 | struct CheckboxListNode 162 | { 163 | GUI_CHECKBOX_TYPE CheckboxElement; 164 | struct CheckboxListNode *Next; 165 | }; 166 | typedef struct CheckboxListNode GUI_CHECKBOX_LIST_TYPE; 167 | 168 | //!Led type definition 169 | typedef struct 170 | { 171 | unsigned short Id; 172 | unsigned short XPos; 173 | unsigned short YPos; 174 | bool IsOn; 175 | unsigned short Size; 176 | } GUI_LED_TYPE; 177 | 178 | //! Led type default values 179 | #define LED_DEFAULT (GUI_LED_TYPE){0, 0, 0, FALSE, 0} 180 | 181 | //! Led type linked list definition 182 | struct LedListNode 183 | { 184 | GUI_LED_TYPE LedElement; 185 | struct LedListNode *Next; 186 | }; 187 | typedef struct LedListNode GUI_LED_LIST_TYPE; 188 | 189 | //! Panel type definition 190 | typedef struct 191 | { 192 | unsigned char Id; 193 | unsigned short XPos; 194 | unsigned short YPos; 195 | unsigned short Width; 196 | unsigned short Height; 197 | unsigned int Color; 198 | } GUI_PANEL_TYPE; 199 | 200 | //! Panel type default values 201 | #define PANEL_DEFAULT (GUI_PANEL_TYPE){0, 0, 0, 0, 0, 0x0000} 202 | 203 | //! Panel type linked list definition 204 | struct PanelListNode 205 | { 206 | GUI_PANEL_TYPE PanelElement; 207 | struct PanelListNode *Next; 208 | }; 209 | typedef struct PanelListNode GUI_PANEL_LIST_TYPE; 210 | 211 | //! TextBox type definition 212 | #define GUI_TEXTBOX_MAX_SIZE 1023 //1kb for textbox string size 213 | typedef struct 214 | { 215 | unsigned char Id; 216 | unsigned short XPos; 217 | unsigned short YPos; 218 | unsigned short Width; 219 | unsigned short Height; 220 | char *String; 221 | unsigned short ScrollIndex; 222 | FONT_SIZE_TYPE FontSize; 223 | unsigned int BackgroundColor; 224 | unsigned int FontColor; 225 | } GUI_TEXTBOX_TYPE; 226 | 227 | //! TextBox type default values 228 | #define TEXTBOX_DEFAULT (GUI_TEXTBOX_TYPE){0, 0, 0, 0, 0, "", 0, FONT_8P, 0xFFFF, 0x0000} 229 | 230 | //! Graph type 231 | typedef struct 232 | { 233 | unsigned char Id; 234 | unsigned short XPos; 235 | unsigned short YPos; 236 | unsigned char Scale; //0 - 100 % 237 | unsigned char GraphData[GUI_NUM_OF_GRAPH_DATA]; 238 | } GUI_GRAPH_TYPE; 239 | 240 | //! Graph type default values 241 | #define GRAPH_DEFAULT (GUI_GRAPH_TYPE){0, 0, 0, 0, NULL} 242 | 243 | //! View type definition is a container of all GUI element lists that can be dynamically changed 244 | typedef struct 245 | { 246 | bool IsCreated; 247 | GUI_GRAPH_TYPE *Graph; 248 | GUI_TEXTBOX_TYPE *TextBox; 249 | GUI_LABEL_LIST_TYPE *LabelList; 250 | GUI_BUTTON_LIST_TYPE *ButtonList; 251 | GUI_PANEL_LIST_TYPE *PanelList; 252 | GUI_SLIDER_LIST_TYPE *SliderList; 253 | GUI_CHECKBOX_LIST_TYPE *CheckboxList; 254 | GUI_LED_LIST_TYPE *LedList; 255 | } GUI_VIEW_TYPE; 256 | 257 | //! View type default values 258 | #define VIEW_DEFAULT (GUI_VIEW_TYPE){FALSE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL} 259 | 260 | GUI_BUTTON_TYPE* Gui_NewButton(GUI_VIEW_TYPE *View); 261 | GUI_LABEL_TYPE* Gui_NewLabel(GUI_VIEW_TYPE *View); 262 | GUI_SLIDER_TYPE* Gui_NewSlider(GUI_VIEW_TYPE *View); 263 | GUI_CHECKBOX_TYPE* Gui_NewCheckbox(GUI_VIEW_TYPE *View); 264 | GUI_LED_TYPE* Gui_NewLed(GUI_VIEW_TYPE *View); 265 | GUI_PANEL_TYPE* Gui_NewPanel(GUI_VIEW_TYPE *View); 266 | GUI_GRAPH_TYPE* Gui_NewGraph(GUI_VIEW_TYPE *View); 267 | GUI_TEXTBOX_TYPE* Gui_NewTextBox(GUI_VIEW_TYPE *View); 268 | 269 | void Gui_DeleteView(GUI_VIEW_TYPE *View); 270 | 271 | void Gui_DrawLabel(GUI_LABEL_TYPE *Label); 272 | void Gui_DrawButton(GUI_BUTTON_TYPE *Button); 273 | void Gui_DrawSlider(GUI_SLIDER_TYPE *Slider); 274 | void Gui_DrawCheckbox(GUI_CHECKBOX_TYPE *Checkbox); 275 | void Gui_DrawLed(GUI_LED_TYPE *Led); 276 | void Gui_DrawPanel(GUI_PANEL_TYPE *Panel); 277 | void Gui_DrawGraph(GUI_GRAPH_TYPE *Graph); 278 | void Gui_DrawTextBox(GUI_TEXTBOX_TYPE *TextBox); 279 | void Gui_DrawView(GUI_VIEW_TYPE *View); 280 | 281 | void Gui_AddDataToGraph(GUI_GRAPH_TYPE *Graph, unsigned char Data); 282 | 283 | void Gui_TextBoxClearString(GUI_TEXTBOX_TYPE *TextBox); 284 | void Gui_TextBoxSetString(GUI_TEXTBOX_TYPE *TextBox, char *string); 285 | void Gui_TextBoxAddToString(GUI_TEXTBOX_TYPE *TextBox, char *string); 286 | char* Gui_TextBoxGetStringPointer(void); 287 | 288 | void Gui_Task(GUI_VIEW_TYPE *View); 289 | 290 | char* Gui_IntToString(char *string, int num); 291 | unsigned int Gui_RGB888To565(unsigned char red, unsigned char green, unsigned char blue); 292 | 293 | #endif /* GUI_H_ */ 294 | -------------------------------------------------------------------------------- /src/TouchDriver/TouchDriver.c: -------------------------------------------------------------------------------- 1 | /** 2 | * @file TouchDriver.c 3 | * 4 | * @brief This module implements 4-wire resistive touchscreen data reading 5 | * 6 | * @details This module needs hardware support from MCU side, example implementation is for STM32 micro 7 | * 8 | * @author Krzysztof Grzeszczak 9 | * 10 | * @version 1.0 11 | * 12 | * @date 2012-2013 13 | * 14 | * @copyright GNU Public License 15 | */ 16 | 17 | #include "TouchDriver.h" 18 | 19 | #define TOUCH_ALPHA_BITS 2 20 | #define TOUCH_FILTER_DEBOUNCE 40 //40 [ms] 21 | 22 | //TODO define here proper GPIO's for 4-wire resistive touchscreen. Example on STM32 Cortex-M3 23 | //#define YU GPIO_Pin_1 24 | //#define XL GPIO_Pin_0 25 | //#define YD GPIO_Pin_3 26 | //#define XR GPIO_Pin_2 27 | 28 | //TODO define here proper ADC channels to read voltage from touchscreen 29 | //#define Touch_XL ADC_Channel_10 30 | //#define Touch_YU ADC_Channel_11 31 | //#define Touch_XR ADC_Channel_12 32 | //#define Touch_YD ADC_Channel_13 33 | 34 | //! Offset values to read absolute linear x position. 35 | //! It was established empirically and will vary from touchscreen resistance value 36 | #define TOUCH_X_LOWEST_VALID_VALUE 300 37 | #define TOUCH_X_HIGHEST_VALID_VALUE 3820 38 | 39 | //! Offset values to read absolute linear y position. 40 | //! It was established empirically and will vary from touchscreen resistance value 41 | #define TOUCH_Y_LOWEST_VALID_VALUE 550 42 | #define TOUCH_Y_HIGHEST_VALID_VALUE 3630 43 | 44 | static TOUCH_DRIVIER_TYPE TouchData; 45 | static volatile unsigned short RawXData; //!< Holds raw non filtered X coordinate 46 | static volatile unsigned short RawYData; //!< Holds raw non filtered Y coordinate 47 | static volatile unsigned short FilteredXData; //!< Holds filtered X coordinate 48 | static volatile unsigned short FilteredYData; //!< Holds filtered Y coordinate 49 | static volatile unsigned short IirXData; //!< temporary filter data for X coordinate 50 | static volatile unsigned short IirYData; //!< temporary filter data for Y coordinate 51 | static volatile unsigned short Touch1msCnt; //!< Counter that is used to debounce touch event 52 | 53 | unsigned short TouchDriver_CalculateXCord(unsigned short filtered_x); 54 | unsigned short TouchDriver_CalculateYCord(unsigned short filtered_y); 55 | void TouchDriver_ConfigureToReadX(void); 56 | void TouchDriver_ConfigureToReadY(void); 57 | void TouchDriver_ConfigureToDetectTouch(void); 58 | unsigned short TouchDriver_IIRFilter(volatile unsigned short *iir_value, volatile unsigned short new_value, unsigned char alpha_bits); 59 | bool TouchDriver_DetectTouch(void); 60 | unsigned short TouchDriver_GetAdcTouchData(void); 61 | 62 | /** 63 | * @brief Initialize MCU to read analog touch screen data 64 | * 65 | * @note This function should be implemented according to proper MCU procedure 66 | */ 67 | void TouchDriver_Initialize(void) 68 | { 69 | 70 | //Example on STM32 Cortex-M3 71 | // ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 72 | // ADC_InitStructure.ADC_ScanConvMode = DISABLE; 73 | // ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 74 | // ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 75 | // ADC_InitStructure.ADC_NbrOfChannel = 1; 76 | // ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 77 | // ADC_Init(ADC1, &ADC_InitStructure); 78 | // 79 | // TouchDriver_ConfigureToReadX(); 80 | // ADC_StartCalibration(ADC1); 81 | // while(ADC_GetCalibrationStatus(ADC1)); 82 | // ADC_SoftwareStartConvCmd(ADC1, ENABLE); 83 | 84 | Touch1msCnt = 0; 85 | RawXData = 0; 86 | RawYData = 0; 87 | FilteredXData = 0; 88 | FilteredYData = 0; 89 | IirXData = 0; 90 | IirYData = 0; 91 | TouchData.State = TOUCH_WAITING_FOR_TOUCH; 92 | TouchData.IsTouchDetected = FALSE; 93 | } 94 | 95 | /** 96 | * @brief TouchDriver module periodic task 97 | * 98 | * @note This function need to be called every 1 [ms] to enable proper responsiveness. 99 | * This time can be increase but this implies touch event debouncing 100 | */ 101 | void TouchDriver_Task(void) 102 | { 103 | bool is_touch_detected = FALSE; 104 | 105 | TouchDriver_ConfigureToDetectTouch(); 106 | is_touch_detected = TouchDriver_DetectTouch(); 107 | 108 | switch(TouchData.State) 109 | { 110 | case TOUCH_WAITING_FOR_TOUCH: 111 | // Wait for touch event 112 | if( is_touch_detected == FALSE) 113 | { 114 | TouchData.State = TOUCH_DETECT_X; 115 | } 116 | break; 117 | 118 | case TOUCH_DETECT_X: 119 | if( is_touch_detected == FALSE) 120 | { 121 | Touch1msCnt++; 122 | if(Touch1msCnt > TOUCH_FILTER_DEBOUNCE) 123 | { 124 | Touch1msCnt = 0; 125 | TouchData.Xpos = TouchDriver_CalculateXCord(FilteredXData); 126 | 127 | TouchData.State = TOUCH_DETECT_Y; 128 | } 129 | else 130 | { 131 | TouchDriver_ConfigureToReadX(); 132 | RawXData = TouchDriver_GetAdcTouchData(); 133 | FilteredXData = TouchDriver_IIRFilter(&IirXData, RawXData, TOUCH_ALPHA_BITS); 134 | } 135 | } 136 | else 137 | { 138 | TouchData.State = TOUCH_WAITING_FOR_TOUCH; 139 | TouchData.IsTouchDetected = FALSE; 140 | } 141 | break; 142 | 143 | case TOUCH_DETECT_Y: 144 | if( is_touch_detected == FALSE) 145 | { 146 | Touch1msCnt++; 147 | if(Touch1msCnt > TOUCH_FILTER_DEBOUNCE) 148 | { 149 | Touch1msCnt = 0; 150 | TouchData.Ypos = TouchDriver_CalculateYCord(FilteredYData); 151 | TouchData.IsTouchDetected = TRUE; 152 | TouchData.State = TOUCH_WAITING_FOR_TOUCH; 153 | } 154 | else 155 | { 156 | TouchDriver_ConfigureToReadY(); 157 | RawYData = TouchDriver_GetAdcTouchData(); 158 | FilteredYData = TouchDriver_IIRFilter(&IirYData, RawYData, TOUCH_ALPHA_BITS); 159 | } 160 | } 161 | else 162 | { 163 | TouchData.State = TOUCH_WAITING_FOR_TOUCH; 164 | TouchData.IsTouchDetected = FALSE; 165 | } 166 | break; 167 | 168 | default: 169 | break; 170 | } 171 | } 172 | 173 | /** 174 | * @brief Check if touch event has been detected 175 | * 176 | * @return TRUE, FALSE - bool type 177 | */ 178 | bool TouchDriver_IsTouchDetected(void) 179 | { 180 | return TouchData.IsTouchDetected; 181 | } 182 | 183 | /** 184 | * @brief Get filtered X coordinate 185 | * 186 | * @return TouchData.Xpos - unsigned short 187 | */ 188 | unsigned short TouchDriver_GetX(void) 189 | { 190 | return TouchData.Xpos; 191 | } 192 | 193 | /** 194 | * @brief Get filtered Y coordinate 195 | * 196 | * @return TouchData.Ypos - unsigned short 197 | */ 198 | unsigned short TouchDriver_GetY(void) 199 | { 200 | return TouchData.Ypos; 201 | } 202 | 203 | /** 204 | * @brief Get non filtered X coordinate 205 | * 206 | * @return X coordinate - unsigned short 207 | */ 208 | unsigned short TouchDriver_GetRawX(void) 209 | { 210 | return TouchDriver_CalculateXCord(RawXData); 211 | } 212 | 213 | /** 214 | * @brief Get non filtered Y coordinate 215 | * 216 | * @return Y coordinate - unsigned short 217 | */ 218 | unsigned short TouchDriver_GetRawY(void) 219 | { 220 | return TouchDriver_CalculateYCord(RawYData); 221 | } 222 | 223 | /** 224 | * @brief Detect touch event by hardware 225 | * 226 | * @return TRUE, FALSE - bool type 227 | * 228 | * @note This function is hardware dependent and should be implemented according to used MCU 229 | */ 230 | bool TouchDriver_DetectTouch(void) 231 | { 232 | //TODO read GPIO pin for touch detection, example on STM32 Cortex-M3 233 | // return (bool) GPIO_ReadInputDataBit(GPIOC, YU); 234 | return FALSE; 235 | } 236 | 237 | /** 238 | * @brief Get an analog voltage value from touchscreen 239 | * 240 | * @return analog value - unsigned short 241 | * 242 | * @note This function is hardware dependent and should be implemented according to used MCU 243 | */ 244 | unsigned short TouchDriver_GetAdcTouchData(void) 245 | { 246 | 247 | //TODO read analog voltage value from ADC, example on STM32 Cortex-M3 248 | // return ADC_GetConversionValue(ADC1); 249 | return 0; 250 | } 251 | 252 | /** 253 | * @brief Configure MCU to read X position data from touchscreen 254 | * 255 | * @details Configure XR and XL GPIO pins to output, YU pin to input analog, YD to input float 256 | * Set XR to high state, XL to low state, configure A/D converter to read X channel and enable conversion 257 | */ 258 | void TouchDriver_ConfigureToReadX(void) 259 | { 260 | /* 261 | //Disable ADC 262 | ADC_Cmd(ADC1, DISABLE); 263 | ADC_SoftwareStartConvCmd(ADC1, DISABLE); 264 | 265 | // Configure XR and XL to output 266 | GPIO_InitStructure.GPIO_Pin = XR | XL; 267 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 268 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 269 | GPIO_Init(GPIOC,&GPIO_InitStructure); 270 | 271 | // Configure YU to input analog 272 | GPIO_InitStructure.GPIO_Pin = YU; 273 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 274 | GPIO_Init(GPIOC,&GPIO_InitStructure); 275 | 276 | // Configure YD to input float 277 | GPIO_InitStructure.GPIO_Pin = YD; 278 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 279 | GPIO_Init(GPIOC,&GPIO_InitStructure); 280 | 281 | //Set XR to high 282 | GPIO_SetBits(GPIOC, XR); 283 | 284 | //Set XL to low 285 | GPIO_ResetBits(GPIOC, XL); 286 | 287 | //Configure ADC to read YU 288 | ADC_RegularChannelConfig(ADC1, Touch_YU, 1, ADC_SampleTime_1Cycles5); 289 | 290 | //Enable ADC conversion 291 | ADC_Cmd(ADC1, ENABLE); 292 | ADC_SoftwareStartConvCmd(ADC1, ENABLE); 293 | */ 294 | } 295 | 296 | /** 297 | * @brief Configure MCU to read Y position data from touchscreen 298 | * 299 | * @details Configure YU and YD GPIO pins to output, XR pin to input analog, XL to input float 300 | * Set YU to high state, YD to low state, configure A/D converter to read Y channel and enable conversion 301 | */ 302 | void TouchDriver_ConfigureToReadY(void) 303 | { 304 | /* 305 | //Disable ADC 306 | ADC_Cmd(ADC1, DISABLE); 307 | ADC_SoftwareStartConvCmd(ADC1, DISABLE); 308 | 309 | // Configure YU and YD to output 310 | GPIO_InitStructure.GPIO_Pin = YU | YD; 311 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 312 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 313 | GPIO_Init(GPIOC,&GPIO_InitStructure); 314 | 315 | // Configure XR to input analog 316 | GPIO_InitStructure.GPIO_Pin = XR; 317 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 318 | GPIO_Init(GPIOC,&GPIO_InitStructure); 319 | 320 | // Configure XL to input float 321 | GPIO_InitStructure.GPIO_Pin = XL; 322 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 323 | GPIO_Init(GPIOC,&GPIO_InitStructure); 324 | 325 | //Set YU to high 326 | GPIO_SetBits(GPIOC, YU); 327 | 328 | //Set YD to low 329 | GPIO_ResetBits(GPIOC, YD); 330 | 331 | //Configure ADC to read YU 332 | ADC_RegularChannelConfig(ADC1, Touch_XR, 1, ADC_SampleTime_1Cycles5); 333 | 334 | //Enable ADC conversion 335 | ADC_Cmd(ADC1, ENABLE); 336 | ADC_SoftwareStartConvCmd(ADC1, ENABLE); 337 | */ 338 | } 339 | 340 | /** 341 | * @brief Configure MCU to detect touch event from touchscreen 342 | * 343 | * @details Configure XL GPIO pin to output, YU pin to input pullup, XR and YD to input float 344 | * Set XL to low state 345 | */ 346 | void TouchDriver_ConfigureToDetectTouch(void) 347 | { 348 | /* 349 | // Configure XR and YD to input float 350 | GPIO_InitStructure.GPIO_Pin = XR | YD; 351 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 352 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 353 | GPIO_Init(GPIOC,&GPIO_InitStructure); 354 | 355 | // Configure XL to output 356 | GPIO_InitStructure.GPIO_Pin = XL; 357 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 358 | GPIO_Init(GPIOC,&GPIO_InitStructure); 359 | 360 | // Configure YU to input pullup 361 | GPIO_InitStructure.GPIO_Pin = YU; 362 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 363 | GPIO_Init(GPIOC,&GPIO_InitStructure); 364 | 365 | //Set XL to low 366 | GPIO_ResetBits(GPIOC, XL); 367 | */ 368 | } 369 | 370 | /** 371 | * @brief Determine a filtered value based on an input value. 372 | * @details The floating-point equation for an IIR filter is: 373 | *
374 |  *                  V = (alpha * new_value) + ((1 - alpha) * V)
375 |  *                  alpha is in the range (0..1]
376 |  *              
377 | * The equation can be rewritten as: 378 | *
379 |  *                  V = (alpha * new_value) + V - (alpha * V)
380 |  *                  V = V + (alpha * (new_value - V))
381 |  *              
382 | * 383 | * This function assumes that alpha is a power of 2 (i.e. 1/2, 1/4, 1/8, etc). 384 | * Therefore, alpha can be fully described by the power of 2 or the number of bits 385 | * involved. Refer to the alpha_bits parameter for details. 386 | * 387 | * This function uses fixed-point calculations. To do this without rounding errors, 388 | * the stored value must have more precision than the value used in the application. 389 | * The fixed-point equation looks like this: 390 | *
391 |  *                  V = Stored Value
392 |  *                  V = V + (new_value - (V >> alpha_bits))
393 |  *
394 |  *                  va = Value used by the application
395 |  *                  va = Round(V >> alpha_bits)
396 |  *              
397 | * 398 | * @param iir_value = A value that stores the current filtered value with additional precision. 399 | * The additional precision required depends on the alpha_bits. 400 | * @param new_value = An input to the filter system with normal precision. 401 | * @param alpha_bits = Exponent of alpha. alpha = 2 ^ (-alpha_bits). 402 | * 403 | * Sum of new_value resolution and alpha_bits must not be higher than 16 bits 404 | * 405 | * @return Returns the updated filtered value after rounding. 406 | */ 407 | unsigned short TouchDriver_IIRFilter(volatile unsigned short *iir_value, volatile unsigned short new_value, unsigned char alpha_bits) 408 | { 409 | *iir_value += new_value - (((*iir_value >> (alpha_bits - 1)) + 1) >> 1); 410 | 411 | return (((*iir_value >> (alpha_bits - 1)) + 1) >> 1); 412 | } 413 | 414 | /** 415 | * @brief Calculate X coordinate from filtered value 416 | * 417 | * @details filtered x value need to be biased, linearized and limited 418 | */ 419 | unsigned short TouchDriver_CalculateXCord(unsigned short filtered_x) 420 | { 421 | if(filtered_x <= TOUCH_X_LOWEST_VALID_VALUE) 422 | { 423 | filtered_x = TOUCH_X_LOWEST_VALID_VALUE; 424 | } 425 | else if(filtered_x >= TOUCH_X_HIGHEST_VALID_VALUE) 426 | { 427 | filtered_x = TOUCH_X_HIGHEST_VALID_VALUE; 428 | } 429 | filtered_x -= TOUCH_X_LOWEST_VALID_VALUE; 430 | 431 | return (unsigned short)(H_RES - (unsigned int)(H_RES * filtered_x)/(TOUCH_X_HIGHEST_VALID_VALUE - TOUCH_X_LOWEST_VALID_VALUE) ); 432 | } 433 | 434 | /** 435 | * @brief Calculate Y coordinate from filtered value 436 | * 437 | * @details filtered y value need to be biased, linearized and limited 438 | */ 439 | unsigned short TouchDriver_CalculateYCord(unsigned short filtered_y) 440 | { 441 | if(filtered_y <= TOUCH_Y_LOWEST_VALID_VALUE) 442 | { 443 | filtered_y = TOUCH_Y_LOWEST_VALID_VALUE; 444 | } 445 | else if(filtered_y >= TOUCH_Y_HIGHEST_VALID_VALUE) 446 | { 447 | filtered_y = TOUCH_Y_HIGHEST_VALID_VALUE; 448 | } 449 | filtered_y -= TOUCH_Y_LOWEST_VALID_VALUE; 450 | 451 | return (unsigned short)( (unsigned int)(V_RES * filtered_y)/(TOUCH_Y_HIGHEST_VALID_VALUE - TOUCH_Y_LOWEST_VALID_VALUE) ); 452 | } 453 | -------------------------------------------------------------------------------- /src/TouchDriver/TouchDriver.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file TouchDriver.h 3 | * 4 | * @brief TouchDriver module API. 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef TOUCHDRIVER_H_ 16 | #define TOUCHDRIVER_H_ 17 | 18 | #include "../Typedefs.h" 19 | #include "../GraphicDriver/GraphicDriver.h" 20 | 21 | //! Enumerated states of TouchDriver state machine 22 | typedef enum 23 | { 24 | TOUCH_WAITING_FOR_TOUCH, 25 | TOUCH_DETECT_X, 26 | TOUCH_DETECT_Y, 27 | } TOUCH_DRIVER_STATE; 28 | 29 | //! TouchDriver module structure 30 | typedef struct 31 | { 32 | TOUCH_DRIVER_STATE State; 33 | bool IsTouchDetected; 34 | unsigned short Xpos; 35 | unsigned short Ypos; 36 | } TOUCH_DRIVIER_TYPE; 37 | 38 | void TouchDriver_Initialize(void); 39 | void TouchDriver_Task(void); 40 | bool TouchDriver_IsTouchDetected(void); 41 | unsigned short TouchDriver_GetRawY(void); 42 | unsigned short TouchDriver_GetRawX(void); 43 | unsigned short TouchDriver_GetX(void); 44 | unsigned short TouchDriver_GetY(void); 45 | 46 | #endif /* TOUCHDRIVER_H_ */ 47 | -------------------------------------------------------------------------------- /src/Typedefs.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Typedefs.h 3 | * 4 | * @brief Custom type definition used in HMI embedde library 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #ifndef TYPEDEFS_H_ 16 | #define TYPEDEFS_H_ 17 | 18 | //! Enumerate Boolean type 19 | typedef enum 20 | { 21 | FALSE = 0, 22 | TRUE = !FALSE 23 | } bool; 24 | 25 | 26 | #endif /* TYPEDEFS_H_ */ 27 | -------------------------------------------------------------------------------- /src/main.c: -------------------------------------------------------------------------------- 1 | /** 2 | * @file main.c 3 | * 4 | * @brief Usage example of HMI library 5 | * 6 | * @author Krzysztof Grzeszczak 7 | * 8 | * @version 1.0 9 | * 10 | * @date 2012-2013 11 | * 12 | * @copyright GNU Public License 13 | */ 14 | 15 | #include "./Gui/Gui.h" 16 | 17 | int main(void) { 18 | //For now just do nothing 19 | do{}while(0); 20 | 21 | return EXIT_SUCCESS; 22 | } 23 | --------------------------------------------------------------------------------