📄 1302-162.lst
字号:
00E9 D104 RCALL _init_lcd
(0045) init_time();
00EA DFD3 RCALL _init_time
00EB C098 RJMP 0x0184
(0046) while(1)
(0047) {
(0048) LCD_set_xy(0,0);
00EC 2722 CLR R18
00ED 2700 CLR R16
00EE D0D1 RCALL _LCD_set_xy
(0049) for(i=0;i<9;i+=2)
00EF 2400 CLR R0
00F0 820A STD Y+2,R0
00F1 C018 RJMP 0x010A
(0050) {
(0051) s=read_data(0x89-i);
00F2 802A LDD R2,Y+2
00F3 2433 CLR R3
00F4 E809 LDI R16,0x89
00F5 1902 SUB R16,R2
00F6 0913 SBC R17,R3
00F7 DF7D RCALL _read_data
00F8 2F60 MOV R22,R16
(0052) tl=s&0x0f;
00F9 2F46 MOV R20,R22
00FA 704F ANDI R20,0xF
(0053) th=(s>>4);
00FB 2F86 MOV R24,R22
00FC 9582 SWAP R24
00FD 708F ANDI R24,0xF
00FE 2EC8 MOV R12,R24
(0054) LCD_write_char(th+48);
00FF 2F08 MOV R16,R24
0100 5D00 SUBI R16,0xD0
0101 D0CE RCALL _LCD_write_char
(0055) LCD_write_char(tl+48);
0102 2F04 MOV R16,R20
0103 5D00 SUBI R16,0xD0
0104 D0CB RCALL _LCD_write_char
(0056) LCD_write_char(':');
0105 E30A LDI R16,0x3A
0106 D0C9 RCALL _LCD_write_char
0107 818A LDD R24,Y+2
0108 5F8E SUBI R24,0xFE
0109 838A STD Y+2,R24
010A 818A LDD R24,Y+2
010B 3089 CPI R24,0x9
010C F328 BCS 0x00F2
(0057) }
(0058) s=read_data(0x8b);
010D E80B LDI R16,0x8B
010E DF66 RCALL _read_data
010F 2F60 MOV R22,R16
(0059) tl=s&0x0f;
0110 2F46 MOV R20,R22
0111 704F ANDI R20,0xF
(0060) LCD_write_char(tl+48);
0112 2F04 MOV R16,R20
0113 5D00 SUBI R16,0xD0
0114 D0BB RCALL _LCD_write_char
(0061)
(0062) a=init_1820(); //复位18b20
0115 D0F8 RCALL _init_1820
0116 2EA0 MOV R10,R16
(0063) if(a==0x01)
0117 3001 CPI R16,1
0118 F441 BNE 0x0121
(0064) {
(0065) LCD_write_string(0,1,"wrong"); //初始化失败
0119 E68D LDI R24,0x6D
011A E090 LDI R25,0
011B 8399 STD Y+1,R25
011C 8388 STD Y+0,R24
011D E021 LDI R18,1
011E 2700 CLR R16
011F D0B8 RCALL _LCD_write_string
(0066) }
0120 C007 RJMP 0x0128
(0067) else
(0068) {
(0069) LCD_write_string(0,1,"temper is");//初始化成功
0121 E683 LDI R24,0x63
0122 E090 LDI R25,0
0123 8399 STD Y+1,R25
0124 8388 STD Y+0,R24
0125 E021 LDI R18,1
0126 2700 CLR R16
0127 D0B0 RCALL _LCD_write_string
(0070) }
(0071) write_1820(0xCC); // SKIP THE ROM
0128 EC0C LDI R16,0xCC
0129 D0F8 RCALL _write_1820
(0072) write_1820(0x44); //启动温度转换
012A E404 LDI R16,0x44
012B D0F6 RCALL _write_1820
(0073) for(i=0;i<200;i++) //每次转换需要延时200ms以上
012C 2400 CLR R0
012D 820A STD Y+2,R0
012E C005 RJMP 0x0134
(0074) delay(200);
012F EC08 LDI R16,0xC8
0130 DF06 RCALL _delay
0131 800A LDD R0,Y+2
0132 9403 INC R0
0133 820A STD Y+2,R0
0134 818A LDD R24,Y+2
0135 3C88 CPI R24,0xC8
0136 F3C0 BCS 0x012F
(0075) a=init_1820(); //复位18b20
0137 D0D6 RCALL _init_1820
0138 2EA0 MOV R10,R16
(0076) write_1820(0xCC); //SKIP THE ROM
0139 EC0C LDI R16,0xCC
013A D0E7 RCALL _write_1820
(0077) write_1820(0xBE); //读寄存器命令
013B EB0E LDI R16,0xBE
013C D0E5 RCALL _write_1820
(0078) teml=read_1820(); //读低字节数据
013D D107 RCALL _read_1820
013E 2EE0 MOV R14,R16
(0079) temh=read_1820(); //读高字节数据
013F D105 RCALL _read_1820
0140 2EC0 MOV R12,R16
(0080) temm=teml;
0141 2D4E MOV R20,R14
(0081) temm&=0x0F;
0142 704F ANDI R20,0xF
(0082) teml>>=4;
0143 2D8E MOV R24,R14
0144 9582 SWAP R24
0145 708F ANDI R24,0xF
0146 2EE8 MOV R14,R24
(0083) temh<<=4;
0147 2D8C MOV R24,R12
0148 708F ANDI R24,0xF
0149 9582 SWAP R24
014A 2EC8 MOV R12,R24
(0084) count=teml|temh;
014B 2D6E MOV R22,R14
014C 2B68 OR R22,R24
(0085) temh_d=count/10;
014D E01A LDI R17,0xA
014E 2F06 MOV R16,R22
014F D158 RCALL div8u
0150 93000075 STS temh_d,R16
(0086) temm_d=(temm*6)/10;
0152 2F24 MOV R18,R20
0153 2733 CLR R19
0154 E006 LDI R16,6
0155 E010 LDI R17,0
0156 D190 RCALL mpy16s
0157 E02A LDI R18,0xA
0158 E030 LDI R19,0
0159 D117 RCALL div16s
015A 93000073 STS temm_d,R16
(0087) teml_d=count%10;
015C E01A LDI R17,0xA
015D 2F06 MOV R16,R22
015E D147 RCALL mod8u
015F 93000074 STS teml_d,R16
(0088) delay(200);
0161 EC08 LDI R16,0xC8
0162 DED4 RCALL _delay
(0089) LCD_set_xy(10,1);
0163 E021 LDI R18,1
0164 E00A LDI R16,0xA
0165 D05A RCALL _LCD_set_xy
(0090) LCD_write_char(temh_d+48);
0166 91000075 LDS R16,temh_d
0168 5D00 SUBI R16,0xD0
0169 D066 RCALL _LCD_write_char
(0091) LCD_set_xy(11,1);
016A E021 LDI R18,1
016B E00B LDI R16,0xB
016C D053 RCALL _LCD_set_xy
(0092) LCD_write_char(teml_d+48);
016D 91000074 LDS R16,teml_d
016F 5D00 SUBI R16,0xD0
0170 D05F RCALL _LCD_write_char
(0093) LCD_set_xy(12,1);
0171 E021 LDI R18,1
0172 E00C LDI R16,0xC
0173 D04C RCALL _LCD_set_xy
(0094) LCD_write_char('.');
0174 E20E LDI R16,0x2E
0175 D05A RCALL _LCD_write_char
(0095) LCD_set_xy(13,1);
0176 E021 LDI R18,1
0177 E00D LDI R16,0xD
0178 D047 RCALL _LCD_set_xy
(0096) LCD_write_char(temm_d+48);
0179 91000073 LDS R16,temm_d
017B 5D00 SUBI R16,0xD0
017C D053 RCALL _LCD_write_char
(0097) LCD_write_string(14,1,"`c");
017D E680 LDI R24,0x60
017E E090 LDI R25,0
017F 8399 STD Y+1,R25
0180 8388 STD Y+0,R24
0181 E021 LDI R18,1
0182 E00E LDI R16,0xE
0183 D054 RCALL _LCD_write_string
0184 CF67 RJMP 0x00EC
0185 9623 ADIW R28,3
0186 9508 RET
_delay_ms:
a --> R20
b --> R22
n --> R16
0187 D140 RCALL push_gset2
FILE: D:\时钟芯片\1302\1302-162\162.c
(0001) #include <io8515v.h>
(0002) #include <macros.h>
(0003) #include <162-1302.h>
(0004) void delay_ms(unsigned char n)
(0005) {
(0006) unsigned char a, b;
(0007) for (a = 1; a<n; a++)
0188 E041 LDI R20,1
0189 C006 RJMP 0x0190
(0008) for (b = 1; b; b++)
018A E061 LDI R22,1
018B C001 RJMP 0x018D
018C 9563 INC R22
018D 2366 TST R22
018E F7E9 BNE 0x018C
018F 9543 INC R20
0190 1740 CP R20,R16
0191 F3C0 BCS 0x018A
0192 D12B RCALL pop_gset2
0193 9508 RET
_delay_us:
b --> R20
n --> R16
0194 D135 RCALL push_gset1
(0009) ;
(0010) }
(0011) void delay_us(unsigned int n)
(0012) {
(0013) unsigned char b;
(0014) for (b = 1; b<n; b++)
0195 E041 LDI R20,1
0196 C001 RJMP 0x0198
0197 9543 INC R20
0198 2E24 MOV R2,R20
0199 2433 CLR R3
019A 1620 CP R2,R16
019B 0631 CPC R3,R17
019C F3D0 BCS 0x0197
019D D12F RCALL pop_gset1
019E 9508 RET
(0015) ;
(0016) }
(0017)
(0018) void LCD_wait(void) //等待LCD空闲
(0019) {
(0020) LCD_DATA_PORT&=~BIT(7);
_LCD_wait:
019F 98DF CBI 0x1B,7
(0021) PORTB&=~BIT(0);
01A0 98C0 CBI 0x18,0
(0022) PORTB|=BIT(1);
01A1 9AC1 SBI 0x18,1
(0023) PORTB|=BIT(2);
01A2 9AC2 SBI 0x18,2
(0024) while(!(LCD_DATA_PIN &0x80)==0);
01A3 B389 IN R24,0x19
01A4 7880 ANDI R24,0x80
01A5 F419 BNE 0x01A9
01A6 E001 LDI R16,1
01A7 E010 LDI R17,0
01A8 C002 RJMP 0x01AB
01A9 2700 CLR R16
01AA 2711 CLR R17
01AB 3000 CPI R16,0
01AC 0701 CPC R16,R17
01AD F3A9 BEQ 0x01A3
(0025) LCD_DATA_DDR|=0xFF;
01AE B38A IN R24,0x1A
01AF 6F8F ORI R24,0xFF
01B0 BB8A OUT 0x1A,R24
(0026) PORTB&=~BIT(2);
01B1 98C2 CBI 0x18,2
01B2 9508 RET
(0027) }
(0028)
(0029) void command_enable() //写指令使能
(0030) {
(0031) PORTB&=~(BIT(0)|BIT(1));
_command_enable:
01B3 B388 IN R24,0x18
01B4 7F8C ANDI R24,0xFC
01B5 BB88 OUT 0x18,R24
(0032) PORTB|=BIT(2);
01B6 9AC2 SBI 0x18,2
(0033) asm("nop");
01B7 0000 NOP
(0034) PORTB&=~BIT(2);
01B8 98C2 CBI 0x18,2
01B9 9508 RET
(0035) }
(0036) void data_enable() //写数据使能
(0037) {
(0038) PORTB|=BIT(0);
_data_enable:
01BA 9AC0 SBI 0x18,0
(0039) PORTB&=~BIT(1);
01BB 98C1 CBI 0x18,1
(0040) PORTB|=BIT(2);
01BC 9AC2 SBI 0x18,2
(0041) asm("nop");
01BD 0000 NOP
(0042) PORTB&=~BIT(2);
01BE 98C2 CBI 0x18,2
01BF 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
01C0 D107 RCALL push_gset2
01C1 2F42 MOV R20,R18
01C2 2F60 MOV R22,R16
(0043) }
(0044)
(0045) /*设置LCD显示的起始位置输入参数:x、y
(0046) 显示字符串的位置,X:0-15,Y:0-1
(0047) LCD第一行显示寄存器地址:0X80-0X8F
(0048) LCD第一行显示寄存器地址:0XC0-0XCF*/
(0049) void LCD_set_xy( unsigned char x, unsigned char y )
(0050) {
(0051) unsigned char address;
(0052) if (y==0)
01C3 2344 TST R20
01C4 F419 BNE 0x01C8
(0053) address=0x80+x;
01C5 2F46 MOV R20,R22
01C6 5840 SUBI R20,0x80
01C7 C002 RJMP 0x01CA
(0054) else
(0055) address=0xC0+x;
01C8 2F46 MOV R20,R22
01C9 5440 SUBI R20,0x40
(0056) LCD_DATA_PORT=address; //输入开始显示地址
01CA BB4B OUT 0x1B,R20
(0057) command_enable();
01CB DFE7 RCALL _command_enable
(0058) delay_ms(10);
01CC E00A LDI R16,0xA
01CD DFB9 RCALL _delay_ms
01CE D0EF RCALL pop_gset2
01CF 9508 RET
_LCD_write_char:
data --> R20
01D0 D0F9 RCALL push_gset1
01D1 2F40 MOV R20,R16
(0059) }
(0060) //写一个字符
(0061) void LCD_write_char(unsigned char data)
(0062) {
(0063) LCD_DATA_PORT=data;
01D2 BB4B OUT 0x1B,R20
(0064) data_enable();
01D3 DFE6 RCALL _data_enable
(0065) delay_ms(10);
01D4 E00A LDI R16,0xA
01D5 DFB1 RCALL _delay_ms
01D6 D0F6 RCALL pop_gset1
01D7 9508 RET
_LCD_write_string:
s --> R20
y --> R10
x --> R22
01D8 D0ED RCALL push_gset3
01D9 2EA2 MOV R10,R18
01DA 2F60 MOV R22,R16
01DB 814E LDD R20,Y+6
01DC 815F LDD R21,Y+7
(0066) }
(0067) //写一字符串
(0068) void LCD_write_string(unsigned char x, unsigned char y,unsigned char *s)
(0069) {
(0070) LCD_set_xy(x,y);
01DD 2D2A MOV R18,R10
01DE 2F06 MOV R16,R22
01DF DFE0 RCALL _LCD_set_xy
01E0 C006 RJMP 0x01E7
(0071) while(*s)
(0072) {
(0073) LCD_write_char(*s);
01E1 2FE4 MOV R30,R20
01E2 2FF5 MOV R31,R21
01E3 8100 LDD R16,Z+0
01E4 DFEB RCALL _LCD_write_char
(0074) s++;
01E5 5F4F SUBI R20,0xFF
01E6 4F5F SBCI R21,0xFF
01E7 2FE4 MOV R30,R20
01E8 2FF5 MOV R31,R21
01E9 8020 LDD R2,Z+0
01EA 2022 TST R2
01EB F7A9 BNE 0x01E1
01EC D0D3 RCALL pop_gset3
01ED 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -