eddiewwm 发表于 2019-1-24 18:00:14

LGT8P663A OTP 初體驗

LGT8P663A 1k OTP SOP8L 是類PIC 的 MIC8S內核,有 RA0~RA5 共6個 I/O,開發時以類PIC12F609作基礎。

步驟:(參考廠商 "LGT8F690A开发指南.pdf")
1) 建議用廠商的SDKBuilder產生根據設備,產出所需基礎代碼,再用較舊的MPLAB IDE v8.92,配合 HI-TECH PICC v9.83作具體完整的編程。

2) 在MPLAB建立工程時,重點包括:
    a) 芯片要選PIC12F609
    b) 下要選
    c) 把頭文件 lgt8p663a.h 放到項目內
    d) 把轉碼工具 XIC2MIC 集成到MPLAB IDE,做法如下:
      i) 在根錄建立檔案夾並把放置,c:\mic8s\xic2mic
       ii) 在項目欄頂的帶 .MCP 名上按鼠標右鍵,在彈出的選單用選
      iii) 選 Custom Build 頁內的 Post-Build Step,並在命令行的框內填上:
         c:\mic8s\xic2mic --mh --ma -cm LGT8P663A -f $(TargetDir)u2spi.hex
         注意當中最後的u2spi.hex是原MPLAB IDE產生的hex檔名,不同項目是不同的。
      iv) 最終xic2mic會在MPLAB IDE的output窗內顯示進度和成功的訊息,並產生的 u2spi_mic.hex檔。

3) 使用LGTMix ISP程序配合小白盒,小白盒的VDD、GND、VPP、SWC、SWD要跟LGT8P663A接好,再選 u2spi_mic.hex 檔案進行燒錄。

以下是廠商提供的一個軟件19200串口和 SPI的編程範例 lgt8fp663a_u2spi:

u2spi.c
//----------------------------------------------------
// LGT8F684A test cases
// Case name : software SCI
//         decription:
//                UART/TX out of from RA5
//                UART settings:
//                        19200bps/8bit data/1bit stop/no parity
// Conditions:
//               +----------+
//        VCC =+                        += GND
//        TXD =+                        += MOSI
//        nCS =+                        += MISO
//        LED =+                        += SPCK
//               +----------+
//----------------------------------------------------

#include "lgt8p663a.h"
#include "usi.h"

// important CFW configuration

// funciton definition
void sys_init(void);
void io_init(void);
void tmr0_init(void);

u8 t0cnt = 0;

// hardware interrupt service
void interrupt hisr(void)
{
        // timer overflow
        if(T0IE && T0IF)
        {
                T0IF = 0;                               
                if(++t0cnt == 20) {
                        RA3 = ~RA3;
                        t0cnt = 0;
                }
        }
}

int main(void)
{
        u8 tmp;
       
        CWOK = 1;
        NOP();
        NOP();

        sys_init();
       
        while(1)
        {
                spi_putc(0x5a);
               
                uart_putc(0x55);
                uart_putc(0xaa);
               
                tmp = spi_getc();
                uart_putc(tmp);
               
                __delay_ms(100);               
        }
}

void sys_init(void)
{
        // disable system clock divider
        // uart/spi interface setup
        usi_init();

        // i/o setup
        io_init();

        // timer0 setup
        tmr0_init();

        // global interrupt enable
        GIE = 1;
}

void io_init(void)
{
        // enable all of RA for digital function
        ANSEL = 0;

        // enable pullup of RA3
        WPUA = 0b00001000;
       
        // enable RA global pullup
        nGPPU = 0;
       
        // RA3 to toggle
        TRISA3 = 0;
       
        // enable RA level change interrupt
        //GPIE = 1;
}

void tmr0_init(void)
{
        // T0CS = 0 : clock by internal osc
        // T0SE = not care
        // PSA = 0 : prescaler for timer0
        // PS = 0 : prescaler 1:256
        OPTION_REG |= 0x7;

        // set timer0 period to 50us
        // 8MHz/256 = 32us       
        // period = 32us * 200 = 16ms
        // PR0H = 1
        T0CON = (T0CON & 0xfc) | 0x1;
        PR0L = 0xD4;

        // enable timer 0 interrupt
        T0IE = 1;
}


usi.c
//-----------------------------------------
// software uart sender
//         bdr: 19200
//        data: 8bits
//        start: 1bit
//        stop: 1bit
//        parity: none
//-----------------------------------------

#include "lgt8p663a.h"
#include "usi.h"

void usi_init()
{
        // uart TXD output
        TXD = 1;
        TXDD = 0;
       
        // spi
        SPI_CS = 1;
        SPI_MO = 0;
        SPI_CK = 0;
       
        SPI_CS_DR = 0;
        SPI_CK_DR = 0;
        SPI_MO_DR = 0;
}

void uart_putc(u8 c)
{
        u8 i;
                       
        // send start bit
        TXD = 0;
        __delay_us(39);

        // send 8bits data
        for(i = 0; i < 8; i++) {
                TXD = c & 1;
                c = c >> 1;
                __delay_us(39);
        }

        // send stop bit
        TXD = 1;
        __delay_us(39);
        __delay_us(39);
}

void uart_puts(char *p)
{
        u8 *ptmp = (u8 *)p;
       
        while(*ptmp != '\0')
                uart_putc((u8)*ptmp++);
}

u8 spi_transfer(u8 data)
{
        u8 i, rev;
       
        SPI_CK = 0;
        rev = 0;
       
        for(i = 0; i < 8; i++) {
                if(data & 0x80) SPI_MO = 1;
                else SPI_MO = 0;
                rev <<= 1;
               
                SPI_CK = 1;        // posedge
               
                if(SPI_MI) rev |= 1;               
                data <<= 1;
               
                SPI_CK = 0; // negedge
        }

        return rev;       
}

usi.h
#ifndef __UART_H__
#define __UART_H__

// using RC(n) for uart txd line
#define        TXD RA5
// direction control for TXD
#define TXDD TRISA5

#define SPI_CS                 RA4
#define SPI_CS_DR         TRISA4

#define SPI_CK                 RA2
#define SPI_CK_DR        TRISA2

#define SPI_MI RA1
#define SPI_MI_DR        TRISA1

#define SPI_MO                 RA0
#define SPI_MO_DR         TRISA0

// system clock for 8M1T
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 32000000
#endif

// external interface
void usi_init();

void uart_putc(u8);
void uart_puts(char*);

u8 spi_transfer(u8);
#define spi_putc(value) spi_transfer(value)
#define spi_getc()        spi_transfer(0xff)

#endif

lgt8663a.h
#ifndef __LGT8P663A_H__
#define __LGT8P663A_H__

#ifndef _HTC_H_
#include <htc.h>
#endif

#ifndef INPUT
#define        INPUT        1
#endif

#ifndef OUTPUT
#define        OUTPUT        0
#endif

#ifndef ANALOG
#define        ANALOG 1
#endif

#ifndef DIGTIAL
#define DIGTIAL 0
#endif

// WKPF bit of STATUS
volatile bit WKPF                @((unsigned)&STATUS*8)+7;
volatile bit GPA1                @((unsigned)&STATUS*8)+6;
volatile bit GPA0                @((unsigned)&STATUS*8)+5;

// PORTA bit 6/7
volatile unsigned char         PORT                @ 0x005;
volatile unsigned char         L_PORTA                @ 0x005;
volatile bit RA6                @((unsigned)&PORTA*8)+6;
volatile bit RA7                @((unsigned)&PORTA*8)+7;
#ifndef _LIB_BUILD
volatile union {
        struct {
                unsigned        RA0        : 1;
                unsigned        RA1        : 1;
                unsigned        RA2        : 1;
                unsigned         RA3 : 1;
                unsigned        RA4        : 1;
                unsigned         RA5        : 1;
                unsigned        RA6        : 1;
                unsigned        RA7        : 1;
        };
} L_PORTAbits @ 0x005;
volatile union {
        struct {
                unsigned        RA0        : 1;
                unsigned        RA1        : 1;
                unsigned        RA2        : 1;
                unsigned         RA3 : 1;
                unsigned        RA4        : 1;
                unsigned         RA5        : 1;
                unsigned        RA6        : 1;
                unsigned        RA7        : 1;
        };
} L_PORTbits @ 0x005;
#endif

