diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..45a243f --- /dev/null +++ b/Makefile @@ -0,0 +1,60 @@ +AVRMCU ?= atmega8 +F_CPU ?= 16000000 +ISPPORT ?= /dev/kaboard + +VERSION = 0.1 + +HEADERS = spi.h st7735.h st7735initcmds.h +SRC = main.c spi.c st7735.c +TARGET = st7735_test +OBJDIR = bin + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size + +SRC_TMP = $(subst ../,,$(SRC)) +OBJ = $(SRC_TMP:%.c=$(OBJDIR)/$(AVRMCU)/%.o) + +CFLAGS = -I ../sss7core/ -Os -Wall -Wstrict-prototypes +CFLAGS += -ffunction-sections -fdata-sections +CFLAGS += -fshort-enums -fpack-struct -funsigned-char -funsigned-bitfields +CFLAGS += -mmcu=$(AVRMCU) -DF_CPU=$(F_CPU)UL -DVERSION=$(VERSION) + +LDFLAGS = -mmcu=$(AVRMCU) -Wl,--gc-sections + +all: start $(OBJDIR)/$(AVRMCU)/$(TARGET).hex size + @echo ":: Done !" + +start: + @echo "ST7735 for AVR $(VERSION)" + @echo "==========================" + @echo ":: Building for $(AVRMCU)" + @echo ":: MCU operating frequency is $(F_CPU)Hz" + +$(OBJDIR)/$(AVRMCU)/%.o : %.c $(HEADERS) Makefile + @mkdir -p $$(dirname $@) + $(CC) $(CFLAGS) -c $< -o $@ + +$(OBJDIR)/$(AVRMCU)/$(TARGET).elf : $(OBJ) + $(CC) $(LDFLAGS) $+ -o $@ + +$(OBJDIR)/$(AVRMCU)/$(TARGET).hex : $(OBJDIR)/$(AVRMCU)/$(TARGET).elf + $(OBJCOPY) -O ihex $< $@ + +size : $(OBJDIR)/$(AVRMCU)/$(TARGET).elf + @echo + @$(SIZE) --mcu=$(AVRMCU) -C $(OBJDIR)/$(AVRMCU)/$(TARGET).elf + @echo + +clean : + @rm -rf $(OBJDIR) + +flash : all + avrdude -c arduino \ + -p $(AVRMCU) -P $(ISPPORT) \ + -U flash:w:$(OBJDIR)/$(AVRMCU)/$(TARGET).hex + +test : flash + screen $(ISPPORT) 38400 diff --git a/main.c b/main.c new file mode 100644 index 0000000..51ec62a --- /dev/null +++ b/main.c @@ -0,0 +1,21 @@ +#include +#include + +#include "spi.h" +#include "st7735.h" + +void main() { + spi_init(); + st7735_init(); + + + + + st7735_set_orientation(ST7735_LANDSCAPE); + st7735_fill_rect(0, 0, 160, 128, ST7735_COLOR_GREEN); + st7735_fill_rect(0, 0, 80, 127, ST7735_COLOR_RED); + st7735_fill_rect(0, 0, 80, 64, ST7735_COLOR_CYAN); + st7735_draw_fast_hline(80, 64, 40, ST7735_COLOR_BLUE); + st7735_draw_fast_vline(120, 64, 32, ST7735_COLOR_BLUE); + +} diff --git a/spi.c b/spi.c index 6b9dac0..3c0813d 100644 --- a/spi.c +++ b/spi.c @@ -1,9 +1,9 @@ #include "spi.h" -void SPI_init(void) { +void spi_init(void) { // Set MOSI and SCK, SS/CS output, all others input DDRB = (1< -void SPI_init(void); +void spi_init(void); static inline void spi_write(uint8_t byte) { SPDR = byte; diff --git a/st7735.c b/st7735.c index 59fb635..97e460c 100644 --- a/st7735.c +++ b/st7735.c @@ -6,26 +6,26 @@ #include "spi.h" #include "st7735initcmds.h" -static uint8_t st7735_row_start = 0; -static uint8_t st7735_column_start = 0; -static uint8_t st7735_width = st7735_default_width; -static uint8_t st7735_height = st7735_default_height_18; -static enum ST7735_ORIENTATION st7735_orientation = ST7735_LANDSCAPE; +uint8_t st7735_row_start = 0; +uint8_t st7735_column_start = 0; +uint8_t st7735_width = 0; +uint8_t st7735_height = 0; +enum ST7735_ORIENTATION st7735_orientation = ST7735_LANDSCAPE; static inline void st7735_set_rs() { - PORTB |= (1 << PB1); + PORTD |= (1 << PD6); } static inline void st7735_unset_rs() { - PORTB &= ~(1 << PB1); + PORTD &= ~(1 << PD6); } static inline void st7735_set_rst() { - PORTB |= (1 << PB0); + PORTD |= (1 << PD7); } static inline void st7735_unset_rst() { - PORTB &= ~(1 << PB0); + PORTD &= ~(1 << PD7); } static inline void st7735_write_cmd(enum ST7735_COMMANDS cmd) { @@ -81,7 +81,9 @@ void st7735_run_command_list(const uint8_t *addr) { _delay_ms(500); } else { - _delay_ms(ms); + for(int i = 0; i < ms; i += 5) { + _delay_ms(5); + } } } @@ -91,7 +93,7 @@ void st7735_run_command_list(const uint8_t *addr) { void st7735_init() { // Set rs and rst output - DDRB |= (1 << PB1) | (1 << PB0); + DDRD |= (1 << PD6) | (1 << PD7); st7735_reset(); @@ -106,12 +108,16 @@ void st7735_init() { st7735_run_command_list(st7735_red_init3); st7735_column_start = 2; st7735_row_start = 1; + st7735_width = st7735_default_width; + st7735_height = st7735_default_height_18; break; case ST7735_RED_18_REDTAB: st7735_run_command_list(st7735_red_init1); st7735_run_command_list(st7735_red_init_red2); st7735_run_command_list(st7735_red_init3); + st7735_width = st7735_default_width; + st7735_height = st7735_default_height_18; break; case ST7735_RED_18_BLACKTAB: @@ -121,6 +127,8 @@ void st7735_init() { // Change MADCTL color filter for black st7735_write_cmd(ST7735_MADCTL); st7735_write_data(0xC0); + st7735_width = st7735_default_width; + st7735_height = st7735_default_height_18; break; case ST7735_RED144_GREENTAB: @@ -130,6 +138,8 @@ void st7735_init() { st7735_height = st7735_default_height_144; st7735_column_start = 2; st7735_row_start = 3; + st7735_width = st7735_default_width; + st7735_height = st7735_default_height_144; break; } } @@ -149,7 +159,7 @@ void st7735_set_orientation(enum ST7735_ORIENTATION orientation) { st7735_write_cmd(ST7735_MADCTL); switch (orientation) { - case ST7735_LANDSCAPE: + case ST7735_PORTRAIT: if(st7735_type == ST7735_RED_18_BLACKTAB) { st7735_write_data(MADCTL_MX | MADCTL_MY | MADCTL_RGB); } else { @@ -166,7 +176,7 @@ void st7735_set_orientation(enum ST7735_ORIENTATION orientation) { break; - case ST7735_PORTRAIT: + case ST7735_LANDSCAPE: if(st7735_type == ST7735_RED_18_BLACKTAB) { st7735_write_data(MADCTL_MY | MADCTL_MV | MADCTL_RGB); } else { @@ -183,7 +193,7 @@ void st7735_set_orientation(enum ST7735_ORIENTATION orientation) { st7735_height = st7735_default_width; break; - case ST7735_LANDSCAPE_INV: + case ST7735_PORTRAIT_INV: if (st7735_type == ST7735_RED_18_BLACKTAB) { st7735_write_data(MADCTL_RGB); } else { @@ -199,7 +209,7 @@ void st7735_set_orientation(enum ST7735_ORIENTATION orientation) { } break; - case ST7735_PORTRAIT_INV: + case ST7735_LANDSCAPE_INV: if (st7735_type == ST7735_RED_18_BLACKTAB) { st7735_write_data(MADCTL_MX | MADCTL_MV | MADCTL_RGB); } else { @@ -220,7 +230,7 @@ void st7735_set_orientation(enum ST7735_ORIENTATION orientation) { void st7735_set_addr_win(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1) { st7735_write_cmd(ST7735_CASET); // Column addr set st7735_write_data(0x00); - st7735_write_cmd(x0 + st7735_column_start); // XSTART + st7735_write_data(x0 + st7735_column_start); // XSTART st7735_write_data(0x00); st7735_write_data(x1 + st7735_column_start); // XEND diff --git a/st7735.h b/st7735.h index 36f09aa..7af9220 100644 --- a/st7735.h +++ b/st7735.h @@ -3,11 +3,11 @@ #include -const uint8_t st7735_default_width = 128; +static const uint8_t st7735_default_width = 128; // for 1.44" display -const uint8_t st7735_default_height_144 = 128; +static const uint8_t st7735_default_height_144 = 128; // for 1.8" display -const uint8_t st7735_default_height_18 = 160; +static const uint8_t st7735_default_height_18 = 160; enum ST7735_DISPLAY_TYPE { ST7735_BLUE, @@ -17,7 +17,7 @@ enum ST7735_DISPLAY_TYPE { ST7735_RED144_GREENTAB }; -const enum ST7735_DISPLAY_TYPE st7735_type = ST7735_RED_18_REDTAB; +static const enum ST7735_DISPLAY_TYPE st7735_type = ST7735_RED_18_BLACKTAB; // ST7735 commands diff --git a/st7735initcmds.h b/st7735initcmds.h index 750745b..cdf67f2 100644 --- a/st7735initcmds.h +++ b/st7735initcmds.h @@ -5,7 +5,7 @@ #include "st7735.h" -const uint8_t DELAY_FLAG = (1 << 7); +#define DELAY_FLAG 0x80 static const uint8_t PROGMEM st7735_blue_init[] = { // Initialization commands for 7735B screens 18, // 18 commands in list: