📄 pcf8591-da-lcd1602-c51.lst
字号:
C51 COMPILER V7.08 PCF8591_DA_LCD1602_C51 12/21/2006 16:15:07 PAGE 1
C51 COMPILER V7.08, 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 /*******************************************************************/
2 /* */
3 /* ME500单片机开发系统演示程序 - PCF8591 D/A CONVERTER */
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/12/02 */
13 /* */
14 /*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved */
15 /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! */
16 /* */
17 /*******************************************************************/
18
19 #include <reg52.h>
20 #include <intrins.h>
21 #include <string.h>
22
23 #define uchar unsigned char
24 #define uint unsigned int
25 #define disdata P0 //显示数据码输出口
26
27 sbit SDA=P1^3; // 将p1.3口模拟数据口
28 sbit SCL=P1^0; // 将p1.0口模拟时钟口
29
30 sbit LCD_RS = P2^0;
31 sbit LCD_RW = P2^1;
32 sbit LCD_EN = P2^2;
33
34 sbit K1 = P1^4;
35 sbit K2 = P1^5; //选择健
36 sbit K3 = P1^6; //启动健
37 sbit K4 = P1^7; //停止健
38 sbit BEEP = P3^7; //蜂鸣器
39
40 uchar code dis1[] = {" PCF-8591 "};
41 uchar code dis2[] = {" DA CONVERTER "};
42
43 uchar code dis3[] = {" K2: D/A CHOOSE "};
44 uchar code dis4[] = {"K3:ENTER K4:EXIT"};
45
46 uchar code dis5[] = {" SINE WAVE "};
47 uchar code dis6[] = {" SQUARE WAVE "};
48 uchar code dis7[] = {" TRIANGLE WAVE "};
49 uchar code dis8[] = {" SAWTOOTH WAVE "};
50
51 bit out1=0,out2=0,out3=0,out4=0,START=0;
52
53 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
54
55 bit bdata SystemError; //从机错误标志位
C51 COMPILER V7.08 PCF8591_DA_LCD1602_C51 12/21/2006 16:15:07 PAGE 2
56
57 uchar N=0x00,k_count;
58 /*********************** PCF8591专用变量定义 ***********************/
59
60 #define PCF8591_WRITE 0x90
61 #define PCF8591_READ 0x91
62 #define NUM 4 //接收和发送缓存区的深度
63 uchar idata receivebuf[NUM]; //数据接收缓冲区
64
65 uchar code sin_tab[] = //正弦波输出表
66 {
67 0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
68 0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
69 0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
70 0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
71 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
72 0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDA,
73 0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
74 0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
75 0x80,0x7C,0x79,0x76,0x72,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
76 0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
77 0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
78 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
79 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
80 0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
81 0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
82 0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x7E
83 };
84
85 /*******************************************************************/
86 /* */
87 /* 延时函数 */
88 /* */
89 /*******************************************************************/
90 void delayB(uchar x) //x*0.14MS
91 {
92 1 uchar i;
93 1 while(x--)
94 1 {
95 2 for (i=0; i<13; i++)
96 2 { }
97 2 }
98 1 }
99
100 /*******************************************************************/
101 /* */
102 /* 延时函数 */
103 /* */
104 /*******************************************************************/
105 void delay(int ms)
106 {
107 1 while(ms--)
108 1 {
109 2 uchar i;
110 2 for(i=0;i<250;i++)
111 2 {
112 3 _nop_();
113 3 _nop_();
114 3 _nop_();
115 3 _nop_();
116 3 }
117 2 }
C51 COMPILER V7.08 PCF8591_DA_LCD1602_C51 12/21/2006 16:15:07 PAGE 3
118 1 }
119
120 /*******************************************************************/
121 /* */
122 /* 蜂鸣器函数 */
123 /* */
124 /*******************************************************************/
125 void beep()
126 {
127 1 uchar j;
128 1 for (j=0;j<180;j++)
129 1 {
130 2 delayB(5);
131 2 BEEP=!BEEP; //BEEP取反
132 2 }
133 1 BEEP=1; //关闭蜂鸣器
134 1 delay(100);
135 1 }
136
137
138 /*******************************************************************/
139 /* */
140 /*检查LCD忙状态 */
141 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
142 /* */
143 /*******************************************************************/
144
145 bit lcd_busy()
146 {
147 1 bit result;
148 1 LCD_RS = 0;
149 1 LCD_RW = 1;
150 1 LCD_EN = 1;
151 1 delayNOP();
152 1 result = (bit)(P0&0x80);
153 1 LCD_EN = 0;
154 1 return(result);
155 1 }
156
157 /*******************************************************************/
158 /* */
159 /*写指令数据到LCD */
160 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
161 /* */
162 /*******************************************************************/
163
164 void lcd_wcmd(uchar cmd)
165
166 {
167 1 while(lcd_busy());
168 1 LCD_RS = 0;
169 1 LCD_RW = 0;
170 1 LCD_EN = 0;
171 1 _nop_();
172 1 _nop_();
173 1 P0 = cmd;
174 1 delayNOP();
175 1 LCD_EN = 1;
176 1 delayNOP();
177 1 LCD_EN = 0;
178 1 }
179
C51 COMPILER V7.08 PCF8591_DA_LCD1602_C51 12/21/2006 16:15:07 PAGE 4
180 /*******************************************************************/
181 /* */
182 /*写显示数据到LCD */
183 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
184 /* */
185 /*******************************************************************/
186
187 void lcd_wdat(uchar dat)
188 {
189 1 while(lcd_busy());
190 1 LCD_RS = 1;
191 1 LCD_RW = 0;
192 1 LCD_EN = 0;
193 1 P0 = dat;
194 1 delayNOP();
195 1 LCD_EN = 1;
196 1 delayNOP();
197 1 LCD_EN = 0;
198 1 }
199
200 /*******************************************************************/
201 /* */
202 /* LCD初始化设定 */
203 /* */
204 /*******************************************************************/
205
206 void lcd_init()
207 {
208 1 delay(15);
209 1 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
210 1 delay(5);
211 1 lcd_wcmd(0x38);
212 1 delay(5);
213 1 lcd_wcmd(0x38);
214 1 delay(5);
215 1
216 1 lcd_wcmd(0x0c); //显示开,关光标
217 1 delay(5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -