iicled.lst
来自「VB环境下的串口通讯设计」· LST 代码 · 共 555 行 · 第 1/2 页
LST
555 行
C51 COMPILER V8.05a IICLED 01/08/2008 18:30:43 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE IICLED
OBJECT MODULE PLACED IN IICLED.OBJ
COMPILER INVOKED BY: C:\Keilc51\C51\BIN\C51.EXE IICLED.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /************************************************/
2 #include <REG52.H>
3 #include <intrins.h>
4 #define uchar unsigned char
5 #define uint unsigned int
6 #define ulong unsigned long
7 #define int8 unsigned char
8 #define int16 unsigned int
9 #define int32 unsigned long
10 sbit SCLK=P3^5;
11 sbit IO=P3^6;
12 sbit RESET=P3^7;
13 sbit I2C_SDA= P1^5;
14 sbit I2C_SCK= P1^4;
15 sbit I2C_WP= P1^3;
16
17 //============================
18 sbit LED1=P3^4;
19 sbit LED2=P1^6;
20 sbit GRE=P1^7;
21 sbit s1=P0^3;
22 sbit s2=P2^3;
23 sbit SCK=P2^4;
24 sbit RCK=P2^5;
25 sbit nG=P2^6;
26 sbit SER=P2^7;
27 uchar xdata tab[16][6];
28 uchar count;
29 uchar l;
30 uint m;
31
32
33 bdata uchar temp;//位于位寻址区的temp变量,
34 sbit bit0=temp^0;//发送数据或命令时用到,通过右移操作将数据或命令放到IO线上
35 sbit bit7=temp^7;//接收数据时用到,接收到的数据始终存入最高位,然后右移
36 void McuInit(void);
37 void Timer_Int();
38 void tab_time(uchar hh,uchar hl,uchar mh,uchar ml);
39 uchar read_time(uchar com);
40 //===============================================
41 /* 列选择*/
42 void lay(int8 n)
43 {
44 1 int8 i;
45 1 i=n;
46 1 s1=0;
47 1 s2=0;
48 1 if(n<8)
49 1 {
50 2 //_nop_();
51 2 P0=(P0&0xf8)|(~i);
52 2 }
53 1 else
54 1 { i=i-7;
55 2 i=i&0x07;
C51 COMPILER V8.05a IICLED 01/08/2008 18:30:43 PAGE 2
56 2 i=i|0xf0; //保护nG位
57 2 P2=(P2&0xf8)|(~i);
58 2 }
59 1
60 1 }
61 /*延时*/
62 void delay(int8 N)
63 {
64 1 int8 i,j,k;
65 1 for(i=0;i<100;i++)
66 1 for(j=0;j<10;j++)
67 1 for(k=0;k<N;k++);
68 1
69 1 }
70 /*发送字节,移位发送*/
71 void WriteByte(int8 val)
72 {
73 1 int8 i,m;
74 1 m=~val;
75 1 for (i = 8; i > 0; i --)
76 1 {
77 2 SCK = 0;//拉低74HC595时钟
78 2 SER = m&0x01;//发送74HC595一位串行数据
79 2 SCK = 1;//拉高74HC595时钟
80 2 m=m>>1;
81 2 _nop_();//延时
82 2 }
83 1 SER = 1;//释放数据总线
84 1 }
85
86 /*发送字*/
87 void display(int8 n )
88 {
89 1 int8 i;
90 1 for(i=0;i<6;i++)
91 1 WriteByte(tab[n][i]);
92 1 RCK=0; //保存并行数据
93 1 _nop_();
94 1 RCK=1;
95 1 }
96
97 void delays(int8 n)
98 { n=n;
99 1 m=m+0x1;
100 1 LED1=m&0x800;
101 1 GRE=~LED1;
102 1 LED2=m&0x1000;
103 1 }
104
105 void XianShiX(void)
106 {
107 1 /**/display(0);//行0
108 1 lay(14); //列
109 1 delays(1); //短延时
110 1 /**/display(1);//行1
111 1 lay(13);
112 1 delays(1);
113 1 /**/display(2);//行2
114 1 lay(12);
115 1 delays(1);
116 1 /**/display(3);//行3
117 1 lay(11);
C51 COMPILER V8.05a IICLED 01/08/2008 18:30:43 PAGE 3
118 1 delays(1);
119 1 /**/display(4);//行4
120 1 lay(10);
121 1 delays(1);
122 1 /**/display(5);//行5
123 1 lay(9);
124 1 delays(1);
125 1 /**/display(6);//行6
126 1 lay(8);
127 1 delays(1);
128 1
129 1 ///**/Timer_Int();
130 1 /**/display(7);//行7
131 1 lay(15);
132 1 delays(1);
133 1 /**/display(8);//行8
134 1 lay(7);
135 1 delays(1);
136 1 /**/display(9);//行9
137 1 lay(6);
138 1 delays(1);
139 1 /**/display(10);//行10
140 1 lay(5);
141 1 delays(1);
142 1 /**/display(11);//行11
143 1 lay(4);
144 1 delays(1);
145 1 /**/display(12); //行12
146 1 lay(0);
147 1 delays(1);
148 1 /**/display(13); //行13
149 1 lay(1);
150 1 delays(1);
151 1 /**/display(14); //行14
152 1 lay(2);
153 1 delays(1);
154 1 /**/display(15); //行15
155 1 lay(3);
156 1 delays(1);
157 1 }
158 //=============================
159 //延时10US
160 //内部调用函数
161 void Delay_10_uS(void)
162 {
163 1 char i=2;
164 1 while(i--);
165 1 }
166
167
168
169 //开始位
170 //内部调用函数
171 bit I2C_Start(void)
172 {
173 1 Delay_10_uS();
174 1 I2C_SDA =1;
175 1 Delay_10_uS();
176 1 I2C_SCK =1;
177 1 Delay_10_uS();
178 1 if ( I2C_SDA == 0) return 0;
179 1 if ( I2C_SCK == 0) return 0;
C51 COMPILER V8.05a IICLED 01/08/2008 18:30:43 PAGE 4
180 1 I2C_SDA = 0;
181 1 Delay_10_uS();
182 1 I2C_SCK = 0;
183 1 Delay_10_uS();
184 1 return 1;
185 1 }
186
187 //停止位
188 //内部调用函数
189 void I2C_Stop(void)
190 {
191 1 Delay_10_uS();
192 1 I2C_SDA = 0;
193 1 Delay_10_uS();
194 1 I2C_SCK = 1;
195 1 Delay_10_uS();
196 1 I2C_SDA = 1;
197 1 Delay_10_uS();
198 1 }
199
200
201 //读数据后拉高应答信号
202 //内部调用函数
203 void I2C_Nack(void)
204 {
205 1 Delay_10_uS();
206 1 I2C_SDA=1;
207 1 Delay_10_uS();
208 1 I2C_SCK=1;
209 1 Delay_10_uS();
210 1 I2C_SCK=0;
211 1 Delay_10_uS();
212 1 }
213
214 //写单字节数据
215 //内部调用函数
216 bit I2C_Send_Byte( uchar d)
217 {
218 1 uchar i = 8;
219 1 bit bit_ack;
220 1 while( i-- )
221 1 {
222 2 Delay_10_uS();
223 2 if ( d &0x80 ) I2C_SDA =1;
224 2 else I2C_SDA =0;
225 2 Delay_10_uS();
226 2 I2C_SCK = 1;
227 2 Delay_10_uS();
228 2 I2C_SCK = 0;
229 2 d = d << 1;
230 2 }
231 1 Delay_10_uS();
232 1 I2C_SDA = 1;
233 1 Delay_10_uS();
234 1 I2C_SCK = 1;
235 1 Delay_10_uS();
236 1 bit_ack = I2C_SDA;
237 1 I2C_SCK =0;
238 1 Delay_10_uS();
239 1 return bit_ack;
240 1 }
241
C51 COMPILER V8.05a IICLED 01/08/2008 18:30:43 PAGE 5
242 //接收单字节数据
243 //内部调用函数
244 uchar I2C_Receive_Byte(void)
245 {
246 1 uchar i = 8, d;
247 1 Delay_10_uS();
248 1 I2C_SDA = 1;
249 1 while ( i--)
250 1 {
251 2 d = d << 1;
252 2 Delay_10_uS();
253 2 I2C_SCK =1;
254 2 if ( I2C_SDA ) d++;
255 2 Delay_10_uS();
256 2 I2C_SCK =0;
257 2 }
258 1 return d;
259 1 }
260
261
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?