📄 1.lst
字号:
C51 COMPILER V8.08 1 05/13/2009 23:07:25 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE 1
OBJECT MODULE PLACED IN 1.OBJ
COMPILER INVOKED BY: D:\My professional software\keil\userfile\C51\BIN\C51.EXE 1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /****************http://bbs.cepark.com/register.php?fromuid=2975 ********
2 显示格式(单位V):
3 H0:4.03 H1:4.03
4 bbs.cepark.com
5
6 /*Writen by kidcao1987 2009-3-7*/
7 /****************http://bbs.cepark.com/register.php?fromuid=2975 *********/
8 #include <REG52.H>
9 #define uint unsigned int
10 #define uchar unsigned char
11 sbit lcd_rs=P1^0;
12 sbit lcd_rw=P1^1;
13 sbit lcd_en=P1^2; //液晶控制端
14
15 sbit cs=P2^0;
16 sbit clk=P3^6;
17 sbit dodi=P3^7;//adc0832控制端
18
19 uchar temp;
20 float result;
21
22 uchar code name[]="SWU-LiJin";
23
24 void lcd_delay(uint m) //延时函数
25 {
26 1 while(m--);
27 1 }
28
29 void read1602() //忙检测
30 {
31 1 uchar i;
32 1 i=254;
33 1 P0=0xff;
34 1 lcd_rs=0;
35 1 lcd_rw=1;
36 1 lcd_en=1;
37 1 while((i--)&&(P0&0x80));//若一段时间以后仍低,则认为是不忙
38 1 lcd_en=0;
39 1 }
40
41 void write1602(uchar wdata,bit rw)//向LCD1602写数据(rw=1)或者命令(rw=0)
42 {
43 1 read1602();
44 1 P0=wdata;
45 1 lcd_rs=rw;
46 1 lcd_rw=0;
47 1 lcd_en=1;
48 1 lcd_delay(1);
49 1 lcd_en=0;
50 1 }
51
52 void lcd_init() //LCD1602液晶的初始化
53 {
54 1
55 1 lcd_delay(1500);
C51 COMPILER V8.08 1 05/13/2009 23:07:25 PAGE 2
56 1 write1602(0x38,0);
57 1
58 1 lcd_delay(500);
59 1 write1602(0x38,0);
60 1
61 1 lcd_delay(500);
62 1 write1602(0x38,0);
63 1
64 1 write1602(0x38,0); //置功能,8位数据,2行显示,5x7字符
65 1
66 1 write1602(0x0c,0); //只打开屏显
67 1
68 1 write1602(0x06,0); //左到右显示,自加1
69 1
70 1 write1602(0x01,0); //清屏
71 1 }
72
73 void lcd_printf(uchar *str)//显示字符串
74 {
75 1 while(*str!='\0')
76 1 {
77 2 write1602(*str,1); //写入数据
78 2 str++;
79 2 }
80 1 }
81
82 void lcd_moveto(uchar x,uchar y)//指定显示的行列坐标
83 {
84 1 if(x==0)
85 1 write1602(0x80|y,0);
86 1 if(x==1)
87 1 write1602(0xc0|y,0);
88 1 }
89
90 uchar readadc0832(bit ch) //获取数值
91 {
92 1 uchar i,data1=0,data2=0;
93 1 clk=0;
94 1 dodi=1;
95 1 cs=0;//cs=0时ADC0832有效
96 1 clk=1;
97 1 clk=0;//第一个脉冲,开始位
98 1 dodi=1;
99 1 clk=1;
100 1 clk=0;//第二个脉冲,模式选择
101 1 dodi=ch;//通道选择
102 1 clk=1;
103 1 clk=0; //第三个脉冲,通道选择
104 1 dodi=1;
105 1
106 1 for(i=0;i<8;i++) //第一次读数从高到低 ,时钟下降沿有效
107 1 {
108 2 clk=1;
109 2 clk=0;
110 2 if(dodi)data1|=0x80>>i;
111 2 }
112 1
113 1 for(i=0;i<8;i++) //第二次从低到高读数,下降沿有效
114 1 {
115 2 if(dodi)data2|=0x01<<i;
116 2 clk=1;
117 2 clk=0;
C51 COMPILER V8.08 1 05/13/2009 23:07:25 PAGE 3
118 2 }
119 1
120 1 cs=1;
121 1 dodi=1;
122 1 clk=1;
123 1 if(data1==data2)return(data1);
124 1 }
125 void main()//测试用MAIN函数
126 {
127 1 lcd_init();
128 1 lcd_moveto(0,0);
129 1 lcd_printf(name);
130 1 while(1)
131 1 {
132 2 lcd_moveto(1,0);//定位在第二行第一列
133 2 lcd_printf("H0:");
134 2 temp=readadc0832(0);//读取通道0的电压值
135 2 result=temp*0.017725490;//得到实际的电压值
136 2 temp=(uchar)(result);//取得电压值的整数部分
137 2 write1602(temp+48,1);//显示电压值的整数部分
138 2 write1602('.',1);//显示小数点
139 2 result=(result-temp)*10;
140 2 temp=(uchar)(result);//获得电压值的小数点后第一位
141 2 write1602(temp+48,1);
142 2 result=(result-temp)*10;
143 2 temp=(uchar)(result); //获得电压值的小数点后第二位
144 2 write1602(temp+48,1);
145 2
146 2
147 2
148 2 lcd_moveto(1,8); //定位在第二行第八列
149 2 lcd_printf("H1:");
150 2 temp=readadc0832(1); //读取通道1的电压值
151 2 result=temp*0.017725490; //得到实际的电压值
152 2 temp=(uchar)(result); //取得电压值的整数部分
153 2 write1602(temp+48,1); //显示电压值的整数部分
154 2 write1602('.',1); //显示小数点
155 2 result=(result-temp)*10;
156 2 temp=(uchar)(result); //获得电压值的小数点后第一位
157 2 write1602(temp+48,1);
158 2 result=(result-temp)*10;
159 2 temp=(uchar)(result); //获得电压值的小数点后第二位
160 2 write1602(temp+48,1);
161 2 }
162 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 454 ----
CONSTANT SIZE = 18 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -