📄 display.lst
字号:
CX51 COMPILER V7.20 DISPLAY 08/15/2005 15:35:54 PAGE 1
CX51 COMPILER V7.20, COMPILATION OF MODULE DISPLAY
OBJECT MODULE PLACED IN .\display.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\CX51.EXE ..\..\test\icktest\display.c LARGE ROM(HUGE) BROWSE DEBUG PRINT(.\display.
-lst) OBJECT(.\display.obj)
line level source
1 #include "main.h"
2 //#include "Sm8958k.h"
3 #include <intrins.h>
4 //#include "i2c.h"
5 //#include "rc500.h"
6 //#define uchar unsigned char
7 #define _Nop() _nop_() /*定义空指令*/
8 //#define OK 0
9 //#define NOK 1
10 #define WRITE932 0x54
11 #define READ932 0x55
12 extern void alar(uint,uchar);
13 extern startwait(uchar time);
14 extern bit keyflag;
15 //extern uint tage;
16 extern bit T0IR;
17
18 bit ack;
19 //bit alarm; /*接收出错报警状态标志*/
20 //bit alarmrcv; /*发送出错报警状态标志*/
21
22 //bit SendStr(uchar sla,uchar *s);/*主发送函数*/
23 //bit RcvStr(uchar sla,uchar *s);/*主接收函数,在中断中调用*/
24 //bit IRcvStr(uchar sla,uchar subah,uchar subal,uchar *s,uchar no);/*test*/
25 //bit ISendStr(uchar sla,uchar subah,uchar subal,uchar *s,uchar no);/*test*/
26 //void delay_ms(uchar t) ;
27 //uchar maxtr; /*一帧传送的最长时间,暂定20ms*/
28 //uchar maxack; /*等待应答的最长时间,暂定20ms*/
29 //uchar idata sendata[15]={0x06,0x21,0x22,0x23,0x24,0x25}; /*发送数据缓冲区指针*/
30 //uchar idata rcvdata[15]; /*接收数据缓冲区指针*/
31 //uchar N; /*重发次数应小于5*/
32
33
34
35
36 /*******************************************************************
37 起动总线函数
38 函数原型: void Start_I2c();
39 功能: 启动I2C总线,即发送I2C起始条件.
40
41 ********************************************************************/
42 void Start_I2c()
43 {
44 1 SDA=1; /*发送起始条件的数据信号*/
45 1 TOGGLE_WD();
46 1 _Nop();
47 1 SCL=1;
48 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
49 1 _Nop();
50 1 _Nop();
51 1 _Nop();
52 1 _Nop();
53 1 SDA=0; /*发送起始信号*/
54 1 _Nop(); /* 起始条件锁定时间大于4μs*/
CX51 COMPILER V7.20 DISPLAY 08/15/2005 15:35:54 PAGE 2
55 1 _Nop();
56 1 _Nop();
57 1 _Nop();
58 1 _Nop();
59 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
60 1 _Nop();
61 1 _Nop();
62 1 }
63
64 /*******************************************************************
65 结束总线函数
66 函数原型: void Stop_I2c();
67 功能: 结束I2C总线,即发送I2C结束条件.
68
69 ********************************************************************/
70 void Stop_I2c()
71 {
72 1 SDA=0; /*发送结束条件的数据信号*/
73 1 _Nop(); /*发送结束条件的时钟信号*/
74 1 SCL=1; /*结束条件建立时间大于4μs*/
75 1 _Nop();
76 1 _Nop();
77 1 _Nop();
78 1 _Nop();
79 1 _Nop();
80 1 SDA=1; /*发送I2C总线结束信号*/
81 1 _Nop();
82 1 _Nop();
83 1 _Nop();
84 1 _Nop();
85 1 TOGGLE_WD();
86 1 }
87
88 /*******************************************************************
89 字节数据传送函数
90 函数原型: bit SendByte(uchar c);
91 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
92 此状态位进行操作.(不应答或非应答都使ack=0 假)
93 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
94 返回:返回OK有应答,返回NOK无应答。
95 ********************************************************************/
96 bit SendByte(uchar c)
97 {
98 1 uchar BitCnt;
99 1 // uint tagesave;
100 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
101 1 {
102 2 if((c<<BitCnt)&0x80)
103 2 {
104 3 SDA=1; /*判断发送位*/
105 3 while(SDA==0&&!T0IR)TOGGLE_WD();
106 3 if(T0IR)return(NOK);/*超时*/
107 3 }
108 2 else SDA=0;
109 2 _Nop();
110 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
111 2 while(SCL==0&&!T0IR)TOGGLE_WD();
112 2 if(T0IR)return(NOK);/*超时*/
113 2
114 2 _Nop();
115 2 _Nop(); /*保证时钟高电平周期大于4μs*/
116 2 _Nop();
CX51 COMPILER V7.20 DISPLAY 08/15/2005 15:35:54 PAGE 3
117 2 _Nop();
118 2 _Nop();
119 2 SCL=0;
120 2 }
121 1 _Nop();
122 1 _Nop();
123 1 _Nop();
124 1 _Nop();
125 1 _Nop();
126 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
127 1 //maxack=0; /*等待应答最长时间为20ms*/
128 1 while (!T0IR) /*等待应答,最长等待时间为20ms*/
129 1 {TOGGLE_WD();
130 2 if(SDA==0) /*如果有应答信号,就置应答标志信号*/
131 2 {
132 3 SCL=1;
133 3 _Nop();
134 3 _Nop();
135 3 //if(SDA==0)
136 3 //{
137 3 ack=1;
138 3 SCL=0;
139 3 return(OK);
140 3 //}/*置应答标志信号*/
141 3 }
142 2 }
143 1 // ack=0; /*无应答*/
144 1 SCL=1;
145 1 _Nop();
146 1 _Nop();
147 1 SCL=0;
148 1 ack=0; /*无应答*/
149 1 return(NOK);
150 1 }
151
152 /*******************************************************************
153 字节数据接收函数
154 函数原型: uchar RcvByte();
155 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
156 发完后请用应答函数。
157 ********************************************************************/
158 uchar RcvByte()
159 {
160 1 uchar retc;
161 1 uchar BitCnt;
162 1
163 1 retc=0;
164 1 SDA=1; /*置数据线为输入方式*/
165 1 for(BitCnt=0;BitCnt<8;BitCnt++)
166 1 {
167 2 _Nop();
168 2 SCL=0; /*置时钟线为低,准备接收数据位*/
169 2 _Nop();
170 2 _Nop(); /*时钟低电平周期大于4.7μs*/
171 2 _Nop();
172 2 _Nop();
173 2 _Nop();
174 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
175 2 while(SCL==0&&!T0IR)TOGGLE_WD();
176 2 if(T0IR)return(NOK);/*超时*/
177 2
178 2 _Nop();
CX51 COMPILER V7.20 DISPLAY 08/15/2005 15:35:54 PAGE 4
179 2 _Nop();
180 2 retc=retc<<1;
181 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
182 2 _Nop();
183 2 _Nop();
184 2 }
185 1 SCL=0;
186 1 _Nop();
187 1 _Nop();
188 1 return(retc);
189 1 }
190
191 /********************************************************************
192 应答子函数
193 原型: void Ack_I2c(bit a);
194
195 功能:主控器进行应答信号,(可以是应答或非应答信号)
196 ********************************************************************/
197 void Ack_I2c(bit a)
198 {
199 1
200 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
201 1 else SDA=1;
202 1 _Nop();
203 1 _Nop();
204 1 _Nop();
205 1 SCL=1;
206 1 _Nop();
207 1 _Nop(); /*时钟低电平周期大于4μs*/
208 1 _Nop();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -