; ; hello7.2.asm ; Neil Gershenfeld CBA MIT 11/12/05 ; 16x2 44780 LCD hello-world ; slave processor ; .include "tn13def.inc" .def byte = R17 .def bitcnt = R18 .def temp = R19 .equ DB7 = PB2 .equ DB6 = PB1 .equ DB5 = PB0 .equ DB4 = PB3 .equ rxpin = PB4 .cseg .org 0 rjmp reset ; ; getchar ; assumes no line driver (doesn't invert bits) ; getchar: ldi bitcnt,9 ; 8 data bit + 1 stop bit getchar1: sbis PINB, rxpin ; wait for start bit rjmp getchar1 rcall bit_delay ; 0.5 bit delay getchar2: rcall bit_delay ; 1 bit delay rcall bit_delay ; clc ; clear carry sbis PINB, rxpin ; if RX pin high skip sec ; otherwise set carry dec bitcnt breq getchar3 ; return if all bits read ror byte ; otherwise shift bit into receive byte rjmp getchar2 ; go get next bit getchar3: ret ; ; bit delay ; .equ b = 17 ; 9600 bps bit_delay: ldi temp, b bitloop: dec temp brne bitloop ret ; ; reset routine ; reset: ; ; set stack pointer to top of RAM ; ldi temp, low(RAMEND) out SPL, temp ; ; init I/O pins ; cbi PORTB, DB4 sbi DDRB, DB4 cbi PORTB, DB5 sbi DDRB, DB5 cbi PORTB, DB6 sbi DDRB, DB6 cbi PORTB, DB7 sbi DDRB, DB7 ; ; infinite main loop ; main: rcall getchar out PORTB, byte rjmp main