• <menu id="ugcm4"><strong id="ugcm4"></strong></menu>
  • 技術熱線: 4007-888-234

    PIC單片機C語言編程實例一

    更新時間: 2019-01-05
    閱讀量:2712

    
    5.1.2  簡單應用實例 
    
        該例用于令與PORTD口相連的8個發光二極管前4個點亮,后4個熄滅。在調試程序前,應使與PORTD口相連的8位拔碼開關拔向相應的位置。
    例5.1   PORTD輸出 
    
           #include 
    main()
    {
           TRISD=0X00;                   /*TRISD寄存器被賦值,PORTD每一位都為輸出*/
    while(1);                           /*循環執行點亮發光二極管的語句*/
           {
                  PORTD=0XF0;          /*向PORTD送數據,點亮LED(由實驗模板*/
    /*的設計決定相應位置低時LED點亮)。*/
    }
    }
    
    5.2.1  MSSP模塊SPI方式功能簡介 
    
           下面是一段簡單的SPI初始化例程,用于利用SPI工作方式輸出數據的場合。
    例5.2  SPI初始化程序 
    
    /*spi初始化子程序*/
    void       SPIINIT()
    {
           PIR1=0;                                   /*清除SPI中斷標志*/        
           SSPCON=0x30;                /* SSPEN=1;CKP=0 , FOSC/4 */
           SSPSTAT=0xC0;
           TRISC=0x00;                    /*SDO引腳為輸出,SCK引腳為輸出*/
    } 
    
    5.2.3  程序清單 
    
    下面給出已經在實驗板上調試通過的一個程序,可作為用戶編制其它程序的參考。
    #include        
    /*該程序用于在8個LED上依次顯示1~8等8個字符*/
    static volatile int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
    volatile    unsigned        char       data; 
    #define   PORTAIT(adr,bit)  ((unsigned)(&adr)*8+(bit))       /*絕對尋址位操作指令*/
    static       bit PORTA_5 @ PORTAIT(PORTA,5); 
    /*spi初始化子程序*/
    void        SPIINIT()
    {
           PIR1=0;             
           SSPCON=0x30;                /* SSPEN=1;CKP=0 , FOSC/4 */
           SSPSTAT=0xC0;
           TRISC=0x00;                    /*SDO引腳為輸出,SCK引腳為輸出*/
    }
    /*系統各輸入輸出口初始化子程序*/
    void        initial()
    {
    TRISA=0x00;                    /*A口設置為輸出*/
           INTCON=0x00;                /*關閉所有中斷*/
           PORTA_5=0;                            /*LACK送低電平,為鎖存做準備*/
    }
    /*SPI發送子程序*/
    void              SPILED(int data)
    {
           SSPBUF=data;                   /*啟動發送*/
           do
           {
    ;
           }while(SSPIF==0);            /*等待發送完畢*/
    SSPIF=0;                          /*清除SSPIF標志*/
    }
    /*主程序*/
    main()
    {
           unsigned  I;
           initial();                             /*系統初始化*/
           SPIINIT()      ;                         /*SPI初始化*/     
          for(i=8;i>0;i--)                /*連續發送8個數據*/
          {
                  data=table[i];                     /*通過數組的轉換獲得待顯示的段碼*/    
                  SPILED(data);            /*發送顯示段碼顯示*/        
          }
           PORTA_5=1;                            /*最后給鎖存信號,代表顯示任務完成*/
    }
    5.3.3  程序清單 
    
          下面給出已經在實驗板上調試通過的程序,可作為用戶編制其它程序的參考。有關顯示部分的SPI初始化,請讀者參考5.2節。
    #include        
    /*該程序用于按下相應的鍵時,在第一個8段LED上顯示相應的1~4的字符*/
    #define   PORTAIT(adr,bit)  ((unsigned)(&adr)*8+(bit))       /*絕對尋址位操作指令*/
    static       bit  PORTA_5  @  PORTAIT(PORTA,5); 
    #define    PORTBIT(adr, bit)     ((unsigned)(&adr)*8+(bit))   /*絕對尋址位操作指令*/
    static       bit  PORTB_5  @  PORTBIT(PORTB,5);
    
      static      bit  PORTB_4  @  PORTBIT(PORTB,4);static       bit  PORTB_1  @  PORTBIT(PORTB,1)    ;
    static       bit  PORTB_2  @  PORTBIT(PORTB,2)    ;
    unsigned        int    I;
    unsigned        char j;
    int  data;
     /*spi初始化子程序*/
    void      SPIINIT()
    {
           PIR1=0;
           SSPCON=0x30; 
           SSPSTAT=0xC0;
           TRISC=0xD7;                   /*SDO引腳為輸出,SCK引腳為輸出*/
    }
    /*系統各輸入輸出口初始化子程序*/
    void      initial()
    {
           TRISA=0xDF;
           TRISB=0XF0;                   /*設置與鍵盤有關的各口的數據方向*/
           INTCON=0x00;                /*關閉所有中斷*/
           data=0X00;                       /*待顯示的寄存器賦初值*/
           PORTB=0X00;                  /*RB1 RB2 先送低電平*/
           j=0;
    }
    /*軟件延時子程序*/
    void        DELAY()
    {
           for(i = 6553; --i ;)
           continue;
    }
    /*鍵掃描子程序*/
    int           KEYSCAN()
    {    
    while(1)
    {
           if ((PORTB_5==0)||(PORTB_4==0))
           break;
    }                                               /*等待有鍵按下*/
           DELAY();                         /*軟件延時*/
           if ((PORTB_5==0)||(PORTB_4==0))
                  KEYSERVE();            /*如果仍有鍵按下,則調用鍵服務子程序*/
           else  j=0x00;                      /*如果為干擾,則令返回值為0*/
           return(j);
    }    
    /*鍵服務子程序*/
    int           KEYSERVE()
    {
           PORTB=0XFD       ;
           if(PORTB_5==0)    j=0X01;
           if(PORTB_4==0)    j=0X03;
           PORTB=0XFB;
           if(PORTB_5==0)    j=0X02;
           if(PORTB_4==0)    j=0X04;/*以上根據按下的鍵確定相應的鍵值*/
           PORTB=0X00;                  /*恢復PORTB的值*/
    while(1)
    {
                  if((PORTB_5==1)&&(PORTB_4==1)) break;</fon
    

    刺激欲乱狂亲伦
  • <menu id="ugcm4"><strong id="ugcm4"></strong></menu>