📄 main.lss
字号:
/* */
/* 写一个字节 */
/* */
/********************************************************/
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 + -