📄 wspilm74.c
字号:
//参考程序A : SPI调试程序 :WSPILM74.c
//SPI调试程序 :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(); //数据转换
void PORT_Init ();
void spi_cfg(uchar spicfg,uchar spickr,uchar spicn)//SPI配置函数
{
SPI0CFG = spicfg; //设定寄存器SPI0CFG=0C7H
SPI0CKR = spickr; //设定寄存器SPI9CKR=27H
SPI0CN = spicn; //设定寄存器SPI0CN =03
EIE1|= 0x01;
}
void config (void) //config function
{
WDTCN = 0xDE; //看门狗禁止
WDTCN = 0xAD;
XBR0 = 0x02;/*交叉开关配置,SPI总线SCK配置到P0.0口,
MOSI为P0.2口, NSS为P0.3,MISO配置到P0.1口*/
XBR1 = 0x00;
XBR2 = 0x40; /*允许功能选择开关有效*/
P0MDOUT = 0x0D;/*SCK、MOSI和NSS为推拉式输出,MISO为开漏式.*/
}
void main() //主程序
{
PORT_Init ();
config();
spi_cfg(0x0C7,0x27,0x03);//设定寄存器SPI0CFG,SPI0CKR和SPI0CN
while(1)
{
P0=0xff;
EA=1;
i=0;
P0&=0x7f;
delay1ms(1);//延时
SPI0DAT=0x00;
//当对SPI0SAT写数据时,产生时钟信号,读入从LM74发来的高8位数据
delay1ms(2);
SPI0DAT=0x00;
//当对SPI0SAT写数据时,产生时钟信号,读入从LM74发来的低8位数据
delay1ms(2);
if(i==2){ //已收到16位数据,就将1-->/CS并转入显示温度值的函数.
P0|=0x80;
delay1ms(5);
EA=0; //关中断
exch(); //数据处理函数
displayled();//显示温度值的函数.
};
}
}
exch() //数据格式转换,将二进制转换为十进制.
{ HMS[0]=0;
h=(256*rr[0]+rr[1])/128;//rr[0]中存放高8位数,rr[1]中存放低8位数
if(h>=128) //判别符号位
{
h=-h; //若为负号,先求补码
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;//由于是全双工总线,在发送完一个字节时,
//主机也收到从机所发的数据
i++;
EA=1;
}
void PORT_Init (void)
{
OSCICN=0x05 ;/*选择内部振荡器,内部振荡器按IFCN指定的频率运行,
;频率为8MHz*/
OSCXCN = 0x67; //外部为11.0592MHZ(未采用)
P74OUT = 0x0ff; /*P7为推拉方式,P4,P5,P6漏极开路*/
EMI0CF |= 0x2c; /*EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉宽占1个SYSCLK周期*/
EMI0TC |= 0x6d; /*地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期*/
Pointm=PORTCON; /*8255初始化*/
*Pointm=0x80;
}
void displayled(void) //显示六位温度数据:-020.5C
{unsigned int p;
unsigned char pp;
for(j=0;j<6;j++)
{
pp=(HMS[j]); /*转化成数码管数字显示码*/
k0=ZI[pp]; /*查表*/
Pointm=PORTB; //动态驱动6数码管
k1=WE[j]; /*查表*/
*Pointm=k1;
Pointm=PORTC;
*Pointm=k0+0x80; /*加小数点*/
if(k1!=8)
(*Pointm=k0); /*送显示码*/
for(p=0;p<=1000;p++);
_nop_();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -