Merge pull request #2325 from opentx/jivarofad/M2560
LCD driver for stock and M2560
This commit is contained in:
+72
-60
@@ -36,7 +36,7 @@ $Descr A4 11693 8268
|
||||
encoding utf-8
|
||||
Sheet 1 1
|
||||
Title "OpenTX board based on Arduino MEGA2560"
|
||||
Date "14 feb 2015"
|
||||
Date "20 may 2015"
|
||||
Rev "0"
|
||||
Comp "Copyright 2015 F. Aguerre"
|
||||
Comment1 ""
|
||||
@@ -196,10 +196,10 @@ F 3 "" H 8800 6900 60 0001 C CNN
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R6
|
||||
L R R7
|
||||
U 1 1 54997DEC
|
||||
P 8800 6550
|
||||
F 0 "R6" V 8880 6550 50 0000 C CNN
|
||||
F 0 "R7" V 8880 6550 50 0000 C CNN
|
||||
F 1 "100K" V 8800 6550 50 0000 C CNN
|
||||
F 2 "" H 8800 6550 60 0001 C CNN
|
||||
F 3 "" H 8800 6550 60 0001 C CNN
|
||||
@@ -207,11 +207,11 @@ F 3 "" H 8800 6550 60 0001 C CNN
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R6
|
||||
L R R5
|
||||
U 1 1 54997CFE
|
||||
P 7800 6000
|
||||
F 0 "R6" V 7880 6000 50 0000 C CNN
|
||||
F 1 "100K" V 7800 6000 50 0000 C CNN
|
||||
F 0 "R5" V 7880 6000 50 0000 C CNN
|
||||
F 1 "6.8K" V 7800 6000 50 0000 C CNN
|
||||
F 2 "" H 7800 6000 60 0001 C CNN
|
||||
F 3 "" H 7800 6000 60 0001 C CNN
|
||||
1 7800 6000
|
||||
@@ -310,11 +310,11 @@ F 3 "" H 9850 4600 60 0001 C CNN
|
||||
0 1 -1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R6
|
||||
L R R5
|
||||
U 1 1 5499427F
|
||||
P 10100 4850
|
||||
F 0 "R6" V 10180 4850 50 0000 C CNN
|
||||
F 1 "100K" V 10100 4850 50 0000 C CNN
|
||||
F 0 "R5" V 10180 4850 50 0000 C CNN
|
||||
F 1 "6.8K" V 10100 4850 50 0000 C CNN
|
||||
F 2 "" H 10100 4850 60 0001 C CNN
|
||||
F 3 "" H 10100 4850 60 0001 C CNN
|
||||
1 10100 4850
|
||||
@@ -342,42 +342,42 @@ F 3 "" H 9100 4600 60 0001 C CNN
|
||||
1 9100 4600
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Text Label 6450 3850 2 42 ~ 0
|
||||
Text Label 6650 3900 2 42 ~ 0
|
||||
U_batt
|
||||
$Comp
|
||||
L R R3
|
||||
U 1 1 54994034
|
||||
P 6050 4100
|
||||
F 0 "R3" V 6130 4100 50 0000 C CNN
|
||||
F 1 "2.7K" V 6050 4100 50 0000 C CNN
|
||||
F 2 "" H 6050 4100 60 0001 C CNN
|
||||
F 3 "" H 6050 4100 60 0001 C CNN
|
||||
1 6050 4100
|
||||
P 6250 4150
|
||||
F 0 "R3" V 6330 4150 50 0000 C CNN
|
||||
F 1 "2.7K" V 6250 4150 50 0000 C CNN
|
||||
F 2 "" H 6250 4150 60 0001 C CNN
|
||||
F 3 "" H 6250 4150 60 0001 C CNN
|
||||
1 6250 4150
|
||||
-1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R4
|
||||
U 1 1 54994033
|
||||
P 5800 3850
|
||||
F 0 "R4" V 5880 3850 50 0000 C CNN
|
||||
F 1 "5.1K" V 5800 3850 50 0000 C CNN
|
||||
F 2 "" H 5800 3850 60 0001 C CNN
|
||||
F 3 "" H 5800 3850 60 0001 C CNN
|
||||
1 5800 3850
|
||||
P 6000 3900
|
||||
F 0 "R4" V 6080 3900 50 0000 C CNN
|
||||
F 1 "5.1K" V 6000 3900 50 0000 C CNN
|
||||
F 2 "" H 6000 3900 60 0001 C CNN
|
||||
F 3 "" H 6000 3900 60 0001 C CNN
|
||||
1 6000 3900
|
||||
0 1 -1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR?
|
||||
U 1 1 54994032
|
||||
P 6050 4450
|
||||
F 0 "#PWR?" H 6050 4450 30 0001 C CNN
|
||||
F 1 "GND" H 6050 4380 30 0001 C CNN
|
||||
F 2 "" H 6050 4450 60 0001 C CNN
|
||||
F 3 "" H 6050 4450 60 0001 C CNN
|
||||
1 6050 4450
|
||||
P 6250 4500
|
||||
F 0 "#PWR?" H 6250 4500 30 0001 C CNN
|
||||
F 1 "GND" H 6250 4430 30 0001 C CNN
|
||||
F 2 "" H 6250 4500 60 0001 C CNN
|
||||
F 3 "" H 6250 4500 60 0001 C CNN
|
||||
1 6250 4500
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Text Notes 5400 3500 0 60 ~ 0
|
||||
Text Notes 5600 3550 0 60 ~ 0
|
||||
Battery voltage reading
|
||||
Text Notes 7250 1950 0 60 ~ 0
|
||||
Rotary encoders (x2)
|
||||
@@ -461,11 +461,11 @@ F 3 "" H 5250 1000 60 0001 C CNN
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R3
|
||||
L R R2
|
||||
U 1 1 54993A62
|
||||
P 5250 2200
|
||||
F 0 "R3" V 5330 2200 50 0000 C CNN
|
||||
F 1 "2.7K" V 5250 2200 50 0000 C CNN
|
||||
F 0 "R2" V 5330 2200 50 0000 C CNN
|
||||
F 1 "2.2K" V 5250 2200 50 0000 C CNN
|
||||
F 2 "" H 5250 2200 60 0001 C CNN
|
||||
F 3 "" H 5250 2200 60 0001 C CNN
|
||||
1 5250 2200
|
||||
@@ -646,10 +646,10 @@ $EndComp
|
||||
Text Label 9250 1000 0 42 ~ 0
|
||||
M2560_Ouput
|
||||
$Comp
|
||||
L R R5
|
||||
L R R6
|
||||
U 1 1 54992F2E
|
||||
P 10250 1250
|
||||
F 0 "R5" V 10330 1250 50 0000 C CNN
|
||||
F 0 "R6" V 10330 1250 50 0000 C CNN
|
||||
F 1 "10K" V 10250 1250 50 0000 C CNN
|
||||
F 2 "" H 10250 1250 60 0001 C CNN
|
||||
F 3 "" H 10250 1250 60 0001 C CNN
|
||||
@@ -837,10 +837,10 @@ F 3 "" H 2350 2100 60 0001 C CNN
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R5
|
||||
L R R6
|
||||
U 1 1 549891B4
|
||||
P 2150 1700
|
||||
F 0 "R5" V 2230 1700 50 0000 C CNN
|
||||
F 0 "R6" V 2230 1700 50 0000 C CNN
|
||||
F 1 "10K" V 2150 1700 50 0000 C CNN
|
||||
F 2 "" H 2150 1700 60 0001 C CNN
|
||||
F 3 "" H 2150 1700 60 0001 C CNN
|
||||
@@ -872,10 +872,10 @@ F 3 "" H 1400 2300 60 0001 C CNN
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R5
|
||||
L R R6
|
||||
U 1 1 549891AC
|
||||
P 2050 2800
|
||||
F 0 "R5" V 2130 2800 50 0000 C CNN
|
||||
F 0 "R6" V 2130 2800 50 0000 C CNN
|
||||
F 1 "10K" V 2050 2800 50 0000 C CNN
|
||||
F 2 "" H 2050 2800 60 0001 C CNN
|
||||
F 3 "" H 2050 2800 60 0001 C CNN
|
||||
@@ -998,10 +998,10 @@ F 3 "" H 9100 5400 60 0001 C CNN
|
||||
0 1 -1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R6
|
||||
L R R7
|
||||
U 1 1 549881D8
|
||||
P 8850 5600
|
||||
F 0 "R6" V 8930 5600 50 0000 C CNN
|
||||
F 0 "R7" V 8930 5600 50 0000 C CNN
|
||||
F 1 "100K" V 8850 5600 50 0000 C CNN
|
||||
F 2 "" H 8850 5600 60 0001 C CNN
|
||||
F 3 "" H 8850 5600 60 0001 C CNN
|
||||
@@ -40954,12 +40954,12 @@ $EndComp
|
||||
$Comp
|
||||
L +BATT U?
|
||||
U 1 1 549E8260
|
||||
P 5450 3750
|
||||
F 0 "U?" H 5450 3700 60 0001 C CNN
|
||||
F 1 "+BATT" H 5450 3850 50 0000 C BNN
|
||||
F 2 "" H 5450 3750 60 0001 C CNN
|
||||
F 3 "" H 5450 3750 60 0001 C CNN
|
||||
1 5450 3750
|
||||
P 5650 3800
|
||||
F 0 "U?" H 5650 3750 60 0001 C CNN
|
||||
F 1 "+BATT" H 5650 3900 50 0000 C BNN
|
||||
F 2 "" H 5650 3800 60 0001 C CNN
|
||||
F 3 "" H 5650 3800 60 0001 C CNN
|
||||
1 5650 3800
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
@@ -41022,24 +41022,24 @@ F 3 "" H 10450 4200 60 0001 C CNN
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R?
|
||||
L R R6
|
||||
U 1 1 549E8FFF
|
||||
P 10450 3850
|
||||
F 0 "R?" V 10530 3850 50 0000 C CNN
|
||||
F 0 "R6" V 10530 3850 50 0000 C CNN
|
||||
F 1 "10K" V 10450 3850 50 0000 C CNN
|
||||
F 2 "" H 10450 3850 60 0001 C CNN
|
||||
F 3 "" H 10450 3850 60 0001 C CNN
|
||||
1 10450 3850
|
||||
-1 0 0 -1
|
||||
$EndComp
|
||||
Text Label 6500 7150 2 42 ~ 0
|
||||
OpenTX I/O
|
||||
Text GLabel 5250 7150 2 42 Output ~ 0
|
||||
Text Label 6550 7450 2 42 ~ 0
|
||||
OpenTX output
|
||||
Text GLabel 5250 7450 2 42 Output ~ 0
|
||||
port pin (initial state)
|
||||
Text Notes 5500 7050 0 60 ~ 0
|
||||
Caption
|
||||
Text Notes 5450 7300 0 60 ~ 0
|
||||
Pinout caption :
|
||||
Text Label 5550 2550 2 42 ~ 0
|
||||
Gain = 1 + R3/R6
|
||||
Gain = 1 + R2/R6
|
||||
$Bitmap
|
||||
Pos 4600 4650
|
||||
Scale 1.000000
|
||||
@@ -41200,7 +41200,7 @@ Wire Wire Line
|
||||
Wire Wire Line
|
||||
2400 1700 2500 1700
|
||||
Wire Wire Line
|
||||
6050 4350 6050 4450
|
||||
6250 4400 6250 4500
|
||||
Wire Wire Line
|
||||
9600 2250 9450 2250
|
||||
Wire Wire Line
|
||||
@@ -41604,7 +41604,7 @@ Wire Wire Line
|
||||
Wire Wire Line
|
||||
10750 3800 10750 4200
|
||||
Wire Wire Line
|
||||
6450 3850 6050 3850
|
||||
6650 3900 6250 3900
|
||||
Wire Wire Line
|
||||
1900 1450 1900 1700
|
||||
Wire Wire Line
|
||||
@@ -41642,9 +41642,9 @@ Wire Wire Line
|
||||
Wire Wire Line
|
||||
4400 1350 4850 1350
|
||||
Wire Wire Line
|
||||
5450 3750 5450 3850
|
||||
5650 3800 5650 3900
|
||||
Wire Wire Line
|
||||
5450 3850 5550 3850
|
||||
5650 3900 5750 3900
|
||||
Wire Wire Line
|
||||
7500 4600 8600 4600
|
||||
Connection ~ 8300 4600
|
||||
@@ -41664,9 +41664,9 @@ Wire Wire Line
|
||||
Wire Wire Line
|
||||
10450 4100 10450 4200
|
||||
Wire Wire Line
|
||||
6050 7150 6500 7150
|
||||
6050 7450 6550 7450
|
||||
Wire Wire Line
|
||||
5100 7150 5250 7150
|
||||
5100 7450 5250 7450
|
||||
Wire Wire Line
|
||||
4700 4650 4700 4300
|
||||
Wire Wire Line
|
||||
@@ -41738,4 +41738,16 @@ F 3 "" H 1750 7050 60 0000 C CNN
|
||||
1 1750 7050
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
Text Notes 4850 6550 0 42 ~ 0
|
||||
LCD supported : ST7565P, ST7565R, ERC12864FSF, ST7920\nProtocol = 6800, 8 bits parallel mode\n\nLCD pinout labels (may differ, depending of brand) :\nRD = Read or Enable on ST7920\nWR = WRite or Write(0)/Read(1) on ST7920\nA0 = R/S (register select) or D/I (data/instruction select)\nRST = RES (reset)\nCS = Chip Select (not used on ST7920)
|
||||
Text Label 6550 7550 2 42 ~ 0
|
||||
OpenTX input
|
||||
Text GLabel 5250 7550 2 42 Input ~ 0
|
||||
port pin (initial state)
|
||||
Wire Wire Line
|
||||
6050 7550 6550 7550
|
||||
Wire Wire Line
|
||||
5100 7550 5250 7550
|
||||
Text Notes 2300 2950 0 60 ~ 0
|
||||
NOTA : all features are optional !\nM2560 can properly work without switch deboucing,\nrotary encoder or PPM / power management.\nMinimum requirement is just LCD and navigation keys.\nSome switches could be usefull, especially for flight\nconditions, but not fundamental.
|
||||
$EndSCHEMATC
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+13
-7
@@ -57,6 +57,10 @@ PCB = 9X
|
||||
# PCB revision
|
||||
PCBREV =
|
||||
|
||||
# LCD
|
||||
# Values: DEFAULT, ST7565P, ST7565R, ERC12864FSF, ST7920
|
||||
LCD = DEFAULT
|
||||
|
||||
# Enable JETI-Telemetry or FrSky Telemetry reception on UART0
|
||||
# For this option you need to modify your hardware!
|
||||
# More information at [insertURLhere]
|
||||
@@ -696,13 +700,7 @@ ifeq ($(PCB), MEGA2560)
|
||||
BITMAPS += bitmaps/9X/splash.lbm bitmaps/9X/asterisk.lbm bitmaps/9X/about.lbm
|
||||
GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp
|
||||
|
||||
# LCD driver
|
||||
# Values: ST7565P(default), ST7565R
|
||||
LCD = ST7565P
|
||||
ifeq ($(LCD), ST7565R)
|
||||
CPPDEFS += -DLCD_ST7565R
|
||||
endif
|
||||
EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/stock/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp
|
||||
EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/stock/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp
|
||||
|
||||
ifeq ($(SDCARD), YES)
|
||||
EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/gruvin9x/diskio.cpp
|
||||
@@ -1087,6 +1085,14 @@ ifeq ($(TURNIGY_TRANSMITTER_FIX), YES)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(LCD), ST7565R)
|
||||
CPPDEFS += -DLCD_ST7565R
|
||||
else ifeq ($(LCD), ERC12864FSF)
|
||||
CPPDEFS += -DLCD_ERC12864FSF
|
||||
else ifeq ($(LCD), ST7920)
|
||||
CPPDEFS += -DLCD_ST7920
|
||||
endif
|
||||
|
||||
ifeq ($(AUTOSWITCH), YES)
|
||||
CPPDEFS += -DAUTOSWITCH
|
||||
endif
|
||||
|
||||
@@ -48,7 +48,7 @@ inline void boardInit()
|
||||
DDRE = 0b00000010; PORTE = 0b11111100; // 7:N/A, 6:N/A, 5:RENC1_B, 4:RENC1_A, 3:N/A, 2:N/A, 1:TELEM_TX, 0:TELEM_RX
|
||||
DDRF = 0b00000000; PORTF = 0b11111111; // 7-0:Trim switch inputs
|
||||
DDRG = 0b00000000; PORTG = 0b11111111; // 7:N/A, 6:N/A, 5:N/A, 4:N/A, 3:N/A, 2:TCut_SW, 1:Gear_SW, 0: RudDr_SW
|
||||
DDRH = 0b00011000; PORTH = 0b11110110; // 7:N/A, 6:RFPw, 5:JackPres, 4:HoldPw, 3:Speaker, 2:N/A, 1:N/A, 0:Haptic
|
||||
DDRH = 0b00011000; PORTH = 0b11110110; // 7:N/A, 6:RF_Activated, 5:DSC_Activated, 4:Hold_Pwower, 3:Speaker, 2:N/A, 1:N/A, 0:Haptic
|
||||
DDRJ = 0b00000000; PORTJ = 0b11111111; // 7:N/A, 6:N/A, 5:N/A, 4:N/A, 3:N/A, 2:N/A, 1:RENC2_push, 0:RENC1_push
|
||||
DDRK = 0b00000000; PORTK = 0b00000000; // Analogic input (no pull-ups)
|
||||
DDRL = 0b00000000; PORTL = 0b11111111; // 7:TRN_SW 6:EleDR_SW, 5:ESC, 4:MENU 3:Keyb_Left, 2:Keyb_Right, 1:Keyb_Up, 0:Keyb_Down
|
||||
@@ -98,7 +98,7 @@ uint8_t pwrCheck()
|
||||
|
||||
void pwrOff()
|
||||
{
|
||||
PORTH = 0xEF; // PortH-4 set to 0
|
||||
PORTH &= ~0x10; // PortH-4 set to 0
|
||||
}
|
||||
|
||||
FORCEINLINE uint8_t keyDown()
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
#define PAUSE_PPMIN_INTERRUPT() TIMSK3 &= ~(1<<ICIE3)
|
||||
#define RESUME_PPMIN_INTERRUPT() TIMSK3 |= (1<<ICIE3)
|
||||
|
||||
#define SLAVE_MODE() ~PINH & (1<<INP_H_RF_POW)
|
||||
#define SLAVE_MODE() ~PINH & (1<<INP_H_RF_Activated)
|
||||
#define JACK_PPM_OUT() PORTB |= (1<<OUT_B_SIM_CTL)
|
||||
#define JACK_PPM_IN() PORTB &= ~(1<<OUT_B_SIM_CTL)
|
||||
#define __BACKLIGHT_ON PORTC |= (1<<OUT_C_LIGHT)
|
||||
@@ -133,9 +133,9 @@ void sdPoll10ms(void);
|
||||
# define INP_D_I2C_SDA 0
|
||||
# define INP_E_TELEM_RX 1
|
||||
# define OUT_E_TELEM_TX 0
|
||||
# define INP_H_RF_POW 6
|
||||
//#define INP_H_ 5 //reserved JACKPRES
|
||||
//#define INP_H_ 4 //reserved HOLDPWR
|
||||
# define INP_H_RF_Activated 6
|
||||
//#define INP_H_ 5 //reserved DSC_Activated, for pwrCheck()
|
||||
//#define INP_H_ 4 //reserved Hold_Power, for pwrCheck()
|
||||
# define OUT_H_Speaker 3
|
||||
# define OUT_H_HAPTIC 0
|
||||
|
||||
|
||||
@@ -36,18 +36,11 @@
|
||||
|
||||
#include "opentx.h"
|
||||
|
||||
#define delay_1us() _delay_us(1)
|
||||
#define delay_2us() _delay_us(2)
|
||||
void delay_1_5us(uint16_t ms)
|
||||
{
|
||||
for (uint16_t i=0; i<ms; i++) delay_1us();
|
||||
}
|
||||
|
||||
void lcdSendCtl(uint8_t val)
|
||||
{
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_CS1);
|
||||
#ifdef LCD_MULTIPLEX
|
||||
DDRA = 0xFF; // set LCD_DAT pins to output
|
||||
DDRA = 0xFF; //Set LCD_DAT pins to output
|
||||
#endif
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_A0);
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_RnW);
|
||||
@@ -56,7 +49,7 @@ void lcdSendCtl(uint8_t val)
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_E);
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_A0);
|
||||
#ifdef LCD_MULTIPLEX
|
||||
DDRA = 0x00; // set LCD_DAT pins to input
|
||||
DDRA = 0x00; //Set LCD_DAT pins to input
|
||||
#endif
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_CS1);
|
||||
}
|
||||
@@ -72,10 +65,11 @@ volatile uint8_t LcdLock ;
|
||||
|
||||
const static pm_uchar lcdInitSequence[] PROGMEM =
|
||||
{
|
||||
#ifdef LCD_ST7565R
|
||||
//ST7565 eq. : KS0713, SED1565, S6B1713, SPLC501C, NT7532 /34 /38, TL03245
|
||||
#if defined(LCD_ST7565R)
|
||||
0xE2, //Initialize the internal functions
|
||||
0xAE, //DON = 0: display OFF
|
||||
0xA0, //ADC = 0: normal direction(SEG132->SEG1)
|
||||
0xA0, //ADC = 0: normal direction (SEG132->SEG1)
|
||||
0xA6, //REV = 0: non-reverse display
|
||||
0xA4, //EON = 0: normal display. non-entire
|
||||
0xA2, //Select LCD bias
|
||||
@@ -85,11 +79,11 @@ const static pm_uchar lcdInitSequence[] PROGMEM =
|
||||
0x81, //Set reference voltage Mode
|
||||
0x22, //24 SV5 SV4 SV3 SV2 SV1 SV0 = 0x18
|
||||
0xAF, //DON = 1: display ON
|
||||
0x60 //sets the display start line to zero
|
||||
#elif LCD_ERC12864FSF
|
||||
0x60 //Set the display start line to zero
|
||||
#elif defined(LCD_ERC12864FSF)
|
||||
0xE2, //Initialize the internal functions
|
||||
0xAE, //DON = 0: display OFF
|
||||
0xA1, //ADC = 1: reverse direction(SEG132->SEG1)
|
||||
0xA1, //ADC = 1: reverse direction (SEG132->SEG1)
|
||||
0xA6, //REV = 0: non-reverse display
|
||||
0xA4, //EON = 0: normal display. non-entire
|
||||
0xA3, //Select LCD bias
|
||||
@@ -99,7 +93,13 @@ const static pm_uchar lcdInitSequence[] PROGMEM =
|
||||
0x81, //Set reference voltage Mode
|
||||
0x2D, //24 SV5 SV4 SV3 SV2 SV1 SV0
|
||||
0xAF //DON = 1: display ON
|
||||
#else
|
||||
#elif defined(LCD_ST7920)
|
||||
0x30, //Set 8-bit interface
|
||||
0x36, //Repeat with graphics bit set to ON
|
||||
0x0C, //Display ON, cursor and blink OFF
|
||||
0x01, //Clear display, reset address
|
||||
0x06 //Display ON, no cursor
|
||||
#else //ST7565P (default 9x LCD)
|
||||
0xE2, //Initialize the internal functions
|
||||
0xAE, //DON = 0: display OFF
|
||||
0xA1, //ADC = 1: reverse direction(SEG132->SEG1)
|
||||
@@ -117,62 +117,104 @@ const static pm_uchar lcdInitSequence[] PROGMEM =
|
||||
|
||||
inline void lcdInit()
|
||||
{
|
||||
// /home/thus/txt/datasheets/lcd/KS0713.pdf
|
||||
// ~/txt/flieger/ST7565RV17.pdf from http://www.glyn.de/content.asp?wdid=132&sid=
|
||||
|
||||
LCD_LOCK();
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_RES); //LCD_RES
|
||||
delay_2us();
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_RES); // f524 sbi 0x15, 2 IOADR-PORTC_LCD_CTRL; 21 1
|
||||
delay_1_5us(1500);
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_RES); //LCD reset
|
||||
_delay_us(2);
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_RES); //LCD normal operation
|
||||
#ifdef LCD_ST7920
|
||||
_delay_ms(40);
|
||||
#else
|
||||
_delay_us(1500);
|
||||
#endif
|
||||
for (uint8_t i=0; i<DIM(lcdInitSequence); i++) {
|
||||
lcdSendCtl(pgm_read_byte(&lcdInitSequence[i])) ;
|
||||
#ifdef LCD_ST7920
|
||||
_delay_us(80);
|
||||
#endif
|
||||
}
|
||||
#ifdef LCD_ERC12864FSF
|
||||
g_eeGeneral.contrast = 0x2D;
|
||||
#else
|
||||
g_eeGeneral.contrast = 0x22;
|
||||
#endif
|
||||
#ifdef LCD_ERC12864FSF
|
||||
g_eeGeneral.contrast = 0x2D;
|
||||
#else
|
||||
g_eeGeneral.contrast = 0x22;
|
||||
#endif
|
||||
LCD_UNLOCK();
|
||||
}
|
||||
|
||||
void lcdSetRefVolt(uint8_t val)
|
||||
{
|
||||
LCD_LOCK();
|
||||
lcdSendCtl(0x81);
|
||||
lcdSendCtl(val);
|
||||
LCD_UNLOCK();
|
||||
#ifndef LCD_ST7920 //No contrast setting for ST7920
|
||||
LCD_LOCK();
|
||||
lcdSendCtl(0x81);
|
||||
lcdSendCtl(val);
|
||||
LCD_UNLOCK();
|
||||
#endif
|
||||
}
|
||||
|
||||
void lcdRefresh()
|
||||
{
|
||||
LCD_LOCK();
|
||||
#ifdef LCD_ST7920
|
||||
uint8_t x_addr = 0;
|
||||
uint8_t y_addr = 0;
|
||||
uint16_t line_offset = 0;
|
||||
uint8_t col_offset = 0;
|
||||
uint16_t byte_offset = 0;
|
||||
uint8_t bit_count = 0;
|
||||
for(uint8_t y=0; y < 64; y++) {
|
||||
x_addr = 0;
|
||||
//Convert coordinates to weirdly-arranged 128x64 screen (the ST7920 is mapped for 256x32 displays)
|
||||
if (y > 31)
|
||||
{
|
||||
y_addr = y - 32; //Because there are only 31 addressable lines in the ST7920
|
||||
x_addr += 8; //so we overflow x (7 visible bytes per line) to reach the bottom half
|
||||
}else{
|
||||
y_addr = y;
|
||||
}
|
||||
lcdSendCtl( 0x80 | y_addr ); //Set Vertical Address
|
||||
_delay_us(49);
|
||||
lcdSendCtl( 0x80 | x_addr ); //Set Horizontal Address
|
||||
_delay_us(49);
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_A0); //HIGH RS and LOW RW will put the LCD to
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_RnW); //Write data register mode
|
||||
bit_count = y & 0x07; //Count from 0 bis 7 -> 0=0, 1=1..7=7, 8=0, 9=1...
|
||||
col_offset = 1 << bit_count; //Build a value for a AND operation with the vorrect bitposition
|
||||
line_offset = ( y / 8 ) * 128; //On the ST7565 there are 8 lines with each 128 bytes width
|
||||
for (coord_t x=0; x < 16; x++) { //Walk through 16 bytes form left to right (128 Pixel)
|
||||
byte_offset = line_offset + ( x * 8 ); //Calculate the position of the first byte im array
|
||||
//adressing the bytes sequential and shift the bits at the correct position, afterwards a OR operation to get all bits in one byte
|
||||
//the position of the LSB is the left-most position of the byte to the ST7920
|
||||
PORTA_LCD_DAT = (((displayBuf[byte_offset] & col_offset) >> bit_count) << 7) | (((displayBuf[byte_offset + 1] & col_offset) >> bit_count) << 6) | (((displayBuf[byte_offset + 2] & col_offset) >> bit_count ) << 5) | (((displayBuf[byte_offset + 3] & col_offset) >> bit_count ) << 4) | (((displayBuf[byte_offset + 4] & col_offset) >> bit_count ) << 3) | (((displayBuf[byte_offset + 5] & col_offset) >> bit_count ) << 2) | (((displayBuf[byte_offset + 6] & col_offset) >> bit_count ) << 1) | (((displayBuf[byte_offset + 7] & col_offset) >> bit_count ) << 0);
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_E);
|
||||
_delay_us(8);
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_E);
|
||||
_delay_us(49);
|
||||
}
|
||||
}
|
||||
#else //All other LCD
|
||||
uint8_t *p=displayBuf;
|
||||
for(uint8_t y=0; y < 8; y++) {
|
||||
|
||||
#ifdef LCD_ST7565R
|
||||
lcdSendCtl(0x01);
|
||||
#else
|
||||
lcdSendCtl(0x04);
|
||||
#endif
|
||||
|
||||
lcdSendCtl(0x10); //column addr 0
|
||||
lcdSendCtl( y | 0xB0); //page addr y
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_CS1);
|
||||
#ifdef LCD_MULTIPLEX
|
||||
DDRA = 0xFF; // set LCD_DAT pins to output
|
||||
#endif
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_A0);
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_RnW);
|
||||
for (coord_t x=LCD_W; x>0; --x) {
|
||||
PORTA_LCD_DAT = *p++;
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_E);
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_E);
|
||||
}
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_A0);
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_CS1);
|
||||
for(uint8_t y=0; y < 8; y++) {
|
||||
#ifdef LCD_ST7565R
|
||||
lcdSendCtl(0x01);
|
||||
#else
|
||||
lcdSendCtl(0x04);
|
||||
#endif
|
||||
lcdSendCtl(0x10); //Column addr 0
|
||||
lcdSendCtl( y | 0xB0); //Page addr y
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_CS1);
|
||||
#ifdef LCD_MULTIPLEX
|
||||
DDRA = 0xFF; //Set LCD_DAT pins to output
|
||||
#endif
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_A0);
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_RnW);
|
||||
for (coord_t x=LCD_W; x>0; --x) {
|
||||
PORTA_LCD_DAT = *p++;
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_E);
|
||||
PORTC_LCD_CTRL &= ~(1<<OUT_C_LCD_E);
|
||||
}
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_A0);
|
||||
PORTC_LCD_CTRL |= (1<<OUT_C_LCD_CS1);
|
||||
}
|
||||
#endif
|
||||
LCD_UNLOCK();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user