📄 avr_ds18b20.lss
字号:
/**********************************************************/
/* */
/* 写一个字节 */
/* */
/**********************************************************/
void WriteOneChar(uchar dat)
{
162: 1f 93 push r17
164: cf 93 push r28
166: c8 2f mov r28, r24
uchar i = 0;
for (i = 8; i > 0; i--)
168: 18 e0 ldi r17, 0x08 ; 8
{
PORTD&=~_BV(DQ);
16a: 93 98 cbi 0x12, 3 ; 18
if(dat&0x01)
16c: c0 ff sbrs r28, 0
16e: 02 c0 rjmp .+4 ; 0x174
PORTD|=_BV(DQ); //写"1"
170: 93 9a sbi 0x12, 3 ; 18
172: 01 c0 rjmp .+2 ; 0x176
else
PORTD&=~_BV(DQ); //写"0"
174: 93 98 cbi 0x12, 3 ; 18
Delay(70);
176: 86 e4 ldi r24, 0x46 ; 70
178: 90 e0 ldi r25, 0x00 ; 0
17a: 0e 94 52 00 call 0xa4
PORTD|=_BV(DQ);
17e: 93 9a sbi 0x12, 3 ; 18
dat>>=1;
180: c6 95 lsr r28
182: 11 50 subi r17, 0x01 ; 1
184: 91 f7 brne .-28 ; 0x16a
186: cf 91 pop r28
188: 1f 91 pop r17
18a: 08 95 ret
0000018c <Read_Temperature>:
}
}
/*********************************************************/
/* */
/* 读取温度 */
/* */
/*********************************************************/
void Read_Temperature(void)
{
Init_DS18B20();
18c: 0e 94 78 00 call 0xf0
if(presence==1)
190: 80 91 c3 00 lds r24, 0x00C3
194: 81 30 cpi r24, 0x01 ; 1
196: 19 f4 brne .+6 ; 0x19e
{ beep();}
198: 0e 94 57 00 call 0xae
19c: 08 95 ret
else
{
WriteOneChar(0xCC); // 跳过读序号列号的操作
19e: 8c ec ldi r24, 0xCC ; 204
1a0: 0e 94 b1 00 call 0x162
WriteOneChar(0x44); // 启动温度转换
1a4: 84 e4 ldi r24, 0x44 ; 68
1a6: 0e 94 b1 00 call 0x162
Init_DS18B20();
1aa: 0e 94 78 00 call 0xf0
WriteOneChar(0xCC); //跳过读序号列号的操作
1ae: 8c ec ldi r24, 0xCC ; 204
1b0: 0e 94 b1 00 call 0x162
WriteOneChar(0xBE); //读取温度寄存器
1b4: 8e eb ldi r24, 0xBE ; 190
1b6: 0e 94 b1 00 call 0x162
temp_data[0] = ReadOneChar(); //温度低8位
1ba: 0e 94 9a 00 call 0x134
1be: 80 93 c1 00 sts 0x00C1, r24
temp_data[1] = ReadOneChar(); //温度高8位
1c2: 0e 94 9a 00 call 0x134
1c6: 80 93 c2 00 sts 0x00C2, r24
1ca: 08 95 ret
1cc: 08 95 ret
000001ce <lcd_busy>:
}
}
/*************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*************************************************************/
void lcd_init(void)
{
DDRA=0XFF; //设置PA输出
PORTA=0XFF; //全部加上上拉电阻
DDRC=0XFF; //设置PC为输出
PORTC=0XFF; //全部加上上拉电阻
delay_nms(30); //等待上电稳定
lcd_wcmd(0x38,0); //16*2显示,5*7点阵,8位数据
delay_nms(5);
lcd_wcmd(0x38,0); //不进行忙检测
delay_nms(5);
lcd_wcmd(0x38,0);
delay_nms(5);
lcd_wcmd(0x0c,1); //显示开,关光标
delay_nms(5);
lcd_wcmd(0x06,1); //移动光标
delay_nms(5);
lcd_wcmd(0x01,1); //清除LCD的显示内容
delay_nms(5);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/*command为指令,wait_en指定是否要检测LCD忙信号 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar command,uchar wait_en)
{
if(wait_en) //若wait_en为1,则要检测LCD忙信号
lcd_busy();
PORTC &=~_BV(LCD_RS);
PORTC &=~_BV(LCD_RW);
PORTC &=~_BV(LCD_EN);
PORTA =command; //送指令数据
PORTC |=_BV(LCD_EN);
_NOP();
_NOP();
PORTC &=~_BV(LCD_EN);
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
lcd_busy();
PORTC |=_BV(LCD_RS);
PORTC &=~_BV(LCD_RW);
PORTC &=~_BV(LCD_EN);
PORTA=dat; //送显示数据
PORTC |=_BV(LCD_EN);
_NOP();
_NOP();
PORTC &=~_BV(LCD_EN);
}
/*************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */
/* */
/*************************************************************/
void lcd_busy(void)
{
DDRA &=~_BV(busy); //设置busy口为输入
1ce: d7 98 cbi 0x1a, 7 ; 26
PORTC &=~_BV(LCD_RS);
1d0: aa 98 cbi 0x15, 2 ; 21
PORTC |= _BV(LCD_RW);
1d2: ab 9a sbi 0x15, 3 ; 21
PORTC |= _BV(LCD_EN);
1d4: ac 9a sbi 0x15, 4 ; 21
while(PINA & _BV(busy)); //忙等待
1d6: cf 99 sbic 0x19, 7 ; 25
1d8: fe cf rjmp .-4 ; 0x1d6
PORTC &=~_BV(LCD_EN);
1da: ac 98 cbi 0x15, 4 ; 21
DDRA|=_BV(busy); //设置busy口为输出
1dc: d7 9a sbi 0x1a, 7 ; 26
1de: 08 95 ret
000001e0 <lcd_wcmd>:
1e0: cf 93 push r28
1e2: c8 2f mov r28, r24
1e4: 66 23 and r22, r22
1e6: 11 f0 breq .+4 ; 0x1ec
1e8: 0e 94 e7 00 call 0x1ce
1ec: aa 98 cbi 0x15, 2 ; 21
1ee: ab 98 cbi 0x15, 3 ; 21
1f0: ac 98 cbi 0x15, 4 ; 21
1f2: cb bb out 0x1b, r28 ; 27
1f4: ac 9a sbi 0x15, 4 ; 21
1f6: 00 00 nop
1f8: 00 00 nop
1fa: ac 98 cbi 0x15, 4 ; 21
1fc: cf 91 pop r28
1fe: 08 95 ret
00000200 <lcd_init>:
200: 8f ef ldi r24, 0xFF ; 255
202: 8a bb out 0x1a, r24 ; 26
204: 8b bb out 0x1b, r24 ; 27
206: 84 bb out 0x14, r24 ; 20
208: 85 bb out 0x15, r24 ; 21
20a: 8e e1 ldi r24, 0x1E ; 30
20c: 90 e0 ldi r25, 0x00 ; 0
20e: 0e 94 47 00 call 0x8e
212: 60 e0 ldi r22, 0x00 ; 0
214: 88 e3 ldi r24, 0x38 ; 56
216: 0e 94 f0 00 call 0x1e0
21a: 85 e0 ldi r24, 0x05 ; 5
21c: 90 e0 ldi r25, 0x00 ; 0
21e: 0e 94 47 00 call 0x8e
222: 60 e0 ldi r22, 0x00 ; 0
224: 88 e3 ldi r24, 0x38 ; 56
226: 0e 94 f0 00 call 0x1e0
22a: 85 e0 ldi r24, 0x05 ; 5
22c: 90 e0 ldi r25, 0x00 ; 0
22e: 0e 94 47 00 call 0x8e
232: 60 e0 ldi r22, 0x00 ; 0
234: 88 e3 ldi r24, 0x38 ; 56
236: 0e 94 f0 00 call 0x1e0
23a: 85 e0 ldi r24, 0x05 ; 5
23c: 90 e0 ldi r25, 0x00 ; 0
23e: 0e 94 47 00 call 0x8e
242: 61 e0 ldi r22, 0x01 ; 1
244: 8c e0 ldi r24, 0x0C ; 12
246: 0e 94 f0 00 call 0x1e0
24a: 85 e0 ldi r24, 0x05 ; 5
24c: 90 e0 ldi r25, 0x00 ; 0
24e: 0e 94 47 00 call 0x8e
252: 61 e0 ldi r22, 0x01 ; 1
254: 86 e0 ldi r24, 0x06 ; 6
256: 0e 94 f0 00 call 0x1e0
25a: 85 e0 ldi r24, 0x05 ; 5
25c: 90 e0 ldi r25, 0x00 ; 0
25e: 0e 94 47 00 call 0x8e
262: 61 e0 ldi r22, 0x01 ; 1
264: 86 2f mov r24, r22
266: 0e 94 f0 00 call 0x1e0
26a: 85 e0 ldi r24, 0x05 ; 5
26c: 90 e0 ldi r25, 0x00 ; 0
26e: 0e 94 47 00 call 0x8e
272: 08 95 ret
00000274 <lcd_wdat>:
274: 1f 93 push r17
276: 18 2f mov r17, r24
278: 0e 94 e7 00 call 0x1ce
27c: aa 9a sbi 0x15, 2 ; 21
27e: ab 98 cbi 0x15, 3 ; 21
280: ac 98 cbi 0x15, 4 ; 21
282: 1b bb out 0x1b, r17 ; 27
284: ac 9a sbi 0x15, 4 ; 21
286: 00 00 nop
288: 00 00 nop
28a: ac 98 cbi 0x15, 4 ; 21
28c: 1f 91 pop r17
28e: 08 95 ret
00000290 <lcd_pos>:
}
/*************************************************************/
/* */
/* 设定显示位置 */
/* */
/*************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80,1); //数据指针=80+地址变量
290: 61 e0 ldi r22, 0x01 ; 1
292: 80 68 ori r24, 0x80 ; 128
294: 0e 94 f0 00 call 0x1e0
298: 08 95 ret
0000029a <writetab>:
}
/*******************************************************************/
/* */
/*自定义字符写入CGRAM */
/* */
/*******************************************************************/
void writetab(void)
{
29a: 0f 93 push r16
29c: 1f 93 push r17
29e: cf 93 push r28
uchar i;
lcd_wcmd(0x40,1); //写CGRAM
2a0: 61 e0 ldi r22, 0x01 ; 1
2a2: 80 e4 ldi r24, 0x40 ; 64
2a4: 0e 94 f0 00 call 0x1e0
2a8: 04 ea ldi r16, 0xA4 ; 164
2aa: 10 e0 ldi r17, 0x00 ; 0
2ac: c7 e0 ldi r28, 0x07 ; 7
for (i = 0; i< 8; i++)
lcd_wdat(mytab[i]);
2ae: f8 01 movw r30, r16
2b0: 81 91 ld r24, Z+
2b2: 8f 01 movw r16, r30
2b4: 0e 94 3a 01 call 0x274
2b8: c1 50 subi r28, 0x01 ; 1
2ba: c7 ff sbrs r28, 7
2bc: f8 cf rjmp .-16 ; 0x2ae
2be: cf 91 pop r28
2c0: 1f 91 pop r17
2c2: 0f 91 pop r16
2c4: 08 95 ret
000002c6 <Ok_Menu>:
}
/*******************************************************************/
/* */
/* DS18B20 OK 显示菜单 */
/* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -