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