📄 timer.lst
字号:
011A C00C RJMP 0x0127
(0180) while (*s)
(0181) { if( LCD_write_char( 0, *s ) == 1 )
011B 01FA MOVW R30,R20
011C 8120 LDD R18,Z+0
011D 2733 CLR R19
011E 2700 CLR R16
011F 2711 CLR R17
0120 DF58 RCALL _LCD_write_char
0121 3001 CPI R16,1
0122 F411 BNE 0x0125
(0182) { return( 1 ); }
0123 E001 LDI R16,1
0124 C007 RJMP 0x012C
(0183) s ++;
0125 5F4F SUBI R20,0xFF
0126 4F5F SBCI R21,0xFF
0127 01FA MOVW R30,R20
0128 8020 LDD R2,Z+0
0129 2022 TST R2
012A F781 BNE 0x011B
(0184) }
(0185) return( 0 );
012B 2700 CLR R16
012C 940E03A9 CALL pop_gset3
012E 9508 RET
_LCD_write_uint8:
tempbuf --> Y+0
i --> R20
num --> R22
data --> Y+9
Y --> R10
X --> R20
012F 940E03B3 CALL push_gset3
0131 2EA2 MOV R10,R18
0132 2F40 MOV R20,R16
0133 9723 SBIW R28,3
0134 856B LDD R22,Y+11
(0186) }
(0187)
(0188) unsigned char LCD_write_uint8(unsigned char X, unsigned char Y, unsigned int data, unsigned char num)
(0189) { unsigned char tempbuf[3],i;
(0190) tempbuf[0]=(data/100)+'0';
0135 E624 LDI R18,0x64
0136 E030 LDI R19,0
0137 8509 LDD R16,Y+9
0138 851A LDD R17,Y+10
0139 940E0374 CALL div16u
013B 01C8 MOVW R24,R16
013C 96C0 ADIW R24,0x30
013D 8388 STD Y+0,R24
(0191) tempbuf[1]=((data%100)/10)+'0';
013E E624 LDI R18,0x64
013F E030 LDI R19,0
0140 8509 LDD R16,Y+9
0141 851A LDD R17,Y+10
0142 940E0372 CALL mod16u
0144 E02A LDI R18,0xA
0145 E030 LDI R19,0
0146 940E0374 CALL div16u
0148 01C8 MOVW R24,R16
0149 96C0 ADIW R24,0x30
014A 8389 STD Y+1,R24
(0192) tempbuf[2]=(data%10)+'0';
014B E02A LDI R18,0xA
014C E030 LDI R19,0
014D 8509 LDD R16,Y+9
014E 851A LDD R17,Y+10
014F 940E0372 CALL mod16u
0151 01C8 MOVW R24,R16
0152 96C0 ADIW R24,0x30
0153 838A STD Y+2,R24
(0193) LCD_set_xy( X, Y );
0154 2D2A MOV R18,R10
0155 2F04 MOV R16,R20
0156 DFA7 RCALL _LCD_set_xy
(0194) for( i=0; i<num; i++ )
0157 2744 CLR R20
0158 C017 RJMP 0x0170
(0195) { if( LCD_write_char( 0, tempbuf[(3-num)+i] ) == 1 ) { return( 1 ); } }
0159 2E26 MOV R2,R22
015A 2433 CLR R3
015B E0E3 LDI R30,3
015C E0F0 LDI R31,0
015D 19E2 SUB R30,R2
015E 09F3 SBC R31,R3
015F 2E24 MOV R2,R20
0160 2433 CLR R3
0161 0DE2 ADD R30,R2
0162 1DF3 ADC R31,R3
0163 01CE MOVW R24,R28
0164 0FE8 ADD R30,R24
0165 1FF9 ADC R31,R25
0166 8120 LDD R18,Z+0
0167 2733 CLR R19
0168 2700 CLR R16
0169 2711 CLR R17
016A DF0E RCALL _LCD_write_char
016B 3001 CPI R16,1
016C F411 BNE 0x016F
016D E001 LDI R16,1
016E C004 RJMP 0x0173
016F 9543 INC R20
0170 1746 CP R20,R22
0171 F338 BCS 0x0159
(0196) return(0);
0172 2700 CLR R16
0173 9623 ADIW R28,3
0174 940E03A9 CALL pop_gset3
0176 9508 RET
(0197) }
(0198) /*-----------------------------------------------------------------------
(0199) 延时函数
(0200) 系统时钟:8M
(0201) -----------------------------------------------------------------------*/
(0202) void delay_1us(void) //1us延时函数
(0203) { asm("nop"); }
_delay_1us:
0177 0000 NOP
0178 9508 RET
_delay_nus:
i --> R20
n --> R22
0179 940E03B5 CALL push_gset2
017B 01B8 MOVW R22,R16
(0204)
(0205) void delay_nus(unsigned int n) //N us延时函数
(0206) { unsigned int i=0;
017C 2744 CLR R20
017D 2755 CLR R21
(0207) for (i=0;i<n;i++)
017E C003 RJMP 0x0182
(0208) delay_1us();
017F DFF7 RCALL _delay_1us
0180 5F4F SUBI R20,0xFF
0181 4F5F SBCI R21,0xFF
0182 1746 CP R20,R22
0183 0757 CPC R21,R23
0184 F3D0 BCS 0x017F
0185 940E03A6 CALL pop_gset2
0187 9508 RET
(0209) }
(0210)
(0211) void delay_1ms(void) //1ms延时函数
(0212) { unsigned int i;
(0213) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
0188 2700 CLR R16
0189 2711 CLR R17
018A C002 RJMP 0x018D
018B 5F0F SUBI R16,0xFF
018C 4F1F SBCI R17,0xFF
018D 3704 CPI R16,0x74
018E E0E4 LDI R30,4
018F 071E CPC R17,R30
0190 F3D0 BCS 0x018B
0191 9508 RET
_delay_nms:
i --> R20
n --> R22
0192 940E03B5 CALL push_gset2
0194 01B8 MOVW R22,R16
(0214) }
(0215)
(0216) void delay_nms(unsigned int n) //N ms延时函数
(0217) { unsigned int i=0;
0195 2744 CLR R20
0196 2755 CLR R21
(0218) for (i=0;i<n;i++)
0197 C003 RJMP 0x019B
(0219) delay_1ms();
0198 DFEF RCALL _delay_1ms
0199 5F4F SUBI R20,0xFF
019A 4F5F SBCI R21,0xFF
019B 1746 CP R20,R22
019C 0757 CPC R21,R23
019D F3D0 BCS 0x0198
019E 940E03A6 CALL pop_gset2
01A0 9508 RET
FILE: G:\Demo\Deal.h
(0001) #define KEYPIN PINC
(0002) #define KEYDDR DDRC
(0003) #define KEYPORT PORTC
(0004) #define KEYMASK 0x0f
(0005)
(0006) uchar KeyTask = 0;
(0007) uchar Keybuf = 0;
(0008) uchar Keydata = 0;
(0009) void InitalKey(void)
(0010) { KEYDDR = KEYMASK;
_InitalKey:
01A1 E08F LDI R24,0xF
01A2 BB84 OUT 0x14,R24
(0011) KEYPORT = ~KEYMASK;
01A3 EF80 LDI R24,0xF0
01A4 BB85 OUT 0x15,R24
01A5 9508 RET
(0012) }
(0013) /**********************************************************
(0014) *原型:uchar ScanKey(void)
(0015) *功能:扫描键盘模块
(0016) *说明:采用算法进行扫描,不循环等待。
(0017) *参数:无
(0018) *返回:uchar按键数据
(0019) **********************************************************/
(0020) uchar ScanKey(void)
(0021) { uchar temp,i;
(0022) switch(KeyTask)
_ScanKey:
i --> R16
temp --> R18
01A6 91000065 LDS R16,KeyTask
01A8 2711 CLR R17
01A9 3000 CPI R16,0
01AA 0701 CPC R16,R17
01AB F0C1 BEQ 0x01C4
01AC 3001 CPI R16,1
01AD E0E0 LDI R30,0
01AE 071E CPC R17,R30
01AF F0F9 BEQ 0x01CF
01B0 3002 CPI R16,2
01B1 E0E0 LDI R30,0
01B2 071E CPC R17,R30
01B3 F0F9 BEQ 0x01D3
01B4 3003 CPI R16,3
01B5 E0E0 LDI R30,0
01B6 071E CPC R17,R30
01B7 F409 BNE 0x01B9
01B8 C047 RJMP 0x0200
01B9 3004 CPI R16,4
01BA E0E0 LDI R30,0
01BB 071E CPC R17,R30
01BC F409 BNE 0x01BE
01BD C04A RJMP 0x0208
01BE 3005 CPI R16,5
01BF E0E0 LDI R30,0
01C0 071E CPC R17,R30
01C1 F409 BNE 0x01C3
01C2 C049 RJMP 0x020C
01C3 C053 RJMP 0x0217
(0023) { case 0:/***有按键按下吗?***/
(0024) KEYPORT = ~KEYMASK;
01C4 EF80 LDI R24,0xF0
01C5 BB85 OUT 0x15,R24
(0025) if( (KEYPIN&(~KEYMASK)) != (~KEYMASK) )
01C6 B383 IN R24,0x13
01C7 7F80 ANDI R24,0xF0
01C8 3F80 CPI R24,0xF0
01C9 F409 BNE 0x01CB
01CA C04C RJMP 0x0217
(0026) { KeyTask=1; } /***延时一个系统时间***/
01CB E081 LDI R24,1
01CC 93800065 STS KeyTask,R24
(0027) break;
01CE C048 RJMP 0x0217
(0028) case 1: /***键按下去抖延时***/
(0029) KeyTask=2; /***延时一个系统时间***/
01CF E082 LDI R24,2
01D0 93800065 STS KeyTask,R24
(0030) break;
01D2 C044 RJMP 0x0217
(0031) case 2: /***键值判断***/
(0032) if( (KEYPIN&(~KEYMASK)) != (~KEYMASK) )
01D3 B383 IN R24,0x13
01D4 7F80 ANDI R24,0xF0
01D5 3F80 CPI R24,0xF0
01D6 F119 BEQ 0x01FA
(0033) { temp = 0x01;
01D7 E021 LDI R18,1
(0034) for( i=0; i<4; i++ )
01D8 2700 CLR R16
01D9 C01E RJMP 0x01F8
(0035) { KEYPORT |= KEYMASK; //输出全为高电平
01DA B385 IN R24,0x15
01DB 608F ORI R24,0xF
01DC BB85 OUT 0x15,R24
(0036) KEYPORT &= ~temp; //输出某个为低电平
01DD 2E22 MOV R2,R18
01DE 9420 COM R2
01DF B235 IN R3,0x15
01E0 2032 AND R3,R2
01E1 BA35 OUT 0x15,R3
(0037) asm("nop"); asm("nop"); asm("nop"); asm("nop");
01E2 0000 NOP
01E3 0000 NOP
01E4 0000 NOP
01E5 0000 NOP
(0038) if( (KEYPIN&(~KEYMASK)) != (~KEYMASK) )
01E6 B383 IN R24,0x13
01E7 7F80 ANDI R24,0xF0
01E8 3F80 CPI R24,0xF0
01E9 F061 BEQ 0x01F6
(0039) { Keybuf = (KEYPIN&(~KEYMASK)) + temp;
01EA B383 IN R24,0x13
01EB 7F80 ANDI R24,0xF0
01EC 0F82 ADD R24,R18
01ED 93800066 STS Keybuf,R24
(0040) KeyTask = 3; KEYPORT = ~KEYMASK; return(1);
01EF E083 LDI R24,3
01F0 93800065 STS KeyTask,R24
01F2 EF80 LDI R24,0xF0
01F3 BB85 OUT 0x15,R24
01F4 E001 LDI R16,1
01F5 C022 RJMP 0x0218
(0041) }
(0042) temp = temp<<1;
01F6 0F22 LSL R18
01F7 9503 INC R16
01F8 3004 CPI R16,4
01F9 F300 BCS 0x01DA
(0043) }
(0044) }
(0045) KEYPORT = ~KEYMASK;
01FA EF80 LDI R24,0xF0
01FB BB85 OUT 0x15,R24
(0046) KeyTask=0; /*抖动*/
01FC 2422 CLR R2
01FD 92200065 STS KeyTask,R2
(0047) break;
01FF C017 RJMP 0x0217
(0048) case 3: /***有松开吗?***/
(0049) if( (KEYPIN&(~KEYMASK)) == (~KEYMASK) )
0200 B383 IN R24,0x13
0201 7F80 ANDI R24,0xF0
0202 3F80 CPI R24,0xF0
0203 F499 BNE 0x0217
(0050) { KeyTask=4; }
0204 E084 LDI R24,4
0205 93800065 STS KeyTask,R24
(0051) break;
0207 C00F RJMP 0x0217
(0052) case 4: /***键松开去抖延时***/
(0053) KeyTask=5; /***延时一个系统时间***/
0208 E085 LDI R24,5
0209 93800065 STS KeyTask,R24
(0054) break;
020B C00B RJMP 0x0217
(0055) case 5: /***键值判断***/
(0056) if( (KEYPIN&(~KEYMASK)) == (~KEYMASK) )
020C B383 IN R24,0x13
020D 7F80 ANDI R24,0xF0
020E 3F80 CPI R24,0xF0
020F F421 BNE 0x0214
(0057) { KeyTask=0; } /*去按键检测开始*/
0210 2422 CLR R2
0211 92200065 STS KeyTask,R2
0213 C003 RJMP 0x0217
(0058) else
(0059) { KeyTask=3; } /*抖动*/
0214 E083 LDI R24,3
0215 93800065 STS KeyTask,R24
(0060) break;
(0061) }
(0062) return(0);
0217 2700 CLR R16
0218 9508 RET
(0063) }
(0064)
(0065) void DealKey(void)
(0066) { //LCD_write_uint8(0,1,Keybuf,3);
(0067) switch( Keybuf )
_DealKey:
0219 91000066 LDS R16,Keybuf
021B 2711 CLR R17
021C 3701 CPI R16,0x71
021D E0E0 LDI R30,0
021E 071E CPC R17,R30
021F F009 BEQ 0x0221
0220 C000 RJMP 0x0221
(0068) { case KEYONE:
(0069) break;
0221 9508 RET
_DispTime:
0222 9723 SBIW R28,3
(0070) }
(0071) }
(0072)
(0073) void DispTime(void)
(0074) {
(0075) LCD_write_uint8(0, 0, Time.year, 2);
0223 E082 LDI R24,2
0224 838A STD Y+2,R24
0225 9020006E LDS R2,Time
0227 2433 CLR R3
0228 8239 STD Y+1,R3
0229 8228 STD Y+0,R2
022A 2722 CLR R18
022B 2700 CLR R16
022C DF02 RCALL _LCD_write_uint8
(0076) LCD_write_string(2,0,"-");
022D E68C LDI R24,0x6C
022E E090 LDI R25,0
022F 8399 STD Y+1,R25
0230 8388 STD Y+0,R24
0231 2722 CLR R18
0232 E002 LDI R16,2
0233 DEDD RCALL _LCD_write_string
(0077) LCD_write_uint8(3, 0, Time.month, 2);
0234 E082 LDI R24,2
0235 838A STD Y+2,R24
0236 9020006F LDS R2,Time+1
0238 2433 CLR R3
0239 8239 STD Y+1,R3
023A 8228 STD Y+0,R2
023B 2722 CLR R18
023C E003 LDI R16,3
023D DEF1 RCALL _LCD_write_uint8
(0078) LCD_write_string(5,0,"-");
023E E68C LDI R24,0x6C
023F E090 LDI R25,0
0240 8399 STD Y+1,R25
0241 8388 STD Y+0,R24
0242 2722 CLR R18
0243 E005 LDI R16,5
0244 DECC RCALL _LCD_write_string
(0079) LCD_write_uint8(6, 0, Time.day, 2);
0245 E082 LDI R24,2
0246 838A STD Y+2,R24
0247 90200070 LDS R2,Time+2
0249 2433 CLR R3
024A 8239 STD Y+1,R3
024B 8228 STD Y+0,R2
024C 2722 CLR R18
024D E006 LDI R16,6
024E DEE0 RCALL _LCD_write_uint8
(0080)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -