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

📄 1820.lis

📁 利用AVRM16和DX18B20温度传感器通信
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 010C           ;           data -> y+4
 010C           ;              Y -> R22
 010C           ;              X -> R20
                        .even
 010C           _LCD_write_char::
 010C 0E940000          xcall push_gset2
 0110 622F              mov R22,R18
 0112 402F              mov R20,R16
 0114                   .dbline -1
 0114                   .dbline 123
 0114           ;     {
 0114           ;       LCD_write_data( *s );
 0114           ;       s ++;
 0114           ;     }
 0114           ;    
 0114           ; }
 0114           ; 
 0114           ; void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
 0114           ; {
 0114                   .dbline 124
 0114           ;   LCD_set_xy( X, Y ); //写地址
 0114 262F              mov R18,R22
 0116 042F              mov R16,R20
 0118 D3DF              xcall _LCD_set_xy
 011A                   .dbline 125
 011A           ;   LCD_write_data( data);
 011A 0C81              ldd R16,y+4
 011C B1DF              xcall _LCD_write_data
 011E                   .dbline -2
 011E           L12:
 011E 0E940000          xcall pop_gset2
 0122                   .dbline 0 ; func end
 0122 0895              ret
 0124                   .dbsym l data 4 c
 0124                   .dbsym r Y 22 c
 0124                   .dbsym r X 20 c
 0124                   .dbend
 0124                   .dbfunc e delayUs _delayUs fV
 0124           ;           temp -> R16
                        .even
 0124           _delayUs::
 0124                   .dbline -1
 0124                   .dbline 191
 0124           ;    
 0124           ; }
 0124           ; 
 0124           ; /*--------------------------------------------------------------------------------------------------
 0124           ;                                   液晶驱动程序
 0124           ; --------------------------------------------------------------------------------------------------*/
 0124           ; 
 0124           ; 
 0124           ; 
 0124           ; 
 0124           ; 
 0124           ; 
 0124           ; 
 0124           ; #define uchar unsigned char
 0124           ; #define uint  unsigned int
 0124           ; #define ulong unsigned long
 0124           ; /******************************************************************************
 0124           ;                          //全局变量
 0124           ; ******************************************************************************/
 0124           ; 
 0124           ; 
 0124           ; 
 0124           ; /******************************************************************************
 0124           ;                           DS18B20驱动程序
 0124           ; ******************************************************************************/
 0124           ; 
 0124           ; /********************************************************************************/
 0124           ; //                           下面为DS18B20温度传感模块                                     //
 0124           ; /********************************************************************************/
 0124           ; /********************************************************************************
 0124           ;                               位变量操作宏定义
 0124           ; ********************************************************************************/
 0124           ; #define               BIT_SET(a,b)    a|=BIT(b)
 0124           ; #define               BIT_CLR(a,b)    a&=~BIT(b)
 0124           ; #define               BIT_INV(a,b)    a^=BIT(b)
 0124           ; #define               BIT_STATUS(a,b) a&BIT(b)
 0124           ; /********************************************************************************
 0124           ;                               DS18B20操作定义
 0124           ; ********************************************************************************/
 0124           ; #define               CLR_DS18B20             BIT_CLR(PORTB,PB1)              //数据线强制拉低
 0124           ; #define               SET_DS18B20             BIT_SET(PORTB,PB1)              //数据线强制拉高,上拉
 0124           ; #define               HLD_DS18B20             BIT_SET(DDRB,PB1)               //Mega16控制总线
 0124           ; #define               RLS_DS18B20             BIT_CLR(DDRB,PB1)               //释放总线
 0124           ; #define               STU_DS18B20             BIT_STATUS(PINB,PB1)            //数据线的状态
 0124           ; 
 0124           ; 
 0124           ; /**********************************************************************
 0124           ; functionName: void delayUs(BYTE temp)
 0124           ; description :延时函数 晶振频率:7.3728MHZ
 0124           ; delayUs(1);           //2.71us
 0124           ; delayUs(2);           //3.53us
 0124           ; delayUs(4);           //5.15us
 0124           ; delayUs(8);           //8.41us
 0124           ; delayUs(16);          //14.92us
 0124           ; delayUs(32);          //27.94us
 0124           ; delayUs(64);          //53.98us
 0124           ; delayUs(128);         //106.07us
 0124           ; delayUs(255);         //209.42us
 0124           ; delayUs(18);          //16.55us
 0124           ; delayUs(34);          //29.57us
 0124           ; delayUs(35);          //30.38us
 0124           ; delayUs(100);         //83.28
 0124           ; _NOP();                       //0.14us  
 0124           ; **********************************************************************/
 0124           ; void delayUs(unsigned char temp)
 0124           ; {
 0124           L14:
 0124                   .dbline 192
 0124           L15:
 0124                   .dbline 192
 0124           ;        while(temp--);
 0124 202E              mov R2,R16
 0126 3324              clr R3
 0128 0150              subi R16,1
 012A 2220              tst R2
 012C D9F7              brne L14
 012E                   .dbline -2
 012E           L13:
 012E                   .dbline 0 ; func end
 012E 0895              ret
 0130                   .dbsym r temp 16 c
 0130                   .dbend
 0130                   .dbfunc e resetDS18B20 _resetDS18B20 fc
 0130           ;        errTime -> R20
                        .even
 0130           _resetDS18B20::
 0130 0E940000          xcall push_gset1
 0134                   .dbline -1
 0134                   .dbline 200
 0134           ; }
 0134           ; 
 0134           ; /**********************************************************************
 0134           ; functionName: BYTE resetDS18B20(void)
 0134           ; description :DS18B20初始化1
 0134           ; **********************************************************************/
 0134           ; unsigned char resetDS18B20(void)
 0134           ; {
 0134                   .dbline 201
 0134           ;       unsigned char errTime=0;
 0134 4427              clr R20
 0136                   .dbline 202
 0136           ;       RLS_DS18B20;            //释放总线
 0136 B998              cbi 0x17,1
 0138                   .dbline 203
 0138           ;       _NOP();
 0138 0000              nop
 013A                   .dbline 204
 013A           ;       HLD_DS18B20;            //Maga16控制总线
 013A B99A              sbi 0x17,1
 013C                   .dbline 205
 013C           ;       CLR_DS18B20;            //强制拉低
 013C C198              cbi 0x18,1
 013E                   .dbline 206
 013E           ;       delayUs(255);           //209.42us
 013E 0FEF              ldi R16,255
 0140 F1DF              xcall _delayUs
 0142                   .dbline 207
 0142           ;       delayUs(255);           //209.42us
 0142 0FEF              ldi R16,255
 0144 EFDF              xcall _delayUs
 0146                   .dbline 208
 0146           ;       delayUs(255);           //83.28us
 0146 0FEF              ldi R16,255
 0148 EDDF              xcall _delayUs
 014A                   .dbline 210
 014A           ;       //以上的三个延时大于480us
 014A           ;       RLS_DS18B20;            //释放总线,总线自动上拉
 014A B998              cbi 0x17,1
 014C                   .dbline 211
 014C           ;       _NOP();                 
 014C 0000              nop
 014E 08C0              xjmp L19
 0150           L18:
 0150                   .dbline 213
 0150           ;       while(STU_DS18B20)      
 0150           ;       {
 0150                   .dbline 214
 0150           ;               delayUs(5);     //5.15us
 0150 05E0              ldi R16,5
 0152 E8DF              xcall _delayUs
 0154                   .dbline 215
 0154           ;               errTime++;
 0154 4395              inc R20
 0156                   .dbline 216
 0156           ;               if(errTime>20)
 0156 84E1              ldi R24,20
 0158 8417              cp R24,R20
 015A 10F4              brsh L21
 015C                   .dbline 217
 015C           ;               return(0x00);           //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
 015C 0027              clr R16
 015E 0FC0              xjmp L17
 0160           L21:
 0160                   .dbline 218
 0160           L19:
 0160                   .dbline 212
 0160 B199              sbic 0x16,1
 0162 F6CF              rjmp L18
 0164                   .dbline 219
 0164           ;       }
 0164           ;       errTime=0;
 0164 4427              clr R20
 0166 08C0              xjmp L24
 0168           L23:
 0168                   .dbline 221
 0168           ;       while(!(STU_DS18B20))   
 0168           ;       {   
 0168                   .dbline 222
 0168           ;               delayUs(5);             //5.15us
 0168 05E0              ldi R16,5
 016A DCDF              xcall _delayUs
 016C                   .dbline 223
 016C           ;               errTime++;
 016C 4395              inc R20
 016E                   .dbline 224
 016E           ;               if(errTime>50)
 016E 82E3              ldi R24,50
 0170 8417              cp R24,R20
 0172 10F4              brsh L26
 0174                   .dbline 225
 0174           ;               return(0x00);           //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
 0174 0027              clr R16
 0176 03C0              xjmp L17
 0178           L26:
 0178                   .dbline 226
 0178           L24:
 0178                   .dbline 220
 0178 B19B              sbis 0x16,1
 017A F6CF              rjmp L23
 017C                   .dbline 227
 017C           ;       }
 017C           ;       return(0xff);
 017C 0FEF              ldi R16,255
 017E                   .dbline -2
 017E           L17:
 017E 0E940000          xcall pop_gset1
 0182                   .dbline 0 ; func end
 0182 0895              ret
 0184                   .dbsym r errTime 20 c
 0184                   .dbend
 0184                   .dbfunc e readByteDS18B20 _readByteDS18B20 fc
 0184           ;         retVal -> R20
 0184           ;              i -> R22
                        .even
 0184           _readByteDS18B20::
 0184 0E940000          xcall push_gset2
 0188                   .dbline -1
 0188                   .dbline 236
 0188           ; }
 0188           ; 
 0188           ; 
 0188           ; /**********************************************************************
 0188           ; functionName: BYTE readByteDS18B20(void)
 0188           ; description :读DS18B20一个字节2
 0188           ; **********************************************************************/
 0188           ; unsigned char readByteDS18B20(void)
 0188           ; {
 0188                   .dbline 238
 0188           ;       unsigned char i;
 0188           ;       unsigned char retVal=0;
 0188 4427              clr R20
 018A                   .dbline 239
 018A           ;       RLS_DS18B20;            //释放总线
 018A B998              cbi 0x17,1
 018C                   .dbline 240
 018C           ;       for(i=8;i>0;i--)
 018C 68E0              ldi R22,8
 018E 1AC0              xjmp L32
 0190           L29:
 0190                   .dbline 241
 0190           ;       {
 0190                   .dbline 242
 0190           ;               retVal>>=1;
 0190 4695              lsr R20
 0192                   .dbline 243
 0192           ;           HLD_DS18B20;        //Maga16控制总线
 0192 B99A              sbi 0x17,1
 0194                   .dbline 244
 0194           ;               CLR_DS18B20;    //强制拉低
 0194 C198              cbi 0x18,1
 0196                   .dbline 245
 0196           ;               NOP();
 0196 0000              nop
 0198                   .dbline 246
 0198           ;               NOP();
 0198 0000              nop
 019A                   .dbline 247
 019A           ;               NOP();
 019A 0000              nop
 019C                   .dbline 248
 019C           ;               NOP();
 019C 0000              nop
 019E                   .dbline 249
 019E           ;               NOP();
 019E 0000              nop
 01A0                   .dbline 250
 01A0           ;               NOP();
 01A0 0000              nop
 01A2                   .dbline 251
 01A2           ;               NOP();  
 01A2 0000              nop
 01A4                   .dbline 252
 01A4           ;               NOP();                  //延时大于1us   
 01A4 0000              nop
 01A6                   .dbline 253
 01A6           ;               RLS_DS18B20;            //释放总线,DS18B20会将总线强制拉低
 01A6 B998              cbi 0x17,1
 01A8                   .dbline 254
 01A8           ;               NOP();
 01A8 0000              nop
 01AA                   .dbline 255
 01AA           ;               NOP();
 01AA 0000              nop
 01AC                   .dbline 256
 01AC           ;               NOP();
 01AC 0000              nop
 01AE                   .dbline 257
 01AE           ;               if(STU_DS18B20)
 01AE B19B              sbis 0x16,1
 01B0 01C0              rjmp L33
 01B2                   .dbline 258
 01B2           ;               retVal|=0x80;
 01B2 4068              ori R20,128
 01B4           L33:
 01B4                   .dbline 261
 01B4 04E1              ldi R16,20
 01B6 B6DF              xcall _delayUs
 01B8                   .dbline 262
 01B8 0EE1              ldi R16,30
 01BA B4DF              xcall _delayUs
 01BC                   .dbline 263
 01BC B998              cbi 0x17,1
 01BE                   .dbline 264
 01BE 0DE2              ldi R16,45
 01C0 B1DF              xcall _delayUs
 01C2                   .dbline 266
 01C2           L30:
 01C2                   .dbline 240
 01C2 6A95              dec R22
 01C4           L32:
 01C4                   .dbline 240
 01C4 2224              clr R2
 01C6 2616              cp R2,R22
 01C8 18F3              brlo L29
 01CA                   .dbline 267
 01CA           ;       
 01CA           ;               
 01CA           ;               delayUs(20);            //14.92us
 01CA           ;           delayUs(30);                //14.92us
 01CA           ;               RLS_DS18B20;            //释放总线
 01CA           ;               delayUs(45);            //30.38us
 01CA           ;               
 01CA           ;       }
 01CA           ;       delayUs(1);                     //2.71us(大于1us就行了)
 01CA 01E0              ldi R16,1
 01CC ABDF              xcall _delayUs
 01CE                   .dbline 268
 01CE           ;       return(retVal);
 01CE 042F              mov R16,R20

⌨️ 快捷键说明

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