📄 wspilm74.lst
字号:
C51 COMPILER V7.05 WSPILM74 02/16/2006 21:22:22 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE WSPILM74
OBJECT MODULE PLACED IN WSPILM74.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe WSPILM74.c DB OE
stmt level source
1 //参考程序A : SPI调试程序 :WSPILM74.c
2 //SPI调试程序 :WSPILM74.c
3 #include <C8051F020.h>
4 #include <intrins.h>
5 #define PORTA 0x8000 /*8255的A口*/
6 #define PORTB 0x8001 /*8255的B口*/
7 #define PORTC 0x8002 /*8255的C口*/
8 #define PORTCON 0x8003 /*8255的控制口*/
9 typedef unsigned char uchar;
10 typedef unsigned int uint;
11 uint h;
12 uchar xdata *idata Pointm;
13 uchar HMS[6],rr[3],h1,h2,h3,h4,i,j,k0,k1;
14 uchar WE[6]={1,2,4,8,0x10,0x20}; //位选
15 uchar ZI[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
16 0x7c,0x39,0x5e,0x79,0x71,0x40};/*字选:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,-*/
17 void PORT_Init (void);
18 void displayled(void);
19 void delay1ms(uint time){//延迟1ms
20 1 uint ii;
21 1 uint jj;
22 1 for (ii=0;ii<time;ii++){
23 2 for(jj=0;jj<300;jj++);
24 2 }
25 1 }
26 exch(); //数据转换
27 void PORT_Init ();
28 void spi_cfg(uchar spicfg,uchar spickr,uchar spicn)//SPI配置函数
29 {
30 1 SPI0CFG = spicfg; //设定寄存器SPI0CFG=0C7H
31 1 SPI0CKR = spickr; //设定寄存器SPI9CKR=27H
32 1 SPI0CN = spicn; //设定寄存器SPI0CN =03
33 1 EIE1|= 0x01;
34 1 }
35 void config (void) //config function
36 {
37 1 WDTCN = 0xDE; //看门狗禁止
38 1 WDTCN = 0xAD;
39 1 XBR0 = 0x02;/*交叉开关配置,SPI总线SCK配置到P0.0口,
40 1 MOSI为P0.2口, NSS为P0.3,MISO配置到P0.1口*/
41 1 XBR1 = 0x00;
42 1 XBR2 = 0x40; /*允许功能选择开关有效*/
43 1 P0MDOUT = 0x0D;/*SCK、MOSI和NSS为推拉式输出,MISO为开漏式.*/
44 1 }
45 void main() //主程序
46 {
47 1 PORT_Init ();
48 1 config();
49 1 spi_cfg(0x0C7,0x27,0x03);//设定寄存器SPI0CFG,SPI0CKR和SPI0CN
50 1 while(1)
51 1 {
52 2 P0=0xff;
53 2 EA=1;
54 2 i=0;
55 2 P0&=0x7f;
C51 COMPILER V7.05 WSPILM74 02/16/2006 21:22:22 PAGE 2
56 2 delay1ms(1);//延时
57 2 SPI0DAT=0x00;
58 2 //当对SPI0SAT写数据时,产生时钟信号,读入从LM74发来的高8位数据
59 2 delay1ms(2);
60 2 SPI0DAT=0x00;
61 2 //当对SPI0SAT写数据时,产生时钟信号,读入从LM74发来的低8位数据
62 2 delay1ms(2);
63 2 if(i==2){ //已收到16位数据,就将1-->/CS并转入显示温度值的函数.
64 3 P0|=0x80;
65 3 delay1ms(5);
66 3 EA=0; //关中断
67 3 exch(); //数据处理函数
68 3 displayled();//显示温度值的函数.
69 3 };
70 2 }
71 1 }
72 exch() //数据格式转换,将二进制转换为十进制.
73 { HMS[0]=0;
74 1 h=(256*rr[0]+rr[1])/128;//rr[0]中存放高8位数,rr[1]中存放低8位数
75 1 if(h>=128) //判别符号位
76 1 {
77 2 h=-h; //若为负号,先求补码
78 2 HMS[0]=0x10;//"-"号(字形码: 40H)
79 2 };
80 1
81 1 h1=h/100;
82 1 h2=(h-h1*100)/10;
83 1 h3=(h-h1*100-h2*10);
84 1 HMS[1]=h1;
85 1 HMS[2]=h2;
86 1 HMS[3]=h3;
87 1 HMS[4]=0;
88 1 h1=rr[1]&0x40;//判别0.5度
89 1 if(h1!=0)
90 1 HMS[4]=5;
91 1 HMS[5]=0x0c; //显示"C"
92 1 }
93
94 void spi_ISR() interrupt 6//SPI中断
95 { EA=0;
96 1 while(TXBSY);
97 1 SPIF=0;
98 1 rr[i]=SPI0DAT;//由于是全双工总线,在发送完一个字节时,
99 1 //主机也收到从机所发的数据
100 1 i++;
101 1 EA=1;
102 1 }
103 void PORT_Init (void)
104 {
105 1 OSCICN=0x05 ;/*选择内部振荡器,内部振荡器按IFCN指定的频率运行,
106 1 ;频率为8MHz*/
107 1 OSCXCN = 0x67; //外部为11.0592MHZ(未采用)
108 1 P74OUT = 0x0ff; /*P7为推拉方式,P4,P5,P6漏极开路*/
109 1 EMI0CF |= 0x2c; /*EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉宽占1个SYSCLK周期*/
110 1 EMI0TC |= 0x6d; /*地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期*/
111 1 Pointm=PORTCON; /*8255初始化*/
112 1 *Pointm=0x80;
113 1 }
114 void displayled(void) //显示六位温度数据:-020.5C
115 {unsigned int p;
116 1 unsigned char pp;
117 1 for(j=0;j<6;j++)
C51 COMPILER V7.05 WSPILM74 02/16/2006 21:22:22 PAGE 3
118 1 {
119 2 pp=(HMS[j]); /*转化成数码管数字显示码*/
120 2 k0=ZI[pp]; /*查表*/
121 2 Pointm=PORTB; //动态驱动6数码管
122 2 k1=WE[j]; /*查表*/
123 2 *Pointm=k1;
124 2 Pointm=PORTC;
125 2 *Pointm=k0+0x80; /*加小数点*/
126 2 if(k1!=8)
127 2 (*Pointm=k0); /*送显示码*/
128 2 for(p=0;p<=1000;p++);
129 2 _nop_();
130 2 }
131 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 434 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 45 ----
IDATA SIZE = 2 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -