📄 pcf8591.lst
字号:
C51 COMPILER V8.02 PCF8591 12/31/2009 10:21:57 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE PCF8591
OBJECT MODULE PLACED IN PCF8591.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PCF8591.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 //-----------------------函数声明,变量定义------------------------
3 #include <reg51.h>
4 #include <intrins.h>
5 sbit SCL=P1^2; // 将p1.2口模拟时钟口
6 sbit SDA=P1^3; // 将p1.3口模拟数据口
7 bit askflag;
8
9 #define uchar unsigned char
10 #define uint unsigned int
11 #define disdata P0 //显示数据码输出口
12
13 sbit LCD_RS = P2^0;
14 sbit LCD_RW = P2^1;
15 sbit LCD_EN = P2^2;
16
17 uint data dis[4]={0x00,0x00,0x00,0x00};
18 //定义3个显示数据单元和1个数据存储单元
19
20 uchar code dis4[] = {"1- . V 2- . V"};
21 uchar code dis5[] = {"3- . V 4- . V"};
22
23
24 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
25
26 bit bdata SystemError; //从机错误标志位
27
28 /*********************** PCF8591专用变量定义 ***********************/
29
30 #define PCF8591_WRITE 0x90
31 #define PCF8591_READ 0x91
32 #define NUM 4 //接收和发送缓存区的深度
33 uchar idata receivebuf[NUM]; //数据接收缓冲区
34
35 /*******************************************************************/
36 /* */
37 /* 延时函数 */
38 /* */
39 /*******************************************************************/
40
41 void delay(int ms)
42 {
43 1 while(ms--)
44 1 {
45 2 uchar i;
46 2 for(i=0;i<250;i++)
47 2 {
48 3 _nop_();
49 3 _nop_();
50 3 _nop_();
51 3 _nop_();
52 3 }
53 2 }
54 1 }
55
C51 COMPILER V8.02 PCF8591 12/31/2009 10:21:57 PAGE 2
56 /*******************************************************************/
57 /* */
58 /*检查LCD忙状态 */
59 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
60 /* */
61 /*******************************************************************/
62
63 bit lcd_busy()
64 {
65 1 bit result;
66 1 LCD_RS = 0;
67 1 LCD_RW = 1;
68 1 LCD_EN = 1;
69 1 delayNOP();
70 1 result = (bit)(P0&0x80);
71 1 LCD_EN = 0;
72 1 return(result);
73 1 }
74
75 /*******************************************************************/
76 /* */
77 /*写指令数据到LCD */
78 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
79 /* */
80 /*******************************************************************/
81
82 void lcd_wcmd(uchar cmd)
83
84 {
85 1 while(lcd_busy());
86 1 LCD_RS = 0;
87 1 LCD_RW = 0;
88 1 LCD_EN = 0;
89 1 _nop_();
90 1 _nop_();
91 1 P0 = cmd;
92 1 delayNOP();
93 1 LCD_EN = 1;
94 1 delayNOP();
95 1 LCD_EN = 0;
96 1 }
97
98 /*******************************************************************/
99 /* */
100 /*写显示数据到LCD */
101 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
102 /* */
103 /*******************************************************************/
104
105 void lcd_wdat(uchar dat)
106 {
107 1 while(lcd_busy());
108 1 LCD_RS = 1;
109 1 LCD_RW = 0;
110 1 LCD_EN = 0;
111 1 P0 = dat;
112 1 delayNOP();
113 1 LCD_EN = 1;
114 1 delayNOP();
115 1 LCD_EN = 0;
116 1 }
117
C51 COMPILER V8.02 PCF8591 12/31/2009 10:21:57 PAGE 3
118 /*******************************************************************/
119 /* */
120 /* LCD初始化设定 */
121 /* */
122 /*******************************************************************/
123
124 void lcd_init()
125 {
126 1 delay(15);
127 1 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
128 1 delay(5);
129 1 lcd_wcmd(0x38);
130 1 delay(5);
131 1 lcd_wcmd(0x38);
132 1 delay(5);
133 1
134 1 lcd_wcmd(0x0c); //显示开,关光标
135 1 delay(5);
136 1 lcd_wcmd(0x06); //移动光标
137 1 delay(5);
138 1 lcd_wcmd(0x01); //清除LCD的显示内容
139 1 delay(5);
140 1 }
141
142 /*******************************************************************/
143 /* */
144 /* 设定显示位置 */
145 /* */
146 /*******************************************************************/
147
148 void lcd_pos(uchar pos)
149 {
150 1 lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
151 1 }
152
153 /******************************************************************/
154 /* */
155 /* 数据处理与显示 */
156 /* 将采集到的数据进行16进制转换为ASCLL码。 */
157 /* */
158 /******************************************************************/
159
160 show_value(uchar ad_data)
161
162 {
163 1 dis[2]=ad_data/51; //AD值转换为3为BCD码,最大为5.00V。
164 1 dis[2]=dis[2]+0x30; //转换为ACSII码
165 1 dis[3]=ad_data%51; //余数暂存
166 1 dis[3]=dis[3]*10; //计算小数第一位
167 1 dis[1]=dis[3]/51;
168 1 dis[1]=dis[1]+0x30; //转换为ACSII码
169 1 dis[3]=dis[3]%51;
170 1 dis[3]=dis[3]*10; //计算小数第二位
171 1 dis[0]=dis[3]/51; //
172 1 dis[0]=dis[0]+0x30; //转换为ACSII码
173 1 }
174 //-------------------------------------------------------------------
175 // 函数名称: iic_start()
176 // 函数功能: 启动I2C总线子程序
177 //-------------------------------------------------------------------
178 void iic_start(void)
179 { //时钟保持高,数据线从高到低一次跳变,I2C通信开始
C51 COMPILER V8.02 PCF8591 12/31/2009 10:21:57 PAGE 4
180 1 SDA = 1;
181 1 SCL = 1;
182 1 delayNOP(); // 延时5us
183 1 SDA = 0;
184 1 delayNOP();
185 1 SCL = 0;
186 1 }
187 //-------------------------------------------------------------------
188 // 函数名称: iic_stop()
189 // 函数功能: 停止I2C总线数据传送子程序
190 //-------------------------------------------------------------------
191 void iic_stop(void)
192 {
193 1 SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止
194 1 SCL = 1;
195 1 delayNOP();
196 1 SDA = 1;
197 1 delayNOP();
198 1 SCL = 0;
199 1 }
200 //------------------------------------------------------------------
201 // 函数名称: iicInit_()
202 // 函数功能: 初始化I2C总线子程序
203 //------------------------------------------------------------------
204 void iicInit(void)
205 {
206 1 SCL = 0;
207 1 iic_stop();
208 1 }
209 //-------------------------------------------------------------------
210 // 函数名称: slave_ACK
211 // 函数功能: 从机发送应答位子程序
212 //-------------------------------------------------------------------
213 void slave_ACK(void)
214 {
215 1 SDA = 0;
216 1 SCL = 1;
217 1 delayNOP();
218 1 SCL = 0;
219 1 }
220 //-------------------------------------------------------------------
221 // 函数名称: slave_NOACK
222 // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
223 //-------------------------------------------------------------------
224 void slave_NOACK(void)
225 {
226 1 SDA = 1;
227 1 SCL = 1;
228 1 delayNOP();
229 1 SDA = 0;
230 1 SCL = 0;
231 1 }
232 //-------------------------------------------------------------------
233 // 函数名称: check_ACK
234 // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
235 //-------------------------------------------------------------------
236 void check_ACK(void)
237 {
238 1 SDA = 1; // 将p1.1设置成输入,必须先向端口写1
239 1 SCL = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -