📄 pcf8591-da-lcd1602-c51.lst
字号:
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 1
C51 COMPILER V8.18, COMPILATION OF MODULE PCF8591_DA_LCD1602_C51
OBJECT MODULE PLACED IN PCF8591-DA-LCD1602-C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PCF8591-DA-LCD1602-C51.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <intrins.h>
3 #include <string.h>
4
5 #define uchar unsigned char
6 #define uint unsigned int
7 #define disdata P0 //显示数据码输出口
8 bit flag;
9 sbit SCL=P1^2; // 将p1.0口模拟时钟口
10 sbit SDA=P1^3; // 将p1.3口模拟数据口
11
12
13 sbit LCD_RS = P2^0;
14 sbit LCD_RW = P2^1;
15 sbit LCD_EN = P2^2;
16
17 sbit K1 = P1^4;
18 sbit K2 = P1^5; //选择健
19 sbit K3 = P1^6; //启动健
20 sbit K4 = P1^7; //停止健
21 sbit BEEP = P3^6; //蜂鸣器
22
23 uchar code dis1[] = {" PCF-8591 "};
24 uchar code dis2[] = {" DA CONVERTER "};
25
26 uchar code dis3[] = {" K2: D/A CHOOSE "};
27 uchar code dis4[] = {"K3:ENTER K4:EXIT"};
28
29 uchar code dis5[] = {" SINE WAVE "};
30 uchar code dis6[] = {" SQUARE WAVE "};
31 uchar code dis7[] = {" TRIANGLE WAVE "};
32 uchar code dis8[] = {" SAWTOOTH WAVE "};
33
34 bit out1=0,out2=0,out3=0,out4=0,START=0;
35
36 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
37
38 bit bdata SystemError; //从机错误标志位
39
40 uchar N=0x00,k_count;
41 /*********************** PCF8591专用变量定义 ***********************/
42
43 #define PCF8591_WRITE 0x90
44 #define PCF8591_READ 0x91
45 #define NUM 4 //接收和发送缓存区的深度
46 uchar idata receivebuf[NUM]; //数据接收缓冲区
47
48 uchar code sin_tab[] = //正弦波输出表
49 {
50 0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
51 0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
52 0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
53 0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
54 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
55 0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDA,
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 2
56 0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
57 0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
58 0x80,0x7C,0x79,0x76,0x72,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
59 0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
60 0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
61 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
62 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
63 0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
64 0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
65 0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x7E
66 };
67
68 /*******************************************************************/
69 /* */
70 /* 延时函数 */
71 /* */
72 /*******************************************************************/
73 void delayB(uchar x) //x*0.14MS
74 {
75 1 uchar i;
76 1 while(x--)
77 1 {
78 2 for (i=0; i<13; i++)
79 2 { }
80 2 }
81 1 }
82
83 /*******************************************************************/
84 /* */
85 /* 延时函数 */
86 /* */
87 /*******************************************************************/
88 void delay(int ms)
89 {
90 1 while(ms--)
91 1 {
92 2 uchar i;
93 2 for(i=0;i<250;i++)
94 2 {
95 3 _nop_();
96 3 _nop_();
97 3 _nop_();
98 3 _nop_();
99 3 }
100 2 }
101 1 }
102
103 /*******************************************************************/
104 /* */
105 /* 蜂鸣器函数 */
106 /* */
107 /*******************************************************************/
108 void beep()
109 {
110 1 uchar j;
111 1 for (j=0;j<180;j++)
112 1 {
113 2 delayB(5);
114 2 BEEP=!BEEP; //BEEP取反
115 2 }
116 1 BEEP=1; //关闭蜂鸣器
117 1 delay(100);
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 3
118 1 }
119
120
121 /*******************************************************************/
122 /* */
123 /*检查LCD忙状态 */
124 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
125 /* */
126 /*******************************************************************/
127
128 bit lcd_busy()
129 {
130 1 bit result;
131 1 LCD_RS = 0;
132 1 LCD_RW = 1;
133 1 LCD_EN = 1;
134 1 delayNOP();
135 1 result = (bit)(P0&0x80);
136 1 LCD_EN = 0;
137 1 return(result);
138 1 }
139
140 /*******************************************************************/
141 /* */
142 /*写指令数据到LCD */
143 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
144 /* */
145 /*******************************************************************/
146
147 void lcd_wcmd(uchar cmd)
148
149 {
150 1 while(lcd_busy());
151 1 LCD_RS = 0;
152 1 LCD_RW = 0;
153 1 LCD_EN = 0;
154 1 _nop_();
155 1 _nop_();
156 1 P0 = cmd;
157 1 delayNOP();
158 1 LCD_EN = 1;
159 1 delayNOP();
160 1 LCD_EN = 0;
161 1 }
162
163 /*******************************************************************/
164 /* */
165 /*写显示数据到LCD */
166 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
167 /* */
168 /*******************************************************************/
169
170 void lcd_wdat(uchar dat)
171 {
172 1 while(lcd_busy());
173 1 LCD_RS = 1;
174 1 LCD_RW = 0;
175 1 LCD_EN = 0;
176 1 P0 = dat;
177 1 delayNOP();
178 1 LCD_EN = 1;
179 1 delayNOP();
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 4
180 1 LCD_EN = 0;
181 1 }
182
183 /*******************************************************************/
184 /* */
185 /* LCD初始化设定 */
186 /* */
187 /*******************************************************************/
188
189 void lcd_init()
190 {
191 1 delay(15);
192 1 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
193 1 delay(5);
194 1 lcd_wcmd(0x38);
195 1 delay(5);
196 1 lcd_wcmd(0x38);
197 1 delay(5);
198 1
199 1 lcd_wcmd(0x0c); //显示开,关光标
200 1 delay(5);
201 1 lcd_wcmd(0x06); //移动光标
202 1 delay(5);
203 1 lcd_wcmd(0x01); //清除LCD的显示内容
204 1 delay(5);
205 1 }
206
207 /*******************************************************************/
208 /* */
209 /* 设定显示位置 */
210 /* */
211 /*******************************************************************/
212
213 void lcd_pos(uchar pos)
214 {
215 1 lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
216 1 }
217
218 //-------------------------------------------------------------------
219 // 函数名称: iic_start()
220 // 函数功能: 启动I2C总线子程序
221 //-------------------------------------------------------------------
222 void iic_start(void)
223 { //时钟保持高,数据线从高到低一次跳变,I2C通信开始
224 1 SDA = 1;
225 1 SCL = 1;
226 1 delayNOP(); // 延时5us
227 1 SDA = 0;
228 1 delayNOP();
229 1 SCL = 0;
230 1 }
231 //-------------------------------------------------------------------
232 // 函数名称: iic_stop()
233 // 函数功能: 停止I2C总线数据传送子程序
234 //-------------------------------------------------------------------
235 void iic_stop(void)
236 {
237 1 SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止
238 1 SCL = 1;
239 1 delayNOP();
240 1 SDA = 1;
241 1 delayNOP();
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 5
242 1 SCL = 0;
243 1 }
244 //------------------------------------------------------------------
245 // 函数名称: iicInit_()
246 // 函数功能: 初始化I2C总线子程序
247 //------------------------------------------------------------------
248 void iicInit(void)
249 {
250 1 SCL = 0;
251 1 iic_stop();
252 1 }
253 //-------------------------------------------------------------------
254 // 函数名称: slave_ACK
255 // 函数功能: 从机发送应答位子程序
256 //-------------------------------------------------------------------
257 void slave_ACK(void)
258 {
259 1 SDA = 0;
260 1 SCL = 1;
261 1 delayNOP();
262 1 SCL = 0;
263 1 }
264 //-------------------------------------------------------------------
265 // 函数名称: slave_NOACK
266 // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
267 //-------------------------------------------------------------------
268 void slave_NOACK(void)
269 {
270 1 SDA = 1;
271 1 SCL = 1;
272 1 delayNOP();
273 1 SDA = 0;
274 1 SCL = 0;
275 1 }
276 //-------------------------------------------------------------------
277 // 函数名称: check_ACK
278 // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
279 //-------------------------------------------------------------------
280 void check_ACK(void)
281 {
282 1 SDA = 1; // 将p1.1设置成输入,必须先向端口写1
283 1 SCL = 1;
284 1 flag = 0;
285 1 delayNOP();
286 1 if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志flag
287 1 flag = 1;
288 1 SCL = 0;
289 1 }
290 //-------------------------------------------------------------------
291 // 函数名称: IICSendByte
292 // 入口参数: ch
293 // 函数功能: 发送一个字节
294 //-------------------------------------------------------------------
295 void IICSendByte(uchar ch)
296
297 {
298 1 unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位
299 1
300 1 while(n--)
301 1 {
302 2 if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
303 2 {
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 6
304 3 SDA = 1; // 传送位1
305 3 SCL = 1;
306 3 delayNOP();
307 3 // SDA = 0;
308 3 SCL = 0;
309 3 }
310 2 else
311 2 {
312 3 SDA = 0; // 否则传送位0
313 3 SCL = 1;
314 3 delayNOP();
315 3 SCL = 0;
316 3 }
317 2 ch = ch<<1; // 数据左移一位
318 2 }
319 1 }
320 //-------------------------------------------------------------------
321 // 函数名称: IICreceiveByte
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -