📄 5045.lst
字号:
C51 COMPILER V7.06 5045 02/28/2006 10:27:15 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 5045
OBJECT MODULE PLACED IN 5045.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 5045.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /**************************************************
2 ; 平凡单片机工作室
3 ; HTTP://WWW.MCUSTUDIO.COM
4 ; (C) COPYRIGHT 2003 PINGFAN'S MCUSTUDIO
5 ; ALL RIGHTS RESERVED
6 ;5045.c
7 ;作者:周坚
8 ;功能描述:
9 ;开机后在每1、2位数码管显示00,D8点亮表示目前处于调整地址的状态
10 ;此时按S1和S2,第1、2位数码管的数据从00~FF变化
11 ;此时若按下S4键,则读出1、2位所示数据作为地址的EEPROM中的值,显示在第5、6位上
12 ;按下S3键,D7点亮,表示进入调整数据状态,此时第5、6位数码管点亮显示值与第1、2位同
13 ;按下S1和S2,第5、6位上的数据从00~FF变化
14 ;此时若按下S4键,则将5、6位上的数据写入第1、2位指定的地址单元中
15 **************************************************/
16 #define uchar unsigned char
17 #define uint unsigned int
18 #include "reg52.h"
19 #include "intrins.h"
20
21
22 sbit CS=P2^1;
23 sbit SI=P3^7;
24 sbit Sck=P3^6;
25 sbit SO=P3^7;
26 sbit WP=P2^0;
27
28 sbit D1Led=P1^0;
29 sbit D2Led=P1^1;
30 sbit D8Led=P1^7;
31
32 bit KFirst; //第一次
33 bit KFunc; //代表两种功能
34 bit KEnter; //代表执行S4键的操作
35
36 uchar AddrCount=0; //地址计数值
37 uchar NumCount=0; //数据计数值
38
39 #define Wdt200 0x90 //WD1 WD0=01
40 #define Wdt600 0xa0 //WD1 WD0=10
41 #define Wdt1400 0x80 //如果最高位是1代表设置看门狗WD1 WD0 =00
42 #define NoWdt 0xb0 //WD1 WD0=11
43 #define ProQtr 0x04 //BL1 BL0=01保护区域为高128字节
44 #define ProHalf 0x08 //BL1 BL0=10写保护区域为高256字节
45 #define ProAll 0x0c //BL1 BL0=11写保护区域为整个存储器
46 #define NoPro 0x00 //BL1 BL0=00不写保护
47
48 #define nop2() _nop_();_nop_()
49 #define WREN_INST 0x06 // 写允许命令字(WREN)
50 #define WRDI_INST 0x04 // 写禁止命令字(WRDI)
51 #define WRSR_INST 0x01 // 写状态寄存器命令字(WRSR)
52 #define RDSR_INST 0x05 // 读状态寄存器命令字(RDSR)
53 #define WRITE_INST 0x02 // 写存储器命令字 (WRITE)
54 #define READ_INST 0x03 // 读存储器命令字 (READ)
55 #define MAX_POLL 0x99 //测试的最大次数
C51 COMPILER V7.06 5045 02/28/2006 10:27:15 PAGE 2
56
57 #define Hidden 0x10; //消隐字符在字形码表中的位置
58 uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
59 uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF
-};
60 uchar DispBuf[6]; //6字节的显示缓冲区
61
62 uchar code TH0Val=63266/256;
63 uchar code TL0Val=63266%256;//当晶振为11.0592时,定时2.5ms的定时器初值
64
65
66 /*******************************************************************************************
67 ;名称: OutByte
68 ;描述:将一个字节送到EEPROM
69 ;功能:移位送出一个字节,从最高位开始送EEPROM
70 *******************************************************************************************/
71 void OutByte(uchar Data)
72 { uchar Counter=8;
73 1 for(;Counter>0;Counter--)
74 1 {
75 2 Sck=0;
76 2 if((Data&0x80)==0) //最高位是0
77 2 SI=0;
78 2 else
79 2 SI=1;
80 2 Sck=1;
81 2 Data=Data<<1;
82 2 }
83 1 SI=0;
84 1 }
85 /*******************************************************************************************
86 ;名称: InByte
87 ;描述:从EEPROM中接收数据
88 ;功能:从EEPROM中接收数据,高位在先
89 *******************************************************************************************/
90 uchar InByte(void)
91 { uchar result=0;
92 1 uchar Counter=8;
93 1 for(;Counter>0;Counter--)
94 1 {
95 2 Sck=1;
96 2 nop2();
97 2 Sck=0;
98 2 result=result<<1;
99 2 if(SO) //如果输入线是高电平
100 2 result|=0x01;
101 2 }
102 1 return (result);
103 1 }
104 /*******************************************************************************************
105 ;名称:RdsrCmd
106 ;描述:读状态寄存器
107 ;功能:送命令用以读状态寄存器
108 *******************************************************************************************/
109 uchar RdsrCmd()
110 { uchar result;
111 1 Sck=0;
112 1 CS=0;
113 1 OutByte(RDSR_INST);
114 1 result=InByte(); //读状态寄存器
115 1 Sck=0;
116 1 CS=1;
C51 COMPILER V7.06 5045 02/28/2006 10:27:15 PAGE 3
117 1 return(result);
118 1 }
119 /*******************************************************************************************
120 ;名称:WipPoll
121 ;描述:器件内部编程检查
122 ;功能:通过检查WIP位来确定X5045内部编程是否结束
123 *******************************************************************************************/
124 void WipPoll()
125 { uchar tmp;
126 1 uchar i;
127 1 for(i=0;i<MAX_POLL;i++)
128 1 {
129 2 tmp=RdsrCmd();
130 2 if((tmp&0x01)==0)
131 2 break;
132 2 }
133 1 }
134 /*******************************************************************************************
135 ;名称:WrenCmd
136 ;描述:写允许
137 ;功能:这段程序发送命令允许写存储器单元和状态寄存器
138 *******************************************************************************************/
139 void WrenCmd()
140 { Sck=0; //将SCK拉低
141 1 CS=0; //将 /CS 拉低
142 1 OutByte(WREN_INST);
143 1 Sck=0; //将SCK拉低
144 1 CS=1; // 将 /CS 升高
145 1 }
146
147 #define Wdt200 0x90 //WD1 WD0=01
148 #define Wdt600 0xa0 //WD1 WD0=10
149 #define Wdt1400 0x80 //如果最高位是1代表设置看门狗WD1 WD0 =00
150 #define NoWdt 0xb0 //WD1 WD0=11
151 #define ProQtr 0x04 //BL1 BL0=01保护区域为高128字节
152 #define ProHalf 0x08 //BL1 BL0=10写保护区域为高256字节
153 #define ProAll 0x0c //BL1 BL0=11写保护区域为整个存储器
154 #define NoPro 0x00 //BL1 BL0=00不写保护
155 /*******************************************************************************************
156 ;名称;WrsrCmd
157 ;描述:写状态寄存器
158 ;功能:将WD0、WD1、BP0、BP1的状态写入状态寄存器
159 *******************************************************************************************/
160 void WrsrCmd(uchar RegCode)
161 { uchar tmp;
162 1 Sck=0; //将SCK拉低
163 1 CS=0; //将 /CS 拉低
164 1 tmp=RdsrCmd(); //读出当前寄存器状态
165 1 if((RegCode&0x7f)!=0) //RegCode与0x7f(01111111)相与不等于0,说明MSB=1,即设置看门狗的命令
166 1 { tmp&=0x0f; //首先将读到的数的高4位清零
167 2 tmp|=RegCode;
168 2 }
169 1 else
170 1 { tmp&=0xf0; //否则是写保护类指令,清除低4位
171 2 tmp|=RegCode;
172 2 }
173 1 OutByte(WRSR_INST); //写指令
174 1 OutByte(tmp);
175 1 Sck=0;
176 1 CS=1;
177 1 OutByte(WRSR_INST); //写指令
178 1 WipPoll() ; //测试是否已器件内部是否写完
C51 COMPILER V7.06 5045 02/28/2006 10:27:15 PAGE 4
179 1 }
180 /*******************************************************************************************
181 ;名称:WrdiCmd
182 ;描述:写禁止
183 ;功能:禁止对存储单元和状态寄存器写
184 *******************************************************************************************/
185 /*void WrdiCmd()
186 { Sck=0; //将SCK拉低
187 CS=0; //将 /CS 拉低
188 OutByte(WRDI_INST);
189 Sck=0; //将SCK拉低
190 CS=1; // 将 /CS 升高
191 } 本程序中用不到这个函数,故注释掉,以免编译警告,需要用时将注释去掉即可*/
192
193 /*******************************************************************************************
194 ;名称:ByteWrite
195 ;描述:单字节写
196 ;功能:本程序用于单字节写入EEPROM
197 *******************************************************************************************/
198 void ByteWrite(uint Address,uchar Data)
199 { uchar tmp;
200 1 Sck=0;
201 1 CS=0;
202 1 tmp=WRITE_INST;
203 1 if(Address>255)
204 1 tmp|=0x08;
205 1 OutByte(tmp);
206 1 tmp=(uchar)(Address&0x00ff);
207 1 OutByte(tmp);
208 1 OutByte(Data);
209 1 Sck=0;
210 1 CS=1;
211 1 WipPoll();
212 1 }
213 /*******************************************************************************************
214 ;名称:ByteRead
215 ;描述:单字节读
216 ;功能:本程序从EEPROM中读出一个字节
217 *******************************************************************************************/
218 uchar ByteRead(uint Address)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -