From fd37a5a9855803f08c9a6386fb38847e6422dffa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lucas=20Ple=C3=9F?= <lucas@lupsi.(none)>
Date: Wed, 3 Oct 2012 00:23:08 +0200
Subject: [PATCH] led und off/on taster eingebaut

---
 lcd_routines.lst | 502 ++++++++++++++++++++++++++++++++++++++++++++++
 lcd_routines.o   | Bin 0 -> 9856 bytes
 main.c           |  62 +++---
 main.eep         |   1 +
 main.elf         | Bin 0 -> 15888 bytes
 main.hex         |  96 +++++++++
 main.lst         | 363 +++++++++++++++++++++++++++++++++
 main.map         | 511 +++++++++++++++++++++++++++++++++++++++++++++++
 main.o           | Bin 0 -> 6520 bytes
 uart.lst         | 405 +++++++++++++++++++++++++++++++++++++
 uart.o           | Bin 0 -> 8260 bytes
 11 files changed, 1913 insertions(+), 27 deletions(-)
 create mode 100644 lcd_routines.lst
 create mode 100644 lcd_routines.o
 create mode 100644 main.eep
 create mode 100755 main.elf
 create mode 100644 main.hex
 create mode 100644 main.lst
 create mode 100644 main.map
 create mode 100644 main.o
 create mode 100644 uart.lst
 create mode 100644 uart.o

diff --git a/lcd_routines.lst b/lcd_routines.lst
new file mode 100644
index 0000000..1b90623
--- /dev/null
+++ b/lcd_routines.lst
@@ -0,0 +1,502 @@
+   1               		.file	"lcd_routines.c"
+   2               	__SREG__ = 0x3f
+   3               	__SP_H__ = 0x3e
+   4               	__SP_L__ = 0x3d
+   5               	__CCP__ = 0x34
+   6               	__tmp_reg__ = 0
+   7               	__zero_reg__ = 1
+  15               	.Ltext0:
+  17               	lcd_enable:
+  18               	.LFB6:
+  19               	.LM1:
+  20               	/* prologue: function */
+  21               	/* frame size = 0 */
+  22               	/* stack size = 0 */
+  23               	.L__stack_usage = 0
+  24               	.LM2:
+  25 0000 DD9A      		sbi 59-32,5
+  26               	.LVL0:
+  27               	.LBB22:
+  28               	.LBB23:
+  29               	.LM3:
+  30 0002 8AE6      		 ldi r24,lo8(106)
+  31 0004 8A95      	    1:dec r24
+  32 0006 01F4      	    brne 1b
+  33 0008 00C0      		rjmp .
+  34               	.LBE23:
+  35               	.LBE22:
+  36               	.LM4:
+  37 000a DD98      		cbi 59-32,5
+  38               	/* epilogue start */
+  39               	.LM5:
+  40 000c 0895      		ret
+  41               	.LFE6:
+  44               	lcd_out:
+  45               	.LFB7:
+  46               	.LM6:
+  47               	.LVL1:
+  48               	/* prologue: function */
+  49               	/* frame size = 0 */
+  50               	/* stack size = 0 */
+  51               	.L__stack_usage = 0
+  52               	.LM7:
+  53 000e 9BB3      		in r25,59-32
+  54 0010 907F      		andi r25,lo8(-16)
+  55 0012 9BBB      		out 59-32,r25
+  56               	.LM8:
+  57 0014 9BB3      		in r25,59-32
+  58 0016 8295      		swap r24
+  59               	.LVL2:
+  60 0018 8F70      		andi r24,lo8(15)
+  61 001a 892B      		or r24,r25
+  62 001c 8BBB      		out 59-32,r24
+  63               	.LM9:
+  64 001e 0E94 0000 		call lcd_enable
+  65               	/* epilogue start */
+  66               	.LM10:
+  67 0022 0895      		ret
+  68               	.LFE7:
+  70               	.global	lcd_data
+  72               	lcd_data:
+  73               	.LFB9:
+  74               	.LM11:
+  75               	.LVL3:
+  76 0024 1F93      		push r17
+  77               	/* prologue: function */
+  78               	/* frame size = 0 */
+  79               	/* stack size = 1 */
+  80               	.L__stack_usage = 1
+  81 0026 182F      		mov r17,r24
+  82               	.LM12:
+  83 0028 DC9A      		sbi 59-32,4
+  84               	.LM13:
+  85 002a 0E94 0000 		call lcd_out
+  86               	.LVL4:
+  87               	.LM14:
+  88 002e 812F      		mov r24,r17
+  89 0030 8295      		swap r24
+  90 0032 807F      		andi r24,lo8(-16)
+  91 0034 0E94 0000 		call lcd_out
+  92               	.LVL5:
+  93               	.LBB24:
+  94               	.LBB25:
+  95               	.LM15:
+  96 0038 85EF      		 ldi r24,lo8(-11)
+  97 003a 8A95      	    1:dec r24
+  98 003c 01F4      	    brne 1b
+  99 003e 0000      		nop
+ 100               	/* epilogue start */
+ 101               	.LBE25:
+ 102               	.LBE24:
+ 103               	.LM16:
+ 104 0040 1F91      		pop r17
+ 105               	.LVL6:
+ 106 0042 0895      		ret
+ 107               	.LFE9:
+ 109               	.global	lcd_command
+ 111               	lcd_command:
+ 112               	.LFB10:
+ 113               	.LM17:
+ 114               	.LVL7:
+ 115 0044 1F93      		push r17
+ 116               	/* prologue: function */
+ 117               	/* frame size = 0 */
+ 118               	/* stack size = 1 */
+ 119               	.L__stack_usage = 1
+ 120 0046 182F      		mov r17,r24
+ 121               	.LM18:
+ 122 0048 DC98      		cbi 59-32,4
+ 123               	.LM19:
+ 124 004a 0E94 0000 		call lcd_out
+ 125               	.LVL8:
+ 126               	.LM20:
+ 127 004e 812F      		mov r24,r17
+ 128 0050 8295      		swap r24
+ 129 0052 807F      		andi r24,lo8(-16)
+ 130 0054 0E94 0000 		call lcd_out
+ 131               	.LVL9:
+ 132               	.LBB26:
+ 133               	.LBB27:
+ 134               	.LM21:
+ 135 0058 80EE      		 ldi r24,lo8(-32)
+ 136 005a 8A95      	    1:dec r24
+ 137 005c 01F4      	    brne 1b
+ 138               	/* epilogue start */
+ 139               	.LBE27:
+ 140               	.LBE26:
+ 141               	.LM22:
+ 142 005e 1F91      		pop r17
+ 143               	.LVL10:
+ 144 0060 0895      		ret
+ 145               	.LFE10:
+ 147               	.global	lcd_clear
+ 149               	lcd_clear:
+ 150               	.LFB11:
+ 151               	.LM23:
+ 152               	/* prologue: function */
+ 153               	/* frame size = 0 */
+ 154               	/* stack size = 0 */
+ 155               	.L__stack_usage = 0
+ 156               	.LM24:
+ 157 0062 81E0      		ldi r24,lo8(1)
+ 158 0064 0E94 0000 		call lcd_command
+ 159               	.LVL11:
+ 160               	.LBB28:
+ 161               	.LBB29:
+ 162               	.LM25:
+ 163 0068 8FE3      		 ldi r24,lo8(7999)
+ 164 006a 9FE1      	    ldi r25,hi8(7999)
+ 165 006c 0197      	    1:sbiw r24,1
+ 166 006e 01F4      	    brne 1b
+ 167 0070 00C0      		rjmp .
+ 168 0072 0000      		nop
+ 169               	/* epilogue start */
+ 170               	.LBE29:
+ 171               	.LBE28:
+ 172               	.LM26:
+ 173 0074 0895      		ret
+ 174               	.LFE11:
+ 176               	.global	lcd_init
+ 178               	lcd_init:
+ 179               	.LFB8:
+ 180               	.LM27:
+ 181               	/* prologue: function */
+ 182               	/* frame size = 0 */
+ 183               	/* stack size = 0 */
+ 184               	.L__stack_usage = 0
+ 185               	.LVL12:
+ 186               	.LM28:
+ 187 0076 8AB3      		in r24,58-32
+ 188 0078 8F63      		ori r24,lo8(63)
+ 189 007a 8ABB      		out 58-32,r24
+ 190               	.LM29:
+ 191 007c 8BB3      		in r24,59-32
+ 192 007e 807C      		andi r24,lo8(-64)
+ 193 0080 8BBB      		out 59-32,r24
+ 194               	.LVL13:
+ 195               	.LBB30:
+ 196               	.LBB31:
+ 197               	.LM30:
+ 198 0082 8FE5      		 ldi r24,lo8(-5537)
+ 199 0084 9AEE      	    ldi r25,hi8(-5537)
+ 200 0086 0197      	    1:sbiw r24,1
+ 201 0088 01F4      	    brne 1b
+ 202 008a 00C0      		rjmp .
+ 203 008c 0000      		nop
+ 204               	.LBE31:
+ 205               	.LBE30:
+ 206               	.LM31:
+ 207 008e 80E3      		ldi r24,lo8(48)
+ 208 0090 0E94 0000 		call lcd_out
+ 209               	.LVL14:
+ 210               	.LBB32:
+ 211               	.LBB33:
+ 212               	.LM32:
+ 213 0094 8FE1      		 ldi r24,lo8(19999)
+ 214 0096 9EE4      	    ldi r25,hi8(19999)
+ 215 0098 0197      	    1:sbiw r24,1
+ 216 009a 01F4      	    brne 1b
+ 217 009c 00C0      		rjmp .
+ 218 009e 0000      		nop
+ 219               	.LBE33:
+ 220               	.LBE32:
+ 221               	.LM33:
+ 222 00a0 0E94 0000 		call lcd_enable
+ 223               	.LVL15:
+ 224               	.LBB34:
+ 225               	.LBB35:
+ 226               	.LM34:
+ 227 00a4 8FE9      		 ldi r24,lo8(3999)
+ 228 00a6 9FE0      	    ldi r25,hi8(3999)
+ 229 00a8 0197      	    1:sbiw r24,1
+ 230 00aa 01F4      	    brne 1b
+ 231 00ac 00C0      		rjmp .
+ 232 00ae 0000      		nop
+ 233               	.LBE35:
+ 234               	.LBE34:
+ 235               	.LM35:
+ 236 00b0 0E94 0000 		call lcd_enable
+ 237               	.LVL16:
+ 238               	.LBB36:
+ 239               	.LBB37:
+ 240               	.LM36:
+ 241 00b4 8FE9      		 ldi r24,lo8(3999)
+ 242 00b6 9FE0      	    ldi r25,hi8(3999)
+ 243 00b8 0197      	    1:sbiw r24,1
+ 244 00ba 01F4      	    brne 1b
+ 245 00bc 00C0      		rjmp .
+ 246 00be 0000      		nop
+ 247               	.LBE37:
+ 248               	.LBE36:
+ 249               	.LM37:
+ 250 00c0 80E2      		ldi r24,lo8(32)
+ 251 00c2 0E94 0000 		call lcd_out
+ 252               	.LVL17:
+ 253               	.LBB38:
+ 254               	.LBB39:
+ 255               	.LM38:
+ 256 00c6 8FE1      		 ldi r24,lo8(19999)
+ 257 00c8 9EE4      	    ldi r25,hi8(19999)
+ 258 00ca 0197      	    1:sbiw r24,1
+ 259 00cc 01F4      	    brne 1b
+ 260 00ce 00C0      		rjmp .
+ 261 00d0 0000      		nop
+ 262               	.LBE39:
+ 263               	.LBE38:
+ 264               	.LM39:
+ 265 00d2 88E2      		ldi r24,lo8(40)
+ 266 00d4 0E94 0000 		call lcd_command
+ 267               	.LM40:
+ 268 00d8 8CE0      		ldi r24,lo8(12)
+ 269 00da 0E94 0000 		call lcd_command
+ 270               	.LM41:
+ 271 00de 86E0      		ldi r24,lo8(6)
+ 272 00e0 0E94 0000 		call lcd_command
+ 273               	.LM42:
+ 274 00e4 0E94 0000 		call lcd_clear
+ 275               	/* epilogue start */
+ 276               	.LM43:
+ 277 00e8 0895      		ret
+ 278               	.LFE8:
+ 280               	.global	lcd_home
+ 282               	lcd_home:
+ 283               	.LFB12:
+ 284               	.LM44:
+ 285               	/* prologue: function */
+ 286               	/* frame size = 0 */
+ 287               	/* stack size = 0 */
+ 288               	.L__stack_usage = 0
+ 289               	.LM45:
+ 290 00ea 82E0      		ldi r24,lo8(2)
+ 291 00ec 0E94 0000 		call lcd_command
+ 292               	.LVL18:
+ 293               	.LBB40:
+ 294               	.LBB41:
+ 295               	.LM46:
+ 296 00f0 8FE3      		 ldi r24,lo8(7999)
+ 297 00f2 9FE1      	    ldi r25,hi8(7999)
+ 298 00f4 0197      	    1:sbiw r24,1
+ 299 00f6 01F4      	    brne 1b
+ 300 00f8 00C0      		rjmp .
+ 301 00fa 0000      		nop
+ 302               	/* epilogue start */
+ 303               	.LBE41:
+ 304               	.LBE40:
+ 305               	.LM47:
+ 306 00fc 0895      		ret
+ 307               	.LFE12:
+ 309               	.global	lcd_setcursor
+ 311               	lcd_setcursor:
+ 312               	.LFB13:
+ 313               	.LM48:
+ 314               	.LVL19:
+ 315               	/* prologue: function */
+ 316               	/* frame size = 0 */
+ 317               	/* stack size = 0 */
+ 318               	.L__stack_usage = 0
+ 319               	.LM49:
+ 320 00fe 6230      		cpi r22,lo8(2)
+ 321 0100 01F0      		breq .L11
+ 322 0102 6330      		cpi r22,lo8(3)
+ 323 0104 00F4      		brsh .L14
+ 324 0106 6130      		cpi r22,lo8(1)
+ 325 0108 01F4      		brne .L8
+ 326 010a 00C0      		rjmp .L16
+ 327               	.L14:
+ 328 010c 6330      		cpi r22,lo8(3)
+ 329 010e 01F0      		breq .L12
+ 330 0110 6430      		cpi r22,lo8(4)
+ 331 0112 01F4      		brne .L8
+ 332 0114 00C0      		rjmp .L17
+ 333               	.L16:
+ 334               	.LM50:
+ 335 0116 8058      		subi r24,lo8(-(-128))
+ 336               	.LVL20:
+ 337               	.LM51:
+ 338 0118 00C0      		rjmp .L15
+ 339               	.LVL21:
+ 340               	.L11:
+ 341               	.LM52:
+ 342 011a 8054      		subi r24,lo8(-(-64))
+ 343               	.LVL22:
+ 344               	.LM53:
+ 345 011c 00C0      		rjmp .L15
+ 346               	.LVL23:
+ 347               	.L12:
+ 348               	.LM54:
+ 349 011e 8057      		subi r24,lo8(-(-112))
+ 350               	.LVL24:
+ 351               	.LM55:
+ 352 0120 00C0      		rjmp .L15
+ 353               	.LVL25:
+ 354               	.L17:
+ 355               	.LM56:
+ 356 0122 8053      		subi r24,lo8(-(-48))
+ 357               	.LVL26:
+ 358               	.L15:
+ 359               	.LM57:
+ 360 0124 0E94 0000 		call lcd_command
+ 361               	.LVL27:
+ 362               	.L8:
+ 363 0128 0895      		ret
+ 364               	.LFE13:
+ 366               	.global	lcd_string
+ 368               	lcd_string:
+ 369               	.LFB14:
+ 370               	.LM58:
+ 371               	.LVL28:
+ 372 012a EF92      		push r14
+ 373 012c FF92      		push r15
+ 374 012e CF93      		push r28
+ 375 0130 DF93      		push r29
+ 376               	/* prologue: function */
+ 377               	/* frame size = 0 */
+ 378               	/* stack size = 4 */
+ 379               	.L__stack_usage = 4
+ 380               	.LM59:
+ 381 0132 E82E      		mov r14,r24
+ 382 0134 E701      		movw r28,r14
+ 383 0136 7E01      		movw r14,r28
+ 384 0138 F92E      		mov r15,r25
+ 385 013a E701      		movw r28,r14
+ 386               	.LM60:
+ 387 013c 00C0      		rjmp .L19
+ 388               	.LVL29:
+ 389               	.L20:
+ 390               	.LM61:
+ 391 013e 0E94 0000 		call lcd_data
+ 392               	.L19:
+ 393               	.LM62:
+ 394 0142 8991      		ld r24,Y+
+ 395 0144 8823      		tst r24
+ 396 0146 01F4      		brne .L20
+ 397               	/* epilogue start */
+ 398               	.LM63:
+ 399 0148 DF91      		pop r29
+ 400 014a CF91      		pop r28
+ 401 014c FF90      		pop r15
+ 402 014e EF90      		pop r14
+ 403 0150 0895      		ret
+ 404               	.LFE14:
+ 406               	.global	lcd_string_p
+ 408               	lcd_string_p:
+ 409               	.LFB15:
+ 410               	.LM64:
+ 411               	.LVL30:
+ 412 0152 CF93      		push r28
+ 413 0154 DF93      		push r29
+ 414               	/* prologue: function */
+ 415               	/* frame size = 0 */
+ 416               	/* stack size = 2 */
+ 417               	.L__stack_usage = 2
+ 418 0156 EC01      		movw r28,r24
+ 419               	.LM65:
+ 420 0158 00C0      		rjmp .L22
+ 421               	.LVL31:
+ 422               	.L23:
+ 423               	.LM66:
+ 424 015a 0E94 0000 		call lcd_data
+ 425               	.LVL32:
+ 426               	.L22:
+ 427               	.LM67:
+ 428 015e FE01      		movw r30,r28
+ 429               	.LVL33:
+ 430               	.LBB42:
+ 431               	.LM68:
+ 432 0160 2196      		adiw r28,1
+ 433               	.LVL34:
+ 434               	/* #APP */
+ 435               	 ;  167 "lcd_routines.c" 1
+ 436 0162 8491      		lpm r24, Z
+ 437               		
+ 438               	 ;  0 "" 2
+ 439               	.LVL35:
+ 440               	/* #NOAPP */
+ 441               	.LBE42:
+ 442 0164 8823      		tst r24
+ 443 0166 01F4      		brne .L23
+ 444               	/* epilogue start */
+ 445               	.LM69:
+ 446 0168 DF91      		pop r29
+ 447 016a CF91      		pop r28
+ 448               	.LVL36:
+ 449 016c 0895      		ret
+ 450               	.LFE15:
+ 452               	.global	lcd_generatechar
+ 454               	lcd_generatechar:
+ 455               	.LFB16:
+ 456               	.LM70:
+ 457               	.LVL37:
+ 458 016e EF92      		push r14
+ 459 0170 FF92      		push r15
+ 460 0172 1F93      		push r17
+ 461 0174 DF93      		push r29
+ 462 0176 CF93      		push r28
+ 463 0178 00D0      		rcall .
+ 464 017a CDB7      		in r28,__SP_L__
+ 465 017c DEB7      		in r29,__SP_H__
+ 466               	/* prologue: function */
+ 467               	/* frame size = 2 */
+ 468               	/* stack size = 7 */
+ 469               	.L__stack_usage = 7
+ 470               	.LM71:
+ 471 017e 880F      		lsl r24
+ 472 0180 880F      		lsl r24
+ 473 0182 880F      		lsl r24
+ 474               	.LVL38:
+ 475 0184 8064      		ori r24,lo8(64)
+ 476 0186 6983      		std Y+1,r22
+ 477 0188 7A83      		std Y+2,r23
+ 478 018a 0E94 0000 		call lcd_command
+ 479               	.LVL39:
+ 480 018e 6981      		ldd r22,Y+1
+ 481 0190 7A81      		ldd r23,Y+2
+ 482 0192 462F      		mov r20,r22
+ 483 0194 572F      		mov r21,r23
+ 484 0196 7A01      		movw r14,r20
+ 485 0198 18E0      		ldi r17,lo8(8)
+ 486               	.LVL40:
+ 487               	.L25:
+ 488               	.LBB43:
+ 489               	.LM72:
+ 490 019a F701      		movw r30,r14
+ 491 019c 8191      		ld r24,Z+
+ 492 019e 7F01      		movw r14,r30
+ 493 01a0 0E94 0000 		call lcd_data
+ 494 01a4 1150      		subi r17,lo8(-(-1))
+ 495               	.LM73:
+ 496 01a6 01F4      		brne .L25
+ 497               	/* epilogue start */
+ 498               	.LBE43:
+ 499               	.LM74:
+ 500 01a8 0F90      		pop __tmp_reg__
+ 501 01aa 0F90      		pop __tmp_reg__
+ 502 01ac CF91      		pop r28
+ 503 01ae DF91      		pop r29
+ 504 01b0 1F91      		pop r17
+ 505 01b2 FF90      		pop r15
+ 506 01b4 EF90      		pop r14
+ 507 01b6 0895      		ret
+ 508               	.LFE16:
+ 614               	.Letext0:
+DEFINED SYMBOLS
+                            *ABS*:0000000000000000 lcd_routines.c
+     /tmp/cc7NhYw7.s:2      *ABS*:000000000000003f __SREG__
+     /tmp/cc7NhYw7.s:3      *ABS*:000000000000003e __SP_H__
+     /tmp/cc7NhYw7.s:4      *ABS*:000000000000003d __SP_L__
+     /tmp/cc7NhYw7.s:5      *ABS*:0000000000000034 __CCP__
+     /tmp/cc7NhYw7.s:6      *ABS*:0000000000000000 __tmp_reg__
+     /tmp/cc7NhYw7.s:7      *ABS*:0000000000000001 __zero_reg__
+     /tmp/cc7NhYw7.s:17     .text:0000000000000000 lcd_enable
+     /tmp/cc7NhYw7.s:44     .text:000000000000000e lcd_out
+     /tmp/cc7NhYw7.s:72     .text:0000000000000024 lcd_data
+     /tmp/cc7NhYw7.s:111    .text:0000000000000044 lcd_command
+     /tmp/cc7NhYw7.s:149    .text:0000000000000062 lcd_clear
+     /tmp/cc7NhYw7.s:178    .text:0000000000000076 lcd_init
+     /tmp/cc7NhYw7.s:282    .text:00000000000000ea lcd_home
+     /tmp/cc7NhYw7.s:311    .text:00000000000000fe lcd_setcursor
+     /tmp/cc7NhYw7.s:368    .text:000000000000012a lcd_string
+     /tmp/cc7NhYw7.s:408    .text:0000000000000152 lcd_string_p
+     /tmp/cc7NhYw7.s:454    .text:000000000000016e lcd_generatechar
+
+NO UNDEFINED SYMBOLS
diff --git a/lcd_routines.o b/lcd_routines.o
new file mode 100644
index 0000000000000000000000000000000000000000..84c7d24a633190ed6f11d1ed7ec5eac06a023350
GIT binary patch
literal 9856
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
XY3aK}=NRhyEjJc~Z(<G;`^oTsFg<iU

literal 0
HcmV?d00001

diff --git a/main.c b/main.c
index 3faaf0e..a3472bb 100644
--- a/main.c
+++ b/main.c
@@ -6,22 +6,27 @@
 #include "lcd_routines.h"
 #include "uart.h"
 
-#define SAVE		PD2
-#define SIGNAL		PD3
-#define FREQ_DOWN	PD4
-#define FREQ_UP		PD5
-#define AMP_DOWN	PD6
-#define AMP_UP		PD7
-#define KEY_DDR		DDRD
-#define KEY_PORT	PORTD
-#define KEY_PIN		PIND
+#define SAVE			PD2
+#define SIGNAL			PD3
+#define FREQ_DOWN		PD4
+#define FREQ_UP			PD5
+#define AMP_DOWN		PD6
+#define AMP_UP			PD7
+#define KEY_DDR			DDRD
+#define KEY_PORT		PORTD
+#define KEY_PIN			PIND
+#define KEY_ON_DDR		DDRB
+#define KEY_ON_PORT		PORTB
+#define KEY_ON_PIN		PINB
+#define KEY_ON			PB0
 
 #define LED_PIN		PA7
 #define LED_PORT	PORTA
 #define LED_DDR		DDRA
 
-#define led_on()	LED_PORT |= _BV(LED_PORT);
-#define led_off()	LED_PORT &= ~_BV(LED_PORT);
+#define led_on()		LED_PORT |= _BV(LED_PIN);
+#define led_off()		LED_PORT &= ~_BV(LED_PIN);
+#define led_toggle()	LED_PORT ^= _BV(LED_PIN)
 
 #define UART_BAUD_RATE      9600
 
@@ -31,15 +36,12 @@
 #define REPEAT_START    50
 #define REPEAT_NEXT     20
 
-volatile uint8_t key_state; // debounced and inverted key state:
-// bit = 1: key pressed
-volatile uint8_t key_press; // key press detect
-
-volatile uint8_t key_rpt; // key long press and repeat
+volatile uint16_t key_state;
+volatile uint16_t key_press;
 
 /* prototypes */
 void init_io();
-uint8_t get_key_press(uint8_t key_mask);
+uint16_t get_key_press(uint16_t key_mask);
 
 int main(void) {
 	init_io();
@@ -60,6 +62,10 @@ int main(void) {
 				lcd_clear();
 			} else if (c == '+') {
 				lcd_setcursor(0, 2);
+			} else if (c == '\'') {
+				led_off();
+			} else if (c == '#') {
+				led_on();
 			} else {
 				lcd_data(c);
 			}
@@ -80,6 +86,9 @@ int main(void) {
 		if (get_key_press(_BV(AMP_DOWN))) {
 			uart_putc('a');
 		}
+		if (get_key_press(_BV(KEY_ON) << 8)) {
+			uart_putc('o');
+		}
 		if (get_key_press(_BV(SAVE))) {
 			uart_putc('v');
 		}
@@ -91,7 +100,12 @@ int main(void) {
 void init_io() {
 	KEY_DDR &= ~ALL_KEYS; // configure key port for input
 	KEY_PORT |= ALL_KEYS;
+
+	KEY_ON_DDR &= ~_BV(KEY_ON);
+	KEY_ON_PORT |= _BV(KEY_ON);
+
 	LED_DDR |= _BV(LED_PIN);
+	LED_PORT &= ~_BV(LED_PIN);
 
 	TCCR0 = (1 << CS02) | (1 << CS00); // divide by 1024
 	TCNT0 = (uint8_t) (int16_t) -(F_CPU / 1024 * 10e-3 + 0.5); // preload for 10ms
@@ -99,27 +113,21 @@ void init_io() {
 }
 
 ISR( TIMER0_OVF_vect ) {
-	static uint8_t ct0, ct1, rpt;
-	uint8_t i;
+	static uint16_t ct0, ct1;
+	uint16_t i;
 
 	TCNT0 = (uint8_t) (int16_t) -(F_CPU / 1024 * 10e-3 + 0.5); // preload for 10ms
 
-	i = key_state ^ ~KEY_PIN; // key changed ?
+	i = key_state ^ ~(KEY_PIN | (KEY_ON_PIN << 8)); // key changed ?
 	ct0 = ~(ct0 & i); // reset or count ct0
 	ct1 = ct0 ^ (ct1 & i); // reset or count ct1
 	i &= ct0 & ct1; // count until roll over ?
 	key_state ^= i; // then toggle debounced state
 	key_press |= key_state & i; // 0->1: key press detect
 
-	if ((key_state & REPEAT_MASK) == 0) // check repeat function
-		rpt = REPEAT_START; // start delay
-	if (--rpt == 0) {
-		rpt = REPEAT_NEXT; // repeat delay
-		key_rpt |= key_state & REPEAT_MASK;
-	}
 }
 
-uint8_t get_key_press(uint8_t key_mask) {
+uint16_t get_key_press(uint16_t key_mask) {
 	cli();
 	// read and clear atomic !
 	key_mask &= key_press; // read key(s)
diff --git a/main.eep b/main.eep
new file mode 100644
index 0000000..1996e8f
--- /dev/null
+++ b/main.eep
@@ -0,0 +1 @@
+:00000001FF
diff --git a/main.elf b/main.elf
new file mode 100755
index 0000000000000000000000000000000000000000..f5bf893fc68ad013e4d233c12bb95b10e6882e85
GIT binary patch
literal 15888
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%0D92|5K5Fq+K1m@g<cG@uQH=>;}-$sW@gI
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
JrPiwW{{a}iZ1eyC

literal 0
HcmV?d00001

diff --git a/main.hex b/main.hex
new file mode 100644
index 0000000..cdce73d
--- /dev/null
+++ b/main.hex
@@ -0,0 +1,96 @@
+:100000000C942A000C943C000C943C000C943C0092
+:100010000C943C000C943C000C943C000C943C0070
+:100020000C943C000C9450000C943C000C940D0279
+:100030000C9436020C943C000C943C000C943C0054
+:100040000C943C000C943C000C943C000C943C0040
+:100050000C943C0011241FBECFE5D4E0DEBFCDBF21
+:1000600010E0A0E6B0E001C01D92AD3AB107E1F7A3
+:100070000E94C2000C94F6020C94000081B38370BD
+:1000800081BB82B38C6F82BBB898C09AD79ADF9835
+:1000900085E083BF84E682BF89B7816089BF089508
+:1000A0001F920F920FB60F9211242F933F934F93ED
+:1000B0005F938F939F9384E682BF4091AB005091F2
+:1000C000AC0080B396B3392F20E090E0822B932BC5
+:1000D0008095909584279527209162003091630048
+:1000E00028233923209530953093630020936200B4
+:1000F00040916000509161004823592342275327C3
+:1001000050936100409360008223932384239523BE
+:100110002091AB003091AC00282739273093AC00F8
+:100120002093AB002091A9003091AA004091AB0030
+:100130005091AC0048235923422B532B5093AA00D3
+:100140004093A9009F918F915F914F913F912F9183
+:100150000F900FBE0F901F9018959C01F8948091FE
+:10016000A9009091AA00282339238091A900909199
+:10017000AA00822793279093AA008093A9007894DD
+:10018000C90108950E943E000E946C0187E690E03C
+:100190000E945B0280E060E00E94B00178940E94BF
+:1001A000BD0218161906E4F40E946F028A32910506
+:1001B00019F40E94620114C08B32910529F480E089
+:1001C00062E00E94B0010CC08732910511F4DF9803
+:1001D00007C08332910511F4DF9A02C00E944301E7
+:1001E00080E190E00E94AD00009719F086E60E9441
+:1001F0008A0280E290E00E94AD00009719F086E448
+:100200000E948A0288E090E00E94AD00009719F0F9
+:1002100083E70E948A0280E890E00E94AD00009788
+:1002200019F081E40E948A0280E490E00E94AD000F
+:10023000009719F081E60E948A0280E091E00E9416
+:10024000AD00009719F08FE60E948A0284E090E0EA
+:100250000E94AD00009709F4A2CF86E70E948A02AF
+:100260009ECFDD9A8AE68A95F1F700C0DD98089561
+:100270009BB3907F9BBB9BB382958F70892B8BBB6D
+:100280000E94310108951F93182FDC9A0E943801B3
+:10029000812F8295807F0E94380185EF8A95F1F742
+:1002A00000001F9108951F93182FDC980E943801B9
+:1002B000812F8295807F0E94380180EE8A95F1F728
+:1002C0001F91089581E00E9453018FE39FE1019700
+:1002D000F1F700C0000008958AB38F638ABB8BB327
+:1002E000807C8BBB8FE59AEE0197F1F700C0000090
+:1002F00080E30E9438018FE19EE40197F1F700C08E
+:1003000000000E9431018FE99FE00197F1F700C0E2
+:1003100000000E9431018FE99FE00197F1F700C0D2
+:10032000000080E20E9438018FE19EE40197F1F71E
+:1003300000C0000088E20E9453018CE00E9453013B
+:1003400086E00E9453010E946201089582E00E94AB
+:1003500053018FE39FE10197F1F700C0000008957A
+:10036000623061F0633018F4613079F405C06330B5
+:1003700039F0643051F406C0805805C0805403C081
+:10038000805701C080530E9453010895EF92FF925D
+:10039000CF93DF93E82EE7017E01F92EE70102C03B
+:1003A0000E94430189918823D9F7DF91CF91FF9073
+:1003B000EF900895CF93DF93EC0102C00E944301B8
+:1003C000FE01219684918823C9F7DF91CF9108958A
+:1003D000EF92FF921F93DF93CF9300D0CDB7DEB79C
+:1003E000880F880F880F806469837A830E94530185
+:1003F00069817A81462F572F7A0118E0F7018191A0
+:100400007F010E9443011150C9F70F900F90CF91C7
+:10041000DF911F91FF90EF9008951F920F920FB6FA
+:100420000F9211242F938F939F93EF93FF938BB190
+:100430009CB1E0916500EF5FEF7120916400E217DD
+:1004400041F08871E0936500F0E0E857FF4F90833A
+:1004500001C082E08093A800FF91EF919F918F915E
+:100460002F910F900FBE0F901F9018951F920F9213
+:100470000FB60F9211248F939F93EF93FF93909158
+:10048000660080916700981761F0E0916700EF5F68
+:10049000EF71E0936700F0E0E859FF4F80818CB97D
+:1004A00001C05598FF91EF919F918F910F900FBED2
+:1004B0000F901F901895109266001092670010928E
+:1004C00065001092640097FF03C022E02BB99F776C
+:1004D00090BD89B988E98AB986E880BD0895909170
+:1004E000650080916400981789F0E0916400EF5FE7
+:1004F000EF71E0936400F0E0E857FF4F8081909146
+:10050000A800392F20E0280F311D02C020E031E083
+:10051000C9010895909166009F5F9F7120916700C7
+:100520009217E1F3E92FF0E0E859FF4F80839093B1
+:100530006600559A0895EF92FF92CF93DF93E82ECD
+:10054000E7017E01F92EE70102C00E948A0289912B
+:100550008823D9F7DF91CF91FF90EF900895CF9343
+:10056000DF93EC0102C00E948A02FE012196849171
+:100570008823C9F7DF91CF9108958091650020917C
+:10058000640090E04F96821B91096FE170E00E9439
+:10059000CF0208958091640080936500089597FBD1
+:1005A000092E07260AD077FD04D00CD006D00020F3
+:1005B0001AF4709561957F4F0895F6F7909581959F
+:1005C0009F4F0895AA1BBB1B51E107C0AA1FBB1F69
+:1005D000A617B70710F0A61BB70B881F991F5A95CF
+:1005E000A9F780959095BC01CD010895F894FFCFAF
+:00000001FF
diff --git a/main.lst b/main.lst
new file mode 100644
index 0000000..07ddbdf
--- /dev/null
+++ b/main.lst
@@ -0,0 +1,363 @@
+   1               		.file	"main.c"
+   2               	__SREG__ = 0x3f
+   3               	__SP_H__ = 0x3e
+   4               	__SP_L__ = 0x3d
+   5               	__CCP__ = 0x34
+   6               	__tmp_reg__ = 0
+   7               	__zero_reg__ = 1
+  15               	.Ltext0:
+  16               	.global	init_io
+  18               	init_io:
+  19               	.LFB1:
+  20               	.LM1:
+  21               	/* prologue: function */
+  22               	/* frame size = 0 */
+  23               	/* stack size = 0 */
+  24               	.L__stack_usage = 0
+  25               	.LM2:
+  26 0000 81B3      		in r24,49-32
+  27 0002 8370      		andi r24,lo8(3)
+  28 0004 81BB      		out 49-32,r24
+  29               	.LM3:
+  30 0006 82B3      		in r24,50-32
+  31 0008 8C6F      		ori r24,lo8(-4)
+  32 000a 82BB      		out 50-32,r24
+  33               	.LM4:
+  34 000c B898      		cbi 55-32,0
+  35               	.LM5:
+  36 000e C09A      		sbi 56-32,0
+  37               	.LM6:
+  38 0010 D79A      		sbi 58-32,7
+  39               	.LM7:
+  40 0012 DF98      		cbi 59-32,7
+  41               	.LM8:
+  42 0014 85E0      		ldi r24,lo8(5)
+  43 0016 83BF      		out 83-32,r24
+  44               	.LM9:
+  45 0018 84E6      		ldi r24,lo8(100)
+  46 001a 82BF      		out 82-32,r24
+  47               	.LM10:
+  48 001c 89B7      		in r24,89-32
+  49 001e 8160      		ori r24,lo8(1)
+  50 0020 89BF      		out 89-32,r24
+  51               	/* epilogue start */
+  52               	.LM11:
+  53 0022 0895      		ret
+  54               	.LFE1:
+  56               	.global	__vector_9
+  58               	__vector_9:
+  59               	.LFB2:
+  60               	.LM12:
+  61 0024 1F92      		push __zero_reg__
+  62 0026 0F92      		push r0
+  63 0028 0FB6      		in r0,__SREG__
+  64 002a 0F92      		push r0
+  65 002c 1124      		clr __zero_reg__
+  66 002e 2F93      		push r18
+  67 0030 3F93      		push r19
+  68 0032 4F93      		push r20
+  69 0034 5F93      		push r21
+  70 0036 8F93      		push r24
+  71 0038 9F93      		push r25
+  72               	/* prologue: Signal */
+  73               	/* frame size = 0 */
+  74               	/* stack size = 9 */
+  75               	.L__stack_usage = 9
+  76               	.LM13:
+  77 003a 84E6      		ldi r24,lo8(100)
+  78 003c 82BF      		out 82-32,r24
+  79               	.LM14:
+  80 003e 4091 0000 		lds r20,key_state
+  81 0042 5091 0000 		lds r21,key_state+1
+  82 0046 80B3      		in r24,48-32
+  83 0048 96B3      		in r25,54-32
+  84 004a 392F      		mov r19,r25
+  85 004c 20E0      		ldi r18,lo8(0)
+  86 004e 90E0      		ldi r25,lo8(0)
+  87 0050 822B      		or r24,r18
+  88 0052 932B      		or r25,r19
+  89 0054 8095      		com r24
+  90 0056 9095      		com r25
+  91 0058 8427      		eor r24,r20
+  92 005a 9527      		eor r25,r21
+  93               	.LVL0:
+  94               	.LM15:
+  95 005c 2091 0000 		lds r18,ct0.1588
+  96 0060 3091 0000 		lds r19,ct0.1588+1
+  97 0064 2823      		and r18,r24
+  98 0066 3923      		and r19,r25
+  99 0068 2095      		com r18
+ 100 006a 3095      		com r19
+ 101 006c 3093 0000 		sts ct0.1588+1,r19
+ 102 0070 2093 0000 		sts ct0.1588,r18
+ 103               	.LM16:
+ 104 0074 4091 0000 		lds r20,ct1.1589
+ 105 0078 5091 0000 		lds r21,ct1.1589+1
+ 106 007c 4823      		and r20,r24
+ 107 007e 5923      		and r21,r25
+ 108 0080 4227      		eor r20,r18
+ 109 0082 5327      		eor r21,r19
+ 110 0084 5093 0000 		sts ct1.1589+1,r21
+ 111 0088 4093 0000 		sts ct1.1589,r20
+ 112               	.LM17:
+ 113 008c 8223      		and r24,r18
+ 114 008e 9323      		and r25,r19
+ 115               	.LVL1:
+ 116 0090 8423      		and r24,r20
+ 117 0092 9523      		and r25,r21
+ 118               	.LVL2:
+ 119               	.LM18:
+ 120 0094 2091 0000 		lds r18,key_state
+ 121 0098 3091 0000 		lds r19,key_state+1
+ 122 009c 2827      		eor r18,r24
+ 123 009e 3927      		eor r19,r25
+ 124 00a0 3093 0000 		sts key_state+1,r19
+ 125 00a4 2093 0000 		sts key_state,r18
+ 126               	.LM19:
+ 127 00a8 2091 0000 		lds r18,key_press
+ 128 00ac 3091 0000 		lds r19,key_press+1
+ 129 00b0 4091 0000 		lds r20,key_state
+ 130 00b4 5091 0000 		lds r21,key_state+1
+ 131 00b8 4823      		and r20,r24
+ 132 00ba 5923      		and r21,r25
+ 133 00bc 422B      		or r20,r18
+ 134 00be 532B      		or r21,r19
+ 135 00c0 5093 0000 		sts key_press+1,r21
+ 136 00c4 4093 0000 		sts key_press,r20
+ 137               	/* epilogue start */
+ 138               	.LM20:
+ 139 00c8 9F91      		pop r25
+ 140 00ca 8F91      		pop r24
+ 141               	.LVL3:
+ 142 00cc 5F91      		pop r21
+ 143 00ce 4F91      		pop r20
+ 144 00d0 3F91      		pop r19
+ 145 00d2 2F91      		pop r18
+ 146 00d4 0F90      		pop r0
+ 147 00d6 0FBE      		out __SREG__,r0
+ 148 00d8 0F90      		pop r0
+ 149 00da 1F90      		pop __zero_reg__
+ 150 00dc 1895      		reti
+ 151               	.LFE2:
+ 153               	.global	get_key_press
+ 155               	get_key_press:
+ 156               	.LFB3:
+ 157               	.LM21:
+ 158               	.LVL4:
+ 159               	/* prologue: function */
+ 160               	/* frame size = 0 */
+ 161               	/* stack size = 0 */
+ 162               	.L__stack_usage = 0
+ 163 00de 9C01      		movw r18,r24
+ 164               	.LM22:
+ 165               	/* #APP */
+ 166               	 ;  131 "main.c" 1
+ 167 00e0 F894      		cli
+ 168               	 ;  0 "" 2
+ 169               	.LM23:
+ 170               	/* #NOAPP */
+ 171 00e2 8091 0000 		lds r24,key_press
+ 172 00e6 9091 0000 		lds r25,key_press+1
+ 173               	.LVL5:
+ 174 00ea 2823      		and r18,r24
+ 175 00ec 3923      		and r19,r25
+ 176               	.LVL6:
+ 177               	.LM24:
+ 178 00ee 8091 0000 		lds r24,key_press
+ 179 00f2 9091 0000 		lds r25,key_press+1
+ 180 00f6 8227      		eor r24,r18
+ 181 00f8 9327      		eor r25,r19
+ 182 00fa 9093 0000 		sts key_press+1,r25
+ 183 00fe 8093 0000 		sts key_press,r24
+ 184               	.LM25:
+ 185               	/* #APP */
+ 186               	 ;  135 "main.c" 1
+ 187 0102 7894      		sei
+ 188               	 ;  0 "" 2
+ 189               	.LM26:
+ 190               	/* #NOAPP */
+ 191 0104 C901      		movw r24,r18
+ 192               	/* epilogue start */
+ 193 0106 0895      		ret
+ 194               	.LFE3:
+ 196               	.global	main
+ 198               	main:
+ 199               	.LFB0:
+ 200               	.LM27:
+ 201               	/* prologue: function */
+ 202               	/* frame size = 0 */
+ 203               	/* stack size = 0 */
+ 204               	.L__stack_usage = 0
+ 205               	.LM28:
+ 206 0108 0E94 0000 		call init_io
+ 207               	.LM29:
+ 208 010c 0E94 0000 		call lcd_init
+ 209               	.LM30:
+ 210 0110 87E6      		ldi r24,lo8(103)
+ 211 0112 90E0      		ldi r25,hi8(103)
+ 212 0114 0E94 0000 		call uart_init
+ 213               	.LM31:
+ 214 0118 80E0      		ldi r24,lo8(0)
+ 215 011a 60E0      		ldi r22,lo8(0)
+ 216 011c 0E94 0000 		call lcd_setcursor
+ 217               	.LM32:
+ 218               	/* #APP */
+ 219               	 ;  55 "main.c" 1
+ 220 0120 7894      		sei
+ 221               	 ;  0 "" 2
+ 222               	/* #NOAPP */
+ 223               	.L20:
+ 224               	.LM33:
+ 225 0122 0E94 0000 		call uart_available
+ 226 0126 1816      		cp __zero_reg__,r24
+ 227 0128 1906      		cpc __zero_reg__,r25
+ 228 012a 04F4      		brge .L5
+ 229               	.LM34:
+ 230 012c 0E94 0000 		call uart_getc
+ 231               	.LVL7:
+ 232               	.LM35:
+ 233 0130 8A32      		cpi r24,42
+ 234 0132 9105      		cpc r25,__zero_reg__
+ 235 0134 01F4      		brne .L6
+ 236               	.LM36:
+ 237 0136 0E94 0000 		call lcd_clear
+ 238               	.LVL8:
+ 239 013a 00C0      		rjmp .L5
+ 240               	.LVL9:
+ 241               	.L6:
+ 242               	.LM37:
+ 243 013c 8B32      		cpi r24,43
+ 244 013e 9105      		cpc r25,__zero_reg__
+ 245 0140 01F4      		brne .L7
+ 246               	.LM38:
+ 247 0142 80E0      		ldi r24,lo8(0)
+ 248               	.LVL10:
+ 249 0144 62E0      		ldi r22,lo8(2)
+ 250 0146 0E94 0000 		call lcd_setcursor
+ 251 014a 00C0      		rjmp .L5
+ 252               	.LVL11:
+ 253               	.L7:
+ 254               	.LM39:
+ 255 014c 8732      		cpi r24,39
+ 256 014e 9105      		cpc r25,__zero_reg__
+ 257 0150 01F4      		brne .L8
+ 258               	.LM40:
+ 259 0152 DF98      		cbi 59-32,7
+ 260 0154 00C0      		rjmp .L5
+ 261               	.L8:
+ 262               	.LM41:
+ 263 0156 8332      		cpi r24,35
+ 264 0158 9105      		cpc r25,__zero_reg__
+ 265 015a 01F4      		brne .L9
+ 266               	.LM42:
+ 267 015c DF9A      		sbi 59-32,7
+ 268 015e 00C0      		rjmp .L5
+ 269               	.L9:
+ 270               	.LM43:
+ 271 0160 0E94 0000 		call lcd_data
+ 272               	.LVL12:
+ 273               	.L5:
+ 274               	.LM44:
+ 275 0164 80E1      		ldi r24,lo8(16)
+ 276 0166 90E0      		ldi r25,hi8(16)
+ 277 0168 0E94 0000 		call get_key_press
+ 278 016c 0097      		sbiw r24,0
+ 279 016e 01F0      		breq .L10
+ 280               	.LM45:
+ 281 0170 86E6      		ldi r24,lo8(102)
+ 282 0172 0E94 0000 		call uart_putc
+ 283               	.L10:
+ 284               	.LM46:
+ 285 0176 80E2      		ldi r24,lo8(32)
+ 286 0178 90E0      		ldi r25,hi8(32)
+ 287 017a 0E94 0000 		call get_key_press
+ 288 017e 0097      		sbiw r24,0
+ 289 0180 01F0      		breq .L11
+ 290               	.LM47:
+ 291 0182 86E4      		ldi r24,lo8(70)
+ 292 0184 0E94 0000 		call uart_putc
+ 293               	.L11:
+ 294               	.LM48:
+ 295 0188 88E0      		ldi r24,lo8(8)
+ 296 018a 90E0      		ldi r25,hi8(8)
+ 297 018c 0E94 0000 		call get_key_press
+ 298 0190 0097      		sbiw r24,0
+ 299 0192 01F0      		breq .L12
+ 300               	.LM49:
+ 301 0194 83E7      		ldi r24,lo8(115)
+ 302 0196 0E94 0000 		call uart_putc
+ 303               	.L12:
+ 304               	.LM50:
+ 305 019a 80E8      		ldi r24,lo8(128)
+ 306 019c 90E0      		ldi r25,hi8(128)
+ 307 019e 0E94 0000 		call get_key_press
+ 308 01a2 0097      		sbiw r24,0
+ 309 01a4 01F0      		breq .L13
+ 310               	.LM51:
+ 311 01a6 81E4      		ldi r24,lo8(65)
+ 312 01a8 0E94 0000 		call uart_putc
+ 313               	.L13:
+ 314               	.LM52:
+ 315 01ac 80E4      		ldi r24,lo8(64)
+ 316 01ae 90E0      		ldi r25,hi8(64)
+ 317 01b0 0E94 0000 		call get_key_press
+ 318 01b4 0097      		sbiw r24,0
+ 319 01b6 01F0      		breq .L14
+ 320               	.LM53:
+ 321 01b8 81E6      		ldi r24,lo8(97)
+ 322 01ba 0E94 0000 		call uart_putc
+ 323               	.L14:
+ 324               	.LM54:
+ 325 01be 80E0      		ldi r24,lo8(256)
+ 326 01c0 91E0      		ldi r25,hi8(256)
+ 327 01c2 0E94 0000 		call get_key_press
+ 328 01c6 0097      		sbiw r24,0
+ 329 01c8 01F0      		breq .L15
+ 330               	.LM55:
+ 331 01ca 8FE6      		ldi r24,lo8(111)
+ 332 01cc 0E94 0000 		call uart_putc
+ 333               	.L15:
+ 334               	.LM56:
+ 335 01d0 84E0      		ldi r24,lo8(4)
+ 336 01d2 90E0      		ldi r25,hi8(4)
+ 337 01d4 0E94 0000 		call get_key_press
+ 338 01d8 0097      		sbiw r24,0
+ 339 01da 01F4      		brne .+2
+ 340 01dc 00C0      		rjmp .L20
+ 341               	.LM57:
+ 342 01de 86E7      		ldi r24,lo8(118)
+ 343 01e0 0E94 0000 		call uart_putc
+ 344 01e4 00C0      		rjmp .L20
+ 345               	.LFE0:
+ 347               		.comm key_state,2,1
+ 348               		.comm key_press,2,1
+ 349               		.lcomm ct1.1589,2
+ 350               		.lcomm ct0.1588,2
+ 399               	.Letext0:
+DEFINED SYMBOLS
+                            *ABS*:0000000000000000 main.c
+     /tmp/cc8a5ehv.s:2      *ABS*:000000000000003f __SREG__
+     /tmp/cc8a5ehv.s:3      *ABS*:000000000000003e __SP_H__
+     /tmp/cc8a5ehv.s:4      *ABS*:000000000000003d __SP_L__
+     /tmp/cc8a5ehv.s:5      *ABS*:0000000000000034 __CCP__
+     /tmp/cc8a5ehv.s:6      *ABS*:0000000000000000 __tmp_reg__
+     /tmp/cc8a5ehv.s:7      *ABS*:0000000000000001 __zero_reg__
+     /tmp/cc8a5ehv.s:18     .text:0000000000000000 init_io
+     /tmp/cc8a5ehv.s:58     .text:0000000000000024 __vector_9
+                            *COM*:0000000000000002 key_state
+     /tmp/cc8a5ehv.s:349    .bss:0000000000000002 ct0.1588
+                             .bss:0000000000000000 ct1.1589
+                            *COM*:0000000000000002 key_press
+     /tmp/cc8a5ehv.s:155    .text:00000000000000de get_key_press
+     /tmp/cc8a5ehv.s:198    .text:0000000000000108 main
+
+UNDEFINED SYMBOLS
+lcd_init
+uart_init
+lcd_setcursor
+uart_available
+uart_getc
+lcd_clear
+lcd_data
+uart_putc
+__do_clear_bss
diff --git a/main.map b/main.map
new file mode 100644
index 0000000..1d96ef7
--- /dev/null
+++ b/main.map
@@ -0,0 +1,511 @@
+Archive member included because of file (symbol)
+
+/usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_divmodhi4.o)
+                              uart.o (__divmodhi4)
+/usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_exit.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o (exit)
+/usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_clear_bss.o)
+                              main.o (__do_clear_bss)
+/usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_udivmodhi4.o)
+                              /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_divmodhi4.o) (__udivmodhi4)
+
+Allocating common symbols
+Common symbol       size              file
+
+key_press           0x2               main.o
+key_state           0x2               main.o
+
+Memory Configuration
+
+Name             Origin             Length             Attributes
+text             0x0000000000000000 0x0000000000020000 xr
+data             0x0000000000800060 0x000000000000ffa0 rw !x
+eeprom           0x0000000000810000 0x0000000000010000 rw !x
+fuse             0x0000000000820000 0x0000000000000400 rw !x
+lock             0x0000000000830000 0x0000000000000400 rw !x
+signature        0x0000000000840000 0x0000000000000400 rw !x
+*default*        0x0000000000000000 0xffffffffffffffff
+
+Linker script and memory map
+
+LOAD /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+LOAD main.o
+LOAD lcd_routines.o
+LOAD uart.o
+LOAD /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/libm.a
+LOAD /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a
+LOAD /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/libc.a
+LOAD /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a
+
+.hash
+ *(.hash)
+
+.dynsym
+ *(.dynsym)
+
+.dynstr
+ *(.dynstr)
+
+.gnu.version
+ *(.gnu.version)
+
+.gnu.version_d
+ *(.gnu.version_d)
+
+.gnu.version_r
+ *(.gnu.version_r)
+
+.rel.init
+ *(.rel.init)
+
+.rela.init
+ *(.rela.init)
+
+.rel.text
+ *(.rel.text)
+ *(.rel.text.*)
+ *(.rel.gnu.linkonce.t*)
+
+.rela.text
+ *(.rela.text)
+ *(.rela.text.*)
+ *(.rela.gnu.linkonce.t*)
+
+.rel.fini
+ *(.rel.fini)
+
+.rela.fini
+ *(.rela.fini)
+
+.rel.rodata
+ *(.rel.rodata)
+ *(.rel.rodata.*)
+ *(.rel.gnu.linkonce.r*)
+
+.rela.rodata
+ *(.rela.rodata)
+ *(.rela.rodata.*)
+ *(.rela.gnu.linkonce.r*)
+
+.rel.data
+ *(.rel.data)
+ *(.rel.data.*)
+ *(.rel.gnu.linkonce.d*)
+
+.rela.data
+ *(.rela.data)
+ *(.rela.data.*)
+ *(.rela.gnu.linkonce.d*)
+
+.rel.ctors
+ *(.rel.ctors)
+
+.rela.ctors
+ *(.rela.ctors)
+
+.rel.dtors
+ *(.rel.dtors)
+
+.rela.dtors
+ *(.rela.dtors)
+
+.rel.got
+ *(.rel.got)
+
+.rela.got
+ *(.rela.got)
+
+.rel.bss
+ *(.rel.bss)
+
+.rela.bss
+ *(.rela.bss)
+
+.rel.plt
+ *(.rel.plt)
+
+.rela.plt
+ *(.rela.plt)
+
+.text           0x0000000000000000      0x5f0
+ *(.vectors)
+ .vectors       0x0000000000000000       0x54 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+                0x0000000000000000                __vectors
+                0x0000000000000000                __vector_default
+ *(.vectors)
+ *(.progmem.gcc*)
+ *(.progmem*)
+                0x0000000000000054                . = ALIGN (0x2)
+                0x0000000000000054                __trampolines_start = .
+ *(.trampolines)
+ .trampolines   0x0000000000000054        0x0 linker stubs
+ *(.trampolines*)
+                0x0000000000000054                __trampolines_end = .
+ *(.jumptables)
+ *(.jumptables*)
+ *(.lowtext)
+ *(.lowtext*)
+                0x0000000000000054                __ctors_start = .
+ *(.ctors)
+                0x0000000000000054                __ctors_end = .
+                0x0000000000000054                __dtors_start = .
+ *(.dtors)
+                0x0000000000000054                __dtors_end = .
+ SORT(*)(.ctors)
+ SORT(*)(.dtors)
+ *(.init0)
+ .init0         0x0000000000000054        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+                0x0000000000000054                __init
+ *(.init0)
+ *(.init1)
+ *(.init1)
+ *(.init2)
+ .init2         0x0000000000000054        0xc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+ *(.init2)
+ *(.init3)
+ *(.init3)
+ *(.init4)
+ .init4         0x0000000000000060       0x10 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_clear_bss.o)
+                0x0000000000000060                __do_clear_bss
+ *(.init4)
+ *(.init5)
+ *(.init5)
+ *(.init6)
+ *(.init6)
+ *(.init7)
+ *(.init7)
+ *(.init8)
+ *(.init8)
+ *(.init9)
+ .init9         0x0000000000000070        0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+ *(.init9)
+ *(.text)
+ .text          0x0000000000000078        0x4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+                0x0000000000000078                __vector_1
+                0x0000000000000078                __bad_interrupt
+                0x0000000000000078                __vector_6
+                0x0000000000000078                __vector_3
+                0x0000000000000078                __vector_13
+                0x0000000000000078                __vector_17
+                0x0000000000000078                __vector_19
+                0x0000000000000078                __vector_7
+                0x0000000000000078                __vector_5
+                0x0000000000000078                __vector_4
+                0x0000000000000078                __vector_2
+                0x0000000000000078                __vector_15
+                0x0000000000000078                __vector_8
+                0x0000000000000078                __vector_14
+                0x0000000000000078                __vector_10
+                0x0000000000000078                __vector_16
+                0x0000000000000078                __vector_18
+                0x0000000000000078                __vector_20
+ .text          0x000000000000007c      0x1e6 main.o
+                0x000000000000007c                init_io
+                0x00000000000000a0                __vector_9
+                0x000000000000015a                get_key_press
+                0x0000000000000184                main
+ .text          0x0000000000000262      0x1b8 lcd_routines.o
+                0x0000000000000286                lcd_data
+                0x00000000000002a6                lcd_command
+                0x00000000000002c4                lcd_clear
+                0x00000000000002d8                lcd_init
+                0x000000000000034c                lcd_home
+                0x0000000000000360                lcd_setcursor
+                0x000000000000038c                lcd_string
+                0x00000000000003b4                lcd_string_p
+                0x00000000000003d0                lcd_generatechar
+ .text          0x000000000000041a      0x184 uart.o
+                0x000000000000041a                __vector_11
+                0x000000000000046c                __vector_12
+                0x00000000000004b6                uart_init
+                0x00000000000004de                uart_getc
+                0x0000000000000514                uart_putc
+                0x0000000000000536                uart_puts
+                0x000000000000055e                uart_puts_p
+                0x000000000000057a                uart_available
+                0x0000000000000594                uart_flush
+ .text          0x000000000000059e        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_divmodhi4.o)
+ .text          0x000000000000059e        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_exit.o)
+ .text          0x000000000000059e        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_clear_bss.o)
+ .text          0x000000000000059e        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_udivmodhi4.o)
+                0x000000000000059e                . = ALIGN (0x2)
+ *(.text.*)
+ .text.libgcc   0x000000000000059e       0x26 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_divmodhi4.o)
+                0x000000000000059e                __divmodhi4
+                0x000000000000059e                _div
+ .text.libgcc   0x00000000000005c4        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_exit.o)
+ .text.libgcc   0x00000000000005c4        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_clear_bss.o)
+ .text.libgcc   0x00000000000005c4       0x28 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_udivmodhi4.o)
+                0x00000000000005c4                __udivmodhi4
+                0x00000000000005ec                . = ALIGN (0x2)
+ *(.fini9)
+ .fini9         0x00000000000005ec        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_exit.o)
+                0x00000000000005ec                exit
+                0x00000000000005ec                _exit
+ *(.fini9)
+ *(.fini8)
+ *(.fini8)
+ *(.fini7)
+ *(.fini7)
+ *(.fini6)
+ *(.fini6)
+ *(.fini5)
+ *(.fini5)
+ *(.fini4)
+ *(.fini4)
+ *(.fini3)
+ *(.fini3)
+ *(.fini2)
+ *(.fini2)
+ *(.fini1)
+ *(.fini1)
+ *(.fini0)
+ .fini0         0x00000000000005ec        0x4 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_exit.o)
+ *(.fini0)
+                0x00000000000005f0                _etext = .
+
+.data           0x0000000000800060        0x0 load address 0x00000000000005f0
+                0x0000000000800060                PROVIDE (__data_start, .)
+ *(.data)
+ .data          0x0000000000800060        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+ .data          0x0000000000800060        0x0 main.o
+ .data          0x0000000000800060        0x0 lcd_routines.o
+ .data          0x0000000000800060        0x0 uart.o
+ .data          0x0000000000800060        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_divmodhi4.o)
+ .data          0x0000000000800060        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_exit.o)
+ .data          0x0000000000800060        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_clear_bss.o)
+ .data          0x0000000000800060        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_udivmodhi4.o)
+ *(.data*)
+ *(.rodata)
+ *(.rodata*)
+ *(.gnu.linkonce.d*)
+                0x0000000000800060                . = ALIGN (0x2)
+                0x0000000000800060                _edata = .
+                0x0000000000800060                PROVIDE (__data_end, .)
+
+.bss            0x0000000000800060       0x4d
+                0x0000000000800060                PROVIDE (__bss_start, .)
+ *(.bss)
+ .bss           0x0000000000800060        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+ .bss           0x0000000000800060        0x4 main.o
+ .bss           0x0000000000800064        0x0 lcd_routines.o
+ .bss           0x0000000000800064       0x45 uart.o
+ .bss           0x00000000008000a9        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_divmodhi4.o)
+ .bss           0x00000000008000a9        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_exit.o)
+ .bss           0x00000000008000a9        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_clear_bss.o)
+ .bss           0x00000000008000a9        0x0 /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_udivmodhi4.o)
+ *(.bss*)
+ *(COMMON)
+ COMMON         0x00000000008000a9        0x4 main.o
+                0x00000000008000a9                key_press
+                0x00000000008000ab                key_state
+                0x00000000008000ad                PROVIDE (__bss_end, .)
+                0x00000000000005f0                __data_load_start = LOADADDR (.data)
+                0x00000000000005f0                __data_load_end = (__data_load_start + SIZEOF (.data))
+
+.noinit         0x00000000008000ad        0x0
+                0x00000000008000ad                PROVIDE (__noinit_start, .)
+ *(.noinit*)
+                0x00000000008000ad                PROVIDE (__noinit_end, .)
+                0x00000000008000ad                _end = .
+                0x00000000008000ad                PROVIDE (__heap_start, .)
+
+.eeprom         0x0000000000810000        0x0
+ *(.eeprom*)
+                0x0000000000810000                __eeprom_end = .
+
+.fuse
+ *(.fuse)
+ *(.lfuse)
+ *(.hfuse)
+ *(.efuse)
+
+.lock
+ *(.lock*)
+
+.signature
+ *(.signature*)
+
+.stab           0x0000000000000000      0x6cc
+ *(.stab)
+ .stab          0x0000000000000000      0x6cc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+
+.stabstr        0x0000000000000000       0x54
+ *(.stabstr)
+ .stabstr       0x0000000000000000       0x54 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+
+.stab.excl
+ *(.stab.excl)
+
+.stab.exclstr
+ *(.stab.exclstr)
+
+.stab.index
+ *(.stab.index)
+
+.stab.indexstr
+ *(.stab.indexstr)
+
+.comment
+ *(.comment)
+
+.debug
+ *(.debug)
+
+.line
+ *(.line)
+
+.debug_srcinfo
+ *(.debug_srcinfo)
+
+.debug_sfnames
+ *(.debug_sfnames)
+
+.debug_aranges  0x0000000000000000       0x60
+ *(.debug_aranges)
+ .debug_aranges
+                0x0000000000000000       0x20 main.o
+ .debug_aranges
+                0x0000000000000020       0x20 lcd_routines.o
+ .debug_aranges
+                0x0000000000000040       0x20 uart.o
+
+.debug_pubnames
+                0x0000000000000000      0x19e
+ *(.debug_pubnames)
+ .debug_pubnames
+                0x0000000000000000       0x64 main.o
+ .debug_pubnames
+                0x0000000000000064       0x9e lcd_routines.o
+ .debug_pubnames
+                0x0000000000000102       0x9c uart.o
+
+.debug_info     0x0000000000000000      0xa3e
+ *(.debug_info)
+ .debug_info    0x0000000000000000      0x185 main.o
+ .debug_info    0x0000000000000185      0x5a5 lcd_routines.o
+ .debug_info    0x000000000000072a      0x314 uart.o
+ *(.gnu.linkonce.wi.*)
+
+.debug_abbrev   0x0000000000000000      0x344
+ *(.debug_abbrev)
+ .debug_abbrev  0x0000000000000000       0xd0 main.o
+ .debug_abbrev  0x00000000000000d0      0x155 lcd_routines.o
+ .debug_abbrev  0x0000000000000225      0x11f uart.o
+
+.debug_line     0x0000000000000000      0x82e
+ *(.debug_line)
+ .debug_line    0x0000000000000000      0x24b main.o
+ .debug_line    0x000000000000024b      0x360 lcd_routines.o
+ .debug_line    0x00000000000005ab      0x283 uart.o
+
+.debug_frame    0x0000000000000000      0x1b0
+ *(.debug_frame)
+ .debug_frame   0x0000000000000000       0x50 main.o
+ .debug_frame   0x0000000000000050       0xc0 lcd_routines.o
+ .debug_frame   0x0000000000000110       0xa0 uart.o
+
+.debug_str      0x0000000000000000      0x2b5
+ *(.debug_str)
+ .debug_str     0x0000000000000000       0xba main.o
+                                        0x100 (size before relaxing)
+ .debug_str     0x00000000000000ba      0x112 lcd_routines.o
+                                        0x1ca (size before relaxing)
+ .debug_str     0x00000000000001cc       0xe9 uart.o
+                                        0x1bd (size before relaxing)
+
+.debug_loc      0x0000000000000000      0x49a
+ *(.debug_loc)
+ .debug_loc     0x0000000000000000       0x98 main.o
+ .debug_loc     0x0000000000000098      0x209 lcd_routines.o
+ .debug_loc     0x00000000000002a1      0x1f9 uart.o
+
+.debug_macinfo
+ *(.debug_macinfo)
+OUTPUT(main.elf elf32-avr)
+LOAD linker stubs
+
+.debug_pubtypes
+                0x0000000000000000       0x9a
+ .debug_pubtypes
+                0x0000000000000000       0x37 main.o
+ .debug_pubtypes
+                0x0000000000000037       0x38 lcd_routines.o
+ .debug_pubtypes
+                0x000000000000006f       0x2b uart.o
+
+Cross Reference Table
+
+Symbol                                            File
+__bad_interrupt                                   /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__bss_end                                         /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_clear_bss.o)
+__bss_start                                       /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_clear_bss.o)
+__divmodhi4                                       /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_divmodhi4.o)
+                                                  uart.o
+__do_clear_bss                                    /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_clear_bss.o)
+                                                  uart.o
+                                                  main.o
+__heap_end                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__init                                            /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__stack                                           /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__udivmodhi4                                      /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_udivmodhi4.o)
+                                                  /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_divmodhi4.o)
+__vector_1                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_10                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_11                                       uart.o
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_12                                       uart.o
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_13                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_14                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_15                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_16                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_17                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_18                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_19                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_2                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_20                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_3                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_4                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_5                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_6                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_7                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_8                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_9                                        main.o
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vector_default                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+__vectors                                         /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+_div                                              /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_divmodhi4.o)
+_exit                                             /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_exit.o)
+exit                                              /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_exit.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+get_key_press                                     main.o
+init_io                                           main.o
+key_press                                         main.o
+key_state                                         main.o
+lcd_clear                                         lcd_routines.o
+                                                  main.o
+lcd_command                                       lcd_routines.o
+lcd_data                                          lcd_routines.o
+                                                  main.o
+lcd_generatechar                                  lcd_routines.o
+lcd_home                                          lcd_routines.o
+lcd_init                                          lcd_routines.o
+                                                  main.o
+lcd_setcursor                                     lcd_routines.o
+                                                  main.o
+lcd_string                                        lcd_routines.o
+lcd_string_p                                      lcd_routines.o
+main                                              main.o
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o
+uart_available                                    uart.o
+                                                  main.o
+uart_flush                                        uart.o
+uart_getc                                         uart.o
+                                                  main.o
+uart_init                                         uart.o
+                                                  main.o
+uart_putc                                         uart.o
+                                                  main.o
+uart_puts                                         uart.o
+uart_puts_p                                       uart.o
diff --git a/main.o b/main.o
new file mode 100644
index 0000000000000000000000000000000000000000..3c0f1ad12084749faa8f8f15cf181f65f2812252
GIT binary patch
literal 6520
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

literal 0
HcmV?d00001

diff --git a/uart.lst b/uart.lst
new file mode 100644
index 0000000..602f5ab
--- /dev/null
+++ b/uart.lst
@@ -0,0 +1,405 @@
+   1               		.file	"uart.c"
+   2               	__SREG__ = 0x3f
+   3               	__SP_H__ = 0x3e
+   4               	__SP_L__ = 0x3d
+   5               	__CCP__ = 0x34
+   6               	__tmp_reg__ = 0
+   7               	__zero_reg__ = 1
+  15               	.Ltext0:
+  16               	.global	__vector_11
+  18               	__vector_11:
+  19               	.LFB0:
+  20               	.LM1:
+  21 0000 1F92      		push __zero_reg__
+  22 0002 0F92      		push r0
+  23 0004 0FB6      		in r0,__SREG__
+  24 0006 0F92      		push r0
+  25 0008 1124      		clr __zero_reg__
+  26 000a 2F93      		push r18
+  27 000c 8F93      		push r24
+  28 000e 9F93      		push r25
+  29 0010 EF93      		push r30
+  30 0012 FF93      		push r31
+  31               	/* prologue: Signal */
+  32               	/* frame size = 0 */
+  33               	/* stack size = 8 */
+  34               	.L__stack_usage = 8
+  35               	.LM2:
+  36 0014 8BB1      		in r24,43-32
+  37               	.LVL0:
+  38               	.LM3:
+  39 0016 9CB1      		in r25,44-32
+  40               	.LVL1:
+  41               	.LM4:
+  42 0018 E091 0000 		lds r30,UART_RxHead
+  43 001c EF5F      		subi r30,lo8(-(1))
+  44 001e EF71      		andi r30,lo8(31)
+  45               	.LVL2:
+  46               	.LM5:
+  47 0020 2091 0000 		lds r18,UART_RxTail
+  48 0024 E217      		cp r30,r18
+  49 0026 01F0      		breq .L3
+  50               	.LM6:
+  51 0028 8871      		andi r24,lo8(24)
+  52               	.LVL3:
+  53               	.LM7:
+  54 002a E093 0000 		sts UART_RxHead,r30
+  55               	.LM8:
+  56 002e F0E0      		ldi r31,lo8(0)
+  57 0030 E050      		subi r30,lo8(-(UART_RxBuf))
+  58 0032 F040      		sbci r31,hi8(-(UART_RxBuf))
+  59               	.LVL4:
+  60 0034 9083      		st Z,r25
+  61 0036 00C0      		rjmp .L2
+  62               	.LVL5:
+  63               	.L3:
+  64               	.LM9:
+  65 0038 82E0      		ldi r24,lo8(2)
+  66               	.LVL6:
+  67               	.L2:
+  68               	.LM10:
+  69 003a 8093 0000 		sts UART_LastRxError,r24
+  70               	/* epilogue start */
+  71               	.LM11:
+  72 003e FF91      		pop r31
+  73 0040 EF91      		pop r30
+  74 0042 9F91      		pop r25
+  75               	.LVL7:
+  76 0044 8F91      		pop r24
+  77               	.LVL8:
+  78 0046 2F91      		pop r18
+  79 0048 0F90      		pop r0
+  80 004a 0FBE      		out __SREG__,r0
+  81 004c 0F90      		pop r0
+  82 004e 1F90      		pop __zero_reg__
+  83 0050 1895      		reti
+  84               	.LFE0:
+  86               	.global	__vector_12
+  88               	__vector_12:
+  89               	.LFB1:
+  90               	.LM12:
+  91 0052 1F92      		push __zero_reg__
+  92 0054 0F92      		push r0
+  93 0056 0FB6      		in r0,__SREG__
+  94 0058 0F92      		push r0
+  95 005a 1124      		clr __zero_reg__
+  96 005c 8F93      		push r24
+  97 005e 9F93      		push r25
+  98 0060 EF93      		push r30
+  99 0062 FF93      		push r31
+ 100               	/* prologue: Signal */
+ 101               	/* frame size = 0 */
+ 102               	/* stack size = 7 */
+ 103               	.L__stack_usage = 7
+ 104               	.LM13:
+ 105 0064 9091 0000 		lds r25,UART_TxHead
+ 106 0068 8091 0000 		lds r24,UART_TxTail
+ 107 006c 9817      		cp r25,r24
+ 108 006e 01F0      		breq .L5
+ 109               	.LM14:
+ 110 0070 E091 0000 		lds r30,UART_TxTail
+ 111 0074 EF5F      		subi r30,lo8(-(1))
+ 112 0076 EF71      		andi r30,lo8(31)
+ 113               	.LVL9:
+ 114               	.LM15:
+ 115 0078 E093 0000 		sts UART_TxTail,r30
+ 116               	.LM16:
+ 117 007c F0E0      		ldi r31,lo8(0)
+ 118 007e E050      		subi r30,lo8(-(UART_TxBuf))
+ 119 0080 F040      		sbci r31,hi8(-(UART_TxBuf))
+ 120               	.LVL10:
+ 121 0082 8081      		ld r24,Z
+ 122 0084 8CB9      		out 44-32,r24
+ 123 0086 00C0      		rjmp .L4
+ 124               	.LVL11:
+ 125               	.L5:
+ 126               	.LM17:
+ 127 0088 5598      		cbi 42-32,5
+ 128               	.L4:
+ 129               	/* epilogue start */
+ 130               	.LM18:
+ 131 008a FF91      		pop r31
+ 132 008c EF91      		pop r30
+ 133 008e 9F91      		pop r25
+ 134 0090 8F91      		pop r24
+ 135 0092 0F90      		pop r0
+ 136 0094 0FBE      		out __SREG__,r0
+ 137 0096 0F90      		pop r0
+ 138 0098 1F90      		pop __zero_reg__
+ 139 009a 1895      		reti
+ 140               	.LFE1:
+ 142               	.global	uart_init
+ 144               	uart_init:
+ 145               	.LFB2:
+ 146               	.LM19:
+ 147               	.LVL12:
+ 148               	/* prologue: function */
+ 149               	/* frame size = 0 */
+ 150               	/* stack size = 0 */
+ 151               	.L__stack_usage = 0
+ 152               	.LM20:
+ 153 009c 1092 0000 		sts UART_TxHead,__zero_reg__
+ 154               	.LM21:
+ 155 00a0 1092 0000 		sts UART_TxTail,__zero_reg__
+ 156               	.LM22:
+ 157 00a4 1092 0000 		sts UART_RxHead,__zero_reg__
+ 158               	.LM23:
+ 159 00a8 1092 0000 		sts UART_RxTail,__zero_reg__
+ 160               	.LM24:
+ 161 00ac 97FF      		sbrs r25,7
+ 162 00ae 00C0      		rjmp .L8
+ 163               	.LM25:
+ 164 00b0 22E0      		ldi r18,lo8(2)
+ 165 00b2 2BB9      		out 43-32,r18
+ 166               	.LM26:
+ 167 00b4 9F77      		andi r25,hi8(32767)
+ 168               	.LVL13:
+ 169               	.L8:
+ 170               	.LM27:
+ 171 00b6 90BD      		out 64-32,r25
+ 172               	.LM28:
+ 173 00b8 89B9      		out 41-32,r24
+ 174               	.LM29:
+ 175 00ba 88E9      		ldi r24,lo8(-104)
+ 176               	.LVL14:
+ 177 00bc 8AB9      		out 42-32,r24
+ 178               	.LM30:
+ 179 00be 86E8      		ldi r24,lo8(-122)
+ 180 00c0 80BD      		out 64-32,r24
+ 181               	/* epilogue start */
+ 182               	.LM31:
+ 183 00c2 0895      		ret
+ 184               	.LFE2:
+ 186               	.global	uart_getc
+ 188               	uart_getc:
+ 189               	.LFB3:
+ 190               	.LM32:
+ 191               	/* prologue: function */
+ 192               	/* frame size = 0 */
+ 193               	/* stack size = 0 */
+ 194               	.L__stack_usage = 0
+ 195               	.LM33:
+ 196 00c4 9091 0000 		lds r25,UART_RxHead
+ 197 00c8 8091 0000 		lds r24,UART_RxTail
+ 198 00cc 9817      		cp r25,r24
+ 199 00ce 01F0      		breq .L11
+ 200               	.LM34:
+ 201 00d0 E091 0000 		lds r30,UART_RxTail
+ 202 00d4 EF5F      		subi r30,lo8(-(1))
+ 203 00d6 EF71      		andi r30,lo8(31)
+ 204               	.LVL15:
+ 205               	.LM35:
+ 206 00d8 E093 0000 		sts UART_RxTail,r30
+ 207               	.LM36:
+ 208 00dc F0E0      		ldi r31,lo8(0)
+ 209 00de E050      		subi r30,lo8(-(UART_RxBuf))
+ 210 00e0 F040      		sbci r31,hi8(-(UART_RxBuf))
+ 211               	.LVL16:
+ 212 00e2 8081      		ld r24,Z
+ 213               	.LVL17:
+ 214               	.LM37:
+ 215 00e4 9091 0000 		lds r25,UART_LastRxError
+ 216 00e8 392F      		mov r19,r25
+ 217 00ea 20E0      		ldi r18,lo8(0)
+ 218 00ec 280F      		add r18,r24
+ 219 00ee 311D      		adc r19,__zero_reg__
+ 220 00f0 00C0      		rjmp .L10
+ 221               	.LVL18:
+ 222               	.L11:
+ 223               	.LM38:
+ 224 00f2 20E0      		ldi r18,lo8(256)
+ 225 00f4 31E0      		ldi r19,hi8(256)
+ 226               	.L10:
+ 227               	.LM39:
+ 228 00f6 C901      		movw r24,r18
+ 229               	/* epilogue start */
+ 230 00f8 0895      		ret
+ 231               	.LFE3:
+ 233               	.global	uart_putc
+ 235               	uart_putc:
+ 236               	.LFB4:
+ 237               	.LM40:
+ 238               	.LVL19:
+ 239               	/* prologue: function */
+ 240               	/* frame size = 0 */
+ 241               	/* stack size = 0 */
+ 242               	.L__stack_usage = 0
+ 243               	.LM41:
+ 244 00fa 9091 0000 		lds r25,UART_TxHead
+ 245 00fe 9F5F      		subi r25,lo8(-(1))
+ 246 0100 9F71      		andi r25,lo8(31)
+ 247               	.LVL20:
+ 248               	.L13:
+ 249               	.LM42:
+ 250 0102 2091 0000 		lds r18,UART_TxTail
+ 251 0106 9217      		cp r25,r18
+ 252 0108 01F0      		breq .L13
+ 253               	.LM43:
+ 254 010a E92F      		mov r30,r25
+ 255 010c F0E0      		ldi r31,lo8(0)
+ 256 010e E050      		subi r30,lo8(-(UART_TxBuf))
+ 257 0110 F040      		sbci r31,hi8(-(UART_TxBuf))
+ 258 0112 8083      		st Z,r24
+ 259               	.LM44:
+ 260 0114 9093 0000 		sts UART_TxHead,r25
+ 261               	.LM45:
+ 262 0118 559A      		sbi 42-32,5
+ 263               	/* epilogue start */
+ 264               	.LM46:
+ 265 011a 0895      		ret
+ 266               	.LFE4:
+ 268               	.global	uart_puts
+ 270               	uart_puts:
+ 271               	.LFB5:
+ 272               	.LM47:
+ 273               	.LVL21:
+ 274 011c EF92      		push r14
+ 275 011e FF92      		push r15
+ 276 0120 CF93      		push r28
+ 277 0122 DF93      		push r29
+ 278               	/* prologue: function */
+ 279               	/* frame size = 0 */
+ 280               	/* stack size = 4 */
+ 281               	.L__stack_usage = 4
+ 282               	.LM48:
+ 283 0124 E82E      		mov r14,r24
+ 284 0126 E701      		movw r28,r14
+ 285 0128 7E01      		movw r14,r28
+ 286 012a F92E      		mov r15,r25
+ 287 012c E701      		movw r28,r14
+ 288               	.LM49:
+ 289 012e 00C0      		rjmp .L16
+ 290               	.LVL22:
+ 291               	.L17:
+ 292               	.LM50:
+ 293 0130 0E94 0000 		call uart_putc
+ 294               	.L16:
+ 295               	.LM51:
+ 296 0134 8991      		ld r24,Y+
+ 297 0136 8823      		tst r24
+ 298 0138 01F4      		brne .L17
+ 299               	/* epilogue start */
+ 300               	.LM52:
+ 301 013a DF91      		pop r29
+ 302 013c CF91      		pop r28
+ 303 013e FF90      		pop r15
+ 304 0140 EF90      		pop r14
+ 305 0142 0895      		ret
+ 306               	.LFE5:
+ 308               	.global	uart_puts_p
+ 310               	uart_puts_p:
+ 311               	.LFB6:
+ 312               	.LM53:
+ 313               	.LVL23:
+ 314 0144 CF93      		push r28
+ 315 0146 DF93      		push r29
+ 316               	/* prologue: function */
+ 317               	/* frame size = 0 */
+ 318               	/* stack size = 2 */
+ 319               	.L__stack_usage = 2
+ 320 0148 EC01      		movw r28,r24
+ 321               	.LM54:
+ 322 014a 00C0      		rjmp .L19
+ 323               	.LVL24:
+ 324               	.L20:
+ 325               	.LM55:
+ 326 014c 0E94 0000 		call uart_putc
+ 327               	.LVL25:
+ 328               	.L19:
+ 329               	.LM56:
+ 330 0150 FE01      		movw r30,r28
+ 331               	.LVL26:
+ 332               	.LBB2:
+ 333               	.LM57:
+ 334 0152 2196      		adiw r28,1
+ 335               	.LVL27:
+ 336               	/* #APP */
+ 337               	 ;  538 "uart.c" 1
+ 338 0154 8491      		lpm r24, Z
+ 339               		
+ 340               	 ;  0 "" 2
+ 341               	.LVL28:
+ 342               	/* #NOAPP */
+ 343               	.LBE2:
+ 344 0156 8823      		tst r24
+ 345 0158 01F4      		brne .L20
+ 346               	/* epilogue start */
+ 347               	.LM58:
+ 348 015a DF91      		pop r29
+ 349 015c CF91      		pop r28
+ 350               	.LVL29:
+ 351 015e 0895      		ret
+ 352               	.LFE6:
+ 354               	.global	uart_available
+ 356               	uart_available:
+ 357               	.LFB7:
+ 358               	.LM59:
+ 359               	/* prologue: function */
+ 360               	/* frame size = 0 */
+ 361               	/* stack size = 0 */
+ 362               	.L__stack_usage = 0
+ 363               	.LM60:
+ 364 0160 8091 0000 		lds r24,UART_RxHead
+ 365 0164 2091 0000 		lds r18,UART_RxTail
+ 366 0168 90E0      		ldi r25,lo8(0)
+ 367 016a 4F96      		adiw r24,31
+ 368 016c 821B      		sub r24,r18
+ 369 016e 9109      		sbc r25,__zero_reg__
+ 370 0170 6FE1      		ldi r22,lo8(31)
+ 371 0172 70E0      		ldi r23,hi8(31)
+ 372 0174 0E94 0000 		call __divmodhi4
+ 373               	/* epilogue start */
+ 374               	.LM61:
+ 375 0178 0895      		ret
+ 376               	.LFE7:
+ 378               	.global	uart_flush
+ 380               	uart_flush:
+ 381               	.LFB8:
+ 382               	.LM62:
+ 383               	/* prologue: function */
+ 384               	/* frame size = 0 */
+ 385               	/* stack size = 0 */
+ 386               	.L__stack_usage = 0
+ 387               	.LM63:
+ 388 017a 8091 0000 		lds r24,UART_RxTail
+ 389 017e 8093 0000 		sts UART_RxHead,r24
+ 390               	/* epilogue start */
+ 391               	.LM64:
+ 392 0182 0895      		ret
+ 393               	.LFE8:
+ 395               		.lcomm UART_RxTail,1
+ 396               		.lcomm UART_RxHead,1
+ 397               		.lcomm UART_TxHead,1
+ 398               		.lcomm UART_TxTail,1
+ 399               		.lcomm UART_TxBuf,32
+ 400               		.lcomm UART_RxBuf,32
+ 401               		.lcomm UART_LastRxError,1
+ 490               	.Letext0:
+DEFINED SYMBOLS
+                            *ABS*:0000000000000000 uart.c
+     /tmp/ccUnbh69.s:2      *ABS*:000000000000003f __SREG__
+     /tmp/ccUnbh69.s:3      *ABS*:000000000000003e __SP_H__
+     /tmp/ccUnbh69.s:4      *ABS*:000000000000003d __SP_L__
+     /tmp/ccUnbh69.s:5      *ABS*:0000000000000034 __CCP__
+     /tmp/ccUnbh69.s:6      *ABS*:0000000000000000 __tmp_reg__
+     /tmp/ccUnbh69.s:7      *ABS*:0000000000000001 __zero_reg__
+     /tmp/ccUnbh69.s:18     .text:0000000000000000 __vector_11
+     /tmp/ccUnbh69.s:395    .bss:0000000000000001 UART_RxHead
+                             .bss:0000000000000000 UART_RxTail
+     /tmp/ccUnbh69.s:399    .bss:0000000000000024 UART_RxBuf
+     /tmp/ccUnbh69.s:400    .bss:0000000000000044 UART_LastRxError
+     /tmp/ccUnbh69.s:88     .text:0000000000000052 __vector_12
+     /tmp/ccUnbh69.s:396    .bss:0000000000000002 UART_TxHead
+     /tmp/ccUnbh69.s:397    .bss:0000000000000003 UART_TxTail
+     /tmp/ccUnbh69.s:398    .bss:0000000000000004 UART_TxBuf
+     /tmp/ccUnbh69.s:144    .text:000000000000009c uart_init
+     /tmp/ccUnbh69.s:188    .text:00000000000000c4 uart_getc
+     /tmp/ccUnbh69.s:235    .text:00000000000000fa uart_putc
+     /tmp/ccUnbh69.s:270    .text:000000000000011c uart_puts
+     /tmp/ccUnbh69.s:310    .text:0000000000000144 uart_puts_p
+     /tmp/ccUnbh69.s:356    .text:0000000000000160 uart_available
+     /tmp/ccUnbh69.s:380    .text:000000000000017a uart_flush
+
+UNDEFINED SYMBOLS
+__divmodhi4
+__do_clear_bss
diff --git a/uart.o b/uart.o
new file mode 100644
index 0000000000000000000000000000000000000000..0160b9bfb59d87942ea3c110e7aa9ee53431c542
GIT binary patch
literal 8260
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

literal 0
HcmV?d00001