📄 18b20.lst
字号:
(0090) lcd_write(data,chn[15+i]);
E4 2FE4 MOV R30,R20
E5 27FF CLR R31
E6 0DEA ADD R30,R10
E7 1DFB ADC R31,R11
E8 8527 LDD R18,Z+15
E9 E001 LDI R16,1
EA DF93 RCALL _lcd_write
EB 9543 INC R20
EC 304F CPI R20,0xF
ED F3B0 BCS 0x00E4
EE C159 RJMP pop_xgset300C
_line1_display:
i --> R20
chn --> R10
EF D153 RCALL push_xgset300C
F0 0158 MOVW R10,R16
(0091) }
(0092)
(0093) //LCD第一行显示字符
(0094) void line1_display(unsigned char chn[15])
(0095) {
(0096) unsigned char i;
(0097) lcd_write(command,0x30);
F1 E320 LDI R18,0x30
F2 2700 CLR R16
F3 DF8A RCALL _lcd_write
(0098) lcd_write(command,x1);
F4 E820 LDI R18,0x80
F5 2700 CLR R16
F6 DF87 RCALL _lcd_write
(0099) for (i=0;i<15;i++)
F7 2744 CLR R20
F8 C004 RJMP 0x00FD
(0100) lcd_write(data,chn[i]);
F9 940E 0265 CALL <created procedures>
FB DF82 RCALL _lcd_write
FC 9543 INC R20
FD 304F CPI R20,0xF
FE F3D0 BCS 0x00F9
FF C148 RJMP pop_xgset300C
_line2_display:
i --> R20
chn --> R10
100 D142 RCALL push_xgset300C
101 0158 MOVW R10,R16
(0101) }
(0102)
(0103) //LCD第二行显示字符
(0104) void line2_display(unsigned char chn[15])
(0105) {
(0106) unsigned char i;
(0107) lcd_write(command,0x30);
102 E320 LDI R18,0x30
103 2700 CLR R16
104 DF79 RCALL _lcd_write
(0108) lcd_write(command,x2);
105 E920 LDI R18,0x90
106 2700 CLR R16
107 DF76 RCALL _lcd_write
(0109) for (i=0;i<15;i++)
108 2744 CLR R20
109 C004 RJMP 0x010E
(0110) lcd_write(data,chn[i]);
10A 940E 0265 CALL <created procedures>
10C DF71 RCALL _lcd_write
10D 9543 INC R20
10E 304F CPI R20,0xF
10F F3D0 BCS 0x010A
110 C137 RJMP pop_xgset300C
_int_disp:
i --> R22
dispi --> Y,+0
j --> R20
adc --> R12
wz --> R10
111 D145 RCALL push_xgsetF03C
112 0169 MOVW R12,R18
113 2EA0 MOV R10,R16
114 9723 SBIW R28,3
(0111) }
(0112)
(0113) //////////////////////////////////////////////////////最前面的零不显示
(0114) void int_disp(unsigned char wz,unsigned int adc)
(0115) {
(0116) unsigned char dispi[3],j=3;
115 E043 LDI R20,3
(0117) unsigned char i=1;
116 E061 LDI R22,1
(0118) adc=adc%1000;
117 EE28 LDI R18,0xE8
118 E033 LDI R19,3
119 0186 MOVW R16,R12
11A D0EC RCALL mod16u
11B 0168 MOVW R12,R16
(0119) dispi[2]=adc/100; adc=adc%100;
11C E624 LDI R18,0x64
11D E030 LDI R19,0
11E D0EA RCALL div16u
11F 830A STD Y+2,R16
120 E624 LDI R18,0x64
121 E030 LDI R19,0
122 0186 MOVW R16,R12
123 D0E3 RCALL mod16u
124 0168 MOVW R12,R16
(0120) dispi[1]=adc/10; adc=adc%10;
125 E02A LDI R18,0xA
126 E030 LDI R19,0
127 D0E1 RCALL div16u
128 8309 STD Y+1,R16
129 E02A LDI R18,0xA
12A E030 LDI R19,0
12B 0186 MOVW R16,R12
12C D0DA RCALL mod16u
12D 0168 MOVW R12,R16
(0121) dispi[0]=adc;
12E 82C8 STD Y+0,R12
(0122) lcd_write(command,wz);
12F 2D2A MOV R18,R10
130 2700 CLR R16
131 DF4C RCALL _lcd_write
132 C017 RJMP 0x014A
(0123) while(j--)
(0124) {
(0125) if((dispi[j]==0)&&(i==1)&&(j!=0))
133 940E 026C CALL 0x026C
135 8020 LDD R2,Z+0
136 2022 TST R2
137 F459 BNE 0x0143
138 3061 CPI R22,1
139 F449 BNE 0x0143
13A 2344 TST R20
13B F039 BEQ 0x0143
13C 940E 026C CALL 0x026C
(0126) {
(0127) lcd_write(data,dispi[j]+0x20);
13E 8120 LDD R18,Z+0
13F 5E20 SUBI R18,0xE0
140 E001 LDI R16,1
141 DF3C RCALL _lcd_write
(0128) }
142 C007 RJMP 0x014A
(0129) else
(0130) {
(0131) lcd_write(data,dispi[j]+0x30);
143 940E 026C CALL 0x026C
145 8120 LDD R18,Z+0
146 5D20 SUBI R18,0xD0
147 E001 LDI R16,1
148 DF35 RCALL _lcd_write
(0132) i=0;
149 2766 CLR R22
14A 2E24 MOV R2,R20
14B 2433 CLR R3
14C 5041 SUBI R20,1
14D 2022 TST R2
14E F721 BNE 0x0133
14F 9623 ADIW R28,3
150 C10F RJMP pop_xgsetF03C
_Sensor_Delay:
i --> R20
US --> R10
151 D0F1 RCALL push_xgset300C
152 0158 MOVW R10,R16
FILE: D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20.h
(0001) #define b20_io PC7
(0002) #define b20_port PORTC
(0003) #define b20_pin PINC
(0004) #define b20_ddr DDRC
(0005) /********************************************************************************************
(0006) * 函数名称:Sensor_Delay(uint16 count)//延时函数
(0007) * 功 能:DS18B20软件延时专用
(0008) * 入口参数:count
(0009) * 出口参数:无
(0010) *********************************************************************************************/
(0011) void Sensor_Delay(unsigned int US)
(0012) {
(0013) unsigned int i;
(0014) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
153 E005 LDI R16,5
154 E010 LDI R17,0
155 0195 MOVW R18,R10
156 D0CC RCALL empy16s
157 0158 MOVW R10,R16
158 94B6 LSR R11
159 94A7 ROR R10
15A 94B6 LSR R11
15B 94A7 ROR R10
(0015) for(i=0;i<US;i++);
15C 2744 CLR R20
15D 2755 CLR R21
15E C002 RJMP 0x0161
15F 5F4F SUBI R20,0xFF
160 4F5F SBCI R21,0xFF
161 154A CP R20,R10
162 055B CPC R21,R11
163 F3D8 BCS 0x015F
164 C0E3 RJMP pop_xgset300C
(0016) }
(0017) /*******************************************
(0018) 函数名称: B20_init
(0019) 功 能: 复位DS18B20
(0020) 参 数: 无
(0021) 返回值 : 无
(0022) ********************************************/
(0023) void B20_init(void)
(0024) {
(0025) b20_ddr|=(1<<b20_io); //配置为输出
_B20_init:
165 9AA7 SBI 0x14,7
(0026) b20_port&=~(1<<b20_io); //拉低
166 98AF CBI 0x15,7
(0027) Sensor_Delay(600); //等待600微秒
167 E508 LDI R16,0x58
168 E012 LDI R17,2
169 DFE7 RCALL _Sensor_Delay
(0028) b20_port|=(1<<b20_io); //释放总线
16A 9AAF SBI 0x15,7
(0029) Sensor_Delay(60); //等待60微秒
16B E30C LDI R16,0x3C
16C E010 LDI R17,0
16D DFE3 RCALL _Sensor_Delay
(0030) b20_ddr&=~(1<<b20_io); //配置为输入
16E 98A7 CBI 0x14,7
(0031) while((b20_pin&(1<<b20_io))); //等待DS18B20拉低
16F 999F SBIC 0x13,7
170 CFFE RJMP 0x016F
(0032) while(!(b20_pin&(1<<b20_io))); //等待DS18B20释放总线
171 9B9F SBIS 0x13,7
172 CFFE RJMP 0x0171
173 9508 RET
_B20_readB:
retd --> R20
i --> R22
174 934A ST R20,-Y
175 936A ST R22,-Y
(0033) }
(0034)
(0035) /*******************************************
(0036) 函数名称: B20_readB
(0037) 功 能: 读取一个字节的数据
(0038) 参 数: 无
(0039) 返回值 : retd--返回的一个字节数据
(0040) ********************************************/
(0041) unsigned char B20_readB(void)
(0042) {
(0043) unsigned char i,retd=0;
176 2744 CLR R20
(0044) for(i=0;i<8;i++) //位计数值
177 2766 CLR R22
178 C00F RJMP 0x0188
(0045) {
(0046) retd>>=1; //右移,准备接受新的数据位
179 9546 LSR R20
(0047) b20_ddr|=(1<<b20_io); //配置为输出
17A 9AA7 SBI 0x14,7
(0048) b20_port&=~(1<<b20_io); //拉低,启动读数据位
17B 98AF CBI 0x15,7
(0049) b20_port|=(1<<b20_io); //释放总线
17C 9AAF SBI 0x15,7
(0050) Sensor_Delay(5); //等待5微秒
17D E005 LDI R16,5
17E E010 LDI R17,0
17F DFD1 RCALL _Sensor_Delay
(0051) b20_ddr&=~(1<<b20_io); //配置为输入,开始读取数据位
180 98A7 CBI 0x14,7
(0052) if(b20_pin&(1<<b20_io)) //该位是否为高
181 9B9F SBIS 0x13,7
182 C001 RJMP 0x0184
(0053) {
(0054) retd|=0x80; //是就将此位置高
183 6840 ORI R20,0x80
(0055) }
(0056) Sensor_Delay(50); //等待50微秒
184 E302 LDI R16,0x32
185 E010 LDI R17,0
186 DFCA RCALL _Sensor_Delay
187 9563 INC R22
188 3068 CPI R22,0x8
189 F378 BCS 0x0179
(0057) }
(0058) return retd; //将读到的一个字节返回
18A 2F04 MOV R16,R20
18B 9169 LD R22,Y+
18C 9149 LD R20,Y+
18D 9508 RET
_B20_writeB:
i --> R20
wrd --> R10
18E 92AA ST R10,-Y
18F 934A ST R20,-Y
190 2EA0 MOV R10,R16
(0059) }
(0060) /*******************************************
(0061) 函数名称: B20_writeB
(0062) 功 能: 写入一个字节的数据
(0063) 参 数: wrd--要写入的数据
(0064) 返回值 : 无
(0065) ********************************************/
(0066) void B20_writeB(unsigned char wrd)
(0067) {
(0068) unsigned char i;
(0069) for(i=0;i<8;i++) //位计数值
191 2744 CLR R20
192 C010 RJMP 0x01A3
(0070) {
(0071) b20_ddr|=(1<<b20_io); //配置为输出
193 9AA7 SBI 0x14,7
(0072) b20_port&=~(1<<b20_io); //拉低,启动写数据位
194 98AF CBI 0x15,7
(0073) Sensor_Delay(1); //等待1微秒
195 E001 LDI R16,1
196 E010 LDI R17,0
197 DFB9 RCALL _Sensor_Delay
(0074) if(wrd&0x01) //此位数据是否为高
198 FEA0 SBRS R10,0
199 C002 RJMP 0x019C
(0075) {
(0076) b20_port|=(1<<b20_io); //是高则将单总线拉高
19A 9AAF SBI 0x15,7
(0077) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -