📄 1820.lis
字号:
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 + -