📄 int0+1.lis
字号:
.module INT0+1.c
.area text(rom, con, rel)
0000 .dbfile G:\Mega8程序\TCXO评估板\Main\INT0+1.c
0000 .dbfunc e delay_ms _delay_ms fV
0000 ; loopcount -> R20
0000 ; i -> R10
0000 ; ms -> R22,R23
.even
0000 _delay_ms::
0000 00D0 rcall push_gset3
0002 B801 movw R22,R16
0004 .dbline -1
0004 .dbline 6
0004 ; /*INT0、INT1使用中断方式,一个中断处理函数 实现对INT0/INT1按键的处理*/
0004 ; #include <iom8v.h>
0004 ; #include <macros.h>
0004 ; extern void uart_init(void);
0004 ; void delay_ms(unsigned int ms)
0004 ; {
0004 .dbline 8
0004 ; unsigned char i,loopcount;
0004 ; ms=4*ms+1;
0004 04E0 ldi R16,4
0006 10E0 ldi R17,0
0008 9B01 movw R18,R22
000A 00D0 rcall empy16s
000C B801 movw R22,R16
000E 6F5F subi R22,255 ; offset = 1
0010 7F4F sbci R23,255
0012 .dbline 9
0012 ; for(loopcount=0;loopcount<ms;loopcount++)//外循环
0012 4427 clr R20
0014 07C0 rjmp L5
0016 L2:
0016 .dbline 10
0016 ; {
0016 .dbline 11
0016 AA24 clr R10
0018 01C0 rjmp L9
001A L6:
001A .dbline 11
001A L7:
001A .dbline 11
001A A394 inc R10
001C L9:
001C .dbline 11
001C 8BEF ldi R24,251
001E 8A15 cp R24,R10
0020 E0F7 brsh L6
0022 .dbline 13
0022 L3:
0022 .dbline 9
0022 4395 inc R20
0024 L5:
0024 .dbline 9
0024 242E mov R2,R20
0026 3324 clr R3
0028 2616 cp R2,R22
002A 3706 cpc R3,R23
002C A0F3 brlo L2
002E .dbline -2
002E L1:
002E 00D0 rcall pop_gset3
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbsym r loopcount 20 c
0032 .dbsym r i 10 c
0032 .dbsym r ms 22 i
0032 .dbend
0032 .dbfunc e int_init _int_init fV
.even
0032 _int_init::
0032 .dbline -1
0032 .dbline 16
0032 ; for(i=0;i<=251;i++);
0032 ; //内循环
0032 ; }
0032 ; }
0032 ; void int_init(void)
0032 ; {GICR = 0xC0;}
0032 .dbline 16
0032 80EC ldi R24,192
0034 8BBF out 0x3b,R24
0036 .dbline -2
0036 L10:
0036 .dbline 0 ; func end
0036 0895 ret
0038 .dbend
.area vector(rom, abs)
.org 2
0002 1CC0 rjmp _int_isr
.area text(rom, con, rel)
0038 .dbfile G:\Mega8程序\TCXO评估板\Main\INT0+1.c
.area vector(rom, abs)
.org 4
0004 1CC0 rjmp _int_isr
.area text(rom, con, rel)
0038 .dbfile G:\Mega8程序\TCXO评估板\Main\INT0+1.c
0038 .dbfunc e int_isr _int_isr fV
0038 ; loopcount -> <dead>
0038 ; i -> R20
.even
0038 _int_isr::
0038 00D0 rcall push_lset
003A 00D0 rcall push_gset1
003C .dbline -1
003C .dbline 20
003C ; //初始化int0,int1中断使能
003C ; #pragma interrupt_handler int_isr:iv_INT0 int_isr:iv_INT1
003C ; void int_isr(void)
003C ; {
003C .dbline 23
003C ; unsigned char i;
003C ; unsigned char loopcount;
003C ; delay_ms(50);//延时10ms后检测按键是否有效,进行软防抖
003C 02E3 ldi R16,50
003E 10E0 ldi R17,0
0040 DFDF rcall _delay_ms
0042 .dbline 27
0042 ; /*for (loopcount=0;loopcount<41;loopcount++)
0042 ; {for(i=0;i<251;i++);}
0042 ; //不使用延时函数而直接使用循环进行延时*/
0042 ; i=PIND&0x0c;//检测键盘是否仍按下
0042 40B3 in R20,0x10
0044 4C70 andi R20,12
0046 .dbline 28
0046 ; if(i==0x0c) return;//按键误触发
0046 4C30 cpi R20,12
0048 09F4 brne L12
004A .dbline 28
004A 36C0 rjmp L11
004C L12:
004C .dbline 30
004C ; else
004C ; {
004C .dbline 31
004C ; if(i==0x08)//INT0键按下
004C 4830 cpi R20,8
004E 91F4 brne L14
0050 .dbline 32
0050 ; {
0050 .dbline 33
0050 ; if (OCR1A<3890) OCR1A+=205;//递增
0050 8AB5 in R24,0x2a
0052 9BB5 in R25,0x2b
0054 8233 cpi R24,50
0056 EFE0 ldi R30,15
0058 9E07 cpc R25,R30
005A 38F4 brsh L16
005C .dbline 33
005C 8AB5 in R24,0x2a
005E 9BB5 in R25,0x2b
0060 8353 subi R24,51 ; offset = 205
0062 9F4F sbci R25,255
0064 9BBD out 0x2b,R25
0066 8ABD out 0x2a,R24
0068 1EC0 rjmp L15
006A L16:
006A .dbline 34
006A ; else OCR1A=0x0fff;
006A 8FEF ldi R24,4095
006C 9FE0 ldi R25,15
006E 9BBD out 0x2b,R25
0070 8ABD out 0x2a,R24
0072 .dbline 36
0072 ; //12位满幅值,防止出现数据变为负向数值
0072 ; }
0072 19C0 rjmp L15
0074 L14:
0074 .dbline 37
0074 ; else if(i==0x04)//INT1键按下
0074 4430 cpi R20,4
0076 99F4 brne L18
0078 .dbline 38
0078 ; {
0078 .dbline 39
0078 ; if (OCR1A>205) OCR1A-=205;//递减
0078 8DEC ldi R24,205
007A 90E0 ldi R25,0
007C 2AB4 in R2,0x2a
007E 3BB4 in R3,0x2b
0080 8215 cp R24,R2
0082 9305 cpc R25,R3
0084 38F4 brsh L20
0086 .dbline 39
0086 8AB5 in R24,0x2a
0088 9BB5 in R25,0x2b
008A 8D5C subi R24,205
008C 9040 sbci R25,0
008E 9BBD out 0x2b,R25
0090 8ABD out 0x2a,R24
0092 09C0 rjmp L19
0094 L20:
0094 .dbline 40
0094 ; else OCR1A=0;
0094 2224 clr R2
0096 3324 clr R3
0098 3BBC out 0x2b,R3
009A 2ABC out 0x2a,R2
009C .dbline 41
009C ; }
009C 04C0 rjmp L19
009E L18:
009E .dbline 42
009E ; else if(i==0x00) UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
009E 4423 tst R20
00A0 11F4 brne L22
00A2 .dbline 42
00A2 88E9 ldi R24,152
00A4 8AB9 out 0xa,R24
00A6 L22:
00A6 L19:
00A6 L15:
00A6 .dbline 44
00A6 ; //两键同时按下,重新切换到USART中,允许接收中断、发送和接收
00A6 ; }
00A6 .dbline 45
00A6 ; GICR = 0x00;
00A6 2224 clr R2
00A8 2BBE out 0x3b,R2
00AA .dbline 47
00AA ; //int0,int1禁止使能
00AA ; SEI();
00AA 7894 sei
00AC L24:
00AC .dbline 48
00AC L25:
00AC .dbline 48
00AC ; while ((PIND&0x0c)!=0x0c);
00AC 80B3 in R24,0x10
00AE 8C70 andi R24,12
00B0 8C30 cpi R24,12
00B2 E1F7 brne L24
00B4 .dbline 50
00B4 ; //检查按键释放
00B4 ; GICR = 0xC0;
00B4 80EC ldi R24,192
00B6 8BBF out 0x3b,R24
00B8 .dbline -2
00B8 L11:
00B8 00D0 rcall pop_gset1
00BA 00D0 rcall pop_lset
00BC .dbline 0 ; func end
00BC 1895 reti
00BE .dbsym l loopcount 1 c
00BE .dbsym r i 20 c
00BE .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -