📄 ds18b20_lcd.lst
字号:
__start:
__text_start:
004A E5CF LDI R28,0x5F
004B E0D4 LDI R29,4
004C BFCD OUT 0x3D,R28
004D BFDE OUT 0x3E,R29
004E 51C0 SUBI R28,0x10
004F 40D0 SBCI R29,0
0050 EA0A LDI R16,0xAA
0051 8308 STD Y+0,R16
0052 2400 CLR R0
0053 ECE0 LDI R30,0xC0
0054 E0F0 LDI R31,0
0055 E010 LDI R17,0
0056 3CE5 CPI R30,0xC5
0057 07F1 CPC R31,R17
0058 F011 BEQ 0x005B
0059 9201 ST R0,Z+
005A CFFB RJMP 0x0056
005B 8300 STD Z+0,R16
005C E3E4 LDI R30,0x34
005D E0F0 LDI R31,0
005E E6A0 LDI R26,0x60
005F E0B0 LDI R27,0
0060 E010 LDI R17,0
0061 39E4 CPI R30,0x94
0062 07F1 CPC R31,R17
0063 F021 BEQ 0x0068
0064 95C8 LPM
0065 9631 ADIW R30,1
0066 920D ST R0,X+
0067 CFF9 RJMP 0x0061
0068 D194 RCALL _main
_exit:
0069 CFFF RJMP _exit
_process:
p --> R10
i --> Y+6
006A D1B1 RCALL push_arg4
006B D22D RCALL push_gset3
006C 84AA LDD R10,Y+10
006D 84BB LDD R11,Y+11
FILE: E:\CRAZY\调试AVR_C\电升06~1\DS18B20.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003)
(0004) #define LCM_Data PORTB
(0005) #define Busy 0x80
(0006)
(0007) #define Set_DQ1 DDRC |= 0x08; PORTC |= 0x08; //总线拉高
(0008) #define Set_DQ0 DDRC |= 0x08; PORTC &= 0xf7; //总线置低
(0009) #define Read_DQ PINC&0x08 //读总线
(0010) #define MatchROM 0xcc //匹配ROM
(0011) #define WriteMode 0x4e //写模式
(0012) #define TH 0x64 //设置温度上限100
(0013) #define TL 0x8a //设置温度下限-10
(0014) #define MatchTemp 0x7f //写温度匹配寄存器,12bit
(0015) #define ConverTem 0x44 //DS18B20温度转换命令
(0016) #define Get_Value 0xbe //读取温度寄存器值
(0017) uchar data[5];
(0018)
(0019) void process(long int i,uchar*p)
(0020) {
(0021) p[0]=i/1000;
006E EE48 LDI R20,0xE8
006F E053 LDI R21,3
0070 D384 RCALL 0x03F5
0071 D1B2 RCALL div32s
0072 01F5 MOVW R30,R10
0073 8300 STD Z+0,R16
(0022) i=i%1000;
0074 EE48 LDI R20,0xE8
0075 E053 LDI R21,3
0076 D37E RCALL 0x03F5
0077 D1AE RCALL mod32s
0078 D399 RCALL 0x0412
(0023) p[1]=i/100;
0079 E644 LDI R20,0x64
007A E050 LDI R21,0
007B D379 RCALL 0x03F5
007C D1A7 RCALL div32s
007D 01F5 MOVW R30,R10
007E 8301 STD Z+1,R16
(0024) i=i%100;
007F E644 LDI R20,0x64
0080 E050 LDI R21,0
0081 D373 RCALL 0x03F5
0082 D1A3 RCALL mod32s
0083 D38E RCALL 0x0412
(0025) p[2]=i/10;
0084 E04A LDI R20,0xA
0085 E050 LDI R21,0
0086 D36E RCALL 0x03F5
0087 D19C RCALL div32s
0088 01F5 MOVW R30,R10
0089 8302 STD Z+2,R16
(0026) i=i%10;
008A E04A LDI R20,0xA
008B E050 LDI R21,0
008C D368 RCALL 0x03F5
008D D198 RCALL mod32s
008E D383 RCALL 0x0412
(0027) p[3]=i;
008F 01FE MOVW R30,R28
0090 8026 LDD R2,Z+6
0091 8037 LDD R3,Z+7
0092 01F5 MOVW R30,R10
0093 8223 STD Z+3,R2
(0028) for(i=0;i<4;i++)
0094 E040 LDI R20,0
0095 E050 LDI R21,0
0096 E060 LDI R22,0
0097 E070 LDI R23,0
0098 01FE MOVW R30,R28
0099 8346 STD Z+6,R20
009A 8357 STD Z+7,R21
009B 8760 STD Z+8,R22
009C 8771 STD Z+9,R23
(0029) p[i]+=0x30;
009D 01FE MOVW R30,R28
009E 8026 LDD R2,Z+6
009F 8037 LDD R3,Z+7
00A0 0C2A ADD R2,R10
00A1 1C3B ADC R3,R11
00A2 01F1 MOVW R30,R2
00A3 8180 LDD R24,Z+0
00A4 5D80 SUBI R24,0xD0
00A5 8380 STD Z+0,R24
00A6 E041 LDI R20,1
00A7 E050 LDI R21,0
00A8 D35A RCALL 0x0403
00A9 0E24 ADD R2,R20
00AA 1E35 ADC R3,R21
00AB 1E46 ADC R4,R22
00AC 1E57 ADC R5,R23
00AD 01FE MOVW R30,R28
00AE 8226 STD Z+6,R2
00AF 8237 STD Z+7,R3
00B0 8640 STD Z+8,R4
00B1 8651 STD Z+9,R5
00B2 E044 LDI R20,4
00B3 E050 LDI R21,0
00B4 D34E RCALL 0x0403
00B5 1624 CP R2,R20
00B6 0635 CPC R3,R21
00B7 0646 CPC R4,R22
00B8 0657 CPC R5,R23
00B9 F40C BGE 0x00BB
00BA CFE2 RJMP 0x009D
(0030) p[4]='$';
00BB E284 LDI R24,0x24
00BC 01F5 MOVW R30,R10
00BD 8384 STD Z+4,R24
00BE D1D2 RCALL pop_gset3
00BF 9624 ADIW R28,4
00C0 9508 RET
_delayms:
j --> R20
i --> R16
00C1 D1DB RCALL push_gset1
(0031) }
(0032)
(0033)
(0034) void delayms(uint i)
(0035) {
(0036) uint j;
(0037) for(;i!=0;i--)
00C2 C00B RJMP 0x00CE
(0038) for(j=0;j<8000;j++)
00C3 2744 CLR R20
00C4 2755 CLR R21
00C5 C002 RJMP 0x00C8
00C6 5F4F SUBI R20,0xFF
00C7 4F5F SBCI R21,0xFF
00C8 3440 CPI R20,0x40
00C9 E1EF LDI R30,0x1F
00CA 075E CPC R21,R30
00CB F3D0 BCS 0x00C6
00CC 5001 SUBI R16,1
00CD 4010 SBCI R17,0
00CE 3000 CPI R16,0
00CF 0701 CPC R16,R17
00D0 F791 BNE 0x00C3
00D1 D1CE RCALL pop_gset1
00D2 9508 RET
(0039) ;
(0040) }
(0041)
(0042) void delayus(uint i)
(0043) {
(0044) for(;i!=0;i--)
_delayus:
i --> R16
00D3 C002 RJMP 0x00D6
00D4 5001 SUBI R16,1
00D5 4010 SBCI R17,0
00D6 3000 CPI R16,0
00D7 0701 CPC R16,R17
00D8 F7D9 BNE 0x00D4
00D9 9508 RET
(0045) ;
(0046) }
(0047)
(0048)
(0049)
(0050)
(0051) void port_init(void)
(0052) {
(0053) DDRD = 0xfe;
_port_init:
00DA EF8E LDI R24,0xFE
00DB BB81 OUT 0x11,R24
(0054) PORTD = 0xff;
00DC EF8F LDI R24,0xFF
00DD BB82 OUT 0x12,R24
(0055) DDRB = 0xff;
00DE BB87 OUT 0x17,R24
(0056) PORTB = 0xff;
00DF BB88 OUT 0x18,R24
(0057) DDRC = 0xff;
00E0 BB84 OUT 0x14,R24
(0058) PORTC = 0xff;
00E1 BB85 OUT 0x15,R24
00E2 9508 RET
_WriteDataLCM:
WDLCM --> R20
00E3 D1B9 RCALL push_gset1
00E4 2F40 MOV R20,R16
(0059) }
(0060)
(0061)
(0062) /**********************************************************/
(0063) //写数据
(0064) void WriteDataLCM(unsigned char WDLCM)
(0065) {
(0066) //ReadStatusLCM(); //检测忙
(0067) LCM_Data = WDLCM;
00E5 BB48 OUT 0x18,R20
(0068) //PORTC=0B00000100;
(0069) //PORTC=0B00000100;
(0070) delayms(1);
00E6 E001 LDI R16,1
00E7 E010 LDI R17,0
00E8 DFD8 RCALL _delayms
(0071) PORTC=0B00000101;
00E9 E085 LDI R24,5
00EA BB85 OUT 0x15,R24
(0072) PORTC=0B00000100;
00EB E084 LDI R24,4
00EC BB85 OUT 0x15,R24
00ED D1B2 RCALL pop_gset1
00EE 9508 RET
_WriteCommandLCM:
BuysC --> R22
WCLCM --> R20
00EF D1AB RCALL push_gset2
00F0 2F62 MOV R22,R18
00F1 2F40 MOV R20,R16
(0073) }
(0074)
(0075) //写指令
(0076) void WriteCommandLCM(unsigned char WCLCM,unsigned char BuysC) //BuysC为0时忽略忙检测
(0077)
(0078) {
(0079) if (BuysC)
00F2 2366 TST R22
00F3 F001 BEQ 0x00F4
(0080) ;//ReadStatusLCM(); //根据需要检测忙
(0081) LCM_Data = WCLCM;
00F4 BB48 OUT 0x18,R20
(0082) delayms(1);
00F5 E001 LDI R16,1
00F6 E010 LDI R17,0
00F7 DFC9 RCALL _delayms
(0083) PORTC=0B00000001;
00F8 E081 LDI R24,1
00F9 BB85 OUT 0x15,R24
(0084) delayms(1);
00FA E001 LDI R16,1
00FB E010 LDI R17,0
00FC DFC4 RCALL _delayms
(0085) PORTC=0B00000000;
00FD 2422 CLR R2
00FE BA25 OUT 0x15,R2
00FF D18F RCALL pop_gset2
0100 9508 RET
(0086) }
(0087)
(0088) //读数据
(0089) unsigned char ReadDataLCM(void)
(0090) {
(0091) PORTC=0X00000111;
_ReadDataLCM:
0101 E181 LDI R24,0x11
0102 E091 LDI R25,1
0103 BB85 OUT 0x15,R24
(0092) return(LCM_Data);
0104 B308 IN R16,0x18
0105 9508 RET
(0093) }
(0094)
(0095) //读状态
(0096)
(0097)
(0098) void LCMInit(void) //LCM初始化
(0099) {
(0100) /* LCM_Data = 0;
(0101) WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
(0102) delayms(5);
(0103) WriteCommandLCM(0x38,0);
(0104) delayms(5);
(0105) WriteCommandLCM(0x38,0);
(0106) delayms(5);
(0107) */
(0108) WriteCommandLCM(0x38,0); //显示模式设置,开始要求每次检测忙信号
_LCMInit:
0106 2722 CLR R18
0107 E308 LDI R16,0x38
0108 DFE6 RCALL _WriteCommandLCM
(0109) //WriteCommandLCM(0x08,0); //关闭显示
(0110) WriteCommandLCM(0x01,0); //显示清屏
0109 2722 CLR R18
010A E001 LDI R16,1
010B DFE3 RCALL _WriteCommandLCM
(0111) WriteCommandLCM(0x06,0); // 显示光标移动设置
010C 2722 CLR R18
010D E006 LDI R16,6
010E DFE0 RCALL _WriteCommandLCM
(0112) WriteCommandLCM(0x0c,0); // 显示开及光标设置
010F 2722 CLR R18
0110 E00C LDI R16,0xC
0111 DFDD RCALL _WriteCommandLCM
0112 9508 RET
_DisplayOneChar:
DData --> Y+4
Y --> R22
X --> R20
0113 D187 RCALL push_gset2
0114 2F62 MOV R22,R18
0115 2F40 MOV R20,R16
(0113) }
(0114)
(0115) /*****************************************************************************/
(0116)
(0117)
(0118) //按指定位置显示一个字符
(0119) void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
(0120) {
(0121) Y &= 0x1;
0116 7061 ANDI R22,1
(0122) X &= 0xF; //限制X不能大于15,Y不能大于1
0117 704F ANDI R20,0xF
(0123) if (Y) X += 0x40; //当要显示第二行时地址码+0x40;
0118 2366 TST R22
0119 F009 BEQ 0x011B
011A 5C40 SUBI R20,0xC0
(0124) X += 0x80; // 算出指令码
011B 5840 SUBI R20,0x80
(0125) WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
011C 2722 CLR R18
011D 2F04 MOV R16,R20
011E DFD0 RCALL _WriteCommandLCM
(0126) WriteDataLCM(DData);
011F 810C LDD R16,Y+4
0120 DFC2 RCALL _WriteDataLCM
0121 D16D RCALL pop_gset2
0122 9508 RET
_DisplayListChar:
ListLength --> R20
DData --> R22
Y --> R10
X --> R12
0123 D173 RCALL push_gset4
0124 2EA2 MOV R10,R18
0125 2EC0 MOV R12,R16
0126 9721 SBIW R28,1
0127 8569 LDD R22,Y+9
0128 857A LDD R23,Y+10
(0127) }
(0128)
(0129) //按指定位置显示一串字符
(0130) void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
(0131) {
(0132) unsigned char ListLength;
(0133)
(0134) ListLength = 0;
0129 2744 CLR R20
(0135) Y &= 0x1;
012A 2D8A MOV R24,R10
012B 7081 ANDI R24,1
012C 2EA8 MOV R10,R24
(0136) X &= 0xF; //限制X不能大于15,Y不能大于1
012D 2D8C MOV R24,R12
012E 708F ANDI R24,0xF
012F 2EC8 MOV R12,R24
0130 C00B RJMP 0x013C
(0137) while (DData[ListLength]!= '$') //若到达字串尾则退出
(0138) {
(0139) if (X <= 0xF) //X坐标应小于0xF
0131 E08F LDI R24,0xF
0132 158C CP R24,R12
0133 F040 BCS 0x013C
0134 D300 RCALL 0x0435
(0140) {
(0141) DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
0135 8020 LDD R2,Z+0
0136 8228 STD Y+0,R2
0137 2D2A MOV R18,R10
0138 2D0C MOV R16,R12
0139 DFD9 RCALL _DisplayOneChar
(0142) ListLength++;
013A 9543 INC R20
(0143) X++;
013B 94C3 INC R12
013C D2F8 RCALL 0x0435
013D 8180 LDD R24,Z+0
013E 3284 CPI R24,0x24
013F F789 BNE 0x0131
0140 9621 ADIW R28,1
0141 D151 RCALL pop_gset4
0142 9508 RET
(0144) }
(0145) }
(0146) }
(0147)
(0148) /**********************************************************/
(0149)
(0150)
(0151) /***************************************************************
(0152) * 功能:主机向总线写0 *
(0153) ***************************************************************/
(0154) void Writr0(void)
(0155) {
(0156) Set_DQ1;
_Writr0:
0143 D2C7 RCALL 0x040B
(0157) Set_DQ0;
(0158) delayus(700);
0144 EB0C LDI R16,0xBC
0145 E012 LDI R17,2
0146 DF8C RCALL _delayus
(0159)
(0160) Set_DQ1;
0147 9AA3 SBI 0x14,3
0148 9AAB SBI 0x15,3
(0161) asm("nop");
0149 0000 NOP
(0162) delayus(15);
014A E00F LDI R16,0xF
014B E010 LDI R17,0
014C DF86 RCALL _delayus
014D 9508 RET
(0163) }
(0164)
(0165) /***************************************************************
(0166) * 功能:主机向总线写1 *
(0167) ***************************************************************/
(0168) void Writr1(void)
(0169) {
(0170) Set_DQ1;
_Writr1:
014E D2BC RCALL 0x040B
014F D29C RCALL <created procedures>
(0171) Set_DQ0;
(0172) asm("nop");
(0173) asm("nop");
(0174) asm("nop");
(0175) asm("nop");
(0176) asm("nop");
(0177) asm("nop");
(0178) asm("nop");
(0179) asm("nop");
(0180) asm("nop");
0150 0000 NOP
0151 D29A RCALL <created procedures>
(0181) asm("nop");
(0182) asm("nop");
(0183) asm("nop");
(0184) asm("nop");
(0185) asm("nop");
(0186) asm("nop");
(0187) asm("nop");
(0188) asm("nop");
(0189)
(0190) Set_DQ1;
0152 9AA3 SBI 0x14,3
0153 9AAB SBI 0x15,3
(0191) delayus(30);
0154 E10E LDI R16,0x1E
0155 E010 LDI R17,0
0156 DF7C RCALL _delayus
0157 9508 RET
_WriteBits:
i --> R20
Byte --> R22
0158 D142 RCALL push_gset2
0159 2F60 MOV R22,R16
(0192)
(0193) }
(0194)
(0195) /***************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -