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

📄 main.lss

📁 AVR source code of some projects
💻 LSS
📖 第 1 页 / 共 3 页
字号:
/*                                                      */
/* 写一个字节                                           */
/*                                                      */
/********************************************************/
void WriteOneChar(uchar dat)
{
 11c:	1f 93       	push	r17
 11e:	cf 93       	push	r28
 120:	c8 2f       	mov	r28, r24
  uchar i = 0;
  
  for (i = 8; i > 0; i--)
 122:	18 e0       	ldi	r17, 0x08	; 8
  {
    PORTD&=~_BV(DQ);
 124:	93 98       	cbi	0x12, 3	; 18
 
    if(dat&0x01)
 126:	c0 ff       	sbrs	r28, 0
 128:	02 c0       	rjmp	.+4      	; 0x12e
     PORTD|=_BV(DQ);      //写"1" 
 12a:	93 9a       	sbi	0x12, 3	; 18
 12c:	01 c0       	rjmp	.+2      	; 0x130
	else     
	 PORTD&=~_BV(DQ);     //写"0"
 12e:	93 98       	cbi	0x12, 3	; 18

    Delay(70);
 130:	86 e4       	ldi	r24, 0x46	; 70
 132:	90 e0       	ldi	r25, 0x00	; 0
 134:	9c df       	rcall	.-200    	; 0x6e
    PORTD|=_BV(DQ);        
 136:	93 9a       	sbi	0x12, 3	; 18
    dat>>=1;
 138:	c6 95       	lsr	r28
 13a:	11 50       	subi	r17, 0x01	; 1
 13c:	99 f7       	brne	.-26     	; 0x124
 13e:	cf 91       	pop	r28
 140:	1f 91       	pop	r17
 142:	08 95       	ret

00000144 <Read_RomCord>:
  }
}

/*************************************************************/
/*                                                           */
/* 读取64位序列码                                            */
/*                                                           */
/*************************************************************/
void Read_RomCord(void)
{
 144:	0f 93       	push	r16
 146:	1f 93       	push	r17
 148:	cf 93       	push	r28
     unsigned char j;
     Init_DS18B20();
 14a:	b4 df       	rcall	.-152    	; 0xb4
  
     WriteOneChar(0x33);  // 读序列码的操作
 14c:	83 e3       	ldi	r24, 0x33	; 51
 14e:	e6 df       	rcall	.-52     	; 0x11c
 150:	04 ea       	ldi	r16, 0xA4	; 164
 152:	10 e0       	ldi	r17, 0x00	; 0
 154:	c7 e0       	ldi	r28, 0x07	; 7
     for (j = 0; j < 8; j++)
	 {
	   RomCode[j] = ReadOneChar() ;
 156:	cc df       	rcall	.-104    	; 0xf0
 158:	f8 01       	movw	r30, r16
 15a:	81 93       	st	Z+, r24
 15c:	8f 01       	movw	r16, r30
       Delay(200);
 15e:	88 ec       	ldi	r24, 0xC8	; 200
 160:	90 e0       	ldi	r25, 0x00	; 0
 162:	85 df       	rcall	.-246    	; 0x6e
 164:	c1 50       	subi	r28, 0x01	; 1
 166:	c7 ff       	sbrs	r28, 7
 168:	f6 cf       	rjmp	.-20     	; 0x156
 16a:	cf 91       	pop	r28
 16c:	1f 91       	pop	r17
 16e:	0f 91       	pop	r16
 170:	08 95       	ret

00000172 <CRC8>:
	 }
}

/*************************************************************/
/*                                                           */
/*DS18B20的CRC8校验程序                                      */
/*                                                           */
/*************************************************************/
int  CRC8(void) 
{ 
   uchar i,x; uchar crcbuff;
   
   crc=0;
 172:	10 92 b3 00 	sts	0x00B3, r1
   for(x = 0; x <8; x++)
 176:	40 e0       	ldi	r20, 0x00	; 0
 178:	61 e0       	ldi	r22, 0x01	; 1
 17a:	70 e0       	ldi	r23, 0x00	; 0
 17c:	58 e1       	ldi	r21, 0x18	; 24
 17e:	84 2f       	mov	r24, r20
   {
    crcbuff=RomCode[x];
 180:	e4 2f       	mov	r30, r20
 182:	ff 27       	eor	r31, r31
 184:	ec 55       	subi	r30, 0x5C	; 92
 186:	ff 4f       	sbci	r31, 0xFF	; 255
 188:	e0 81       	ld	r30, Z
 18a:	28 2f       	mov	r18, r24
 18c:	37 e0       	ldi	r19, 0x07	; 7
    for(i = 0; i < 8; i++) 
     { 
      if(((crc ^ crcbuff)&0x01)==0) 
 18e:	82 2f       	mov	r24, r18
 190:	8e 27       	eor	r24, r30
 192:	99 27       	eor	r25, r25
 194:	81 70       	andi	r24, 0x01	; 1
 196:	90 70       	andi	r25, 0x00	; 0
 198:	86 17       	cp	r24, r22
 19a:	97 07       	cpc	r25, r23
 19c:	11 f0       	breq	.+4      	; 0x1a2
      crc >>= 1; 
 19e:	26 95       	lsr	r18
 1a0:	03 c0       	rjmp	.+6      	; 0x1a8
       else { 
              crc ^= 0x18;   //CRC=X8+X5+X4+1
 1a2:	25 27       	eor	r18, r21
              crc >>= 1; 
 1a4:	26 95       	lsr	r18
              crc |= 0x80; 
 1a6:	20 68       	ori	r18, 0x80	; 128
            }         
      crcbuff >>= 1;       
 1a8:	e6 95       	lsr	r30
 1aa:	31 50       	subi	r19, 0x01	; 1
 1ac:	37 ff       	sbrs	r19, 7
 1ae:	ef cf       	rjmp	.-34     	; 0x18e
 1b0:	82 2f       	mov	r24, r18
 1b2:	4f 5f       	subi	r20, 0xFF	; 255
 1b4:	48 30       	cpi	r20, 0x08	; 8
 1b6:	20 f3       	brcs	.-56     	; 0x180
 1b8:	20 93 b3 00 	sts	0x00B3, r18
	 }
   }
     return (crc);	
}
 1bc:	82 2f       	mov	r24, r18
 1be:	99 27       	eor	r25, r25
 1c0:	08 95       	ret

000001c2 <lcd_busy>:
/*************************************************************/
/*                                                           */
/* 数据转换与显示                                            */
/*                                                           */
/*************************************************************/

void Disp_RomCode(void)
{
   uchar j;
   uchar H_num=0x40;       //LCD第二行初始位置

   for(j=0;j<8;j++)
   {
    Temp = RomCode[j];

    display[0]=((Temp&0xf0)>>4);
    if(display[0]>9)
     { display[0]=display[0]+0x37;}
    else{display[0]=display[0]+0x30;}

    lcd_pos(H_num);             
    lcd_wdat(display[0]);        //高位数显示 

    H_num++;
    display[1]=(Temp&0x0f);
    if(display[1]>9)
     {display[1]=display[1]+0x37;}
    else {display[1]=display[1]+0x30;}

    lcd_pos(H_num);             
    lcd_wdat(display[1]);        //低位数显示 
    H_num++;
   }
}	 

/*************************************************************/
/*                                                           */
/*  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口为输入
 1c2:	d7 98       	cbi	0x1a, 7	; 26
    PORTC &=~_BV(LCD_RS);     
 1c4:	a8 98       	cbi	0x15, 0	; 21
    PORTC |= _BV(LCD_RW);      
 1c6:	a9 9a       	sbi	0x15, 1	; 21
    PORTC |= _BV(LCD_EN);     
 1c8:	aa 9a       	sbi	0x15, 2	; 21
    while(PINA & _BV(busy)); //忙等待
 1ca:	cf 99       	sbic	0x19, 7	; 25
 1cc:	fe cf       	rjmp	.-4      	; 0x1ca
    PORTC &=~_BV(LCD_EN);     
 1ce:	aa 98       	cbi	0x15, 2	; 21
    DDRA|=_BV(busy);          //设置busy口为输出 
 1d0:	d7 9a       	sbi	0x1a, 7	; 26
 1d2:	08 95       	ret

000001d4 <lcd_wdat>:
 1d4:	1f 93       	push	r17
 1d6:	18 2f       	mov	r17, r24
 1d8:	f4 df       	rcall	.-24     	; 0x1c2
 1da:	a8 9a       	sbi	0x15, 0	; 21
 1dc:	a9 98       	cbi	0x15, 1	; 21
 1de:	aa 98       	cbi	0x15, 2	; 21
 1e0:	1b bb       	out	0x1b, r17	; 27
 1e2:	aa 9a       	sbi	0x15, 2	; 21
 1e4:	00 00       	nop
 1e6:	00 00       	nop
 1e8:	aa 98       	cbi	0x15, 2	; 21
 1ea:	1f 91       	pop	r17
 1ec:	08 95       	ret

000001ee <lcd_wcmd>:
 1ee:	cf 93       	push	r28
 1f0:	c8 2f       	mov	r28, r24
 1f2:	61 11       	cpse	r22, r1
 1f4:	e6 df       	rcall	.-52     	; 0x1c2
 1f6:	a8 98       	cbi	0x15, 0	; 21
 1f8:	a9 98       	cbi	0x15, 1	; 21
 1fa:	aa 98       	cbi	0x15, 2	; 21
 1fc:	cb bb       	out	0x1b, r28	; 27
 1fe:	aa 9a       	sbi	0x15, 2	; 21
 200:	00 00       	nop
 202:	00 00       	nop
 204:	aa 98       	cbi	0x15, 2	; 21
 206:	cf 91       	pop	r28
 208:	08 95       	ret

0000020a <lcd_pos>:
}

/*************************************************************/
/*                                                           */
/*  设定显示位置                                             */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -