📄 clock.s
字号:
.module clock.c
.area vector(rom, abs)
.org 12
rjmp _timer1_ovf
.org 14
rjmp _timer0_ovf
.area data(ram, con, rel)
_flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\sl279\8515\clock.c
.dbsym s flag _flag c
_dflag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\sl279\8515\clock.c
.dbsym s dflag _dflag c
.area text(rom, con, rel)
.dbfile D:\sl279\8515\clock.c
.dbfunc s receive_byte _receive_byte fI
; i -> R20
; temp -> R22
.even
_receive_byte::
rcall push_gset2
.dbline -1
.dbline 26
; /************************************************************/
; /* 广州天河双龙电子有限公司 */
; /* http://www.sl.com.cn */
; /* 电脑时钟演示程序(ICCAVR版本) */
; /* 程序作者:詹卫前 */
; /*接线方式:CS=PORTC.4 CLK=PORTC.3 DATA=PORTC.2 KEY=PORTC.1 */
; /* 处理器:AT90S8515 晶振频率:8MHZ */
; /* SL279 晶振频率:12MHZ 使用SLAVR库 */
; /************************************************************/
; #include<io8515.h>
; #include<slavr.h>
; #pragma interrupt_handler timer1_ovf:7
; #pragma interrupt_handler timer0_ovf:8
; #define setcs PORTC|=0x10;
; unsigned char flag=0;//时间刷新标志
; unsigned char dflag=0;//计数方向标志
; /* 定义结构体time */
; struct time
; {
; signed char second;
; signed char minute;
; signed char hour;
; } time;
; /* 字节接收函数 */
; unsigned char receive_byte(void)
; {
.dbline 27
; unsigned char i,temp=0;
clr R22
.dbline 28
; DDRC&=0xfb;
in R24,0x14
andi R24,251
out 0x14,R24
.dbline 29
; delay_us(90);
ldi R16,90
ldi R17,0
rcall _delay_us
.dbline 30
; for(i=0;i<8;i++)
clr R20
rjmp L5
L2:
.dbline 31
; {
.dbline 32
; temp=temp<<1;
lsl R22
.dbline 33
; PORTC|=0x08;//clk=1
sbi 0x15,3
.dbline 34
; delay_us(10);
ldi R16,10
ldi R17,0
rcall _delay_us
.dbline 35
; if((PINC&0x04)!=0)
sbis 0x13,2
rjmp L6
.dbline 36
; temp|=0x01;
ori R22,1
L6:
.dbline 37
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 38
ldi R16,10
ldi R17,0
rcall _delay_us
.dbline 39
L3:
.dbline 30
inc R20
L5:
.dbline 30
cpi R20,8
brlo L2
.dbline 40
; PORTC&=0xf7;//clk=0
; delay_us(10);
; }
; DDRC|=0x04;
sbi 0x14,2
.dbline 41
; return temp;
mov R16,R22
clr R17
.dbline -2
L1:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r temp 22 c
.dbfunc s send_byte _send_byte fI
; i -> R20
; para -> R22
.even
_send_byte::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 45
; }
; /* 字节发送函数 */
; void send_byte(unsigned char para)
; {
.dbline 47
; unsigned char i;
; PORTC&=0xef;//cs=0
in R24,0x15
andi R24,239
out 0x15,R24
.dbline 48
; delay_us(90);
ldi R16,90
ldi R17,0
rcall _delay_us
.dbline 49
; for(i=0;i<8;i++)
clr R20
rjmp L12
L9:
.dbline 50
; {
.dbline 51
; if((para&0x80)==0x80)
mov R24,R22
andi R24,128
cpi R24,128
brne L13
.dbline 52
; PORTC|=0x04;//data=1
sbi 0x15,2
rjmp L14
L13:
.dbline 54
; else
; PORTC&=0xfb;//data=0
in R24,0x15
andi R24,251
out 0x15,R24
L14:
.dbline 55
sbi 0x15,3
.dbline 56
ldi R16,10
ldi R17,0
rcall _delay_us
.dbline 57
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 58
ldi R16,10
ldi R17,0
rcall _delay_us
.dbline 59
lsl R22
.dbline 60
L10:
.dbline 49
inc R20
L12:
.dbline 49
cpi R20,8
brlo L9
.dbline -2
.dbline 61
; PORTC|=0x08;//clk=1
; delay_us(10);
; PORTC&=0xf7;//clk=0
; delay_us(10);
; para=para<<1;
; }
; }
L8:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r para 22 c
.dbfunc s write279 _write279 fI
; cmd2 -> R20
; cmd1 -> R22
.even
_write279::
rcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 64
; /* 写sl279双字节命令 */
; void write279(unsigned char cmd1, unsigned char cmd2)
; {
.dbline 65
; send_byte (cmd1);
mov R16,R22
rcall _send_byte
.dbline 66
; send_byte (cmd2);
mov R16,R20
rcall _send_byte
.dbline 67
; PORTC|=0x10;
sbi 0x15,4
.dbline -2
.dbline 68
; }
L15:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r cmd2 20 c
.dbsym r cmd1 22 c
.dbfunc s initdis _initdis fI
.area func_lit(rom, con, rel)
L59:
.word `L56
.word `L53
.word `L61
.word `L48
.word `L43
.word `L61
.word `L31
.word `L26
.area text(rom, con, rel)
.dbfile D:\sl279\8515\clock.c
; i -> R10
; key -> R20
.even
_initdis::
rcall push_gset5
.dbline -1
.dbline 71
; /*在启动时设置时间,按shift键后进入计时状态*/
; void initdis()
; {
.dbline 72
; unsigned char i=7;
ldi R24,7
mov R10,R24
.dbline 73
; unsigned char key=0;
clr R20
.dbline 74
; write279(0xc8,0);
clr R18
ldi R16,200
rcall _write279
.dbline 75
; write279(0xc9,0);
clr R18
ldi R16,201
rcall _write279
.dbline 76
; write279(0x92,1);
ldi R18,1
ldi R16,146
rcall _write279
.dbline 77
; write279(0xcb,0);
clr R18
ldi R16,203
rcall _write279
.dbline 78
; write279(0xcc,0);
clr R18
ldi R16,204
rcall _write279
.dbline 79
; write279(0x95,1);
ldi R18,1
ldi R16,149
rcall _write279
.dbline 80
; write279(0xce,0);
clr R18
ldi R16,206
rcall _write279
.dbline 81
; write279(0xcf,0);
clr R18
ldi R16,207
rcall _write279
.dbline 82
; write279(0x88,0x7f);
ldi R18,127
ldi R16,136
rcall _write279
.dbline 84
; do
; {
L20:
.dbline 86
L21:
.dbline 85
; while((PINC&0x02)!=0)
sbic 0x13,1
rjmp L20
.dbline 87
; ;
; send_byte(0x15);
ldi R16,21
rcall _send_byte
.dbline 88
; key=receive_byte();
rcall _receive_byte
mov R2,R16
mov R3,R17
mov R20,R2
.dbline 89
; setcs;
sbi 0x15,4
.dbline 89
.dbline 90
; switch (i)
mov R22,R10
clr R23
cpi R22,0
ldi R30,0
cpc R23,R30
brge X1
rjmp L61
X1:
ldi R24,7
ldi R25,0
cp R24,R22
cpc R25,R23
brge X2
rjmp L61
X2:
ldi R24,<L59
ldi R25,>L59
mov R16,R22
mov R17,R23
lsl R16
rol R17
add R16,R24
adc R17,R25
rcall lpm16
mov R30,R16
mov R31,R17
ijmp
X0:
.dbline 91
; {
L26:
.dbline 92
; case 7:{
.dbline 93
; if(key<3)
cpi R20,3
brlo X3
rjmp L61
X3:
.dbline 94
; {
.dbline 95
; write279(0xc8+i,key);
mov R18,R20
mov R16,R10
subi R16,56 ; addi 200
rcall _write279
.dbline 96
; i--;
dec R10
.dbline 97
; write279(0x88,0xbf);
ldi R18,191
ldi R16,136
rcall _write279
.dbline 98
; time.hour=time.hour%10+key*10;
ldi R16,10
mov R17,R20
rcall mpy8s
mov R2,R16
ldi R17,10
lds R16,_time+2
rcall mod8s
mov R3,R16
add R3,R2
sts _time+2,R3
.dbline 99
; }
.dbline 100
; break;
rjmp L61
L31:
.dbline 102
; }
; case 6:{
.dbline 103
; if(key<10)
cpi R20,10
brlo X4
rjmp L61
X4:
.dbline 104
; {
.dbline 105
; if((time.hour<20)|(key<4))
lds R24,_time+2
cpi R24,20
brge L37
ldi R24,1
ldi R25,0
mov R14,R24
mov R15,R25
rjmp L38
L37:
clr R14
clr R15
L38:
cpi R20,4
brsh L39
ldi R24,1
ldi R25,0
mov R12,R24
mov R13,R25
rjmp L40
L39:
clr R12
clr R13
L40:
mov R2,R14
mov R3,R15
or R2,R12
or R3,R13
tst R2
brne X5
tst R3
brne X6
rjmp L61
X6:
X5:
.dbline 106
; {
.dbline 107
; write279(0xc8+i,key);
mov R18,R20
mov R16,R10
subi R16,56 ; addi 200
rcall _write279
.dbline 108
; i--;
dec R10
.dbline 109
; i--;
dec R10
.dbline 110
; write279(0x88,0xef);
ldi R18,239
ldi R16,136
rcall _write279
.dbline 111
; time.hour=(time.hour/10)*10+key;
ldi R17,10
lds R16,_time+2
rcall div8s
mov R17,R16
ldi R16,10
rcall mpy8s
mov R2,R16
add R2,R20
sts _time+2,R2
.dbline 112
; }
.dbline 113
; }
.dbline 114
; break;
rjmp L61
L43:
.dbline 116
; }
; case 4:{
.dbline 117
; if(key<6)
cpi R20,6
brlo X7
rjmp L61
X7:
.dbline 118
; {
.dbline 119
; write279(0xc8+i,key);
mov R18,R20
mov R16,R10
subi R16,56 ; addi 200
rcall _write279
.dbline 120
; i--;
dec R10
.dbline 121
; write279(0x88,0xf7);
ldi R18,247
ldi R16,136
rcall _write279
.dbline 122
; time.minute=time.minute%10+key*10;
ldi R16,10
mov R17,R20
rcall mpy8s
mov R2,R16
ldi R17,10
lds R16,_time+1
rcall mod8s
mov R3,R16
add R3,R2
sts _time+1,R3
.dbline 123
; }
.dbline 124
; break;
rjmp L61
L48:
.dbline 126
; }
; case 3:{
.dbline 127
; if(key<10)
cpi R20,10
brlo X8
rjmp L61
X8:
.dbline 128
; {
.dbline 129
; write279(0xc8+i,key);
mov R18,R20
mov R16,R10
subi R16,56 ; addi 200
rcall _write279
.dbline 130
; i--;
dec R10
.dbline 131
; i--;
dec R10
.dbline 132
; write279(0x88,0xfd);
ldi R18,253
ldi R16,136
rcall _write279
.dbline 133
; time.minute=(time.minute/10)*10+key;
ldi R17,10
lds R16,_time+1
rcall div8s
mov R17,R16
ldi R16,10
rcall mpy8s
mov R2,R16
add R2,R20
sts _time+1,R2
.dbline 134
; }
.dbline 135
; break;
rjmp L61
L53:
.dbline 137
; }
; case 1:{
.dbline 138
; if(key<6)
cpi R20,6
brsh L61
.dbline 139
; {
.dbline 140
; write279(0xc8+i,key);
mov R18,R20
mov R16,R10
subi R16,56 ; addi 200
rcall _write279
.dbline 141
; i--;
dec R10
.dbline 142
; write279(0x88,0xfe);
ldi R18,254
ldi R16,136
rcall _write279
.dbline 143
; time.second=time.second%10+key*10;
ldi R16,10
mov R17,R20
rcall mpy8s
mov R2,R16
ldi R17,10
lds R16,_time
rcall mod8s
mov R3,R16
add R3,R2
sts _time,R3
.dbline 144
; }
.dbline 145
; break;
rjmp L61
L56:
.dbline 147
; }
; case 0:{
.dbline 148
; if(key<10)
cpi R20,10
brsh L61
.dbline 149
; {
.dbline 150
; write279(0xc8+i,key);
mov R18,R20
mov R16,R10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -