ds1820.lis
来自「avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用」· LIS 代码 · 共 542 行 · 第 1/2 页
LIS
542 行
.module DS1820.C
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\DS1820.C
0000 .dbfunc e delay_10us _delay_10us fV
0000 ; i -> R16
.even
0000 _delay_10us::
0000 .dbline -1
0000 .dbline 51
0000 ; /*
0000 ; LCD12864液晶屏驱动模块
0000 ; 1、可直接嵌入到项目中使用
0000 ; 2、晶振频率:1M
0000 ; 3、如晶振提高低层驱动延时要作相应修改
0000 ; AVR_AFA
0000 ; www.iccavr.com
0000 ; */
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; #define DQ_IN DDRA &= ~(1 << PA7) /*设置输入*/
0000 ; #define DQ_OUT DDRA |= (1 << PA7) /*设置输出*/
0000 ; #define DQ_CLR PORTA &= ~(1 << PA7) /*置低电平*/
0000 ; #define DQ_SET PORTA |= (1 << PA7) /*置高电平*/
0000 ; #define DQ_R PINA & (1 << PA7) /*读了电平*/
0000 ;
0000 ; unsigned char flag; /*中断标志缓存*/
0000 ;
0000 ; /*===================================================================
0000 ; // 函数功能: DS18B20数据校验函数
0000 ; // 形参: void
0000 ; // 返回: unsigned char 校验结果
0000 ; // 编写: 2004/8/25
0000 ; // 备注: CRC公式为:CRC = X^8 + X^5 + X^4 + 1
0000 ; ===================================================================*/
0000 ; /*unsigned char crc(unsigned char *p,unsigned char len)
0000 ; {
0000 ; unsigned char bit0,cbit,r,temp,i,j,byte;
0000 ; temp = 0;
0000 ; for(j = 0; j < len; j++)
0000 ; {
0000 ; byte = p[j];
0000 ; for(i = 0; i < 8; i++)
0000 ; {
0000 ; cbit = temp & 0x01;
0000 ; bit0 = byte&0x01;
0000 ; temp >>= 1;
0000 ; r = cbit ^ bit0;
0000 ; if(r == 1)
0000 ; temp ^= 0x8c;
0000 ; byte >>= 1;
0000 ; }
0000 ; }
0000 ; return temp;
0000 ; }*/
0000 ;
0000 ; /*延时函数*/
0000 ; /*频率为1MHz,延时:i X 10 + 16uS*/
0000 ; void delay_10us(unsigned char i) {
0000 .dbline 53
0000 ;
0000 ; if (i == 0) {
0000 0023 tst R16
0002 29F4 brne L5
0004 .dbline 53
0004 .dbline 54
0004 ; return ;
0004 09C0 xjmp L1
0006 L4:
0006 .dbline 56
0006 .dbline 57
0006 0000 nop
0008 .dbline 58
0008 0000 nop
000A .dbline 59
000A 0000 nop
000C .dbline 60
000C 0000 nop
000E .dbline 61
000E L5:
000E .dbline 56
000E ; }
000E ; while (i--) {
000E 202E mov R2,R16
0010 3324 clr R3
0012 0150 subi R16,1
0014 2220 tst R2
0016 B9F7 brne L4
0018 .dbline -2
0018 L1:
0018 .dbline 0 ; func end
0018 0895 ret
001A .dbsym r i 16 c
001A .dbend
001A .dbfunc e ds1820_reset _ds1820_reset fc
001A ; i -> R20
.even
001A _ds1820_reset::
001A 0E940000 xcall push_gset1
001E .dbline -1
001E .dbline 65
001E ; NOP();
001E ; NOP();
001E ; NOP();
001E ; NOP();
001E ; }
001E ; }
001E ;
001E ; /*DS18B20复位函数*/
001E ; unsigned char ds1820_reset(void) {
001E .dbline 68
001E ;
001E ; unsigned char i;
001E ; flag = SREG; /*中断保护*/
001E 2FB6 in R2,0x3f
0020 20920000 sts _flag,R2
0024 .dbline 69
0024 ; CLI(); /*关中断*/
0024 F894 cli
0026 .dbline 70
0026 ; DQ_OUT;
0026 D79A sbi 0x1a,7
0028 .dbline 71
0028 ; DQ_CLR;
0028 DF98 cbi 0x1b,7
002A .dbline 72
002A ; delay_10us(49); /*延时500uS(480-960)*/
002A 01E3 ldi R16,49
002C E9DF xcall _delay_10us
002E .dbline 73
002E ; DQ_SET;
002E DF9A sbi 0x1b,7
0030 .dbline 74
0030 ; DQ_IN;
0030 D798 cbi 0x1a,7
0032 .dbline 75
0032 ; delay_10us(7); /*延时80uS*/
0032 07E0 ldi R16,7
0034 E5DF xcall _delay_10us
0036 .dbline 76
0036 ; i = DQ_R;
0036 49B3 in R20,0x19
0038 4078 andi R20,128
003A .dbline 77
003A ; delay_10us(49); /*延时500uS(保持>480uS)*/
003A 01E3 ldi R16,49
003C E1DF xcall _delay_10us
003E .dbline 78
003E ; if (flag & 0x80) { /*恢复中断状态*/
003E 20900000 lds R2,_flag
0042 27FE sbrs R2,7
0044 01C0 rjmp L8
0046 .dbline 78
0046 .dbline 79
0046 ; SEI();
0046 7894 sei
0048 .dbline 80
0048 ; }
0048 L8:
0048 .dbline 81
0048 ; if (i) {
0048 4423 tst R20
004A 11F0 breq L10
004C .dbline 81
004C .dbline 82
004C ; return 0x00;
004C 0027 clr R16
004E 01C0 xjmp L7
0050 L10:
0050 .dbline 84
0050 ; }
0050 ; else {
0050 .dbline 85
0050 ; return 0x01;
0050 01E0 ldi R16,1
0052 .dbline -2
0052 L7:
0052 0E940000 xcall pop_gset1
0056 .dbline 0 ; func end
0056 0895 ret
0058 .dbsym r i 20 c
0058 .dbend
0058 .dbfunc e ds1820_read_byte _ds1820_read_byte fc
0058 ; value -> R20
0058 ; i -> R22
.even
0058 _ds1820_read_byte::
0058 0E940000 xcall push_gset2
005C .dbline -1
005C .dbline 95
005C ; }
005C ; }
005C ;
005C ; /*===================================================================
005C ; // 函数功能: 从 1-wire 总线上读取一个字节
005C ; // 形参: void
005C ; // 返回: unsigned char 读到的值
005C ; // 编写: 2004/8/25
005C ; ===================================================================*/
005C ; unsigned char ds1820_read_byte(void) {
005C .dbline 98
005C ;
005C ; unsigned char i;
005C ; unsigned char value = 0;
005C 4427 clr R20
005E .dbline 99
005E ; flag = SREG; /*中断保护*/
005E 2FB6 in R2,0x3f
0060 20920000 sts _flag,R2
0064 .dbline 100
0064 ; CLI(); /*关中断*/
0064 F894 cli
0066 .dbline 101
0066 68E0 ldi R22,8
0068 19C0 xjmp L16
006A L13:
006A .dbline 101
006A ; for (i = 8; i != 0; i--) {
006A .dbline 102
006A ; value >>= 1;
006A 4695 lsr R20
006C .dbline 103
006C ; DQ_OUT;
006C D79A sbi 0x1a,7
006E .dbline 104
006E ; DQ_CLR;
006E DF98 cbi 0x1b,7
0070 .dbline 105
0070 ; NOP(); /*延时4uS*/
0070 0000 nop
0072 .dbline 106
0072 ; NOP();
0072 0000 nop
0074 .dbline 107
0074 ; NOP();
0074 0000 nop
0076 .dbline 108
0076 ; NOP();
0076 0000 nop
0078 .dbline 109
0078 ; DQ_SET;
0078 DF9A sbi 0x1b,7
007A .dbline 110
007A ; DQ_IN;
007A D798 cbi 0x1a,7
007C .dbline 111
007C ; NOP(); /*延时10uS*/
007C 0000 nop
007E .dbline 112
007E ; NOP();
007E 0000 nop
0080 .dbline 113
0080 ; NOP();
0080 0000 nop
0082 .dbline 114
0082 ; NOP();
0082 0000 nop
0084 .dbline 115
0084 ; NOP();
0084 0000 nop
0086 .dbline 116
0086 ; NOP();
0086 0000 nop
0088 .dbline 117
0088 ; NOP();
0088 0000 nop
008A .dbline 118
008A ; NOP();
008A 0000 nop
008C .dbline 119
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?