📄 funcs.s
字号:
; Delayus(10);
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 92
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
cbi 0x18,7
.dbline 93
; Delayus(10);
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 94
; DS1302_writeB(data); //写入数据
mov R16,R20
xcall _DS1302_writeB
.dbline 95
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
cbi 0x18,7
.dbline 96
; Delayus(10); //调整片选脉冲
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 97
; PORTC&=~BIT(RTC_CS); //拉低片选端
cbi 0x15,7
.dbline -2
.dbline 98
; }
L32:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbsym r addr 22 c
.dbend
.dbfunc e DS1302_readD _DS1302_readD fc
; data -> R20
; addr -> R20
.even
_DS1302_readD::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 106
; /*******************************************
; 函数名称: DS1302_readD
; 功 能: 从DS1302的某个地址读出一个字节数据
; 参 数: addr--地址值(寄存器或RAM)
; 返回值 : data--读出的数据
; /********************************************/
; uchar DS1302_readD(uchar addr)
; {
.dbline 108
; uchar data;
; PORTC&=~BIT(RTC_CS); //拉低片选端
cbi 0x15,7
.dbline 109
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
cbi 0x18,7
.dbline 110
; Delayus(10);
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 111
; PORTC|=BIT(RTC_CS); //拉高片选端
sbi 0x15,7
.dbline 112
; Delayus(10); //调整片选脉冲
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 113
; DS1302_writeB(addr); //写入操作命令(地址)
mov R16,R20
xcall _DS1302_writeB
.dbline 114
; Delayus(10);
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 115
; data=DS1302_readB(); //读出数据
xcall _DS1302_readB
mov R20,R16
.dbline 116
; Delayus(10);
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 117
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
cbi 0x18,7
.dbline 118
; PORTC&=~BIT(RTC_CS); //拉低片选端
cbi 0x15,7
.dbline 119
; return data; //返回读出的数据
mov R16,R20
.dbline -2
L33:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbsym r addr 20 c
.dbend
.dbfunc e DS1302_getT _DS1302_getT fV
; addr -> R20
; i -> R22
; time -> R10,R11
.even
_DS1302_getT::
xcall push_gset3
movw R10,R16
.dbline -1
.dbline 128
; }
; /*******************************************
; 函数名称: DS1302_getT
; 功 能: 读取DS1302的当前时间的时、分、秒
; 参 数: time[]--读取的时间数组
; 返回值 : 无
; /********************************************/
; void DS1302_getT(INT8U time[])
; {
.dbline 130
; uchar i;
; uchar addr = 0x80; //读取地址从秒寄存器开始
ldi R20,128
.dbline 131
; for(i=0;i<3;i++)
clr R22
xjmp L38
L35:
.dbline 132
.dbline 133
mov R16,R20
ori R16,1
xcall _DS1302_readD
ldi R24,2
mul R24,R22
movw R30,R0
add R30,R10
adc R31,R11
std z+0,R16
.dbline 134
subi R20,254 ; addi 2
.dbline 135
L36:
.dbline 131
inc R22
L38:
.dbline 131
cpi R22,3
brlo L35
.dbline 136
; {
; time[i*2]=DS1302_readD(addr|RD); // 秒 分 时 日 月 星期 年
; addr+=2;
; }
; PORTB&=~BIT(RTC_CLK); //拉低时钟端(时钟端在不操作时为低)
cbi 0x18,7
.dbline -2
.dbline 137
; }
L34:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r addr 20 c
.dbsym r i 22 c
.dbsym r time 10 pc
.dbend
.dbfunc e One_smg_display _One_smg_display fV
; number -> R20
; data -> R22
.even
_One_smg_display::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 147
;
; /*******************************************
; 函数名称: One_smg_display
; 功 能: 指定的数码管显示指定的内容
; 参 数: data--显示的内容(0-15)
; number--指定的数码管(1-6)
; 返回值 : 无
; /********************************************/
; void One_smg_display(uchar data,uchar number)
; {
.dbline 148
; PORTB|=0x3F; //输出位选
in R24,0x18
ori R24,63
out 0x18,R24
.dbline 149
; PORTA|=BIT(BITLK); //更新位选
sbi 0x1b,4
.dbline 151
; //Delayus(50); //调整时序
; PORTA&=~BIT(BITLK); //锁存位选
cbi 0x1b,4
.dbline 153
;
; PORTB=SEGMENT[data]; //输出段选
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_SEGMENT
ldi R25,>_SEGMENT
add R30,R24
adc R31,R25
lpm R0,Z+
lpm R1,Z
movw R30,R0
out 0x18,R30
.dbline 154
; PORTA|=BIT(SEGLK); //更新段选
sbi 0x1b,3
.dbline 156
; //Delayus(50); //调整时序
; PORTA&=~BIT(SEGLK); //锁存段选
cbi 0x1b,3
.dbline 158
;
; number=~BIT(number-1); //调整位选(指定时是1~6,而操作的时候是0~5)
mov R17,R20
subi R17,1
ldi R16,1
xcall lsl8
mov R20,R16
com R20
.dbline 159
; PORTB=number; //输出位选
out 0x18,R20
.dbline 160
; PORTA|=BIT(BITLK); //更新位选
sbi 0x1b,4
.dbline 162
; //Delayus(50); //调整时序
; PORTA&=~BIT(BITLK); //锁存位选
cbi 0x1b,4
.dbline -2
.dbline 163
; }
L39:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r number 20 c
.dbsym r data 22 c
.dbend
.dbfunc e All_smg_display _All_smg_display fV
; i -> R20
; pdata -> R22,R23
.even
_All_smg_display::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 171
; /*******************************************
; 函数名称: All_smg_display
; 功 能: 6个数码管显示指定的内容
; 参 数: *pdata--显示内容数组地址
; 返回值 : 无
; /********************************************/
; void All_smg_display(uchar *pdata)
; {
.dbline 173
; uchar i;
; for(i=0;i<6;i++)
clr R20
xjmp L44
L41:
.dbline 174
.dbline 175
mov R18,R20
subi R18,255 ; addi 1
mov R2,R20
clr R3
ldi R30,5
ldi R31,0
sub R30,R2
sbc R31,R3
add R30,R22
adc R31,R23
ldd R16,z+0
xcall _One_smg_display
.dbline 176
ldi R16,3
ldi R17,0
xcall _Delayms
.dbline 177
L42:
.dbline 173
inc R20
L44:
.dbline 173
cpi R20,6
brlo L41
.dbline -2
.dbline 178
; {
; One_smg_display(pdata[5-i],i+1);
; Delayms(3);
; }
; }
L40:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r pdata 22 pc
.dbend
.dbfunc e One_led _One_led fV
; i -> <dead>
; light -> R22
; number -> R20
.even
_One_led::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 188
;
; /*******************************************
; 函数名称: One_led
; 功 能: 点亮或者熄灭指定的LED
; 参 数: number--指定的LED
; light--为TRUE的时候为点亮LED,为FALSE的时候为熄灭LED
; 返回值 : 无
; /********************************************/
; void One_led(uchar number,uchar light)
; {
.dbline 190
; uchar i;
; if(light==TRUE) //点亮操作
cpi R22,1
brne L46
.dbline 191
; {
.dbline 192
; PORTB&=~BIT(number); //输出数据
ldi R16,1
mov R17,R20
xcall lsl8
mov R2,R16
com R2
in R3,0x18
and R3,R2
out 0x18,R3
.dbline 193
; PORTA|=BIT(LEDLK); //更新数据
sbi 0x1b,2
.dbline 195
; //Delayms(5); //调整时序
; PORTA&=~BIT(LEDLK); //锁存数据
cbi 0x1b,2
.dbline 196
; }
xjmp L47
L46:
.dbline 198
.dbline 199
ldi R16,1
mov R17,R20
xcall lsl8
in R2,0x18
or R2,R16
out 0x18,R2
.dbline 200
sbi 0x1b,2
.dbline 202
cbi 0x1b,2
.dbline 203
L47:
.dbline -2
.dbline 204
; else
; {
; PORTB|=BIT(number); //输出数据
; PORTA|=BIT(LEDLK); //更新数据
; //Delayms(5); //调整时序
; PORTA&=~BIT(LEDLK); //锁存数据
; }
; }
L45:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l i 1 c
.dbsym r light 22 c
.dbsym r number 20 c
.dbend
.dbfunc e All_led _All_led fV
; light -> R16
.even
_All_led::
.dbline -1
.dbline 212
; /*******************************************
; 函数名称: All_led
; 功 能: 点亮或者熄灭全部LED
; 参 数: light--为TRUE的时候为点亮全部LED,为FALSE的时候为熄灭全部LED
; 返回值 : 无
; /********************************************/
; void All_led(uchar light)
; {
.dbline 213
; if(light)
tst R16
breq L49
.dbline 214
; {
.dbline 215
; PORTB&=~ALLLED;
in R24,0x18
andi R24,0
out 0x18,R24
.dbline 216
; PORTA|=BIT(LEDLK);
sbi 0x1b,2
.dbline 218
; //Delayms(5);
; PORTA&=~BIT(LEDLK);
cbi 0x1b,2
.dbline 219
; }
xjmp L50
L49:
.dbline 221
.dbline 222
in R24,0x18
ori R24,255
out 0x18,R24
.dbline 223
sbi 0x1b,2
.dbline 225
cbi 0x1b,2
.dbline 226
L50:
.dbline -2
.dbline 227
; else
; {
; PORTB|=ALLLED;
; PORTA|=BIT(LEDLK);
; //Delayms(5);
; PORTA&=~BIT(LEDLK);
; }
; }
L48:
.dbline 0 ; func end
ret
.dbsym r light 16 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -