📄 display.lst
字号:
0136 9508 RET
_puts:
l --> R20
h --> R20
data --> Y+2
0137 931A ST R17,-Y
0138 930A ST R16,-Y
0139 940E0305 CALL push_gset1
(0179)
(0180) }//主循环结束
(0181) }//主程序结束
(0182)
(0183)
(0184) void puts(unsigned int data )
(0185) {
(0186) // UDR=data>>8;
(0187) unsigned char h , l ;
(0188) h=*((unsigned char *)(&data)+1);
013B 814B LDD R20,Y+3
(0189) UDR=h;
013C B94C OUT 0x0C,R20
(0190) while(!(USR&0x40));
013D 9B5E SBIS 0x0B,6
013E CFFE RJMP 0x013D
(0191) USR |= 0x40;
013F 9A5E SBI 0x0B,6
(0192) //UDR=data;
(0193) l=*(unsigned char *)(&data);
0140 01FE MOVW R30,R28
0141 8142 LDD R20,Z+2
(0194) UDR=l;
0142 B94C OUT 0x0C,R20
(0195) while(!(USR&0x40));
0143 9B5E SBIS 0x0B,6
0144 CFFE RJMP 0x0143
(0196) USR |= 0x40;
0145 9A5E SBI 0x0B,6
0146 940E0308 CALL pop_gset1
0148 9622 ADIW R28,2
0149 9508 RET
_display:
k --> R20
014A 940E0305 CALL push_gset1
(0197)
(0198) }
(0199)
(0200) void display(void)
(0201) {
(0202) unsigned char k ;
(0203) if(one==1)
014C 91800065 LDS R24,one
014E 3081 CPI R24,1
014F F4E9 BNE 0x016D
(0204) {
(0205) LCD_set_xy(0,0);
0150 2722 CLR R18
0151 2700 CLR R16
0152 940E0287 CALL _LCD_set_xy
(0206) for(k=1;k<=end;k++)
0154 E041 LDI R20,1
0155 C00D RJMP 0x0163
(0207) {
(0208) LCD_write_char(0,string[k]);
0156 E686 LDI R24,0x66
0157 E090 LDI R25,0
0158 2FE4 MOV R30,R20
0159 27FF CLR R31
015A 0FE8 ADD R30,R24
015B 1FF9 ADC R31,R25
015C 8120 LDD R18,Z+0
015D 2733 CLR R19
015E 2700 CLR R16
015F 2711 CLR R17
0160 940E02A1 CALL _LCD_write_char
0162 9543 INC R20
0163 90200063 LDS R2,end
0165 1624 CP R2,R20
0166 F778 BCC 0x0156
(0209)
(0210) }
(0211) start=0;
0167 2422 CLR R2
0168 92200064 STS start,R2
(0212) i=0;
016A 92200060 STS i,R2
(0213) }
016C C020 RJMP 0x018D
(0214) else if(two==1)
016D 91800062 LDS R24,two
016F 3081 CPI R24,1
0170 F4E1 BNE 0x018D
(0215) {
(0216) LCD_set_xy(0,1);
0171 E021 LDI R18,1
0172 2700 CLR R16
0173 940E0287 CALL _LCD_set_xy
(0217) for(k=1;k<=end;k++)
0175 E041 LDI R20,1
0176 C00D RJMP 0x0184
(0218) {
(0219) LCD_write_char(0,string[k]);
0177 E686 LDI R24,0x66
0178 E090 LDI R25,0
0179 2FE4 MOV R30,R20
017A 27FF CLR R31
017B 0FE8 ADD R30,R24
017C 1FF9 ADC R31,R25
017D 8120 LDD R18,Z+0
017E 2733 CLR R19
017F 2700 CLR R16
0180 2711 CLR R17
0181 940E02A1 CALL _LCD_write_char
0183 9543 INC R20
0184 90200063 LDS R2,end
0186 1624 CP R2,R20
0187 F778 BCC 0x0177
(0220)
(0221) }
(0222) start = 0 ;
0188 2422 CLR R2
0189 92200064 STS start,R2
(0223) i= 0;
018B 92200060 STS i,R2
(0224) }
018D 940E0308 CALL pop_gset1
018F 9508 RET
FILE: F:\我的设计\delphi\uartdispy\mcu\delay.c
(0001) /*********************************Copyright (c)*********************************
(0002) **
(0003) ** 文 件 名: delayUs.c
(0004) ** 最后修改日期: 2005年06月8日
(0005) ** 描 述: 延迟函数文件
(0006) ** 版 本: V1.0
(0007) ** 主 控 芯 片:M16 晶振频率:8 MHZ
(0008) *******************************************************************************/
(0009) #include <iom16v.h>
(0010) #include <macros.h>
(0011) #include "function.h"
(0012) #include "define.h"
(0013)
(0014)
(0015) /**********************************************************************
(0016) functionName: void delayUs(BYTE temp)
(0017) description : 延时函数 晶振频率:7.3728MHZ
(0018) delayUs(1); //2.71us
(0019) delayUs(2); //3.53us
(0020) delayUs(4); //5.15us
(0021) delayUs(8); //8.41us
(0022) delayUs(16); //14.92us
(0023) delayUs(32); //27.94us
(0024) delayUs(64); //53.98us
(0025) delayUs(128); //106.07us
(0026) delayUs(255); //209.42us
(0027) delayUs(18); //16.55us
(0028) delayUs(34); //29.57us
(0029) delayUs(35); //30.38us
(0030) delayUs(100); //83.28
(0031) _NOP(); //0.14us
(0032) **********************************************************************/
(0033) void delayUs(unsigned char temp)
(0034) {
(0035) while(temp--);
_delayUs:
temp --> R16
0190 2E20 MOV R2,R16
0191 2433 CLR R3
0192 5001 SUBI R16,1
0193 2022 TST R2
0194 F7D9 BNE 0x0190
0195 9508 RET
(0036) }
(0037)
(0038) /*-----------------------------------------------------------------------
(0039) 延时函数
(0040) 系统时钟:8M
(0041) -----------------------------------------------------------------------*/
(0042) void delay_1us(void) //1us延时函数
(0043) {
(0044) asm("nop");
_delay_1us:
0196 0000 NOP
0197 9508 RET
_delay_nus:
i --> R20
n --> R22
0198 940E0303 CALL push_gset2
019A 01B8 MOVW R22,R16
(0045) }
(0046)
(0047) void delay_nus(unsigned int n) //N us延时函数
(0048) {
(0049) unsigned int i=0;
019B 2744 CLR R20
019C 2755 CLR R21
(0050) for (i=0;i<n;i++)
019D C003 RJMP 0x01A1
(0051) delay_1us();
019E DFF7 RCALL _delay_1us
019F 5F4F SUBI R20,0xFF
01A0 4F5F SBCI R21,0xFF
01A1 1746 CP R20,R22
01A2 0757 CPC R21,R23
01A3 F3D0 BCS 0x019E
01A4 940E02F4 CALL pop_gset2
01A6 9508 RET
(0052) }
(0053)
(0054) void delay_1ms(void) //1ms延时函数
(0055) {
(0056) unsigned int i;
(0057) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
01A7 2700 CLR R16
01A8 2711 CLR R17
01A9 C002 RJMP 0x01AC
01AA 5F0F SUBI R16,0xFF
01AB 4F1F SBCI R17,0xFF
01AC 3704 CPI R16,0x74
01AD E0E4 LDI R30,4
01AE 071E CPC R17,R30
01AF F3D0 BCS 0x01AA
01B0 9508 RET
_delay_nms:
i --> R20
n --> R22
01B1 940E0303 CALL push_gset2
01B3 01B8 MOVW R22,R16
(0058) }
(0059)
(0060) void delay_nms(unsigned int n) //N ms延时函数
(0061) {
(0062) unsigned int i=0;
01B4 2744 CLR R20
01B5 2755 CLR R21
(0063) for (i=0;i<n;i++)
01B6 C003 RJMP 0x01BA
(0064) delay_1ms();
01B7 DFEF RCALL _delay_1ms
01B8 5F4F SUBI R20,0xFF
01B9 4F5F SBCI R21,0xFF
01BA 1746 CP R20,R22
01BB 0757 CPC R21,R23
01BC F3D0 BCS 0x01B7
01BD 940E02F4 CALL pop_gset2
01BF 9508 RET
_resetDS18B20:
errTime --> R20
01C0 940E0305 CALL push_gset1
FILE: F:\我的设计\delphi\uartdispy\mcu\DS18B20.c
(0001) /*********************************Copyright (c)*********************************
(0002) **
(0003) ** 文 件 名: defineLCD1602.h
(0004) ** 最后修改日期: 2005年06月8日
(0005) ** 描 述: 18B20温度检测IC驱动函数文件
(0006) ** 版 本: V1.0
(0007) ** 主 控 芯 片:M16 晶振频率:8 MHZ
(0008) *******************************************************************************/
(0009)
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012) #include "function.h"
(0013) #include "define.h"
(0014) #include "defineDS18B20.h"
(0015)
(0016)
(0017) /**********************************************************************
(0018) functionName: BYTE resetDS18B20(void)
(0019) description :DS18B20初始化
(0020) **********************************************************************/
(0021) unsigned char resetDS18B20(void)
(0022) {
(0023) unsigned char errTime=0;
01C2 2744 CLR R20
(0024) RLS_DS18B20; //释放总线
01C3 988E CBI 0x11,6
(0025) _NOP();
01C4 0000 NOP
(0026) HLD_DS18B20; //Maga16控制总线
01C5 9A8E SBI 0x11,6
(0027) CLR_DS18B20; //强制拉低
01C6 9896 CBI 0x12,6
(0028) delayUs(255); //209.42us
01C7 EF0F LDI R16,0xFF
01C8 940E0190 CALL _delayUs
(0029) delayUs(255); //209.42us
01CA EF0F LDI R16,0xFF
01CB 940E0190 CALL _delayUs
(0030) delayUs(255); //83.28us
01CD EF0F LDI R16,0xFF
01CE 940E0190 CALL _delayUs
(0031) //以上的三个延时大于480us
(0032) RLS_DS18B20; //释放总线,总线自动上拉
01D0 988E CBI 0x11,6
(0033) _NOP();
01D1 0000 NOP
01D2 C009 RJMP 0x01DC
(0034) while(STU_DS18B20)
(0035) {
(0036) delayUs(4); //5.15us
01D3 E004 LDI R16,4
01D4 940E0190 CALL _delayUs
(0037) errTime++;
01D6 9543 INC R20
(0038) if(errTime>20)
01D7 E184 LDI R24,0x14
01D8 1784 CP R24,R20
01D9 F410 BCC 0x01DC
(0039) return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
01DA 2700 CLR R16
01DB C010 RJMP 0x01EC
01DC 9986 SBIC 0x10,6
01DD CFF5 RJMP 0x01D3
(0040) }
(0041) errTime=0;
01DE 2744 CLR R20
01DF C009 RJMP 0x01E9
(0042) while(!(STU_DS18B20))
(0043) {
(0044) delayUs(4); //5.15us
01E0 E004 LDI R16,4
01E1 940E0190 CALL _delayUs
(0045) errTime++;
01E3 9543 INC R20
(0046) if(errTime>50)
01E4 E382 LDI R24,0x32
01E5 1784 CP R24,R20
01E6 F410 BCC 0x01E9
(0047) return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
01E7 2700 CLR R16
01E8 C003 RJMP 0x01EC
01E9 9B86 SBIS 0x10,6
01EA CFF5 RJMP 0x01E0
(0048) }
(0049) return(0xff);
01EB EF0F LDI R16,0xFF
01EC 940E0308 CALL pop_gset1
01EE 9508 RET
_readByteDS18B20:
retVal --> R20
i --> R22
01EF 940E0303 CALL push_gset2
(0050) }
(0051)
(0052)
(0053) /**********************************************************************
(0054) functionName: BYTE readByteDS18B20(void)
(0055) description :读DS18B20一个字节
(0056) **********************************************************************/
(0057) unsigned char readByteDS18B20(void)
(0058) {
(0059) unsigned char i;
(0060) unsigned char retVal=0;
01F1 2744 CLR R20
(0061) RLS_DS18B20; //释放总线
01F2 988E CBI 0x11,6
(0062) for(i=8;i>0;i--)
01F3 E068 LDI R22,0x8
01F4 C01D RJMP 0x0212
(0063) {
(0064) retVal>>=1;
01F5 9546 LSR R20
(0065) HLD_DS18B20; //Maga16控制总线
01F6 9A8E SBI 0x11,6
(0066) CLR_DS18B20; //强制拉低
01F7 9896 CBI 0x12,6
(0067) NOP();
01F8 0000 NOP
(0068) NOP();
01F9 0000 NOP
(0069) NOP();
01FA 0000 NOP
(0070) NOP();
01FB 0000 NOP
(0071) NOP();
01FC 0000 NOP
(0072) NOP();
01FD 0000 NOP
(0073) NOP();
01FE 0000 NOP
(0074) NOP(); //延时大于1us
01FF 0000 NOP
(0075) RLS_DS18B20; //释放总线,DS18B20会将总线强制拉低
0200 988E CBI 0x11,6
(0076) NOP();
0201 0000 NOP
(0077) NOP();
0202 0000 NOP
(0078) NOP();
0203 0000 NOP
(0079) if(STU_DS18B20)
0204 9B86 SBIS 0x10,6
0205 C001 RJMP 0x0207
(0080) retVal|=0x80;
0206 6840 ORI R20,0x80
(0081) delayUs(16); //14.92us
0207 E100 LDI R16,0x10
0208 940E0190 CALL _delayUs
(0082) delayUs(16); //14.92us
020A E100 LDI R16,0x10
020B 940E0190 CALL _delayUs
(0083) RLS_DS18B20; //释放总线
020D 988E CBI 0x11,6
(0084) delayUs(35); //30.38us
020E E203 LDI R16,0x23
020F 940E0190 CALL _delayUs
0211 956A DEC R22
0212 2422 CLR R2
0213 1626 CP R2,R22
0214 F300 BCS 0x01F5
(0085) }
(0086) delayUs(1); //2.71us(大于1us就行了)
0215 E001 LDI R16,1
0216 940E0190 CALL _delayUs
(0087) return(retVal);
0218 2F04 MOV R16,R20
0219 940E02F4 CALL pop_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -