Понадобилось мне для некоторых целей быстренько соорудить нечто похожее на printf для микроконтроллера. Нет, я знаю, что есть успешный опыт прикручивания полноценного printf, но чукча не читатель.
Как будет время, обязательно разберусь, но пока я просто оставлю это здесь.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#include <avr/io.h> #include <avr/power.h> #include <stdarg.h> static inline void uart_putc(const char DataByte) { while (!(UCSR1A & (1 << UDRE1))) ; UDR1 = DataByte; } static inline char uart_getc(void) { while (!(UCSR1A & (1 << RXC1))) ; return UDR1; } void print_hex(uint16_t val) { char c; uint16_t i; for (i = 0; i < 4; i++) { c = (val & 0xf000)>>12; val<<=4; if (c > 9) { uart_putc(c + 'a' - 10); } else { uart_putc(c + '0'); } } } void print_uint16_t(uint16_t val) { } void uart_puts(const char *str) { char c; while (c = *str) { uart_putc(c); str++; } } void uart_printf(const char *str, ...) { char c; uint16_t val; va_list vl; va_start(vl, str); while (c = *str) { if (c == '%') { val = va_arg(vl,uint16_t); str++; c = *str; if (c == 'i') { print_uint16_t(val); } else if (c == 'x') { print_hex(val); } else { uart_puts("!ERROR!"); } str++; } else { uart_putc(c); str++; } } va_end(vl); } int main() { clock_prescale_set(clock_div_1); UBRR1 = 103; UCSR1A = (1 << U2X1); UCSR1C = (1 << UCSZ11) | (1 << UCSZ10); UCSR1B = (1 << RXEN1) | (1 << TXEN1); while (1) { uart_printf("Hi! My num: %x\n\r", 0x12ab); } } |