?? wspilm74.c
字號:
//參考程序A : SPI調(diào)試程序 :WSPILM74.c
//SPI調(diào)試程序 :WSPILM74.c
#include <C8051F020.h>
#include <intrins.h>
#define PORTA 0x8000 /*8255的A口*/
#define PORTB 0x8001 /*8255的B口*/
#define PORTC 0x8002 /*8255的C口*/
#define PORTCON 0x8003 /*8255的控制口*/
typedef unsigned char uchar;
typedef unsigned int uint;
uint h;
uchar xdata *idata Pointm;
uchar HMS[6],rr[3],h1,h2,h3,h4,i,j,k0,k1;
uchar WE[6]={1,2,4,8,0x10,0x20}; //位選
uchar ZI[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71,0x40};/*字選:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,-*/
void PORT_Init (void);
void displayled(void);
void delay1ms(uint time){//延遲1ms
uint ii;
uint jj;
for (ii=0;ii<time;ii++){
for(jj=0;jj<300;jj++);
}
}
exch(); //數(shù)據(jù)轉(zhuǎn)換
void PORT_Init ();
void spi_cfg(uchar spicfg,uchar spickr,uchar spicn)//SPI配置函數(shù)
{
SPI0CFG = spicfg; //設(shè)定寄存器SPI0CFG=0C7H
SPI0CKR = spickr; //設(shè)定寄存器SPI9CKR=27H
SPI0CN = spicn; //設(shè)定寄存器SPI0CN =03
EIE1|= 0x01;
}
void config (void) //config function
{
WDTCN = 0xDE; //看門狗禁止
WDTCN = 0xAD;
XBR0 = 0x02;/*交叉開關(guān)配置,SPI總線SCK配置到P0.0口,
MOSI為P0.2口, NSS為P0.3,MISO配置到P0.1口*/
XBR1 = 0x00;
XBR2 = 0x40; /*允許功能選擇開關(guān)有效*/
P0MDOUT = 0x0D;/*SCK、MOSI和NSS為推拉式輸出,MISO為開漏式.*/
}
void main() //主程序
{
PORT_Init ();
config();
spi_cfg(0x0C7,0x27,0x03);//設(shè)定寄存器SPI0CFG,SPI0CKR和SPI0CN
while(1)
{
P0=0xff;
EA=1;
i=0;
P0&=0x7f;
delay1ms(1);//延時(shí)
SPI0DAT=0x00;
//當(dāng)對SPI0SAT寫數(shù)據(jù)時(shí),產(chǎn)生時(shí)鐘信號,讀入從LM74發(fā)來的高8位數(shù)據(jù)
delay1ms(2);
SPI0DAT=0x00;
//當(dāng)對SPI0SAT寫數(shù)據(jù)時(shí),產(chǎn)生時(shí)鐘信號,讀入從LM74發(fā)來的低8位數(shù)據(jù)
delay1ms(2);
if(i==2){ //已收到16位數(shù)據(jù),就將1-->/CS并轉(zhuǎn)入顯示溫度值的函數(shù).
P0|=0x80;
delay1ms(5);
EA=0; //關(guān)中斷
exch(); //數(shù)據(jù)處理函數(shù)
displayled();//顯示溫度值的函數(shù).
};
}
}
exch() //數(shù)據(jù)格式轉(zhuǎn)換,將二進(jìn)制轉(zhuǎn)換為十進(jìn)制.
{ HMS[0]=0;
h=(256*rr[0]+rr[1])/128;//rr[0]中存放高8位數(shù),rr[1]中存放低8位數(shù)
if(h>=128) //判別符號位
{
h=-h; //若為負(fù)號,先求補(bǔ)碼
HMS[0]=0x10;//"-"號(字形碼: 40H)
};
h1=h/100;
h2=(h-h1*100)/10;
h3=(h-h1*100-h2*10);
HMS[1]=h1;
HMS[2]=h2;
HMS[3]=h3;
HMS[4]=0;
h1=rr[1]&0x40;//判別0.5度
if(h1!=0)
HMS[4]=5;
HMS[5]=0x0c; //顯示"C"
}
void spi_ISR() interrupt 6//SPI中斷
{ EA=0;
while(TXBSY);
SPIF=0;
rr[i]=SPI0DAT;//由于是全雙工總線,在發(fā)送完一個字節(jié)時(shí),
//主機(jī)也收到從機(jī)所發(fā)的數(shù)據(jù)
i++;
EA=1;
}
void PORT_Init (void)
{
OSCICN=0x05 ;/*選擇內(nèi)部振蕩器,內(nèi)部振蕩器按IFCN指定的頻率運(yùn)行,
;頻率為8MHz*/
OSCXCN = 0x67; //外部為11.0592MHZ(未采用)
P74OUT = 0x0ff; /*P7為推拉方式,P4,P5,P6漏極開路*/
EMI0CF |= 0x2c; /*EMIF工作在地址/數(shù)據(jù)復(fù)用方式,只用外部存儲器,ALE高/低脈寬占1個SYSCLK周期*/
EMI0TC |= 0x6d; /*地址建立/保持時(shí)間占0個SYSCLK周期,/WR和/RD占12個SYSCLK周期*/
Pointm=PORTCON; /*8255初始化*/
*Pointm=0x80;
}
void displayled(void) //顯示六位溫度數(shù)據(jù):-020.5C
{unsigned int p;
unsigned char pp;
for(j=0;j<6;j++)
{
pp=(HMS[j]); /*轉(zhuǎn)化成數(shù)碼管數(shù)字顯示碼*/
k0=ZI[pp]; /*查表*/
Pointm=PORTB; //動態(tài)驅(qū)動6數(shù)碼管
k1=WE[j]; /*查表*/
*Pointm=k1;
Pointm=PORTC;
*Pointm=k0+0x80; /*加小數(shù)點(diǎn)*/
if(k1!=8)
(*Pointm=k0); /*送顯示碼*/
for(p=0;p<=1000;p++);
_nop_();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -