📄 1820.lst
字号:
01D4 2F48 MOV R20,R24
(0076) lcd_out(s);
01D5 2F08 MOV R16,R24
01D6 DFDA RCALL _lcd_out
01D7 940E0446 CALL pop_gset2
01D9 9508 RET
_WR_control:
s --> R20
dat --> R22
01DA 940E0452 CALL push_gset2
01DC 2F60 MOV R22,R16
(0077) }
(0078) //**************************************************************************
(0079) void WR_control(unsigned char dat)
(0080) {
(0081) unsigned char s;
(0082) s=dat&0xf0;
01DD 2F46 MOV R20,R22
01DE 7F40 ANDI R20,0xF0
(0083) lcd_out(0xf8);
01DF EF08 LDI R16,0xF8
01E0 DFD0 RCALL _lcd_out
(0084) lcd_out(s);
01E1 2F04 MOV R16,R20
01E2 DFCE RCALL _lcd_out
(0085) s=dat&0x0f;
01E3 2F46 MOV R20,R22
01E4 704F ANDI R20,0xF
(0086) s<<=4;
01E5 2F84 MOV R24,R20
01E6 708F ANDI R24,0xF
01E7 9582 SWAP R24
01E8 2F48 MOV R20,R24
(0087) lcd_out(s);
01E9 2F08 MOV R16,R24
01EA DFC6 RCALL _lcd_out
01EB 940E0446 CALL pop_gset2
01ED 9508 RET
(0088) }
(0089) //**************************************************************************
(0090) void lcd_control()
(0091) {
(0092) WR_control(0x30);
_lcd_control:
01EE E300 LDI R16,0x30
01EF DFEA RCALL _WR_control
(0093) WR_control(0x0c);
01F0 E00C LDI R16,0xC
01F1 DFE8 RCALL _WR_control
01F2 9508 RET
_lcd_clear:
i --> R20
01F3 940E0454 CALL push_gset1
(0094) }
(0095) //**************************************************************************
(0096) void lcd_clear()
(0097) {
(0098) int i;
(0099) WR_control(0x01);
01F5 E001 LDI R16,1
01F6 DFE3 RCALL _WR_control
(0100) for(i=0;i<5000;i++) // 延时5ms
01F7 2744 CLR R20
01F8 2755 CLR R21
(0101) {
(0102) asm("nop");
01F9 0000 NOP
(0103) asm("nop");
01FA 0000 NOP
01FB 5F4F SUBI R20,0xFF
01FC 4F5F SBCI R21,0xFF
01FD 3848 CPI R20,0x88
01FE E1E3 LDI R30,0x13
01FF 075E CPC R21,R30
0200 F3C4 BLT 0x01F9
0201 940E0457 CALL pop_gset1
0203 9508 RET
_LCD_address:
address --> R20
y --> R22
x --> R20
0204 940E0452 CALL push_gset2
0206 2F62 MOV R22,R18
0207 2F40 MOV R20,R16
(0104) }
(0105) }
(0106) /*******************************************************/
(0107) /****** 函数名称: LCD_set_xy() ******/
(0108) /****** 功 能: 设置LCD显示坐标 ******/
(0109) /****** 参 数: 显示字符串的位置,X:0-15,Y:0-1*****/
(0110) /****** 返回值 : 无 ******/
(0111) /*******************************************************/
(0112) void LCD_address( unsigned char x, unsigned char y )
(0113) {
(0114) unsigned char address;
(0115) switch(x)
0208 2755 CLR R21
0209 3040 CPI R20,0
020A 0745 CPC R20,R21
020B F069 BEQ 0x0219
020C 3041 CPI R20,1
020D E0E0 LDI R30,0
020E 075E CPC R21,R30
020F F061 BEQ 0x021C
0210 3042 CPI R20,2
0211 E0E0 LDI R30,0
0212 075E CPC R21,R30
0213 F059 BEQ 0x021F
0214 3043 CPI R20,3
0215 E0E0 LDI R30,0
0216 075E CPC R21,R30
0217 F051 BEQ 0x0222
0218 C00C RJMP 0x0225
(0116) {
(0117) case 0:
(0118) address = 0x80 + y; //计算显示地址
0219 2F46 MOV R20,R22
021A 5840 SUBI R20,0x80
(0119) break;
021B C00B RJMP 0x0227
(0120) case 1:
(0121) address = 0x90 + y; //计算显示地址
021C 2F46 MOV R20,R22
021D 5740 SUBI R20,0x70
(0122) break;
021E C008 RJMP 0x0227
(0123) case 2:
(0124) address = 0x88 + y; //计算显示地址
021F 2F46 MOV R20,R22
0220 5748 SUBI R20,0x78
(0125) break;
0221 C005 RJMP 0x0227
(0126) case 3:
(0127) address = 0x98 + y; //计算显示地址
0222 2F46 MOV R20,R22
0223 5648 SUBI R20,0x68
(0128) break;
0224 C002 RJMP 0x0227
(0129) default:address = 0x80 + y;
0225 2F46 MOV R20,R22
0226 5840 SUBI R20,0x80
(0130) }
(0131) WR_control( address); //写地址命令
0227 2F04 MOV R16,R20
0228 DFB1 RCALL _WR_control
0229 940E0446 CALL pop_gset2
022B 9508 RET
_LCD_Write_string:
s --> R20
Y --> R10
X --> R22
022C 940E0450 CALL push_gset3
022E 2EA2 MOV R10,R18
022F 2F60 MOV R22,R16
0230 814E LDD R20,Y+6
0231 815F LDD R21,Y+7
(0132) }
(0133) //**************************************************************************
(0134) /*******************************************************/
(0135) /****** 函数名称: LCD_write_string() ******/
(0136) /****** 功 能: 中英文字符串显示函数 ******/
(0137) /****** 参 数: *s--英文字符串指针 ******/
(0138) /****** X、Y--显示字符串的位置 ******/
(0139) /****** 返回值 : 无 ******/
(0140) /*******************************************************/
(0141) void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0142) {
(0143)
(0144) LCD_address( X, Y ); //写显示地址
0232 2D2A MOV R18,R10
0233 2F06 MOV R16,R22
0234 DFCF RCALL _LCD_address
0235 C005 RJMP 0x023B
(0145) while (*s) //是否到字符串尾
(0146) {
(0147) WR_dat (*s ); //写显示数据
0236 01FA MOVW R30,R20
0237 8100 LDD R16,Z+0
0238 DF8D RCALL _WR_dat
(0148) s ++; //字符串地址加1
0239 5F4F SUBI R20,0xFF
023A 4F5F SBCI R21,0xFF
023B 01FA MOVW R30,R20
023C 8020 LDD R2,Z+0
023D 2022 TST R2
023E F7B9 BNE 0x0236
023F 940E0449 CALL pop_gset3
0241 9508 RET
(0149) }
(0150) }
(0151)
(0152)
(0153) /******************************************************************************/
(0154) //函数功能:将BCD码转换为ASCII码函数
(0155) //输入数据:BCD
(0156) //输出:ASCII
(0157) //作者:韩红瑞
(0158) //修改时间:2006-08-31
(0159) /******************************************************************************/
(0160) unsigned char BCD_ASCII(unsigned char bcd)
(0161) {
(0162) bcd &= 0x0F;
_BCD_ASCII:
bcd --> R16
0242 700F ANDI R16,0xF
(0163) if(bcd > 9)
0243 E089 LDI R24,0x9
0244 1780 CP R24,R16
0245 F410 BCC 0x0248
(0164) bcd +=('7'); // 将A~F转换为ASCII
0246 5C09 SUBI R16,0xC9
0247 C001 RJMP 0x0249
(0165) else
(0166) bcd += '0'; // 将0~9转换为ASCII 0~9
0248 5D00 SUBI R16,0xD0
(0167) return(bcd);
0249 9508 RET
_LCD_writeasc:
data --> Y+4
y --> R22
x --> R20
024A 940E0452 CALL push_gset2
024C 2F62 MOV R22,R18
024D 2F40 MOV R20,R16
(0168) }
(0169)
(0170)
(0171) void LCD_writeasc(unsigned char x, unsigned char y, unsigned char data)
(0172) {
(0173) LCD_address(x,y);
024E 2F26 MOV R18,R22
024F 2F04 MOV R16,R20
0250 DFB3 RCALL _LCD_address
(0174) WR_dat(data);
0251 810C LDD R16,Y+4
0252 DF73 RCALL _WR_dat
0253 940E0446 CALL pop_gset2
0255 9508 RET
(0175) }
(0176)
(0177) void Lcd_INT()
(0178) {
(0179) //DDRD|=0X03;
(0180) //PORTD=0X03;
(0181) lcd_control();
_Lcd_INT:
0256 DF97 RCALL _lcd_control
0257 9508 RET
_lcd_writechar:
number --> Y+4
Y --> R22
X --> R20
0258 940E0452 CALL push_gset2
025A 2F62 MOV R22,R18
025B 2F40 MOV R20,R16
(0182) }
(0183)
(0184) void lcd_writechar(unsigned char X,unsigned char Y,unsigned char number)
(0185) {
(0186) LCD_address(X,Y);
025C 2F26 MOV R18,R22
025D 2F04 MOV R16,R20
025E DFA5 RCALL _LCD_address
(0187) WR_dat(BCD_ASCII(number>>4));
025F 810C LDD R16,Y+4
0260 9502 SWAP R16
0261 700F ANDI R16,0xF
0262 DFDF RCALL _BCD_ASCII
0263 DF62 RCALL _WR_dat
(0188) WR_dat(BCD_ASCII(number));
0264 810C LDD R16,Y+4
0265 DFDC RCALL _BCD_ASCII
0266 DF5F RCALL _WR_dat
0267 940E0446 CALL pop_gset2
0269 9508 RET
_lcd_write2:
number --> Y+4
Y --> R22
X --> R20
026A 940E0452 CALL push_gset2
026C 2F62 MOV R22,R18
026D 2F40 MOV R20,R16
(0189) }
(0190)
(0191) void lcd_write2(unsigned char X,unsigned char Y,unsigned int number)
(0192) {
(0193) LCD_address(X,Y);
026E 2F26 MOV R18,R22
026F 2F04 MOV R16,R20
0270 DF93 RCALL _LCD_address
(0194)
(0195) //WR_dat(BCD_ASCII(number));//%1000/100
(0196) //WR_dat(BCD_ASCII(number));//%1000%100/10
(0197) WR_dat(BCD_ASCII(number));//%10
0271 810C LDD R16,Y+4
0272 811D LDD R17,Y+5
0273 DFCE RCALL _BCD_ASCII
0274 DF51 RCALL _WR_dat
0275 940E0446 CALL pop_gset2
0277 9508 RET
_show_time:
temp --> R20
time --> R22
0278 940E0452 CALL push_gset2
027A 01B8 MOVW R22,R16
027B 9721 SBIW R28,1
(0198) }
(0199) void show_time(unsigned int time)
(0200) {
(0201)
(0202) unsigned char temp;
(0203) temp=time/60;
027C E32C LDI R18,0x3C
027D E030 LDI R19,0
027E 018B MOVW R16,R22
027F 940E0404 CALL div16u
0281 2F40 MOV R20,R16
(0204) lcd_writechar(1,3,((temp/10)<<4)+(temp%10)); // 显示分
0282 E01A LDI R17,0xA
0283 940E041E CALL mod8u
0285 2E20 MOV R2,R16
0286 E01A LDI R17,0xA
0287 2F04 MOV R16,R20
0288 940E0420 CALL div8u
028A 2F80 MOV R24,R16
028B 708F ANDI R24,0xF
028C 9582 SWAP R24
028D 0D82 ADD R24,R2
028E 8388 STD Y+0,R24
028F E023 LDI R18,3
0290 E001 LDI R16,1
0291 DFC6 RCALL _lcd_writechar
(0205) //LCD_Write_string(1,2,"分");
(0206) temp=time%60; // 显示秒
0292 E32C LDI R18,0x3C
0293 E030 LDI R19,0
0294 018B MOVW R16,R22
0295 940E0402 CALL mod16u
0297 2F40 MOV R20,R16
(0207) lcd_writechar(1,5,((temp/10)<<4)+(temp%10));
0298 E01A LDI R17,0xA
0299 940E041E CALL mod8u
029B 2E20 MOV R2,R16
029C E01A LDI R17,0xA
029D 2F04 MOV R16,R20
029E 940E0420 CALL div8u
02A0 2F80 MOV R24,R16
02A1 708F ANDI R24,0xF
02A2 9582 SWAP R24
02A3 0D82 ADD R24,R2
02A4 8388 STD Y+0,R24
02A5 E025 LDI R18,5
02A6 E001 LDI R16,1
02A7 DFB0 RCALL _lcd_writechar
02A8 9621 ADIW R28,1
02A9 940E0446 CALL pop_gset2
02AB 9508 RET
_lcd_writejd:
number --> Y+4
Y --> R22
X --> R20
02AC 940E0452 CALL push_gset2
02AE 2F62 MOV R22,R18
02AF 2F40 MOV R20,R16
(0208)
(0209) }
(0210)
(0211)
(0212) unsigned char JD[11]={'5','4','3','2','1','0','1','2','3','4','5'};
(0213)
(0214) void lcd_writejd(unsigned char X,unsigned char Y,unsigned char number)
(0215) {
(0216) LCD_address(X,Y);
02B0 2F26 MOV R18,R22
02B1 2F04 MOV R16,R20
02B2 DF51 RCALL _LCD_address
(0217) if(number<5)
02B3 818C LDD R24,Y+4
02B4 3085 CPI R24,5
02B5 F418 BCC 0x02B9
(0218) {
(0219) WR_dat('+');
02B6 E20B LDI R16,0x2B
02B7 DF0E RCALL _WR_dat
(0220) }
02B8 C008 RJMP 0x02C1
(0221) else if(number==5)
02B9 818C LDD R24,Y+4
02BA 3085 CPI R24,5
02BB F419 BNE 0x02BF
(0222) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -