📄 18b20.lst
字号:
(0090) lcd_write(data,chn[15+i]);
E3 2FE4 MOV R30,R20
E4 27FF CLR R31
E5 0DEA ADD R30,R10
E6 1DFB ADC R31,R11
E7 8527 LDD R18,Z+15
E8 E001 LDI R16,1
E9 DF94 RCALL _lcd_write
EA 9543 INC R20
EB 304F CPI R20,0xF
EC F3B0 BCS 0x00E3
ED C159 RJMP pop_xgset300C
_line1_display:
i --> R20
chn --> R10
EE D153 RCALL push_xgset300C
EF 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);
F0 E320 LDI R18,0x30
F1 2700 CLR R16
F2 DF8B RCALL _lcd_write
(0098) lcd_write(command,x1);
F3 E820 LDI R18,0x80
F4 2700 CLR R16
F5 DF88 RCALL _lcd_write
(0099) for (i=0;i<15;i++)
F6 2744 CLR R20
F7 C004 RJMP 0x00FC
(0100) lcd_write(data,chn[i]);
F8 940E 0264 CALL <created procedures>
FA DF83 RCALL _lcd_write
FB 9543 INC R20
FC 304F CPI R20,0xF
FD F3D0 BCS 0x00F8
FE C148 RJMP pop_xgset300C
_line2_display:
i --> R20
chn --> R10
FF D142 RCALL push_xgset300C
100 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);
101 E320 LDI R18,0x30
102 2700 CLR R16
103 DF7A RCALL _lcd_write
(0108) lcd_write(command,x2);
104 E920 LDI R18,0x90
105 2700 CLR R16
106 DF77 RCALL _lcd_write
(0109) for (i=0;i<15;i++)
107 2744 CLR R20
108 C004 RJMP 0x010D
(0110) lcd_write(data,chn[i]);
109 940E 0264 CALL <created procedures>
10B DF72 RCALL _lcd_write
10C 9543 INC R20
10D 304F CPI R20,0xF
10E F3D0 BCS 0x0109
10F C137 RJMP pop_xgset300C
_int_disp:
i --> R22
dispi --> Y,+0
j --> R20
adc --> R12
wz --> R10
110 D145 RCALL push_xgsetF03C
111 0169 MOVW R12,R18
112 2EA0 MOV R10,R16
113 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;
114 E043 LDI R20,3
(0117) unsigned char i=1;
115 E061 LDI R22,1
(0118) adc=adc%1000;
116 EE28 LDI R18,0xE8
117 E033 LDI R19,3
118 0186 MOVW R16,R12
119 D0EC RCALL mod16u
11A 0168 MOVW R12,R16
(0119) dispi[2]=adc/100; adc=adc%100;
11B E624 LDI R18,0x64
11C E030 LDI R19,0
11D D0EA RCALL div16u
11E 830A STD Y+2,R16
11F E624 LDI R18,0x64
120 E030 LDI R19,0
121 0186 MOVW R16,R12
122 D0E3 RCALL mod16u
123 0168 MOVW R12,R16
(0120) dispi[1]=adc/10; adc=adc%10;
124 E02A LDI R18,0xA
125 E030 LDI R19,0
126 D0E1 RCALL div16u
127 8309 STD Y+1,R16
128 E02A LDI R18,0xA
129 E030 LDI R19,0
12A 0186 MOVW R16,R12
12B D0DA RCALL mod16u
12C 0168 MOVW R12,R16
(0121) dispi[0]=adc;
12D 82C8 STD Y+0,R12
(0122) lcd_write(command,wz);
12E 2D2A MOV R18,R10
12F 2700 CLR R16
130 DF4D RCALL _lcd_write
131 C017 RJMP 0x0149
(0123) while(j--)
(0124) {
(0125) if((dispi[j]==0)&&(i==1)&&(j!=0))
132 940E 026B CALL 0x026B
134 8020 LDD R2,Z+0
135 2022 TST R2
136 F459 BNE 0x0142
137 3061 CPI R22,1
138 F449 BNE 0x0142
139 2344 TST R20
13A F039 BEQ 0x0142
13B 940E 026B CALL 0x026B
(0126) {
(0127) lcd_write(data,dispi[j]+0x20);
13D 8120 LDD R18,Z+0
13E 5E20 SUBI R18,0xE0
13F E001 LDI R16,1
140 DF3D RCALL _lcd_write
(0128) }
141 C007 RJMP 0x0149
(0129) else
(0130) {
(0131) lcd_write(data,dispi[j]+0x30);
142 940E 026B CALL 0x026B
144 8120 LDD R18,Z+0
145 5D20 SUBI R18,0xD0
146 E001 LDI R16,1
147 DF36 RCALL _lcd_write
(0132) i=0;
148 2766 CLR R22
149 2E24 MOV R2,R20
14A 2433 CLR R3
14B 5041 SUBI R20,1
14C 2022 TST R2
14D F721 BNE 0x0132
14E 9623 ADIW R28,3
14F C10F RJMP pop_xgsetF03C
_Sensor_Delay:
i --> R20
US --> R10
150 D0F1 RCALL push_xgset300C
151 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 US)//延时函数
(0007) * 功 能:DS18B20软件延时专用
(0008) * 入口参数:US
(0009) * 出口参数:无
(0010) *********************************************************************************************/
(0011) void Sensor_Delay(unsigned int US)
(0012) {
(0013) unsigned int i;
(0014) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
152 E005 LDI R16,5
153 E010 LDI R17,0
154 0195 MOVW R18,R10
155 D0CC RCALL empy16s
156 0158 MOVW R10,R16
157 94B6 LSR R11
158 94A7 ROR R10
159 94B6 LSR R11
15A 94A7 ROR R10
(0015) for(i=0;i<US;i++);
15B 2744 CLR R20
15C 2755 CLR R21
15D C002 RJMP 0x0160
15E 5F4F SUBI R20,0xFF
15F 4F5F SBCI R21,0xFF
160 154A CP R20,R10
161 055B CPC R21,R11
162 F3D8 BCS 0x015E
163 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:
164 9AA7 SBI 0x14,7
(0026) b20_port&=~(1<<b20_io); //拉低
165 98AF CBI 0x15,7
(0027) Sensor_Delay(600); //等待600微秒
166 E508 LDI R16,0x58
167 E012 LDI R17,2
168 DFE7 RCALL _Sensor_Delay
(0028) b20_port|=(1<<b20_io); //释放总线
169 9AAF SBI 0x15,7
(0029) Sensor_Delay(60); //等待60微秒
16A E30C LDI R16,0x3C
16B E010 LDI R17,0
16C DFE3 RCALL _Sensor_Delay
(0030) b20_ddr&=~(1<<b20_io); //配置为输入
16D 98A7 CBI 0x14,7
(0031) while((b20_pin&(1<<b20_io))); //等待DS18B20拉低
16E 999F SBIC 0x13,7
16F CFFE RJMP 0x016E
(0032) while(!(b20_pin&(1<<b20_io))); //等待DS18B20释放总线
170 9B9F SBIS 0x13,7
171 CFFE RJMP 0x0170
172 9508 RET
_B20_readB:
retd --> R20
i --> R22
173 934A ST R20,-Y
174 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;
175 2744 CLR R20
(0044) for(i=0;i<8;i++) //位计数值
176 2766 CLR R22
177 C00F RJMP 0x0187
(0045) {
(0046) retd>>=1; //右移,准备接受新的数据位
178 9546 LSR R20
(0047) b20_ddr|=(1<<b20_io); //配置为输出
179 9AA7 SBI 0x14,7
(0048) b20_port&=~(1<<b20_io); //拉低,启动读数据位
17A 98AF CBI 0x15,7
(0049) b20_port|=(1<<b20_io); //释放总线
17B 9AAF SBI 0x15,7
(0050) Sensor_Delay(5); //等待5微秒
17C E005 LDI R16,5
17D E010 LDI R17,0
17E DFD1 RCALL _Sensor_Delay
(0051) b20_ddr&=~(1<<b20_io); //配置为输入,开始读取数据位
17F 98A7 CBI 0x14,7
(0052) if(b20_pin&(1<<b20_io)) //该位是否为高
180 9B9F SBIS 0x13,7
181 C001 RJMP 0x0183
(0053) {
(0054) retd|=0x80; //是就将此位置高
182 6840 ORI R20,0x80
(0055) }
(0056) Sensor_Delay(50); //等待50微秒
183 E302 LDI R16,0x32
184 E010 LDI R17,0
185 DFCA RCALL _Sensor_Delay
186 9563 INC R22
187 3068 CPI R22,0x8
188 F378 BCS 0x0178
(0057) }
(0058) return retd; //将读到的一个字节返回
189 2F04 MOV R16,R20
18A 9169 LD R22,Y+
18B 9149 LD R20,Y+
18C 9508 RET
_B20_writeB:
i --> R20
wrd --> R10
18D 92AA ST R10,-Y
18E 934A ST R20,-Y
18F 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++) //位计数值
190 2744 CLR R20
191 C010 RJMP 0x01A2
(0070) {
(0071) b20_ddr|=(1<<b20_io); //配置为输出
192 9AA7 SBI 0x14,7
(0072) b20_port&=~(1<<b20_io); //拉低,启动写数据位
193 98AF CBI 0x15,7
(0073) Sensor_Delay(1); //等待1微秒
194 E001 LDI R16,1
195 E010 LDI R17,0
196 DFB9 RCALL _Sensor_Delay
(0074) if(wrd&0x01) //此位数据是否为高
197 FEA0 SBRS R10,0
198 C002 RJMP 0x019B
(0075) {
(0076) b20_port|=(1<<b20_io); //是高则将单总线拉高
199 9AAF SBI 0x15,7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -