ソースを参照

Start working with graphical LCD

kbere 1 年間 前
コミット
ccd1000e23
8 ファイル変更245 行追加5 行削除
  1. 21 0
      README.md
  2. 10 2
      soft/Makefile
  3. 51 0
      soft/UC1601S-I2C.c
  4. 150 0
      soft/UC1601S-I2C.h
  5. 0 1
      soft/display.c
  6. 7 1
      soft/main.c
  7. 6 0
      soft/main.h
  8. 0 1
      soft/working_modes.c

+ 21 - 0
README.md

@@ -0,0 +1,21 @@
+Software build & programming:
+
+First, install bootloader using USBASP:
+```
+cd optiboot
+make install
+```
+
+Second, program with software.
+
+Alphanumeric display version:
+```
+cd soft
+make install PROGPORT=COM16
+```
+
+Graphical display version:
+```
+cd soft
+make install PROGPORT=COM16 LCD=graphic
+```

+ 10 - 2
soft/Makefile

@@ -2,7 +2,7 @@
 PROJECT	= glg
 
 ### Source files and search directory
-CSRC    = main.c uart0.c uart1.c ff.c mmc.c 1wire.c ds18b20.c expander.c HD44780-I2C.c I2C.c xprintf.c gpx.c ffunicode.c display.c working_modes.o timec.o nmea.o settings.o menu.o
+CSRC    = main.c uart0.c uart1.c ff.c mmc.c 1wire.c ds18b20.c expander.c I2C.c xprintf.c gpx.c ffunicode.c display.c working_modes.o timec.o nmea.o settings.o menu.o
 ASRC    = stime.S
 VPATH   =
 
@@ -26,6 +26,13 @@ DEFS	= F_CPU=7372800
 # DEFS	+= LEDR_UART
 ADEFS	=
 
+ifeq ($(LCD),graphic)
+CSRC	+= UC1601S-I2C.c
+DEFS	+= LCD_GRAPHIC
+else
+CSRC	+= HD44780-I2C.c
+endif
+
 ### Warning contorls
 WARNINGS = all extra
 
@@ -60,7 +67,8 @@ PROJECT   := $(OBJDIR)/$(PROJECT)
 CFLAGS += -g$(DEBUG)
 CFLAGS += -mmcu=$(DEVICE)
 CFLAGS += -O$(OPTIMIZE) -mcall-prologues
-CFLAGS += $(addprefix -W,$(WARNINGS)) --param=min-pagesize=0
+CFLAGS += $(addprefix -W,$(WARNINGS))
+# --param=min-pagesize=0
 CFLAGS += $(addprefix -I,$(INCDIRS))
 CFLAGS += $(addprefix -D,$(DEFS))
 CFLAGS += -Wp,-MM,-MP,-MT,$(OBJDIR)/$(*F).o,-MF,$(OBJDIR)/$(*F).d

+ 51 - 0
soft/UC1601S-I2C.c

@@ -0,0 +1,51 @@
+#include "UC1601S-I2C.h"
+
+void uc1601s_write_command(unsigned char cmd) {
+	expander_set_bit_no_send(UC1601S_CS_PORT, UC1601S_CS, 0);
+	expander_set_bit_no_send(UC1601S_CD_PORT, UC1601S_CD, 0);
+	exp_output[0] = cmd;
+	expander_write(0);
+	expander_set_bit(UC1601S_WR_PORT, UC1601S_WR, 0);
+	expander_set_bit(UC1601S_WR_PORT, UC1601S_WR, 1);
+	expander_set_bit(UC1601S_CS_PORT, UC1601S_CS, 1);
+}
+
+void uc1601s_write_data(unsigned char data) {
+	expander_set_bit_no_send(UC1601S_CS_PORT, UC1601S_CS, 0);
+	expander_set_bit(UC1601S_CD_PORT, UC1601S_CD, 1);
+	exp_output[0] = data;
+	expander_write(0);
+	expander_set_bit(UC1601S_WR_PORT, UC1601S_WR, 0);
+	expander_set_bit(UC1601S_WR_PORT, UC1601S_WR, 1);
+	expander_set_bit(UC1601S_CS_PORT, UC1601S_CS, 1);
+}
+
+unsigned char uc1601s_read_data(void) {
+	unsigned char out;
+	UC1601S_DATA_INPUT();
+	expander_set_bit_no_send(UC1601S_CS_PORT, UC1601S_CS, 0);
+	expander_set_bit_no_send(UC1601S_CD_PORT, UC1601S_CD, 1);
+	expander_set_bit(UC1601S_RD_PORT, UC1601S_RD, 0);
+	out = expander_read_byte(0, 0);
+	expander_set_bit_no_send(UC1601S_RD_PORT, UC1601S_RD, 1);
+	expander_set_bit(UC1601S_CS_PORT, UC1601S_CS, 1);
+	UC1601S_DATA_OUTPUT();
+	return out;
+}
+
+#define UC1601S_INTERNAL_VLCD	0x6
+
+void LCD_Initialize(void) {
+	expander_set_bit(UC1601S_RST_PORT, UC1601S_RST, 1);
+	_delay_ms(5);
+	expander_set_bit_no_send(UC1601S_RD_PORT, UC1601S_RD, 1);
+	expander_set_bit(UC1601S_WR_PORT, UC1601S_WR, 1);
+	UC1601S_DATA_OUTPUT();
+//	uc1601s_system_reset();
+	uc1601s_set_lcd_bias_ratio(UC1601S_BIAS_RATIO_8);
+	uc1601s_set_vbias(0xee);
+	uc1601s_set_display_enable(1);
+	uc1601s_set_power_control(UC1601S_INTERNAL_VLCD);
+	uc1601s_set_all_pixel_on(1);
+	_delay_ms(2);
+}

+ 150 - 0
soft/UC1601S-I2C.h

@@ -0,0 +1,150 @@
+#pragma once
+
+#include <avr/io.h>
+#include <util/delay.h>
+#include "expander.h"
+
+#define LCD_WriteCommand(x)
+#define LCD_WriteData(x)
+#define LCD_Clear()
+#define LCD_GoTo(x,y)
+#define LCD_WriteTextP(x)
+#define LCD_WriteText(x)
+
+#define UC1601S_CA30	0x00
+#define UC1601S_CA74	0x10
+#define UC1601S_TC	0x24
+#define UC1601S_PC	0x28
+#define UC1601S_ADV	0x30
+#define UC1601S_SL	0x40
+#define UC1601S_PA	0xb0
+#define UC1601S_PM	0x81
+#define UC1601S_LC4	0x84
+#define UC1601S_AC	0x88
+#define UC1601S_LC3	0xa0
+#define UC1601S_DC1	0xa4
+#define UC1601S_DC0	0xa6
+#define UC1601S_DC2	0xae
+#define UC1601S_LC21	0xc0
+#define UC1601S_SYSTEMRESET	0xe2
+#define UC1601S_NOP	0xe3
+#define UC1601S_BR	0xe8
+#define UC1601S_CEN	0xf1
+#define UC1601S_DST	0xf2
+#define UC1601S_DEN	0xf3
+
+#define UC1601S_DATA_OUTPUT() 	expander_set_dir(0, 0x00, 0x00)
+#define UC1601S_DATA_INPUT() 	expander_set_dir(0, 0xFF, 0x00)
+
+#define UC1601S_WR_PORT	1
+#define UC1601S_WR		(1<<2)
+#define UC1601S_CD_PORT	1
+#define UC1601S_CD		(1<<0)
+#define UC1601S_RD_PORT	1
+#define UC1601S_RD		(1<<3)
+#define UC1601S_CS_PORT	1
+#define UC1601S_CS		(1<<1)
+#define UC1601S_RST_PORT	1
+#define UC1601S_RST		(1<<6)
+
+void uc1601s_write_command(unsigned char cmd);
+void uc1601s_write_data(unsigned char data);
+unsigned char uc1601s_read_data(void);
+void LCD_Initialize(void);
+
+static inline void uc1601s_set_column_address(unsigned char addr) {
+	uc1601s_write_command(UC1601S_CA30 | (addr&0x0f));
+	uc1601s_write_command(UC1601S_CA74 | (addr>>4));
+	uc1601s_read_data();
+}
+
+static inline void uc1601s_set_temp_compensation(unsigned char tc) {
+	tc &= 0x3;
+	uc1601s_write_command(UC1601S_TC | tc);
+}
+
+static inline void uc1601s_set_power_control(unsigned char pc) {
+	pc &= 0x7;
+	uc1601s_write_command(UC1601S_PC | pc);
+}
+
+static inline void uc1601s_set_scroll_line(unsigned char sl) {
+	sl &= 0x3f;
+	uc1601s_write_command(UC1601S_SL | sl);
+}
+
+static inline void uc1601s_set_page_address(unsigned char pa) {
+	pa &= 0x0f;
+	uc1601s_write_command(UC1601S_PA | pa);
+	uc1601s_read_data();
+}
+
+static inline void uc1601s_set_vbias(unsigned char pm) {
+	uc1601s_write_command(UC1601S_PM);
+	uc1601s_write_command(pm);
+}
+
+static inline void uc1601s_set_partial_display(unsigned char lc) {
+	lc &= 0x1;
+	uc1601s_write_command(UC1601S_LC4 | lc);
+}
+
+static inline void uc1601s_set_ram_address(unsigned char ac) {
+	ac &= 0x3;
+	uc1601s_write_command(UC1601S_AC | ac);
+}
+
+static inline void uc1601_set_frame_rate(unsigned char lc) {
+	lc &= 0x1;
+	uc1601s_write_command(UC1601S_LC3 | lc);
+}
+
+static inline void uc1601s_set_all_pixel_on(unsigned char dc) {
+	dc &= 0x1;
+	uc1601s_write_command(UC1601S_DC1 | dc);
+}
+
+static inline void uc1601s_set_inverse_display(unsigned char dc) {
+	dc &= 0x1;
+	uc1601s_write_command(UC1601S_DC0 | dc);
+}
+
+static inline void uc1601s_set_display_enable(unsigned char dc) {
+	dc &= 0x1;
+	uc1601s_write_command(UC1601S_DC2 | dc);
+}
+
+static inline void uc1601s_set_lcd_mapping(unsigned char lc) {
+	lc &= 0x3;
+	lc <<= 1;
+	uc1601s_write_command(UC1601S_LC21 | lc);
+}
+
+static inline void uc1601s_system_reset(void) {
+	uc1601s_write_command(UC1601S_SYSTEMRESET);
+}
+
+#define UC1601S_BIAS_RATIO_6	0x0
+#define UC1601S_BIAS_RATIO_7	0x1
+#define UC1601S_BIAS_RATIO_8	0x2
+#define UC1601S_BIAS_RATIO_9	0x3
+
+static inline void uc1601s_set_lcd_bias_ratio(unsigned char br) {
+	br &= 0x3;
+	uc1601s_write_command(UC1601S_BR | br);
+}
+
+static inline void uc1601s_set_com_end(unsigned char cen) {
+	uc1601s_write_command(UC1601S_CEN);
+	uc1601s_write_command(cen);
+}
+
+static inline void uc1601s_set_partial_display_start(unsigned char dst) {
+	uc1601s_write_command(UC1601S_DST);
+	uc1601s_write_command(dst);
+}
+
+static inline void uc1601s_set_partial_display_end(unsigned char den) {
+	uc1601s_write_command(UC1601S_DEN);
+	uc1601s_write_command(den);
+}

+ 0 - 1
soft/display.c

@@ -1,7 +1,6 @@
 #include <avr/pgmspace.h>
 #include "main.h"
 #include "display.h"
-#include "HD44780-I2C.h"
 #include "xprintf.h"
 #include "working_modes.h"
 #include "timec.h"

+ 7 - 1
soft/main.c

@@ -21,7 +21,6 @@
 #include "ds18b20.h"
 #include "I2C.h"
 #include "expander.h"
-#include "HD44780-I2C.h"
 #include "gpx.h"
 #include "display.h"
 #include "working_modes.h"
@@ -239,8 +238,15 @@ void ioinit (void)
 	
 	I2C_init();
 	expander_init(0, 0x00, 0x00); /* all as outputs */
+	
+	while (1) {
+	
 	LCD_Initialize();
 	LCD_Clear();
+	
+	wdt_reset();
+	
+	}
 
 	sei();
 	

+ 6 - 0
soft/main.h

@@ -8,6 +8,12 @@
 #include "expander.h"
 #include "settings.h"
 
+#ifdef LCD_GRAPHIC
+#include "UC1601S-I2C.h"
+#else
+#include "HD44780-I2C.h"
+#endif
+
 #define	IVT_SYNC	180			/* f_sync() interval (0:no periodic sync) [sec] */
 #define POWER_SW_TIME	300		/* power switch hold time to power off [10ms] */
 #define BACKLIGHT_TIME	10000

+ 0 - 1
soft/working_modes.c

@@ -1,7 +1,6 @@
 #include "main.h"
 #include "working_modes.h"
 #include "display.h"
-#include "HD44780-I2C.h"
 #include "xprintf.h"
 #include "settings.h"
 #include "nmea.h"