// INTCON
volatile bit INTIF                @((unsigned)&INTCON*8)+1;
volatile bit INTIE                @((unsigned)&INTCON*8)+4;

// PIR1.CGIF bit instead of EEIF
volatile bit CMIF                @((unsigned)&PIR1*8)+3;
volatile bit ECPIF                @((unsigned)&PIR1*8)+5;
volatile bit TWIF                @((unsigned)&PIR1*8)+7;

// T1CON.T1SYNC bits
volatile bit T1SYNC                @((unsigned)&T1CON*8)+2;
volatile bit nT1SYNC        @((unsigned)&T1CON*8)+2;
volatile bit T1GNV                @((unsigned)&T1CON*8)+7;

// DC0AL
volatile unsigned char         DC0AL                @ 0x011;

// DC0BL
volatile unsigned char         DC0BL                @ 0x012;

// DC1AL
volatile unsigned char         DC1AL                @ 0x013;

// DC1AH
volatile unsigned char         DC1AH                @ 0x014;

// ECP0CON : 0x015
volatile unsigned char         ECP0CON                @ 0x015;
volatile bit P0BPOL                @((unsigned)&ECP0CON*8)+0;
volatile bit P0APOL                @((unsigned)&ECP0CON*8)+1;
volatile bit DC0BH0                @((unsigned)&ECP0CON*8)+2;
volatile bit DC0BH1                @((unsigned)&ECP0CON*8)+3;
volatile bit DC0AH0                @((unsigned)&ECP0CON*8)+4;
volatile bit DC0AH1                @((unsigned)&ECP0CON*8)+5;
volatile bit P0BOEN                @((unsigned)&ECP0CON*8)+6;
volatile bit P0AOEN                @((unsigned)&ECP0CON*8)+7;
#ifndef _LIB_BUILD
volatile union {
        struct {
                unsigned        P0BPOL        : 1;
                unsigned        P0APOL        : 1;
                unsigned        DC0BH        : 2;
                unsigned         DC0AH        : 2;
                unsigned        P0BOEN        : 1;
                unsigned        P0AOEN        : 1;               
        };
} ECP0CONbits @ 0x015;
#endif

// PWM0CON : 0x016
volatile unsigned char         PWM0CON                @ 0x016;
volatile bit PWM0BDB0        @((unsigned)&PWM0CON*8)+0;
volatile bit PWM0BDB1        @((unsigned)&PWM0CON*8)+1;
volatile bit PWM0BDB2        @((unsigned)&PWM0CON*8)+2;
volatile bit PWM0BDB3        @((unsigned)&PWM0CON*8)+3;
volatile bit PWM0ADB0        @((unsigned)&PWM0CON*8)+4;
volatile bit PWM0ADB1        @((unsigned)&PWM0CON*8)+5;
volatile bit PWM0ADB2        @((unsigned)&PWM0CON*8)+6;
volatile bit PWM0M                @((unsigned)&PWM0CON*8)+7;
#ifndef _LIB_BUILD
volatile union {
        struct {
                unsigned        PWM0BDB        : 4;
                unsigned        PWM0ADB        : 3;
                unsigned        PWM0M        : 1;               
        };
} PWM0CONbits @ 0x016;
#endif

// ECP0AS : 0x017
volatile unsigned char         ECP0AS                @ 0x017;
volatile bit PSS0B0                @((unsigned)&ECP0AS*8)+0;
volatile bit PSS0B1                @((unsigned)&ECP0AS*8)+1;
volatile bit PSS0A0                @((unsigned)&ECP0AS*8)+2;
volatile bit PSS0A1                @((unsigned)&ECP0AS*8)+3;
volatile bit INTS0E                @((unsigned)&ECP0AS*8)+4;
volatile bit CMPS0E                @((unsigned)&ECP0AS*8)+5;
volatile bit PSR0EN                @((unsigned)&ECP0AS*8)+6;
volatile bit ECP0ASE        @((unsigned)&ECP0AS*8)+7;
#ifndef _LIB_BUILD
volatile union {
        struct {
                unsigned        PSS0B        : 2;
                unsigned        PSS0A        : 2;
                unsigned        INTS0E        : 1;
                unsigned         CMPS0E        : 1;
                unsigned        PSR0EN        : 1;
                unsigned        ECP0ASE        : 1;               
        };
} ECP0ASbits @ 0x017;
#endif

// PWM1CON : 0x018
volatile unsigned char         PWM1CON                @ 0x018;
volatile bit PWM1BDB0        @((unsigned)&PWM1CON*8)+0;
volatile bit PWM1BDB1        @((unsigned)&PWM1CON*8)+1;
volatile bit PWM1BDB2        @((unsigned)&PWM1CON*8)+2;
volatile bit PWM1BDB3        @((unsigned)&PWM1CON*8)+3;
volatile bit PWM1ADB0        @((unsigned)&PWM1CON*8)+4;
volatile bit PWM1ADB1        @((unsigned)&PWM1CON*8)+5;
volatile bit PWM1ADB2        @((unsigned)&PWM1CON*8)+6;
volatile bit PWM1M                @((unsigned)&PWM1CON*8)+7;
#ifndef _LIB_BUILD
volatile union {
        struct {
                unsigned        PWM1BDB        : 4;
                unsigned        PWM1ADB        : 3;
                unsigned        PWM1M        : 1;               
        };
} PWM1CONbits @ 0x018;
#endif

// VRCON
volatile unsigned char         L_VRCON                @ 0x019;
volatile bit VR0                @ ((unsigned)&VRCON*8)+0;
volatile bit VR1                @ ((unsigned)&VRCON*8)+1;
volatile bit VR2                @ ((unsigned)&VRCON*8)+2;
volatile bit VR3                @ ((unsigned)&VRCON*8)+3;
#ifndef _LIB_BUILD
volatile union {
    struct {
      unsigned        VR0                        : 1;
      unsigned        VR1                        : 1;
      unsigned        VR2                        : 1;
      unsigned        VR3                        : 1;
      unsigned        FVREN                : 1;
      unsigned        VRR                        : 1;
                unsigned                                : 1;
      unsigned        CMVREN                : 1;
    };
        struct {
                unsigned        VR                : 4;
        };
} L_VRCONbits @ 0x019;
#endif

// CMCON0 : 0x1A
volatile bit CMCH0                @((unsigned)&CMCON0*8)+0;
volatile bit CMCH1                @((unsigned)&CMCON0*8)+1;

// ECP1CON : 0x01B
volatile unsigned char         ECP1CON                @ 0x01B;
volatile bit P1BPOL                @((unsigned)&ECP1CON*8)+0;
volatile bit P1APOL                @((unsigned)&ECP1CON*8)+1;
volatile bit BUF1BE                @((unsigned)&ECP1CON*8)+2;
volatile bit BUF1AE                @((unsigned)&ECP1CON*8)+3;
volatile bit CAPM                @((unsigned)&ECP1CON*8)+4;
volatile bit CAPEN                @((unsigned)&ECP1CON*8)+5;
volatile bit P1BOEN                @((unsigned)&ECP1CON*8)+6;
volatile bit P1AOEN                @((unsigned)&ECP1CON*8)+7;
#ifndef _LIB_BUILD
volatile union {
        struct {
                unsigned        P1BPOL        : 1;
                unsigned        P1APOL        : 1;
                unsigned        BUF1BE        : 1;
                unsigned         BUF1AE        : 1;
                unsigned        CAPM        : 1;
                unsigned        CAPEN        : 1;
                unsigned        P1BOEN        : 1;
                unsigned        P1AOEN        : 1;               
        };
} ECP1CONbits @ 0x01B;
#endif

// CMCON1 : 0x1C
volatile bit CFEN0                @((unsigned)&CMCON1*8)+5;
volatile bit CFEN1                @((unsigned)&CMCON1*8)+6;
#ifndef _LIB_BUILD
volatile union {
        struct {
                unsigned                        : 5;
                unsigned        CFEN        : 2;
        };
} L_CMCON1bits @ 0x01C;
#endif

// ECP1AS : 0x01D
volatile unsigned char         ECP1AS                @ 0x01D;
volatile bit PSS1B0                @((unsigned)&ECP1AS*8)+0;
volatile bit PSS1B1                @((unsigned)&ECP1AS*8)+1;
volatile bit PSS1A0                @((unsigned)&ECP1AS*8)+2;
volatile bit PSS1A1                @((unsigned)&ECP1AS*8)+3;
volatile bit INTS1E                @((unsigned)&ECP1AS*8)+4;
volatile bit CMPS1E                @((unsigned)&ECP1AS*8)+5;
volatile bit PSR1EN                @((unsigned)&ECP1AS*8)+6;
volatile bit ECP1ASE        @((unsigned)&ECP1AS*8)+7;
#ifndef _LIB_BUILD
volatile union {
        struct {
                unsigned        PSS1B        : 2;
                unsigned        PSS1A        : 2;
                unsigned        INTS1E        : 1;
                unsigned         CMPS1E        : 1;
                unsigned        PSR1EN        : 1;
                unsigned        ECP1ASE        : 1;               
        };
} ECP1ASbits @ 0x01D;
#endif

// TRISA : 0x85
volatile bit TRIS0                @((unsigned)&TRISA*8)+0;
volatile bit TRIS1                @((unsigned)&TRISA*8)+1;
volatile bit TRIS2                @((unsigned)&TRISA*8)+2;
volatile bit TRIS3                @((unsigned)&TRISA*8)+3;
volatile bit TRIS4                @((unsigned)&TRISA*8)+4;
volatile bit TRIS5                @((unsigned)&TRISA*8)+5;
volatile bit TRIS6                @((unsigned)&TRISA*8)+6;
volatile bit TRIS7                @((unsigned)&TRISA*8)+7;
volatile bit TRISA6                @((unsigned)&TRISA*8)+6;
volatile bit TRISA7                @((unsigned)&TRISA*8)+7;
volatile bit RA0_DIR        @((unsigned)&TRISA*8)+0;
volatile bit RA1_DIR        @((unsigned)&TRISA*8)+1;
volatile bit RA2_DIR        @((unsigned)&TRISA*8)+2;
volatile bit RA3_DIR        @((unsigned)&TRISA*8)+3;
volatile bit RA4_DIR        @((unsigned)&TRISA*8)+4;
volatile bit RA5_DIR        @((unsigned)&TRISA*8)+5;
volatile bit RA6_DIR        @((unsigned)&TRISA*8)+6;
volatile bit RA7_DIR        @((unsigned)&TRISA*8)+7;

// PR1L : 0x88
volatile unsigned char         PR1L                @ 0x088;

// PR1H : 0x89
volatile unsigned char         PR1H                @ 0x089;

// PCHBUF : 0x8A
volatile unsigned char         PCHBUF                @ 0x08A;

// PIE1
volatile bit TWIE                @((unsigned)&PIE1*8)+7;
volatile bit ECPIE                @((unsigned)&PIE1*8)+5;

// TWDR : 0x8D
volatile unsigned char         TWDR                @ 0x08D;

// PCON : 0x8E
volatile bit LVR                @((unsigned)&PCON*8)+0;
volatile bit POR                @((unsigned)&PCON*8)+1;
volatile bit SWDD                @((unsigned)&PCON*8)+2;
volatile bit DPSM0                @((unsigned)&PCON*8)+3;
volatile bit DPSM1                @((unsigned)&PCON*8)+4;
volatile bit LVRE                @((unsigned)&PCON*8)+5;
volatile bit CWOK                @((unsigned)&PCON*8)+6;
volatile bit WDTE                @((unsigned)&PCON*8)+7;
#ifndef _LIB_BUILD
volatile union {
        struct {
                unsigned                        : 3;
                unsigned        DPSM        : 2;
        };
        struct {
                unsigned        : 3;
                unsigned        DPSM : 2;
        };
} L_PCONbits @ 0x08E;
#endif

// OSCTUNE : 0x90
volatile bit TUN5                @ ((unsigned)&OSCTUNE*8)+5;
volatile bit TUN6                @ ((unsigned)&OSCTUNE*8)+6;
volatile bit TUN7                @ ((unsigned)&OSCTUNE*8)+7;
#ifndef _LIB_BUILD
volatile union {
    struct {
      unsigned        TUN               : 8;
    };
    struct {
      unsigned        TUN0                : 1;
      unsigned        TUN1                : 1;
      unsigned        TUN2                : 1;
      unsigned        TUN3                : 1;
      unsigned        TUN4                : 1;
      unsigned        TUN5                : 1;
      unsigned        TUN6                : 1;
      unsigned        TUN7                : 1;
    };
} L_OSCTUNEbits @ 0x090;
#endif

// T0CON : 0x91
volatile unsigned char         T0CON                @ 0x091;
volatile bit PR0H0                        @ ((unsigned)&T0CON*8)+0;
volatile bit PR0H1                        @ ((unsigned)&T0CON*8)+1;
volatile bit T0H0         @ ((unsigned)&T0CON*8)+4;
volatile bit T0H1         @ ((unsigned)&T0CON*8)+5;
volatile bit T0D                 @ ((unsigned)&T0CON*8)+7;
#ifndef _LIB_BUILD
volatile union {
    struct {
      unsigned        PR0H        : 2;
                unsigned                        : 2;
      unsigned        T0H                : 2;
                unsigned                        : 1;
      unsigned        T0D                : 1;
    };
} T0CONbits @ 0x091;
#endif

// PR0L : 0x92
volatile unsigned char         PR0L                @ 0x092;

// DC1BL : 0x93
volatile unsigned char         DC1BL                @ 0x093;

// DC1BH : 0x94
volatile unsigned char         DC1BH                @ 0x094;

// ANSEL redefine
volatile bit RA0_ANS                @ ((unsigned)&ANSEL*8)+0;
volatile bit RA1_ANS                @ ((unsigned)&ANSEL*8)+1;
volatile bit RA2_ANS                @ ((unsigned)&ANSEL*8)+2;
volatile bit RA4_ANS                @ ((unsigned)&ANSEL*8)+3;
volatile bit RC0_ANS                @ ((unsigned)&ANSEL*8)+4;
volatile bit RC1_ANS                @ ((unsigned)&ANSEL*8)+5;
volatile bit RC2_ANS                @ ((unsigned)&ANSEL*8)+6;
volatile bit APP_ANS                     @ ((unsigned)&ANSEL*8)+6;
volatile bit RC3_ANS                @ ((unsigned)&ANSEL*8)+7;

