📄 18b20.lst
字号:
157 EC0C LDI R16,0xCC
158 DFB7 RCALL _write_1820
(0069) write_1820(0xbe);
159 EB0E LDI R16,0xBE
15A DFB5 RCALL _write_1820
(0070) teml=read_1820(); //读数据
15B DFD0 RCALL _read_1820
15C 2EC0 MOV R12,R16
(0071) temh=read_1820();
15D DFCE RCALL _read_1820
15E 2F60 MOV R22,R16
(0072) wm0=teml>>4; //只要高8位的低四位和低8位的高四位,温度范围0~99啦!
15F 2D4C MOV R20,R12
160 9542 SWAP R20
161 704F ANDI R20,0xF
(0073) wm1=temh<<4;
162 2F86 MOV R24,R22
163 708F ANDI R24,0xF
164 9582 SWAP R24
165 2EA8 MOV R10,R24
(0074)
(0075) //count=(temh*256+teml)*6.25; //计算具体温度
(0076) if((temh&0xF8) == 0xF8)
166 2F86 MOV R24,R22
167 7F88 ANDI R24,0xF8
168 3F88 CPI R24,0xF8
169 F561 BNE 0x0196
(0077) {
(0078) flag=1;
16A E081 LDI R24,1
16B 9380 0081 STS flag,R24
(0079) count=((0xFF-temh)*256+(0xFF-teml))*6.25;
16D E504 LDI R16,0x54
16E E010 LDI R17,0
16F 940E 02F3 CALL lpm32
171 0118 MOVW R2,R16
172 0129 MOVW R4,R18
173 2E66 MOV R6,R22
174 2477 CLR R7
175 EF2F LDI R18,0xFF
176 E030 LDI R19,0
177 1926 SUB R18,R6
178 0937 SBC R19,R7
179 E000 LDI R16,0
17A E011 LDI R17,1
17B 940E 02A2 CALL empy16s
17D 0138 MOVW R6,R16
17E 2C8C MOV R8,R12
17F 2499 CLR R9
180 EF8F LDI R24,0xFF
181 E090 LDI R25,0
182 1988 SUB R24,R8
183 0999 SBC R25,R9
184 0E68 ADD R6,R24
185 1E79 ADC R7,R25
186 0183 MOVW R16,R6
187 940E 033B CALL int2fp
189 933A ST R19,-Y
18A 932A ST R18,-Y
18B 931A ST R17,-Y
18C 930A ST R16,-Y
18D 0181 MOVW R16,R2
18E 0192 MOVW R18,R4
18F 940E 0431 CALL fpmule2
191 940E 030D CALL fpint
193 9300 0080 STS count,R16
(0080) //count=((0xFF-temh)*256+(0xFF-teml))*625;
(0081) }
195 C023 RJMP 0x01B9
(0082) else
(0083) {
(0084) flag=0;
196 2422 CLR R2
197 9220 0081 STS flag,R2
(0085) count=(temh*256+teml)*6.25;
199 E504 LDI R16,0x54
19A E010 LDI R17,0
19B 940E 02F3 CALL lpm32
19D 0118 MOVW R2,R16
19E 0129 MOVW R4,R18
19F 2F26 MOV R18,R22
1A0 2733 CLR R19
1A1 E000 LDI R16,0
1A2 E011 LDI R17,1
1A3 940E 02A2 CALL empy16s
1A5 0138 MOVW R6,R16
1A6 2C8C MOV R8,R12
1A7 2499 CLR R9
1A8 0C68 ADD R6,R8
1A9 1C79 ADC R7,R9
1AA 0183 MOVW R16,R6
1AB 940E 033B CALL int2fp
1AD 933A ST R19,-Y
1AE 932A ST R18,-Y
1AF 931A ST R17,-Y
1B0 930A ST R16,-Y
1B1 0181 MOVW R16,R2
1B2 0192 MOVW R18,R4
1B3 940E 0431 CALL fpmule2
1B5 940E 030D CALL fpint
1B7 9300 0080 STS count,R16
(0086) //count=(temh*256+teml)*625; //计算具体温度
(0087) }
(0088) wm2=wm1+wm0; //16进制转10进制
1B9 0EA4 ADD R10,R20
(0089) wm3=wm2/100;
1BA E614 LDI R17,0x64
1BB 2D0A MOV R16,R10
1BC 940E 028C CALL div8u
1BE 2EC0 MOV R12,R16
(0090) wmh=(wm2%100)/10; //出口参数了!wmh是显示的高位,wml是显示的低位
1BF E614 LDI R17,0x64
1C0 2D0A MOV R16,R10
1C1 940E 028A CALL mod8u
1C3 E01A LDI R17,0xA
1C4 940E 028C CALL div8u
1C6 9300 0083 STS wmh,R16
(0091) wml=(wm2%100)%10;
1C8 E614 LDI R17,0x64
1C9 2D0A MOV R16,R10
1CA 940E 028A CALL mod8u
1CC E01A LDI R17,0xA
1CD 940E 028A CALL mod8u
1CF 9300 0082 STS wml,R16
1D1 940C 02E1 JMP pop_xgsetF03C
FILE: F:\单片机资料\AVR单片机\制作ds18b20\18B20\led.c
(0001) /**********************************
(0002) ** file_name led.c **
(0003) ** describe 七段数码管函数 **
(0004) ** auther 古欣 www.avrvi.com **
(0005) ** Time 200-2-25 **
(0006) ** temp=(data*1000)%1; 这个式子中的%为取余数,temp为data的第三位小数,0.023(data) --> 3(temp)
(0007) ***********************************/
(0008) #include "config.h"
(0009)
(0010)
(0011) //LED数据 不显点,亮的段为1,连接为P0~P7对应a~g,dp
(0012) const led_data[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x73,0x39,0x63,0x79};
(0013)
(0014) /***********************
(0015) ** 初始化对应端口为输出
(0016) ** ABCD 和 abcdefg dpi 共12个IO口
(0017) ** 默认为 PB(0123) 和 PA
(0018) ***********************/
(0019) void led_init(void)
(0020) {
(0021) led_ddr = 0xFF; //abcdefg dpi 各位设为输出
_led_init:
1D3 EF8F LDI R24,0xFF
1D4 BB8A OUT 0x1A,R24
(0022) led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
1D5 B387 IN R24,0x17
1D6 608F ORI R24,0xF
1D7 BB87 OUT 0x17,R24
1D8 9508 RET
_display_one:
data --> R12
count --> R10
1D9 92AA ST R10,-Y
1DA 92CA ST R12,-Y
1DB 2EC2 MOV R12,R18
1DC 2EA0 MOV R10,R16
(0023)
(0024) // 以下两句将会使LED全亮,如果立即更改状态,将看不出来效果
(0025) // led_port = 0xFF;
(0026) // led_contrl_port |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d);
(0027) }
(0028)
(0029) /***********************
(0030) ** 显示一位
(0031) ** 输入:count显示在第几位(3210),data 要显示的数(0~f)
(0032) ************************/
(0033) void display_one(uint8 count, uint8 data)
(0034) {
(0035) led_port = led_data[data]; //显示的数
1DD E680 LDI R24,0x60
1DE E090 LDI R25,0
1DF 2DEC MOV R30,R12
1E0 27FF CLR R31
1E1 0FEE LSL R30
1E2 1FFF ROL R31
1E3 0FE8 ADD R30,R24
1E4 1FF9 ADC R31,R25
1E5 8020 LDD R2,Z+0
1E6 8031 LDD R3,Z+1
1E7 BA2B OUT 0x1B,R2
(0036) led_contrl_port |= (1<<count); //选中对应要显示的位,从右至左,0123
1E8 E001 LDI R16,1
1E9 2D1A MOV R17,R10
1EA 940E 0307 CALL lsl8
1EC B228 IN R2,0x18
1ED 2A20 OR R2,R16
1EE BA28 OUT 0x18,R2
1EF 90C9 LD R12,Y+
1F0 90A9 LD R10,Y+
1F1 9508 RET
_display:
temp --> R10
mode --> R20
data --> R12
1F2 940E 02CA CALL push_xgset303C
1F4 2F42 MOV R20,R18
1F5 0168 MOVW R12,R16
(0037) //如果对位进行了调整,就不在是0123,而是对应的值
(0038) }
(0039)
(0040) /***********************
(0041) ** 显示四位整数
(0042) ** 输入:要显示的四位数data,显示模式mode,1为补零显示模式,默认不显示零
(0043) ** 说明:可以小于四位数,mode=1时 自动补零
(0044) ************************/
(0045) void display(uint16 data,uint8 mode)
(0046) {
(0047) uint8 temp;
(0048) //千位
(0049) if(data>1000)
1F6 EE88 LDI R24,0xE8
1F7 E093 LDI R25,3
1F8 158C CP R24,R12
1F9 059D CPC R25,R13
1FA F478 BCC 0x020A
(0050) {
(0051) temp=data/1000;
1FB EE28 LDI R18,0xE8
1FC E033 LDI R19,3
1FD 0186 MOVW R16,R12
1FE 940E 0270 CALL div16u
200 0158 MOVW R10,R16
(0052) display_one(3,temp);
201 2D2A MOV R18,R10
202 E003 LDI R16,3
203 DFD5 RCALL _display_one
(0053) delay_ms(6); //6ms 是个经验值,刚好无闪烁,并且亮度较高
204 E006 LDI R16,6
205 E010 LDI R17,0
206 940E 00A0 CALL _delay_ms
(0054) led_contrl_port &=~ (1<<3);
208 98C3 CBI 0x18,3
(0055) }
209 C00A RJMP 0x0214
(0056) else
(0057) {
(0058) if(mode==1)
20A 3041 CPI R20,1
20B F441 BNE 0x0214
(0059) {
(0060) display_one(3,0);
20C 2722 CLR R18
20D E003 LDI R16,3
20E DFCA RCALL _display_one
(0061) delay_ms(6);
20F E006 LDI R16,6
210 E010 LDI R17,0
211 940E 00A0 CALL _delay_ms
(0062) led_contrl_port &=~ (1<<3);
213 98C3 CBI 0x18,3
(0063) }
(0064) }
(0065) //百位
(0066) if(data>100)
214 E684 LDI R24,0x64
215 E090 LDI R25,0
216 158C CP R24,R12
217 059D CPC R25,R13
218 F498 BCC 0x022C
(0067) {
(0068) temp=(data%1000)/100;
219 EE28 LDI R18,0xE8
21A E033 LDI R19,3
21B 0186 MOVW R16,R12
21C 940E 026E CALL mod16u
21E E624 LDI R18,0x64
21F E030 LDI R19,0
220 940E 0270 CALL div16u
222 0158 MOVW R10,R16
(0069) display_one(2,temp);
223 2D2A MOV R18,R10
224 E002 LDI R16,2
225 DFB3 RCALL _display_one
(0070) delay_ms(6);
226 E006 LDI R16,6
227 E010 LDI R17,0
228 940E 00A0 CALL _delay_ms
(0071) led_contrl_port &=~ (1<<2);
22A 98C2 CBI 0x18,2
(0072) }
22B C00A RJMP 0x0236
(0073) else
(0074) {
(0075) if(mode==1)
22C 3041 CPI R20,1
22D F441 BNE 0x0236
(0076) {
(0077) display_one(2,0);
22E 2722 CLR R18
22F E002 LDI R16,2
230 DFA8 RCALL _display_one
(0078) delay_ms(6);
231 E006 LDI R16,6
232 E010 LDI R17,0
233 940E 00A0 CALL _delay_ms
(0079) led_contrl_port &=~ (1<<2);
235 98C2 CBI 0x18,2
(0080) }
(0081) }
(0082) //十位
(0083) if(data>10)
236 E08A LDI R24,0xA
237 E090 LDI R25,0
238 158C CP R24,R12
239 059D CPC R25,R13
23A F498 BCC 0x024E
(0084) {
(0085) temp=(data%100)/10;
23B E624 LDI R18,0x64
23C E030 LDI R19,0
23D 0186 MOVW R16,R12
23E 940E 026E CALL mod16u
240 E02A LDI R18,0xA
241 E030 LDI R19,0
242 940E 0270 CALL div16u
244 0158 MOVW R10,R16
(0086) display_one(1,temp);
245 2D2A MOV R18,R10
246 E001 LDI R16,1
247 DF91 RCALL _display_one
(0087) delay_ms(6);
248 E006 LDI R16,6
249 E010 LDI R17,0
24A 940E 00A0 CALL _delay_ms
(0088) led_contrl_port &=~ (1<<1);
24C 98C1 CBI 0x18,1
(0089) }
24D C00A RJMP 0x0258
(0090) else
(0091) {
(0092) if(mode==1)
24E 3041 CPI R20,1
24F F441 BNE 0x0258
(0093) {
(0094) display_one(1,0);
250 2722 CLR R18
251 E001 LDI R16,1
252 DF86 RCALL _display_one
(0095) delay_ms(6);
253 E006 LDI R16,6
254 E010 LDI R17,0
255 940E 00A0 CALL _delay_ms
(0096) led_contrl_port &=~ (1<<1);
257 98C1 CBI 0x18,1
(0097) }
(0098) }
(0099) //个位
(0100) temp=data%10;
258 E02A LDI R18,0xA
259 E030 LDI R19,0
25A 0186 MOVW R16,R12
25B 940E 026E CALL mod16u
25D 0158 MOVW R10,R16
(0101) display_one(0,temp);
25E 2D2A MOV R18,R10
25F 2700 CLR R16
260 DF78 RCALL _display_one
(0102) delay_ms(6);
261 E006 LDI R16,6
262 E010 LDI R17,0
263 940E 00A0 CALL _delay_ms
(0103) led_contrl_port &=~ (1<<0);
265 98C0 CBI 0x18,0
266 940C 02D1 JMP pop_xgset303C
(0104) }
(0105)
(0106) /***********************
(0107) ** 显示四位浮点数
(0108) ** 输入:要显示的四位数
(0109) ** 说明:可以小于四位数,自动补零
(0110) 没有调通
(0111) ************************/
(0112) /*
(0113) void display_float(float data)
(0114) {
(0115) uint8 temp;
(0116) // 人为保证data的值,可以不要错误处理。
(0117) if (data>1000)
(0118) {
(0119) led_error();
(0120) break;
(0121) }
(0122) if (data<0)
(0123) {
(0124) led_error();
(0125) break;
(0126) }
(0127) //
(0128) if(data<1) //比如 0.123
(0129) {
(0130) display_one(3,0); //显示0.
(0131) led_port |= 0x07; //点亮对应小数点
(0132) delay_ms(6);
(0133) led_contrl_port &=~ (1<<3);
(0134)
(0135) temp=(data*10); // 0.123*10 = 1
(0136) display_one(2,temp);
(0137) delay_ms(6);
(0138) led_contrl_port &=~ (1<<2);
(0139)
(0140) temp=(data*100)%10; // 0.123*100%10 = 2
(0141) display_one(1,temp);
(0142) delay_ms(6);
(0143) led_contrl_port &=~ (1<<1);
(0144)
(0145) temp=(data*1000)%10; // 0.123*100%10 = 3
(0146) display_one(0,temp);
(0147) delay_ms(6);
(0148) led_contrl_port &=~ (1<<0);
(0149) }
(0150) else if(data<10) //比如1.234
(0151) {
(0152) temp=(data/1); // 1.234/1 = 1
(0153) display_one(3,temp);
(0154) led_port |= 0x07; //点亮对应小数点
(0155) delay_ms(6);
(0156) led_contrl_port &=~ (1<<3);
(0157) //第一位小数
(0158) temp=(data*10)%10; // 1.234*10%10 = 2
(0159) display_one(2,temp);
(0160) delay_ms(6);
(0161) led_contrl_port &=~ (1<<2);
(0162) //第二位小数
(0163) temp=(data*100)%10; // 1.234*100%10 = 3
(0164) display_one(1,temp);
(0165) delay_ms(6);
(0166) led_contrl_port &=~ (1<<1);
(0167) //第三位小数
(0168) temp=(data*1000)%10; // 1.234*1000%10 = 4
(0169) display_one(0,temp);
(0170) delay_ms(6);
(0171) led_contrl_port &=~ (1<<0);
(0172) }
(0173) else if(data<100) // 例如12.34
(0174) {
(0175) temp=(data/10); // 12.34/10=1
(0176) display_one(3,temp);
(0177) delay_ms(6);
(0178) led_contrl_port &=~ (1<<3);
(0179)
(0180) temp=(data%10); // 12.34%10=2
(0181) display_one(2,temp);
(0182) led_port |= 0x07; //点亮对应小数点
(0183) delay_ms(6);
(0184) led_contrl_port &=~ (1<<2);
(0185)
(0186) temp=(data*10)%10; // 12.34*10%10=3
(0187) display_one(1,temp);
(0188) delay_ms(6);
(0189) led_contrl_port &=~ (1<<1);
(0190)
(0191) temp=(data*100)%10;// 12.34*100%10=4
(0192) display_one(0,temp);
(0193) delay_ms(6);
(0194) led_contrl_port &=~ (1<<0);
(0195) }
(0196) else if(data<1000) //比如123.4
(0197) {
(0198) temp=(data/100);// 123.4/100=1
(0199) display_one(3,temp);
(0200) delay_ms(6);
(0201) led_contrl_port &=~ (1<<3);
(0202)
(0203) temp=(data%100)/10;// 123.4%100/10=2
(0204) display_one(2,temp);
(0205) delay_ms(6);
(0206) led_contrl_port &=~ (1<<2);
(0207)
(0208) temp=(data%10);// 123.4%10=3
(0209) display_one(1,temp);
(0210) delay_ms(6);
(0211) led_contrl_port &=~ (1<<1);
(0212)
(0213) temp=(data*10)%10;// 123.4*10%10=4
(0214) display_one(0,temp);
(0215) delay_ms(6);
(0216) led_contrl_port &=~ (1<<0);
(0217) }
(0218) else led_error();
(0219) }
(0220) */
(0221) /***********************************************
(0222) ** 异常处理,led全亮 8。8。8。8。
(0223) ***********************************************/
(0224) void led_error(void)
(0225) {
(0226) // 以下两句将会使LED全亮,如果立即更改状态,将看不出来效果
(0227) led_port = 0xFF;
_led_error:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -