[Disp][ACM1602] Add support parallel lcd.
#include "i2c_io.h"
+#ifdef _I2C_IO_TWO_MSSPS
void i2c1_init(void)
{
unsigned char b;
b = b | _SSPEN | _SSPM3;
SSP1CON1 = b;
}
-
void i2c2_init(void)
{
unsigned char b;
SSP2CON1 = b;
}
+#elif defined(_I2C_IO_ONE_MSSP)
+void i2c1_init(void)
+{
+ unsigned char b;
+ b = SSPCON1;
+ b &= ~(_WCOL | _SSPOV);
+ b = b | _SSPEN | _SSPM3;
+ SSPCON1 = b;
+}
+void i2c2_init(void)
+{
+ i2c1_init();
+}
+
+#else // None MSSP, Software I2C
+void i2c1_init(void)
+{
+}
+void i2c2_init(void)
+{
+}
+#endif
#include <pic18fregs.h> /* ONLY FOR PIC18x */
#include <i2c.h>
+#include "iodef.h"
#ifndef I2C_IO_H
#define I2C_IO_H
extern "C" {
#endif
+/*
+ * Machine depended flags
+ */
+#if defined(__18F23K22) || defined(__18F24K22) || defined(__18F25K22) || defined(__18F26K22)
+#define _I2C_IO_TWO_MSSPS
+#define _PIO_HAS_THREE
+#endif
+
+#if defined(__18F43K20) || defined(__18F44K20) || defined(__18F45K20) || defined(__18F46K20)
+#define _I2C_IO_ONE_MSSP
+#define _PIO_HAS_FIVE
+#endif
/*
* MAP OF IOPORT
* the executable file might be covered by the GNU General Public License.
*/
+#include "iodef.h"
#include "lcd_acm1602.h"
+#ifdef _USE_I2C_1602
static void sendcmd(unsigned char addr, unsigned char cmd)
{
i2c_idle();
static void delay_lcd(void)
{
- delay1ktcy(40); // (1000cycle * (8*5) = 5ms
+ _ACM1602_LONG_WAIT(); // Wait 0.1ms
}
-void acm1602_cls(unsigned char addr)
+static void acm1602_ioinit(addr)
{
- i2c_idle();
- OPENASMASTER();
- i2c_writechar(addr);
- i2c_writechar(0x00); // CMD
- i2c_writechar(0x01); // CLS
- CLOSEASMASTER();
- delay_lcd();
+ return;
}
void acm1602_putchar(unsigned char addr, unsigned char c)
i2c_writechar(0x80); //Data
i2c_writechar(c); // Putchar
CLOSEASMASTER();
- delay1ktcy(1); //0.1ms
+ _ACM1602_SHORT_WAIT(); // Wait 0.1ms
+}
+
+#else // Parallel
+/*
+ * Default values, You should re-define in iodef.h if you need.
+ */
+#ifndef _LCDPORT_DATA
+#define _LCDPORT_DATA PORTD
+#define _LCDPORT_TRIS_DATA TRISD
+#define _LCDPORT_LATCH_DATA LATD
+#endif
+
+#ifndef _LCDPORT_CONT
+#define _LCDPORT_CONT PORTE
+#define _LCDPORT_TRIS_CONT TRISE
+#define _LCDPORT_CONT_RS _PORTE_RE0
+#define _LCDPORT_CONT_RW _PORTE_RE1
+#define _LCDPORT_CONT_EN _PORTE_RE2
+#define _LCDPORT_CONT_LATCH LATE
+#endif
+
+static void delay_lcd(void)
+{
+ _ACM1602_LONG_WAIT();
+}
+
+static void acm1602_ioinit(unsigned char addr)
+{
+ unsigned char b;
+ b = _LCDPORT_TRIS_CONT;
+ b &= ~(_LCDPORT_CONT_RS | _LCDPORT_CONT_RW | _LCDPORT_CONT_EN);
+ _LCDPORT_TRIS_CONT = b; // Clear Tristate bits, output.
+ b = _LCDPORT_CONT;
+ b &= ~(_LCDPORT_CONT_RS | _LCDPORT_CONT_RW | _LCDPORT_CONT_EN);
+ _LCDPORT_CONT_LATCH = b;
+ _LCDPORT_TRIS_DATA = 0x00; // OUT
+ _LCDPORT_LATCH_DATA = 0x00;
+}
+
+static void sendcmd(unsigned char addr, unsigned char cmd)
+{
+ unsigned char b;
+ b = _LCDPORT_CONT;
+ b &= ~(_LCDPORT_CONT_RS | _LCDPORT_CONT_RW); // RS='0',RW='0'
+ _LCDPORT_CONT_LATCH = b;
+ _LCDPORT_LATCH_DATA = cmd;
+ b |= _LCDPORT_CONT_EN; // Send CMD
+ _LCDPORT_CONT_LATCH = b;
+ _ACM1602_TC_WAIT(); // Wait 2.5?us
+ b &= ~_LCDPORT_CONT_EN; // Disable EN
+ _LCDPORT_CONT_LATCH = b;
+ // End of Command.
+}
+
+void acm1602_putchar(unsigned char addr, unsigned char c)
+{
+ unsigned char b;
+ b = _LCDPORT_CONT;
+ b &= ~_LCDPORT_CONT_RW; // ,RW='0'
+ b |= _LCDPORT_CONT_RS; // RS='1"
+ _LCDPORT_CONT_LATCH = b;
+ _LCDPORT_LATCH_DATA = c;
+ b |= _LCDPORT_CONT_EN; // Send character
+ _LCDPORT_CONT_LATCH = b;
+ _ACM1602_TC_WAIT(); // Wait 2.5?us
+ b &= ~_LCDPORT_CONT_EN; // Disable EN
+ _LCDPORT_CONT_LATCH = b;
+ _ACM1602_SHORT_WAIT(); // Wait 0.1ms
+}
+
+#endif
+
+void acm1602_cls(unsigned char addr)
+{
+ sendcmd(addr, 0x01);
+ delay_lcd();
}
void acm1602_locate(unsigned char addr, char x, char y)
void acm1602_home(unsigned char addr)
{
- i2c_idle();
- OPENASMASTER();
- i2c_writechar(addr);
- i2c_writechar(0x00); // CMD
- i2c_writechar(0x02); // HOME
- CLOSEASMASTER();
+ sendcmd(addr, 0x02);
delay_lcd();
}
void acm1602_init(unsigned char addr, unsigned char cls)
{
+ acm1602_ioinit(addr);
sendcmd(addr, 0x38); // 2lines, 8x10dot fonts.
sendcmd(addr, 0x0f); // Display ON.
if(cls == 0){
#include <delay.h>
#include <string.h>
+#include "iodef.h"
#include "i2c_io.h"
extern "C" {
#endif
+// Wait 5us
+#define _ACM1602_TC_WAIT() delay10tcy(4)
+// Wait 50us
+#define _ACM1602_SHORT_WAIT() delay100tcy(4)
+// Wait 5ms
+#define _ACM1602_LONG_WAIT() delay1ktcy(40)
+
void acm1602_cls(unsigned char addr);
void acm1602_putchar(unsigned char addr, unsigned char c);
void acm1602_locate(unsigned char addr, char x, char y);
/*
* Config words.
*/
+#if defined(__18F23K22) || defined(__18F24K22) || defined(__18F25K22) || defined(__18F26K22)
#pragma stack 0x200 256 // Set stack size to 256bytes.
#pragma config FOSC=INTIO67,BORV=190,BOREN=ON,PWRTEN=ON
#pragma config WDTEN=ON,WDTPS=32768
#pragma config CP0=OFF,CP1=OFF,CPB=OFF,CPD=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRTB=OFF,WRTC=OFF,WRTD=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTRB=OFF
-//__at(__CONFIG1H) _config1h = _FOSC_INTIO67_1H;
-//__at(__CONFIG2L) _config2l = _BORV_190_2L & _BOREN_ON_2L & _PWRTEN_ON_2L;
-//__at(__CONFIG2H) _config2h = _WDTEN_ON_2H & _WDTPS_32768_2H;
-//__at(__CONFIG3H) _config3h = _PBADEN_OFF_3H & _MCLRE_EXTMCLR_3H;
-//__at(__CONFIG4L) _config4l = _STVREN_ON_4L & _LVP_OFF_4L & _XINST_ON_4L & _DEBUG_ON_4L;
-//__at(__CONFIG5L) _config5l = _CP0_OFF_5L & _CP1_OFF_5L;
-//__at(__CONFIG5H) _config5h = _CPB_OFF_5H & _CPD_OFF_5H;
-//__at(__CONFIG6L) _config6l = _WRT0_OFF_6L & _WRT1_OFF_6L;
-//__at(__CONFIG6H) _config6h = _WRTD_OFF_6H & _WRTB_OFF_6H & _WRTC_OFF_6H;
-//__at(__CONFIG7L) _config7l = _EBTR0_OFF_7L & _EBTR1_OFF_7L;
-//__at(__CONFIG7H) _config7h = _EBTRB_OFF_7H;
+#endif
+// For 4xK20 or 2xK20 Series
+#if defined(__18F43K20) || defined(__18F44K20) || defined(__18F45K20) || defined(__18F46K20) || \
+ defined(__18F23K20) || defined(__18F24K20) || defined(__18F25K20) || defined(__18F26K20)
+#pragma stack 0x200 256
+#pragma config FOSC=INTIO67,FCMEN=ON,PWRT=ON,BOREN=ON,BORV=22
+#pragma config WDTEN=ON,WDTPS=32768,PBADEN=OFF,LPT1OSC=ON,MCLRE=ON
+#pragma config STRVEN=ON,DEBUG=ON
+#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF
+#pragma config CPB=OFF,CPD=OFF
+#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF
+#pragma config WRTC=OFF,WRTB=OFF,WRTD=OFF
+#pragma config EBTR0=OFF,EBTR1=OFFEBTR2=OFF,EBTR3=OFF,EBTRB=OFF
+#else // Another words.
+#endif
SIGHANDLER(TMR0_handler)
}
+#if defined(__18F23K22) || defined(__18F24K22) || defined(__18F25K22) || defined(__18F26K22)
+
void keyin_ioinit(void)
{
/* Initialize IOPORTS*/
ANSELC = AN_C_VAL;
TRISC = TRIS_C_VAL_O;
}
+#elif defined(__18F43K20) || defined(__18F44K20) || defined(__18F45K20) || defined(__18F46K20)
+
+void keyin_ioinit(void)
+{
+ /* Initialize IOPORTS*/
+ PORTA = 0x00;
+ LATA = 0x00;
+ ANSEL = 0x01; // Use RA0 AS ADC, Another is not used.
+ ANSELH = 0x00; //
+ TRISA = TRIS_A_VAL;
+ PORTB = 0x00;
+ LATB = 0x00;
+ TRISB = TRIS_B_VAL;
+
+ PORTC = 0x00;
+ LATC = 0x00;
+ TRISC = TRIS_C_VAL_O;
+}
+#else
+void keyin_ioinit(void)
+{
+ /* Initialize IOPORTS*/
+ PORTA = 0x00;
+ LATA = 0x00;
+// ANSEL = 0x01; // Use RA0 AS ADC, Another is not used.
+// ANSELH = 0x00; //
+ TRISA = TRIS_A_VAL;
+
+ PORTB = 0x00;
+ LATB = 0x00;
+ TRISB = TRIS_B_VAL;
+
+ PORTC = 0x00;
+ LATC = 0x00;
+ TRISC = TRIS_C_VAL_O;
+}
+#endif
/*
* Push to keyin fifo; not used atomic-writing.
*/