第十一章 PIC单片机的 C 语言编程 - · PDF file第十一章 PIC 单片机的C 语言 ... 提供,常见的有Hitech、CCS、IAR、Bytecraft 等公司。 ... 结构:struct

Embed Size (px)

Citation preview

  • 2004-4-7 1 of 26

    PIC C 11.1 PIC C

    C

    C PIC C

    C PC PC

    PC

    C

    C PIC C

    PICMicrochip PIC

    C PIC C HitechCCSIARBytecraft HitechPICC PIC

    Hitech PIC PICC-Lite PIC PIC16F84PIC16F877 PIC16F628 Flash PICC-Lite PIC C

    PIC C Hitech-PICC www.htsoft.com IAR www.iar.com CCS www.ccsinfo.com/picc.shtml ByteCraft www.bytecraft.com/mpccaps.html Hitech-PICC C

    PIC 11.2 Hitech-PICC

    PICC ANSI

    PIC PIC PIC

  • 2004-4-7 2 of 26

    PICPICC C 4KC

  • 2004-4-7 3 of 26

    C

    11-2 CI2C

    11.4 PIC C

    PICC PIC C

    #includepic.h

    __CONFIG PICC

    main

    11-1 C

    #include //

    #include pc68.h //

    //

    __CONFIG (HS & PROTECT & PWRTEN & BOREN & WDTDIS);

    //

    void SetSFR(void);

    void Clock(void);

    void KeyScan(void);

    void Measure(void);

    void LCD_Test(void);

    void LCD_Disp(unsigned char);

    //

    unsigned char second, minute, hour;

    bit flag1,flag2;

    //

    11-2 C

  • 2004-4-7 4 of 26

    void main(void)

    {

    SetSFR();

    PORTC = 0x00;

    TMR1H += TMR1H_CONST;

    LED1 = LED_OFF;

    LCD_Test();

    //

    while(1) {

    asm(clrwdt); //

    Clock(); //

    KeyScan(); //

    Measure(); //

    SetSFR(); //

    }

    }

    11-1 C

    11.5 PICC

    11.5.1 PICC PICC 11-1

    bit 1 0 1

    char 8 PICC char

    unsigned char 8

    short 16

    unsigned short 16

    int 16

    unsigned int 16

    long 32

    unsigned long 32

    float 24

    double 24 32 PICC double 24

    32

    11-1 PICC

    PICC Little-endian

  • 2004-4-7 5 of 26

    11.5.2 PICC 11-1 bitPICC

    C unsigned int data[10];

    struct commInData {

    unsigned char inBuff[8];

    unsigned char getPtr, putPtr;

    };

    union int_Byte {

    unsigned char c[2];

    unsigned int i;

    };

    11-2 C

    11.5.3 PICC bank PICC bank

    bank bank0

    unsigned char buffer[32];

    bit flag1,flag2;

    float val[8];

    bank0 bank

    bank bank1 unsigned char buffer[32]; // bank1

    bank2 bit flag1,flag2; // bank2

    bank3 float val[8]; // bank3

    PIC bank 128

    C bank RAM bank

    Error[000] : Can't find 0x12C words for psect rbss_1 in segment BANK1

    0x12C300 bank1 bank1 bank1 bank

    bank

    bankC bank bank bank bank bank

  • 2004-4-7 6 of 26

    11.5.4 PICC PICC auto bank0

    PICPICC

    bank0 bank0

    11.5.5 PICC

    bit PICC bank 8

    PIC

    PICC0x000 0 0x0000

    8

    flag1 0x123

    0x123/8 = 0x24

    0x123%8 = 3

    flag1 0x24 3 flag1 0x24 0x123

    PIC PICC tmp 0x20

    tmp |= 0x80 => bsf 0x20,7

    tmp &= 0xf7 => bcf 0x20,3

    if (tmp&0xfe) => btfsc 0x20,0

    C

    C

  • 2004-4-7 7 of 26

    union {

    struct {

    unsigned b0: 1;

    unsigned b1: 1;

    unsigned b2: 1;

    unsigned b3: 1;

    unsigned b4: 1;

    unsigned b5: 1;

    unsigned : 2; //

    } oneBit;

    unsigned char allBits;

    } myFlag;

    11-3

    myFlag.oneBit.b3=1; //b3 1

    myFlag.allBits=0; // 0

    0 0 1 1 ANSI-C 0

    11.5.6 PICC

    PICC IEEE-754 32 4PICC 24 float 24 double 24 double 32

    24

    11.5.7 PICC C

    bank

    PICC PICC PICC

  • 2004-4-7 8 of 26

    unsigned char tmpData @ 0x20; //tmpData 0x20

    PICC tmpData

    0x20 0x20

    unsigned char tmpData @ 0x20; //tmpData 0x20

    bit tmpBit0 @ tmpData*8+0; //tmpBit0 tmpData 0

    bit tmpBit1 @ tmpData*8+1; //tmpBit0 tmpData 1

    bit tmpBit2 @ tmpData*8+2; //tmpBit0 tmpData 2

    tmpData

    11.5.8 PICC

    extern C

    extern code1.c bank1 unsigned char var1, var2; // bank1

    code2.c extern bank1 unsigned char var1, var2; // bank1

    volatile

    PICC C

    volatile IO

    volatile volatile unsigned char STATUS @ 0x03;

    volatile bit commFlag;

    volatile C

    volatile

    volatile

  • 2004-4-7 9 of 26

    volatile

    const const

    ROM ROM constretlw PICC

    const unsigned char name[]=This is a demo; //

    const RAM

    persistent C

    PICC mainPICC persistent

    persisten persistent unsigned char hour,minute,second; //

    persistent

    persistent PIC

    11.5.9 PICC PICC C PIC

    RAM FSRPICC

    PICC C RAM FSRFSR 256 bank0/1 bank2/3 512PICC

  • 2004-4-7 10 of 26

    unsigned char *ptr0; // bank0/1

    bank2 unsigned char *ptr1; // bank2/3

    bank3 unsigned char *ptr2; // bank2/3

    bank bank0 bank1 bank2 bank3 bank bank0 bank bank

    unsigned char *ptr0; // bank0/1

    bank2 unsigned char buff[8]; // bank2

    ptr0 = buff; // bank2 bank0/1

    PICC Fixup overflow in expression (...)

    bank

    void SendMessage(unsigned char *);

    bank0 bank1 bank2 bank3

    void SendMessage_2(bank2 unsigned char *);

    Fixup overflow

    ROM ROM

    const unsigned char company[]=Microchip; // ROM

    const unsigned char *romPtr; // ROM

    romPtr company; //

    data = *romPtr++; // 1

    *romPtr data; //

    CPICC

    PIC PICC RAM

  • 2004-4-7 11 of 26

    PC

    persistentvolatile PICC

    bank bank0/1 bank2/3

    bank0bank

    // bank0/1 bank0

    unsigned char *ptr0;

    // bank2/3 bank0

    bank2 unsigned char *ptr0;

    // bank2/3 bank1

    bank2 unsigned char * bank1 ptr0;

    bank bank

    bank volatilepersistent const bank volatilepersistent const

    bank // bank0/1 bank0

    volatile unsigned char *ptr0;

    // bank2/3 bank1

    bank2 unsigned char * volatile bank1 ptr0;

    // ROM ROM

    const unsigned char * const ptr0;

    11.6 PICC

    PIC C

    11.6.1

  • 2004-4-7 12 of 26

    PICC C PIC 2K C 2K 2K

    11.6.2

    PIC 8

    7

    PICC *.map

    call graph

    Call graph:

    *_main size 0,0 offset 0

    _RightShift_C

    * _Task size 0,1 offset 0

    lwtoft

    ftmul size 0,0 offset 0

    ftunpack1

    ftunpack2

    ftadd size 0,0 offset 0

    ftunpack1

    ftunpack2

    ftdenorm

    11-4 C

    main C

    11.6.3 PICC

    void Task(void);

    unsigned char Temperature(void);

    void BIN2BCD(unsigned char);

    void TimeDisplay(unsigned char, unsigned char);

  • 2004-4-7 13 of 26

    C

    11-1 11.6.4 PICC C

    void interrupt ISR(void);

    ISRvoidinterrupt

    interruptPICC

    0x0004retfie

    void interrupt ISR(void) //

    {

    if (T0IE && T0IF) // TMR0

    {

    T0IF = 0; // TMR0

    // TMR0

    }

    if (TMR1IE && TMR1IF) // TMR1

    {

    TMR1IF = 0; // TMR1

    // TMR1

    }

    } //

    11-5 C

    PICC

    C

    PICC

  • 2004-4-7 14 of 26

    PIC

    11.6.5 PICC C

    bank0 #include

    #include PICC

    C printf/sprintf

    printf/sprintf

    CscanfprintfPICC

    getch() putch() scanf/printf getch() putch()

    11.7 PICC PICC 11.7.1 PIC PICC

    C __CONFIG (HS & UNPROTECT & PWRTEN & BORDIS & WDTEN);

    __CONFIG

    pic.h

    HEX 16F7x

    /**/

    #define RC 0x3FFF // RC

    #define HS 0x3FFE // HS

  • 2004-4-7 15 of 26

    #define XT 0x3FFD // XT

    #define LP 0x3FFC // LP

    /**/

    #define WDTEN 0x3FFF //

    #define WDTDIS 0x3FFB //

    /**/

    #define PWRTEN 0x3FF7 //

    #define PWRTDIS 0x3FFF //

    /**/

    #define BOREN 0x3FFF //

    #define BORDIS 0x3FBF //

    /**/

    #define UNPROTECT 0x3FFF //

    #define PROTECT 0x3FEF //

    11-6

    11.7.2

    PIC__IDLOC

    __IDLOC (1234);

    160x 01020304 11.8 MPLAB-IDE PICC

    11.3 PICCMPLAB-IDE

    MPLABMPLAB

    MakeMPLAB

    Build All

    ProjectMakeBuild All

    11.8.1

  • 2004-4-7 16 of 26

    PICC Configure Select Device

    MPLAB 11-1 #include pic.hMPLAB pic.h

    #include 11.8.2 PICCGeneral 3.2.7 3-20

    PICCMPAMS 11-3 PICC

    Include Path

    11.8.3 PICCPICC Global C 11-4

    Compile for MPLAB ICD ICD C ICD

    Treat char as signedPICCchar

    11-3 PICC

    11-4 PICC

  • 2004-4-7 17 of 26

    char Floating point double widthPICC

    double 24 float 32

    11.8.4 CPICC Compiler

    C C C

    GeneralAdvanced 11-5A 11-5B

    C

    9

    20%2K PICC

    volatile

    PICC

    A B

    11-5 C

  • 2004-4-7 18 of 26

    C

    Generate assembly list file C*.lst C C

    C Compile to assembly only C *.as C C C

    11.8.5 PICC Linker PICC Linker

    11-6

    Generate map file

    *.map

    Display memory-segment usage

    // Psect Usage Map: //

    Psect | Contents | Memory Range

    ----------|------------------------------|---