📄 24c01.lst
字号:
C51 COMPILER V7.06 24C01 02/28/2006 10:27:07 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 24C01
OBJECT MODULE PLACED IN 24c01.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 24c01.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 ;24C01.C
7 ;作者:周坚
8 ;功能描述:
9 ;PC端发送3个数据 n0,n1,n2
10 ;n0=0,写,将n1写入n2地址中
11 ;n0=1,读,读出n1地址中的数据,n2不起作用,但必须有
12 ;收到一个字节后,将其地址值显示在数码管第1、2位上,数值显示在第5、6位上
13 ;读出一个字节后,将其地址值显示在数码管第1、2位上,读出的值显示在第5、6位上
14 ;**************************************************/
15 #define uchar unsigned char
16 #define uint unsigned int
17 #define Slaw 0x0a; //写命令字
18 #define Slar 0xa1; //读命令字
19 #include "reg52.h"
20 #include "intrins.h"
21
22 sbit Scl=P3^6; //串行时钟
23 sbit Sda=P3^7; //串行数据
24
25
26 bit Rec; //接收到数据的标志
27 uchar RecBuf[3]; //接收缓冲区
28
29 #define Hidden 0x10; //消隐字符在字形码表中的位置
30 uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
31 uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF
-};
32 uchar DispBuf[6]; //6字节的显示缓冲区
33
34 uchar code TH0Val=63266/256;
35 uchar code TL0Val=63266%256;//当晶振为11.0592时,定时2.5ms的定时器初值
36
37 //以下是中断程序,用于显示
38 void Timer0() interrupt 1
39 { uchar tmp;
40 1 static uchar dCount; //计数器,显示程序通过它得知现正显示哪个数码管
41 1 TH0=TH0Val;
42 1 TL0=TL0Val;
43 1 tmp=BitTab[dCount]; //根据当前的计数值取位值
44 1 P2=P2|0xfc; //P2与11111100B相或,将高6位置1
45 1 P2=P2&tmp; //P2与取出的位值相与,将某一位清零
46 1 tmp=DispBuf[dCount]; //根据当前的计数值取显示缓冲待显示值
47 1 tmp=DispTab[tmp]; //取字形码
48 1 P0=tmp; //送出字形码
49 1 dCount++; //计数值加1
50 1 if(dCount==6) //如果计数值等于6,则让其回0
51 1 dCount=0;
52 1 }
53
54 /*发送起始条件*/
C51 COMPILER V7.06 24C01 02/28/2006 10:27:07 PAGE 2
55 void Start(void) /*起始条件*/
56 {
57 1 Sda=1;
58 1 Scl=1;
59 1 _nop_ ();
60 1 _nop_ ();
61 1 _nop_ ();
62 1 _nop_ ();
63 1 Sda=0;
64 1 _nop_ ();
65 1 _nop_ ();
66 1 _nop_ ();
67 1 _nop_ ();
68 1 }
69 void Stop(void) /*停止条件*/
70 {
71 1 Sda=0;
72 1 Scl=1;
73 1 _nop_ ();
74 1 _nop_ ();
75 1 _nop_ ();
76 1 _nop_ ();
77 1 Sda=1;
78 1 _nop_ ();
79 1 _nop_ ();
80 1 _nop_ ();
81 1 _nop_ ();
82 1 }
83 void Ack(void) /*应答位*/
84 {
85 1 Sda=0;
86 1 _nop_ ();
87 1 _nop_ ();
88 1 _nop_ ();
89 1 _nop_ ();
90 1 Scl=1;
91 1 _nop_ ();
92 1 _nop_ ();
93 1 _nop_ ();
94 1 _nop_ ();
95 1 Scl=0;
96 1 }
97 void NoAck(void) /*反向应答位*/
98 {
99 1 Sda=1;
100 1 _nop_ ();
101 1 _nop_ ();
102 1 _nop_ ();
103 1 _nop_ ();
104 1 Scl=1;
105 1 _nop_ ();
106 1 _nop_ ();
107 1 _nop_ ();
108 1 _nop_ ();
109 1 Scl=0;
110 1 }
111 void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/
112 {
113 1 uchar BitCounter=8; /*位数控制*/
114 1 uchar temp; /*中间变量控制*/
115 1 do
116 1 {
C51 COMPILER V7.06 24C01 02/28/2006 10:27:07 PAGE 3
117 2 temp=Data;
118 2 Scl=0;
119 2 _nop_ ();
120 2 _nop_ ();
121 2 _nop_ ();
122 2 _nop_ ();
123 2 if((temp&0x80)==0x80)/* 如果最高位是1*/
124 2 Sda=1;
125 2 else
126 2 Sda=0;
127 2 Scl=1;
128 2 temp=Data<<1; /*RLC*/
129 2 Data=temp;
130 2 BitCounter--;
131 2 }while(BitCounter);
132 1 Scl=0;
133 1 }
134 uchar Read(void) /*读一个字节的数据,并返回该字节值*/
135 {
136 1 uchar temp=0;
137 1 uchar temp1=0;
138 1 uchar BitCounter=8;
139 1 Sda=1;
140 1 do{
141 2 Scl=0;
142 2 _nop_ ();
143 2 _nop_ ();
144 2 _nop_ ();
145 2 _nop_ ();
146 2 Scl=1;
147 2 _nop_ ();
148 2 _nop_ ();
149 2 _nop_ ();
150 2 _nop_ ();
151 2 if(Sda) /*如果Sda=1;*/
152 2 temp=temp|0x01; /*temp的最低位置1*/
153 2 else
154 2 temp=temp&0xfe; /*否则temp的最低位清0*/
155 2 if(BitCounter-1)
156 2 { temp1=temp<<1;
157 3 temp=temp1;
158 3 }
159 2 BitCounter--;
160 2 }while(BitCounter);
161 1 return(temp);
162 1 }
163 void WrToROM(uchar Data[],uchar Address,uchar Num)
164 {
165 1 uchar i=0;
166 1 uchar *PData;
167 1 PData=Data;
168 1 Start();
169 1 Send(0xa0);
170 1 Ack();
171 1 Send(Address);
172 1 Ack();
173 1 for(i=0;i<Num;i++)
174 1 {
175 2 Send(*(PData+i));
176 2 Ack();
177 2 }
178 1 Stop();
C51 COMPILER V7.06 24C01 02/28/2006 10:27:07 PAGE 4
179 1 }
180 void RdFromROM(uchar Data[],uchar Address,uchar Num)
181 {
182 1 uchar i=0;
183 1 uchar *PData;
184 1 PData=Data;
185 1 for(i=0;i<Num;i++)
186 1 {
187 2 Start();
188 2 Send(0xa0);
189 2 Ack();
190 2 Send(Address+i);
191 2 Ack();
192 2 Start();
193 2 Send(0xa1);
194 2 Ack();
195 2 *(PData+i)=Read();
196 2 Scl=0;
197 2 NoAck();
198 2 Stop();
199 2 }
200 1 }
201
202 void Recive() interrupt 4 //串行中断程序
203 { static uchar Count=0;
204 1 if(TI)
205 1 { TI=0;
206 2 return; //如果是发送中断,直接退出
207 2 }
208 1 RI=0; //清RI标志
209 1 RecBuf[Count]=SBUF;
210 1 Count++;
211 1 Rec=0;
212 1 if(Count>=3)
213 1 { Count=0;
214 2 Rec=1; //置位标志
215 2 }
216 1 }
217
218 void Init()
219 { TMOD=0x21;
220 1 RI=0;
221 1 TH1=0xfd;
222 1 TL1=0xfd;
223 1 PCON|=0x80;
224 1 TR1=1;
225 1 SCON=0x50;
226 1
227 1 TH0=TH0Val;
228 1 TL0=TL0Val;
229 1 ET0=1; //开T0中断
230 1 EA=1; //开总中断
231 1 ES=1;
232 1 TR0=1; //T0开始运行
233 1 TR1=1;
234 1 }
235
236 void Calc(uchar Dat1,uchar Dat2) //第一个参数放在第1、2位,第二个参数放入第5、6位
237 { DispBuf[0]=Dat1/16;
238 1 DispBuf[1]=Dat1%16;
239 1
240 1 DispBuf[4]=Dat2/16;
C51 COMPILER V7.06 24C01 02/28/2006 10:27:07 PAGE 5
241 1 DispBuf[5]=Dat2%16;
242 1 }
243
244 void main()
245 { uchar RomDat[4];
246 1 Init(); //初始化
247 1 DispBuf[2]=Hidden;
248 1 DispBuf[3]=Hidden;
249 1 for(;;)
250 1 {
251 2 Calc(RecBuf[1],RomDat[0]); //分别显示地址和数据
252 2 if(Rec) //接收到数据
253 2 { Rec=0; //清除标志
254 3 if(RecBuf[0]==0) //第一种功能,写入
255 3 { RomDat[0]=RecBuf[2];
256 4 WrToROM(RomDat,RecBuf[1],1);
257 4 SBUF=RomDat[0];
258 4 }
259 3 else
260 3 { RdFromROM(RomDat,RecBuf[1],1);
261 4 SBUF=RomDat[0];
262 4 }
263 3 }
264 2 }
265 1 }
266
267
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 517 ----
CONSTANT SIZE = 25 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 20
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -