⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avr_ds18b20.lss

📁 基于AVR单片机 MEGA16的温度采集源程序
💻 LSS
📖 第 1 页 / 共 3 页
字号:
/**********************************************************/
/*                                                        */
/* 写一个字节                                             */
/*                                                        */
/**********************************************************/
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 + -