#ifndef F_CPU #define F_CPU 8000000UL //8MHz #endif #include #include #include #include "lcd.h" //#include "interrupts.h" #define LCD_PORT PORTB #define LCD_REGISTER DDRB #define LCD_VDD_PIN 0 #define LCD_VSS_PIN 1 #define LCD_LOAD_PIN 2 #define LCD_DATA_PIN 3 #define LCD_CLK_PIN 4 #define LCD_CHK_PIN 5 #define LCD_POWER(flag) \ ((flag)? (LCD_PORT |= ((1 << LCD_VDD_PIN) | (0 << LCD_VSS_PIN))): \ (LCD_PORT &= ~((1 << LCD_VDD_PIN) | (1 << LCD_VSS_PIN)))) #define LCD_CLOCK(flag) \ ((flag)? (LCD_PORT |= (1 << LCD_CLK_PIN)): \ (LCD_PORT &= ~(1 << LCD_CLK_PIN))) #define LCD_DATA(flag) \ ((flag)? (LCD_PORT |= (1 << LCD_DATA_PIN)): \ (LCD_PORT &= ~(1 << LCD_DATA_PIN))) #define LCD_LOAD(flag) \ ((flag)? (LCD_PORT |= (1 << LCD_LOAD_PIN)): \ (LCD_PORT &= ~(1 << LCD_LOAD_PIN))) static uint8_t init_complete = 0; const uint8_t digit_buffer[10] = { 1+2+8+16+32+64, 64+32, 16+32+4+2+1, 16+32+4+64+1, 8+4+32+64, 16+8+4+64+1, 16+8+2+4+1+64, 16+32+64, 127, 127-2 }; static volatile uint8_t lcd_buffer[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; static volatile uint8_t dp_buffer[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; static volatile uint8_t us_buffer[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; void lcd_strobe(uint8_t select_io) { switch (select_io) { case 0: LCD_CLOCK(1); _delay_us(1); LCD_CLOCK(0); _delay_us(1); case 1: LCD_LOAD(1); _delay_us(1); LCD_LOAD(0); _delay_us(1); default: break; } } void write_data(void) { uint8_t dp = 0; uint8_t underscore = 0; uint8_t data = 0; for (int8_t i = 7; i >= 0; i--) { dp = dp_buffer[i]; lcd_strobe(0); if (dp) LCD_DATA(1); else LCD_DATA(0); for (int8_t j = 7; j >= 0; j--) { underscore = us_buffer[j]; lcd_strobe(0); if (underscore) LCD_DATA(1); else LCD_DATA(0); data = lcd_buffer[j]; for (int8_t z = 7; z >= 0; z--) { lcd_strobe(0); if (data & 0x40) LCD_DATA(1); else LCD_DATA(0); data = data << 1; } } } lcd_strobe(1); } void clear_buffers(void) { for (uint8_t i = 0; i < sizeof(dp_buffer); i++) { dp_buffer[i] = 0; } for (uint8_t i = 0; i < sizeof(us_buffer); i++) { us_buffer[i] = 0; } for (uint8_t i = 0; i < sizeof(lcd_buffer); i++) { lcd_buffer[i] = 0; } } void init_lcd(void) { if (!init_complete) { LCD_REGISTER = 0x1F; LCD_POWER(1); init_complete = 1; } for (int8_t i = 0; i <= 9; i++) { clear_buffers(); lcd_buffer[0] = digit_buffer[i]; if (i < 8) { us_buffer[i] = 1; dp_buffer[i] = 1; } write_data(); _delay_ms(1000); } }