專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享
從全面的產(chǎn)品導(dǎo)入到強大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!
提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力
提供最新的單片機資訊,行業(yè)消息以及公司新聞動態(tài)
5.1.2 簡單應(yīng)用實例
該例用于令與PORTD口相連的8個發(fā)光二極管前4個點亮,后4個熄滅。在調(diào)試程序前,應(yīng)使與PORTD口相連的8位拔碼開關(guān)拔向相應(yīng)的位置。
例5.1 PORTD輸出
#include
main()
{
TRISD=0X00; /*TRISD寄存器被賦值,PORTD每一位都為輸出*/
while(1); /*循環(huán)執(zhí)行點亮發(fā)光二極管的語句*/
{
PORTD=0XF0; /*向PORTD送數(shù)據(jù),點亮LED(由實驗?zāi)0?/
/*的設(shè)計決定相應(yīng)位置低時LED點亮)。*/
}
}
5.2.1 MSSP模塊SPI方式功能簡介
下面是一段簡單的SPI初始化例程,用于利用SPI工作方式輸出數(shù)據(jù)的場合。
例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 程序清單
下面給出已經(jīng)在實驗板上調(diào)試通過的一個程序,可作為用戶編制其它程序的參考。
#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引腳為輸出*/
}
/*系統(tǒng)各輸入輸出口初始化子程序*/
void initial()
{
TRISA=0x00; /*A口設(shè)置為輸出*/
INTCON=0x00; /*關(guān)閉所有中斷*/
PORTA_5=0; /*LACK送低電平,為鎖存做準備*/
}
/*SPI發(fā)送子程序*/
void SPILED(int data)
{
SSPBUF=data; /*啟動發(fā)送*/
do
{
;
}while(SSPIF==0); /*等待發(fā)送完畢*/
SSPIF=0; /*清除SSPIF標志*/
}
/*主程序*/
main()
{
unsigned I;
initial(); /*系統(tǒng)初始化*/
SPIINIT() ; /*SPI初始化*/
for(i=8;i>0;i--) /*連續(xù)發(fā)送8個數(shù)據(jù)*/
{
data=table[i]; /*通過數(shù)組的轉(zhuǎn)換獲得待顯示的段碼*/
SPILED(data); /*發(fā)送顯示段碼顯示*/
}
PORTA_5=1; /*最后給鎖存信號,代表顯示任務(wù)完成*/
}
5.3.3 程序清單
下面給出已經(jīng)在實驗板上調(diào)試通過的程序,可作為用戶編制其它程序的參考。有關(guān)顯示部分的SPI初始化,請讀者參考5.2節(jié)。
#include
/*該程序用于按下相應(yīng)的鍵時,在第一個8段LED上顯示相應(yīng)的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引腳為輸出*/
}
/*系統(tǒng)各輸入輸出口初始化子程序*/
void initial()
{
TRISA=0xDF;
TRISB=0XF0; /*設(shè)置與鍵盤有關(guān)的各口的數(shù)據(jù)方向*/
INTCON=0x00; /*關(guān)閉所有中斷*/
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(); /*如果仍有鍵按下,則調(diào)用鍵服務(wù)子程序*/
else j=0x00; /*如果為干擾,則令返回值為0*/
return(j);
}
/*鍵服務(wù)子程序*/
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;/*以上根據(jù)按下的鍵確定相應(yīng)的鍵值*/
PORTB=0X00; /*恢復(fù)PORTB的值*/
while(1)
{
if((PORTB_5==1)&&(PORTB_4==1)) break;</fon