📄 bi2.lst
字号:
(0422)
(0423)
(0424)
(0425)
(0426)
(0427)
(0428)
(0429)
(0430)
(0431)
(0432) void LCD_write_ch(unsigned char X,unsigned char Y,unsigned char z,unsigned int s)
(0433) {unsigned char k;
(0434) unsigned char p[6]="0";
0245 EA88 LDI R24,0xA8
0246 E090 LDI R25,0
0247 01FE MOVW R30,R28
0248 E006 LDI R16,6
0249 E010 LDI R17,0
024A 93FA ST R31,-Y
024B 93EA ST R30,-Y
024C 939A ST R25,-Y
024D 938A ST R24,-Y
024E 940E0774 CALL asgncblk
(0435) unsigned char i=0;
0250 2744 CLR R20
(0436) //写地址
(0437) LCD_set_xy( X, Y );
0251 2D2E MOV R18,R14
0252 2D0C MOV R16,R12
0253 D056 RCALL _LCD_set_xy
(0438) for(i=0;i<z;i++)
0254 C012 RJMP 0x0267
(0439) {
(0440) p[i]=s%10;
0255 E02A LDI R18,0xA
0256 E030 LDI R19,0
0257 018B MOVW R16,R22
0258 940E06E7 CALL mod16u
025A 01CE MOVW R24,R28
025B 2FE4 MOV R30,R20
025C 27FF CLR R31
025D 0FE8 ADD R30,R24
025E 1FF9 ADC R31,R25
025F 8300 STD Z+0,R16
(0441) s=s/10;
0260 E02A LDI R18,0xA
0261 E030 LDI R19,0
0262 018B MOVW R16,R22
0263 940E06E9 CALL div16u
0265 01B8 MOVW R22,R16
0266 9543 INC R20
0267 154A CP R20,R10
0268 F360 BCS 0x0255
(0442)
(0443) }
(0444) i--;
0269 954A DEC R20
(0445) /*
(0446) while(!(p[i]))
(0447) {
(0448) if(i==0)
(0449) {LCD_write_char( 0, 0b00110000 );i--;}
(0450) else
(0451) {i--;LCD_write_char( 0, 0b10000000 );}
(0452)
(0453) }
(0454) */
(0455) for(;i<255;i--)
026A C00D RJMP 0x0278
(0456) {
(0457) LCD_write_char( 0, p[i]+0b00110000 );
026B 01CE MOVW R24,R28
026C 2FE4 MOV R30,R20
026D 27FF CLR R31
026E 0FE8 ADD R30,R24
026F 1FF9 ADC R31,R25
0270 8120 LDD R18,Z+0
0271 2733 CLR R19
0272 5D20 SUBI R18,0xD0
0273 4F3F SBCI R19,0xFF
0274 2700 CLR R16
0275 2711 CLR R17
0276 D04C RCALL _LCD_write_char
0277 954A DEC R20
0278 3F4F CPI R20,0xFF
0279 F388 BCS 0x026B
027A 9626 ADIW R28,6
027B 940E0724 CALL pop_gset5
027D 9508 RET
(0458) }}
(0459)
(0460)
(0461)
(0462)
(0463)
(0464) void LCD_init(void) //液晶初始化
(0465) {
(0466) delay_nms(15);
_LCD_init:
027E E00F LDI R16,0xF
027F E010 LDI R17,0
0280 DE78 RCALL _delay_nms
(0467) LCD_write_char(0x28,0); //4位显示
0281 2722 CLR R18
0282 2733 CLR R19
0283 E208 LDI R16,0x28
0284 E010 LDI R17,0
0285 D03D RCALL _LCD_write_char
(0468) LCD_write_char(0x0c,0); //显示开
0286 2722 CLR R18
0287 2733 CLR R19
0288 E00C LDI R16,0xC
0289 E010 LDI R17,0
028A D038 RCALL _LCD_write_char
(0469) LCD_write_char(0x01,0); //清屏
028B 2722 CLR R18
028C 2733 CLR R19
028D E001 LDI R16,1
028E E010 LDI R17,0
028F D033 RCALL _LCD_write_char
0290 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
0291 940E072B CALL push_gset3
0293 2EA2 MOV R10,R18
0294 2F60 MOV R22,R16
0295 814E LDD R20,Y+6
0296 815F LDD R21,Y+7
(0470) }
(0471) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0472) {
(0473) LCD_set_xy( X, Y ); //写地址
0297 2D2A MOV R18,R10
0298 2F06 MOV R16,R22
0299 D010 RCALL _LCD_set_xy
029A C008 RJMP 0x02A3
(0474)
(0475) while (*s) // 写显示字符
(0476) {
(0477) LCD_write_char( 0, *s );
029B 01FA MOVW R30,R20
029C 8120 LDD R18,Z+0
029D 2733 CLR R19
029E 2700 CLR R16
029F 2711 CLR R17
02A0 D022 RCALL _LCD_write_char
(0478) s ++;
02A1 5F4F SUBI R20,0xFF
02A2 4F5F SBCI R21,0xFF
02A3 01FA MOVW R30,R20
02A4 8020 LDD R2,Z+0
02A5 2022 TST R2
02A6 F7A1 BNE 0x029B
02A7 940E071E CALL pop_gset3
02A9 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
02AA 940E072D CALL push_gset2
02AC 2F42 MOV R20,R18
02AD 2F60 MOV R22,R16
(0479) }
(0480) }
(0481) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0482) {
(0483) unsigned char address;
(0484) if (y == 0) address = 0x80 + x;
02AE 2344 TST R20
02AF F419 BNE 0x02B3
02B0 2F46 MOV R20,R22
02B1 5840 SUBI R20,0x80
02B2 C002 RJMP 0x02B5
(0485) else
(0486) address = 0xc0 + x;
02B3 2F46 MOV R20,R22
02B4 5440 SUBI R20,0x40
(0487) LCD_write_char( address, 0 );
02B5 2722 CLR R18
02B6 2733 CLR R19
02B7 2F04 MOV R16,R20
02B8 2711 CLR R17
02B9 D009 RCALL _LCD_write_char
02BA 940E071B CALL pop_gset2
02BC 9508 RET
(0488) }
(0489) void LCD_en_write(void) //液晶使能
(0490) {
(0491) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
02BD 9A94 SBI 0x12,4
(0492) delay_nus(1);
02BE E001 LDI R16,1
02BF E010 LDI R17,0
02C0 DE1F RCALL _delay_nus
(0493) LCD_EN_PORT&=~LCD_EN;
02C1 9894 CBI 0x12,4
02C2 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
02C3 940E0729 CALL push_gset4
02C5 0169 MOVW R12,R18
02C6 0158 MOVW R10,R16
(0494) }
(0495) void LCD_write_char(unsigned command,unsigned data) // 写数据
(0496) {
(0497) unsigned command_temp,data_temp;
(0498) command_temp=command;
02C7 01A5 MOVW R20,R10
(0499) data_temp=data;
02C8 01B6 MOVW R22,R12
(0500) delay_nus(16);
02C9 E100 LDI R16,0x10
02CA E010 LDI R17,0
02CB DE14 RCALL _delay_nus
(0501) if(command==0)
02CC 3040 CPI R20,0
02CD 0745 CPC R20,R21
02CE F511 BNE 0x02F1
(0502) {
(0503) LCD_RS_PORT|=LCD_RS; //RS=1
02CF 9A96 SBI 0x12,6
(0504) LCD_DATA_PORT&=0XF0;
02D0 B382 IN R24,0x12
02D1 7F80 ANDI R24,0xF0
02D2 BB82 OUT 0x12,R24
(0505) LCD_DATA_PORT|=(data_temp>>4)&0x0F; //写高四位
02D3 01CB MOVW R24,R22
02D4 9596 LSR R25
02D5 9587 ROR R24
02D6 9596 LSR R25
02D7 9587 ROR R24
02D8 9596 LSR R25
02D9 9587 ROR R24
02DA 9596 LSR R25
02DB 9587 ROR R24
02DC 708F ANDI R24,0xF
02DD 7090 ANDI R25,0
02DE B222 IN R2,0x12
02DF 2433 CLR R3
02E0 2A28 OR R2,R24
02E1 2A39 OR R3,R25
02E2 BA22 OUT 0x12,R2
(0506) LCD_en_write();
02E3 DFD9 RCALL _LCD_en_write
(0507) //data_temp=data_temp<<4;
(0508) LCD_DATA_PORT&=0XF0;
02E4 B382 IN R24,0x12
02E5 7F80 ANDI R24,0xF0
02E6 BB82 OUT 0x12,R24
(0509) LCD_DATA_PORT|=data_temp&0x0F; //写低四位
02E7 01CB MOVW R24,R22
02E8 708F ANDI R24,0xF
02E9 7090 ANDI R25,0
02EA B222 IN R2,0x12
02EB 2433 CLR R3
02EC 2A28 OR R2,R24
02ED 2A39 OR R3,R25
02EE BA22 OUT 0x12,R2
(0510) LCD_en_write();
02EF DFCD RCALL _LCD_en_write
(0511) }
02F0 C021 RJMP 0x0312
(0512) else
(0513) {
(0514) LCD_RS_PORT&=~LCD_RS; //RS=0
02F1 9896 CBI 0x12,6
(0515) LCD_DATA_PORT&=0XF0;
02F2 B382 IN R24,0x12
02F3 7F80 ANDI R24,0xF0
02F4 BB82 OUT 0x12,R24
(0516) LCD_DATA_PORT|=(command_temp>>4)&0x0F; //写高四位
02F5 01CA MOVW R24,R20
02F6 9596 LSR R25
02F7 9587 ROR R24
02F8 9596 LSR R25
02F9 9587 ROR R24
02FA 9596 LSR R25
02FB 9587 ROR R24
02FC 9596 LSR R25
02FD 9587 ROR R24
02FE 708F ANDI R24,0xF
02FF 7090 ANDI R25,0
0300 B222 IN R2,0x12
0301 2433 CLR R3
0302 2A28 OR R2,R24
0303 2A39 OR R3,R25
0304 BA22 OUT 0x12,R2
(0517) LCD_en_write();
0305 DFB7 RCALL _LCD_en_write
(0518) // command_temp=command_temp<<4;
(0519) LCD_DATA_PORT&=0xF0;
0306 B382 IN R24,0x12
0307 7F80 ANDI R24,0xF0
0308 BB82 OUT 0x12,R24
(0520) LCD_DATA_PORT|=command_temp&0x0F; //写低四位
0309 01CA MOVW R24,R20
030A 708F ANDI R24,0xF
030B 7090 ANDI R25,0
030C B222 IN R2,0x12
030D 2433 CLR R3
030E 2A28 OR R2,R24
030F 2A39 OR R3,R25
0310 BA22 OUT 0x12,R2
(0521) LCD_en_write();
0311 DFAB RCALL _LCD_en_write
(0522) }
0312 940E0721 CALL pop_gset4
0314 9508 RET
(0523) }
(0524) /***************************************
(0525) T2初始化,中断
(0526) ****************************************/
(0527)
(0528)
(0529)
(0530)
(0531) void time_change(void)
(0532) {
(0533) if(time[0][0]<60)
_time_change:
0315 91800062 LDS R24,time
0317 338C CPI R24,0x3C
0318 F408 BCC 0x031A
(0534) return;
0319 C01B RJMP 0x0335
(0535) else
(0536) {time[0][0]-=60;
031A 91800062 LDS R24,time
031C 538C SUBI R24,0x3C
031D 93800062 STS time,R24
(0537) if(time[0][1]<59)
031F 91800063 LDS R24,time+1
0321 338B CPI R24,0x3B
0322 F420 BCC 0x0327
(0538) time[0][1]++;
0323 5F8F SUBI R24,0xFF
0324 93800063 STS time+1,R24
0326 C00E RJMP 0x0335
(0539) else
(0540) {
(0541) time[0][1]=0;
0327 2422 CLR R2
0328 92200063 STS time+1,R2
(0542) if(time[0][2]<23)
032A 91800064 LDS R24,time+2
032C 3187 CPI R24,0x17
032D F420 BCC 0x0332
(0543) time[0][2]++;
032E 5F8F SUBI R24,0xFF
032F 93800064 STS time+2,R24
0331 C003 RJMP 0x0335
(0544) else
(0545) time[0][2]=0;
0332 2422 CLR R2
0333 92200064 STS time+2,R2
(0546) }
(0547) }
0335 9508 RET
(0548)
(0549) }
(0550)
(0551) void t2_init()
(0552) {
(0553) ASSR=(1<<AS2);
_t2_init:
0336 E088 LDI R24,0x8
0337 BD82 OUT 0x22,R24
(0554) TCNT2=0XE0;
0338 EE80 LDI R24,0xE0
0339 BD84 OUT 0x24,R24
(0555) TCCR2=(7<<CS20);
033A E087 LDI R24,7
033B BD85 OUT 0x25,R24
(0556) TIMSK|=(1<<TOIE2);
033C B789 IN R24,0x39
033D 6480 ORI R24,0x40
033E BF89 OUT 0x39,R24
033F 9508 RET
_t2_iov:
0340 940E0746 CALL push_lset
(0557) }
(0558) #pragma interrupt_handler t2_iov:5
(0559) void t2_iov(void)
(0560) {
(0561) TCNT2=0XE0;
0342 EE80 LDI R24,0xE0
0343 BD84 OUT 0x24,R24
(0562) time[0][0]++;
0344 91800062 LDS R24,time
0346 5F8F SUBI R24,0xFF
0347 93800062 STS time,R24
(0563) time_change();
0349 DFCB RCALL _time_change
034A 940E075D CALL pop_lset
034C 9518 RETI
_disp_temp:
q --> Y+8
y --> R20
x --> R22
034D 940E072D CALL push_gset2
034F 2F42 MOV R20,R18
0350 2F60 MOV R22,R16
0351 9724 SBIW R28,4
(0564) }
(0565)
(0566)
(0567)
(0568) void disp_temp(unsigned char x,unsigned char y,unsigned char q)
(0569) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -