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