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 + -
显示快捷键?