OSDN Git Service

[General] Add support of PIC18F45K20.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 12 Jun 2013 10:57:48 +0000 (19:57 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 12 Jun 2013 10:57:48 +0000 (19:57 +0900)
[Disp][ACM1602] Add support parallel lcd.

i2c_io.c
i2c_io.h
iodef.h
lcd_acm1602.c
lcd_acm1602.h
main.c
ui.c

index 7a1ff96..651b8f1 100644 (file)
--- a/i2c_io.c
+++ b/i2c_io.c
@@ -31,6 +31,7 @@
 
 #include "i2c_io.h"
 
+#ifdef _I2C_IO_TWO_MSSPS
 void i2c1_init(void)
 {
     unsigned char b;
@@ -39,7 +40,6 @@ void i2c1_init(void)
     b = b | _SSPEN | _SSPM3;
     SSP1CON1 = b;
 }
-
 void i2c2_init(void)
 {
     unsigned char b;
@@ -49,3 +49,25 @@ void i2c2_init(void)
     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
index 16db6a3..4acfa39 100644 (file)
--- a/i2c_io.h
+++ b/i2c_io.h
@@ -29,6 +29,7 @@
 #include <pic18fregs.h> /* ONLY FOR PIC18x */
 
 #include <i2c.h>
+#include "iodef.h"
 
 #ifndef I2C_IO_H
 #define        I2C_IO_H
diff --git a/iodef.h b/iodef.h
index 012f89c..e3c6e7e 100644 (file)
--- a/iodef.h
+++ b/iodef.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
index 2e54f5f..bf88a52 100644 (file)
  *  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();
@@ -41,18 +43,12 @@ static void sendcmd(unsigned char addr, unsigned char cmd)
 
 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)
@@ -63,7 +59,83 @@ 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)
@@ -81,12 +153,7 @@ 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();
 }
 
@@ -120,6 +187,7 @@ void acm1602_cursordir(unsigned char addr, unsigned char right)
 
 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){
index d5b58aa..443646f 100644 (file)
@@ -33,6 +33,7 @@
 #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);
diff --git a/main.c b/main.c
index b3fde8d..1c80a83 100644 (file)
--- a/main.c
+++ b/main.c
@@ -45,6 +45,7 @@
 /*
  * 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)
diff --git a/ui.c b/ui.c
index 83076cf..984f6c3 100644 (file)
--- a/ui.c
+++ b/ui.c
@@ -50,6 +50,8 @@ void keyin_init(void)
 
 }
 
+#if defined(__18F23K22) || defined(__18F24K22) || defined(__18F25K22) || defined(__18F26K22)
+
 void keyin_ioinit(void)
 {
     /* Initialize IOPORTS*/
@@ -68,7 +70,44 @@ void keyin_ioinit(void)
     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.
  */