// PUCR : 0x095
volatile unsigned char         PUCR                @ 0x095;
volatile unsigned char         PUAR                @ 0x095;
volatile bit PUC0                @ ((unsigned)&PUCR*8)+0;
volatile bit PUC1                @ ((unsigned)&PUCR*8)+1;
volatile bit PUC2                @ ((unsigned)&PUCR*8)+2;
volatile bit PUC3                @ ((unsigned)&PUCR*8)+3;
volatile bit PUC4                @ ((unsigned)&PUCR*8)+4;
volatile bit PUC5                @ ((unsigned)&PUCR*8)+5;
volatile bit PUC6                @ ((unsigned)&PUCR*8)+6;
volatile bit PUC7                @ ((unsigned)&PUCR*8)+7;
#ifndef _LIB_BUILD
volatile union {
    struct {
      unsigned        PUC0                : 1;
      unsigned        PUC1                : 1;
      unsigned        PUC2                : 1;
      unsigned        PUC3                : 1;
      unsigned        PUC4                : 1;
      unsigned        PUC5                : 1;
      unsigned        PUC6                : 1;
      unsigned        PUC7                : 1;               
    };       
} PUCRbits @ 0x095;
volatile union {
    struct {
      unsigned        PUA0                : 1;
      unsigned        PUA1                : 1;
      unsigned        PUA2                : 1;
      unsigned        PUA3                : 1;
      unsigned        PUA4                : 1;
      unsigned        PUA5                : 1;
      unsigned        PUA6                : 1;
      unsigned        PUA7                : 1;               
    };
} PUARbits @ 0x095;
#endif

// IOCR : 0x096
volatile unsigned char         IOCR                @ 0x096;
volatile bit IOC0                @ ((unsigned)&IOCR*8)+0;
volatile bit IOC1                @ ((unsigned)&IOCR*8)+1;
volatile bit IOC2                @ ((unsigned)&IOCR*8)+2;
volatile bit IOC3                @ ((unsigned)&IOCR*8)+3;
volatile bit IOC4                @ ((unsigned)&IOCR*8)+4;
volatile bit IOC5                @ ((unsigned)&IOCR*8)+5;
volatile bit IOC6                @ ((unsigned)&IOCR*8)+6;
volatile bit IOC7                @ ((unsigned)&IOCR*8)+7;
volatile bit IOCA6               @ ((unsigned)&IOCR*8)+6;
volatile bit IOCA7               @ ((unsigned)&IOCR*8)+7;
#ifndef _LIB_BUILD
volatile union {
    struct {
      unsigned        IOC0                : 1;
      unsigned        IOC1                : 1;
      unsigned        IOC2                : 1;
      unsigned        IOC3                : 1;
      unsigned        IOC4                : 1;
      unsigned        IOC5                : 1;
      unsigned        IOC6                : 1;
      unsigned        IOC7                : 1;               
    };
} IOCRbits @ 0x096;
#endif

// PDCR : 0x097
volatile unsigned char         PDCR                @ 0x097;
volatile unsigned char         PDAR                @ 0x097;
volatile bit PDC0                @ ((unsigned)&PDCR*8)+0;
volatile bit PDC1                @ ((unsigned)&PDCR*8)+1;
volatile bit PDC2                @ ((unsigned)&PDCR*8)+2;
volatile bit PDC3                @ ((unsigned)&PDCR*8)+3;
volatile bit PDC4                @ ((unsigned)&PDCR*8)+4;
volatile bit PDC5                @ ((unsigned)&PDCR*8)+5;
volatile bit PDC6                @ ((unsigned)&PDCR*8)+6;
volatile bit PDC7                @ ((unsigned)&PDCR*8)+7;
#ifndef _LIB_BUILD
volatile union {
    struct {
      unsigned        PDC0                : 1;
      unsigned        PDC1                : 1;
      unsigned        PDC2                : 1;
      unsigned        PDC3                : 1;
      unsigned        PDC4                : 1;
      unsigned        PDC5                : 1;
      unsigned        PDC6                : 1;
      unsigned        PDC7                : 1;               
    };
} PDCRbits @ 0x097;
volatile union {
    struct {
      unsigned        PDA0                : 1;
      unsigned        PDA1                : 1;
      unsigned        PDA2                : 1;
      unsigned        PDA3                : 1;
      unsigned        PDA4                : 1;
      unsigned        PDA5                : 1;
      unsigned        PDA6                : 1;
      unsigned        PDA7                : 1;               
    };
} PDARbits @ 0x097;
#endif

// TWSR : 0x098
volatile unsigned char         TWSR                @ 0x098;
volatile bit RXS                        @ ((unsigned)&TWSR*8)+0;
volatile bit RXD                        @ ((unsigned)&TWSR*8)+1;
volatile bit TXK                        @ ((unsigned)&TWSR*8)+2;
volatile bit RXP                        @ ((unsigned)&TWSR*8)+3;
volatile bit TXS                        @ ((unsigned)&TWSR*8)+4;
volatile bit TXD                        @ ((unsigned)&TWSR*8)+5;
volatile bit RXK                        @ ((unsigned)&TWSR*8)+6;
volatile bit TXP                        @ ((unsigned)&TWSR*8)+7;
#ifndef _LIB_BUILD
volatile union {
    struct {
      unsigned        RXS                : 1;
      unsigned        RXD                : 1;
      unsigned        TXK                : 1;
      unsigned        RXP                : 1;
      unsigned        TXS                : 1;
      unsigned        TXD                : 1;
      unsigned        RXK                : 1;
      unsigned        TXP                : 1;               
    };
} TWSRbits @ 0x098;
#endif

// EEPDR : 0x09A
volatile unsigned char         EEPDR                @ 0x09A;

// EEPAR : 0x09B
volatile unsigned char         EEPAR                @ 0x09B;

// EEPCR : 0x09C
volatile unsigned char         EEPCR                @ 0x09C;
volatile bit EEPRE                        @ ((unsigned)&EEPCR*8)+0;
volatile bit EEPPE                        @ ((unsigned)&EEPCR*8)+1;
volatile bit EEPWE                        @ ((unsigned)&EEPCR*8)+2;
volatile bit EEPER                        @ ((unsigned)&EEPCR*8)+3;
volatile bit EEPBR                        @ ((unsigned)&EEPCR*8)+4;
volatile bit EEPMD                        @ ((unsigned)&EEPCR*8)+5;
volatile bit EERST                        @ ((unsigned)&EEPCR*8)+6;
volatile bit EEPEN                        @ ((unsigned)&EEPCR*8)+7;
#ifndef _LIB_BUILD
volatile union {
    struct {
      unsigned        EEPRE                : 1;
      unsigned        EEPPE                : 1;
      unsigned        EEPWE                : 1;
      unsigned        EEPER                : 1;
      unsigned        EEPBR                : 1;
      unsigned        EEPMD                : 1;
      unsigned        EERST                : 1;
      unsigned        EEPEN                : 1;               
    };
} EEPCRbits @ 0x09C;
#endif

// TWCR : 0x09E
volatile unsigned char         TWCR                @ 0x09E;
volatile bit CKPS0                        @ ((unsigned)&TWCR*8)+0;
volatile bit CKPS1                        @ ((unsigned)&TWCR*8)+1;
volatile bit RACK                        @ ((unsigned)&TWCR*8)+2;
volatile bit TACK                        @ ((unsigned)&TWCR*8)+3;
volatile bit TWMST                        @ ((unsigned)&TWCR*8)+6;
volatile bit TWEN                        @ ((unsigned)&TWCR*8)+7;
#ifndef _LIB_BUILD
volatile union {
    struct {
      unsigned        CKPS            : 2;       
    };
    struct {
      unsigned        CKPS0         : 1;
      unsigned        CKPS1         : 1;               
      unsigned        RACK            : 1;
      unsigned        TACK            : 1;
      unsigned                                        : 2;
      unsigned        TWMST                        : 1;                               
      unsigned        TWEN                        : 1;               
    };
} TWCRbits @ 0x09E;
#endif

// ANSEL : 0x09F
volatile bit ANS2                @ ((unsigned)&ANSEL*8)+2;
volatile bit ANS4                @ ((unsigned)&ANSEL*8)+4;

#ifndef NOP
#define NOP()        asm("nop")
#endif

typedef        unsigned char u8;
typedef unsigned short u16;

#endif

eddiewwm 发表于 2019-1-25 10:37:13

另一個參考:LGT8P653A startup guide.pdf
页: [1]
查看完整版本: LGT8P663A OTP 初體驗