📄 keyled.s
字号:
.module keyled.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\按键显示\keyled.c
.dbfile C:\DOCUME~1\Administrator\桌面\按键显示\delay.h
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 7
; /* 1MHz 下延时程序*/
;
; #ifndef DELAY_H_H
; #define DELAY_H_H
;
; void delay_1ms() //1ms 延时
; {
.dbline 13
; unsigned int i;
; /*
; for(i=1;i<140;i++) //1MHz
; ;
; */
; for(i=1331;i>0;i--) // 8MHz
ldi R16,1331
ldi R17,5
xjmp L5
L2:
.dbline 14
; ;
L3:
.dbline 13
subi R16,1
sbci R17,0
L5:
.dbline 13
cpi R16,0
cpc R16,R17
brne L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay _delay fV
; i -> R20,R21
; n -> R10,R11
.even
_delay::
xcall push_xgset300C
movw R10,R16
.dbline -1
.dbline 19
;
; }
;
; void delay(unsigned int n)
; {
.dbline 20
; unsigned int i=0;
clr R20
clr R21
.dbline 21
; for(i=0;i<n;i++)
xjmp L10
L7:
.dbline 22
; delay_1ms();
xcall _delay_1ms
L8:
.dbline 21
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 21
cp R20,R10
cpc R21,R11
brlo L7
X1:
.dbline -2
L6:
.dbline 0 ; func end
xjmp pop_xgset300C
.dbsym r i 20 i
.dbsym r n 10 i
.dbend
.area lit(rom, con, rel)
_seg_table::
.byte 192,249
.byte 164,176
.byte 153,146
.byte 130,248
.byte 128,144
.byte 136,131
.byte 198,161
.byte 134,142
.dbfile C:\DOCUME~1\Administrator\桌面\按键显示\keyled.c
.dbsym e seg_table _seg_table A[16:16]kc
.area vector(rom, abs)
.org 64
jmp _timer0_com_isr
.area lit(rom, con, rel)
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\按键显示\keyled.c
.dbfunc e display _display fV
; j -> <dead>
; i -> R20
; k -> R20
.even
_display::
st -y,R20
.dbline -1
.dbline 19
; /*跑表和计时
; 8MHz */
; #include <iom128v.h>
; #include <macros.h>
; #include "delay.h"
; unsigned char temp;
; unsigned char timer2; //the num of 5ms
; unsigned int timer200; // the num of 1s
; unsigned char work_state; //to set the timer or clock,0表示计时,1表示跑表
; unsigned char time_change; //to sign the state of change
; unsigned char clock_start; // 跑表开始信号,0表示开始,1 表示暂停
; unsigned char time[4]; //array of time
; unsigned char clock[4]; //array of watch
; const unsigned char seg_table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
; 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
; #pragma interrupt_handler timer0_com_isr:17 //timer0 compare interrupt
;
; void display()
; {
.dbline 21
; unsigned char i,j,k;
; DDRA=0xff;
ldi R24,255
out 0x1a,R24
.dbline 22
; PORTA=0xff;
out 0x1b,R24
.dbline 23
; DDRC=0xff;
out 0x14,R24
.dbline 24
; PORTC=0xff;
out 0x15,R24
.dbline 26
;
; if(work_state==0) //计时显示
lds R2,_work_state
tst R2
breq X15
xjmp L12
X15:
X2:
.dbline 27
; {
.dbline 28
; if(time_change==0x00) // normal
lds R2,_time_change
tst R2
brne L14
X3:
.dbline 29
; {for(i=0;i<4;i++)
.dbline 29
clr R20
xjmp L19
L16:
.dbline 30
; {
.dbline 31
; PORTA=seg_table[time[i]];
ldi R24,<_time
ldi R25,>_time
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_seg_table
ldi R25,>_seg_table
add R30,R24
adc R31,R25
elpm R2,Z
out 0x1b,R2
.dbline 32
; PORTC=~(1<<(i+4));
mov R17,R20
subi R17,252 ; addi 4
ldi R16,1
xcall lsl8
mov R2,R16
com R2
out 0x15,R2
.dbline 33
; delay_1ms();
xcall _delay_1ms
.dbline 34
; PORTC|=0xf0;
in R24,0x15
ori R24,240
out 0x15,R24
.dbline 35
; }
L17:
.dbline 29
inc R20
L19:
.dbline 29
cpi R20,4
brlo L16
X4:
.dbline 36
; }
xjmp L15
L14:
.dbline 37
; else if(time_change==0x01) // change second
lds R24,_time_change
cpi R24,1
breq X16
xjmp L20
X16:
X5:
.dbline 38
; {
.dbline 39
; if(timer200<100) //正常显示
lds R24,_timer200
lds R25,_timer200+1
cpi R24,100
ldi R30,0
cpc R25,R30
brsh L22
X6:
.dbline 40
; {
.dbline 41
; for(i=0;i<4;i++)
clr R20
xjmp L27
L24:
.dbline 42
; {
.dbline 43
; PORTA=seg_table[time[i]];
ldi R24,<_time
ldi R25,>_time
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_seg_table
ldi R25,>_seg_table
add R30,R24
adc R31,R25
elpm R2,Z
out 0x1b,R2
.dbline 44
; PORTC=~(1<<(i+4));
mov R17,R20
subi R17,252 ; addi 4
ldi R16,1
xcall lsl8
mov R2,R16
com R2
out 0x15,R2
.dbline 45
; delay_1ms();
xcall _delay_1ms
.dbline 46
; PORTC|=0xf0;
in R24,0x15
ori R24,240
out 0x15,R24
.dbline 47
; }
L25:
.dbline 41
inc R20
L27:
.dbline 41
cpi R20,4
brlo L24
X7:
.dbline 48
; }
xjmp L21
L22:
.dbline 50
; else //只显示分
; {for(i=2;i<4;i++)
.dbline 50
ldi R20,2
xjmp L31
L28:
.dbline 51
; {
.dbline 52
; PORTA=seg_table[time[i]];
ldi R24,<_time
ldi R25,>_time
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_seg_table
ldi R25,>_seg_table
add R30,R24
adc R31,R25
elpm R2,Z
out 0x1b,R2
.dbline 53
; PORTC=~(1<<(i+4));
mov R17,R20
subi R17,252 ; addi 4
ldi R16,1
xcall lsl8
mov R2,R16
com R2
out 0x15,R2
.dbline 54
; delay_1ms();
xcall _delay_1ms
.dbline 55
; PORTC|=0xc0;
in R24,0x15
ori R24,192
out 0x15,R24
.dbline 56
; }
L29:
.dbline 50
inc R20
L31:
.dbline 50
cpi R20,4
brlo L28
X8:
.dbline 57
; }
.dbline 58
; }
xjmp L21
L20:
.dbline 59
; else if(time_change==0x02) //正常显示
lds R24,_time_change
cpi R24,2
breq X17
xjmp L32
X17:
X9:
.dbline 60
; { if(timer200<100)
.dbline 60
lds R24,_timer200
lds R25,_timer200+1
cpi R24,100
ldi R30,0
cpc R25,R30
brsh L34
X10:
.dbline 61
; {
.dbline 62
; { for(i=0;i<4;i++)
.dbline 62
clr R20
xjmp L39
L36:
.dbline 63
; {
.dbline 64
; PORTA=seg_table[time[i]];
ldi R24,<_time
ldi R25,>_time
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_seg_table
ldi R25,>_seg_table
add R30,R24
adc R31,R25
elpm R2,Z
out 0x1b,R2
.dbline 65
; PORTC=~(1<<(i+4));
mov R17,R20
subi R17,252 ; addi 4
ldi R16,1
xcall lsl8
mov R2,R16
com R2
out 0x15,R2
.dbline 66
; delay_1ms();
xcall _delay_1ms
.dbline 67
; PORTC|=0xf0;
in R24,0x15
ori R24,240
out 0x15,R24
.dbline 68
; }
L37:
.dbline 62
inc R20
L39:
.dbline 62
cpi R20,4
brlo L36
X11:
.dbline 69
; }
.dbline 70
; }
xjmp L35
L34:
.dbline 72
; else //只显示秒
; for(i=0;i<2;i++)
clr R20
xjmp L43
L40:
.dbline 73
; {
.dbline 74
; PORTA=seg_table[time[i]];
ldi R24,<_time
ldi R25,>_time
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_seg_table
ldi R25,>_seg_table
add R30,R24
adc R31,R25
elpm R2,Z
out 0x1b,R2
.dbline 75
; PORTC=~(1<<(i+4));
mov R17,R20
subi R17,252 ; addi 4
ldi R16,1
xcall lsl8
mov R2,R16
com R2
out 0x15,R2
.dbline 76
; delay_1ms();
xcall _delay_1ms
.dbline 77
; PORTC|=0x30;
in R24,0x15
ori R24,48
out 0x15,R24
.dbline 78
; }
L41:
.dbline 72
inc R20
L43:
.dbline 72
cpi R20,2
brlo L40
X12:
L35:
.dbline 79
; }
L32:
L21:
L15:
.dbline 80
; }
L12:
.dbline 83
; //}
; //if(clock_start==0x00) //跑表显示,当跑表已经启动时
; if(work_state==1)
lds R24,_work_state
cpi R24,1
brne L44
X13:
.dbline 85
; //{for(j=0;j<5;j++)
; {
.dbline 86
; for(k=0;k<4;k++)
clr R20
xjmp L49
L46:
.dbline 87
; {
.dbline 88
; PORTA=seg_table[clock[k]];
ldi R24,<_clock
ldi R25,>_clock
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_seg_table
ldi R25,>_seg_table
add R30,R24
adc R31,R25
elpm R2,Z
out 0x1b,R2
.dbline 89
; PORTC=~(1<<(k+4));
mov R17,R20
subi R17,252 ; addi 4
ldi R16,1
xcall lsl8
mov R2,R16
com R2
out 0x15,R2
.dbline 90
; delay_1ms();
xcall _delay_1ms
.dbline 91
; PORTC|=0xf0;
in R24,0x15
ori R24,240
out 0x15,R24
.dbline 92
; }
L47:
.dbline 86
inc R20
L49:
.dbline 86
cpi R20,4
brlo L46
X14:
.dbline 93
; }
L44:
.dbline -2
L11:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym l j 1 c
.dbsym r i 20 c
.dbsym r k 20 c
.dbend
.dbfunc e timer0_com_isr _timer0_com_isr fV
.even
_timer0_com_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
.dbline -1
.dbline 97
; //}
; }
; void timer0_com_isr() /* 2 ms*/
; {
.dbline 98
; TIFR=0xff;
ldi R24,255
out 0x36,R24
.dbline 100
; // timer2++; //10 ms
; timer200++; //1 s,因为没有暂停的说法,所以一直加
lds R24,_timer200
lds R25,_timer200+1
adiw R24,1
sts _timer200+1,R25
sts _timer200,R24
.dbline 102
; //TCNT0=0x05;
; TCNT0=0xd7;
ldi R24,215
out 0x32,R24
.dbline 103
; if(timer200==200) //计时 1s
lds R24,_timer200
lds R25,_timer200+1
cpi R24,200
ldi R30,0
cpc R25,R30
brne L51
X18:
.dbline 104
; {
.dbline 105
; timer200=0;
clr R2
clr R3
sts _timer200+1,R3
sts _timer200,R2
.dbline 106
; time[0]++;
lds R24,_time
subi R24,255 ; addi 1
sts _time,R24
.dbline 107
; if(time[0]==10) // second 个位
cpi R24,10
brne L53
X19:
.dbline 108
; {
.dbline 109
; time[0]=0;
sts _time,R2
.dbline 110
; time[1]++;
lds R24,_time+1
subi R24,255 ; addi 1
sts _time+1,R24
.dbline 111
; if(time[1]==6) //second 十位
cpi R24,6
brne L56
X20:
.dbline 112
; {
.dbline 113
; time[1]=0;
sts _time+1,R2
.dbline 114
; time[2]++;
lds R24,_time+2
subi R24,255 ; addi 1
sts _time+2,R24
.dbline 115
; if(time[2]==10) // 分个位
cpi R24,10
brne L61
X21:
.dbline 116
; {
.dbline 117
; time[2]=0;
sts _time+2,R2
.dbline 118
; time[3]++;
lds R24,_time+3
subi R24,255 ; addi 1
sts _time+3,R24
.dbline 119
; if(time[3]==6)
cpi R24,6
brne L66
X22:
.dbline 120
; time[3]=0;
sts _time+3,R2
L66:
.dbline 121
; time[2]=0;
clr R2
sts _time+2,R2
.dbline 122
; time[1]=0;
sts _time+1,R2
.dbline 123
; time[0]=0;
sts _time,R2
.dbline 124
; } //time[2]
L61:
.dbline 125
; } //time[1]
L56:
.dbline 126
; } //time[0]
L53:
.dbline 128
;
; } // 1s
L51:
.dbline 130
;
; if(work_state==0x01&&clock_start==0) //跑表
lds R24,_work_state
cpi R24,1
brne L72
X23:
lds R2,_clock_start
tst R2
brne L72
X24:
.dbline 131
; {
.dbline 132
; timer2++;
lds R24,_timer2
subi R24,255 ; addi 1
sts _timer2,R24
.dbline 133
; if(timer2==0x02)
cpi R24,2
brne L74
X25:
.dbline 134
; {timer2=0;
.dbline 134
clr R2
sts _timer2,R2
.dbline 135
; clock[0]++;
lds R24,_clock
subi R24,255 ; addi 1
sts _clock,R24
.dbline 136
; if(clock[0]==10)
cpi R24,10
brne L76
X26:
.dbline 137
; {
.dbline 138
; clock[0]=0;
sts _clock,R2
.dbline 139
; clock[1]++;
lds R24,_clock+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -