📄 rtc.s
字号:
.module rtc.c
.area text(rom, con, rel)
.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
.area data(ram, con, rel)
.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
_i::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
.dbsym e i _i i
_j::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
.dbsym e j _j i
_k::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
.dbsym e k _k i
.area text(rom, con, rel)
.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
.dbfunc e portE_B _portE_B fV
.even
_portE_B::
.dbline -1
.dbline 31
; // **************************************************************
; // *** 广 州 天 河 双 龙 电 子 公 司 ***
; // *** http://www.sl.com.cn ***
; // *** 实验: RTC ***
; // *** 作者:zxy@sl.com.cn ***
; // *** 2006年3月28日 ***
; // *** 目标MCU:MEGA169 晶振:内部(INT)8MHZ ***
; // **************************************************************
; //此实验需具备AD转换知识
; //通过按键修改时钟值,S1为选位键,S2为增1,S4为减1
; #include <iom169v.h>
; #include <macros.h>
; //键值定义,以目标实验板际测取键值范围为准
; #define s1 (adc_old<0x03)
; //200h
; #define s2 ((adc_old>0x180)&&(adc_old<0x220))
; //2a6h
; #define s3 ((adc_old>0x290)&&(adc_old<0x2CF))
; //2fbh
; #define s4 ((adc_old>0x2D0)&&(adc_old<0x310))
; //326h
; #define s5 ((adc_old>0x310)&&(adc_old<0x345))
; extern const unsigned char seg_table[16];
; extern unsigned char led_buff[3];
; extern void delay_ms(unsigned int time);
; extern void display(void);
; unsigned int adc_rel;//AD转换结果
; unsigned int i=0,j=0,k=0;
; //E、B口初始化
; void portE_B(void)
; {
.dbline 32
; DDRE=0xff;//E、B口初始化
ldi R24,255
out 0xd,R24
.dbline 33
; PORTE=0xff;
out 0xe,R24
.dbline 34
; DDRB|=0xf0;
in R24,0x4
ori R24,240
out 0x4,R24
.dbline 35
; PORTD|=0xf0;
in R24,0xb
ori R24,240
out 0xb,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 39
; }
; //ADC初始化
; void adc_init(void)
; {
.dbline 40
; ADCSRA = 0x00; //设置前,先关闭ADC
clr R2
sts 122,R2
.dbline 41
; ADMUX =(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准,单端输入口为ADC0
ldi R24,65
sts 124,R24
.dbline 42
; ACSR =(1<<ACD);//关闭模拟比较器,禁止位P148
ldi R24,128
out 0x30,R24
.dbline 43
; ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
ldi R24,206
sts 122,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer2_init _timer2_init fV
.even
_timer2_init::
.dbline -1
.dbline 47
; }
; //定时器初始化
; void timer2_init(void)
; {
.dbline 48
; TIMSK2 = 0x00;
clr R2
sts 112,R2
.dbline 49
; ASSR = 1<<AS2; //异步时钟
ldi R24,8
sts 182,R24
.dbline 50
; TCNT2 = 0xE0; //定时时间1秒
ldi R24,224
sts 178,R24
.dbline 51
; TCCR2A = (1<<CS22)|(1<<CS21)|(1<<CS20); //分频比1024,0x07
ldi R24,7
sts 176,R24
.dbline 52
; SEI();
sei
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 76
jmp _adc_isr
.area text(rom, con, rel)
.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
.area vector(rom, abs)
.org 20
jmp _int_isr
.area text(rom, con, rel)
.dbfile C:\TDdownload\zxy\169demo\169RTC\rtc.c
.dbfunc e adc_isr _adc_isr fV
.even
_adc_isr::
st -y,R24
st -y,R25
in R24,0x3f
st -y,R24
.dbline -1
.dbline 58
; }
;
; #pragma interrupt_handler adc_isr:20 int_isr:6
; //ADC完成中断
; void adc_isr(void)
; {
.dbline 59
; adc_rel=ADC&0x3ff;
lds R24,120
lds R25,120+1
andi R25,3
sts _adc_rel+1,R25
sts _adc_rel,R24
.dbline 60
; ADMUX=(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准
ldi R24,65
sts 124,R24
.dbline 61
; ADCSRA|=(1<<ADSC);//启动AD转换
lds R24,122
ori R24,64
sts 122,R24
.dbline -2
L4:
.dbline 0 ; func end
ld R24,y+
out 0x3f,R24
ld R25,y+
ld R24,y+
reti
.dbend
.dbfunc e int_isr _int_isr fV
; n -> <dead>
.even
_int_isr::
st -y,R2
st -y,R3
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 65
; }
; //定时器中断
; void int_isr(void)
; { int n;
.dbline 66
; TCNT2 = 0xE0;
ldi R24,224
sts 178,R24
.dbline 67
; led_buff[0]=seg_table[i]; //个位
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_i
lds R31,_i+1
add R30,R24
adc R31,R25
lpm R2,Z
sts _led_buff,R2
.dbline 68
; led_buff[1]=seg_table[j]; //十位
lds R30,_j
lds R31,_j+1
add R30,R24
adc R31,R25
lpm R2,Z
sts _led_buff+1,R2
.dbline 69
; led_buff[2]=seg_table[k]; //百位
lds R30,_k
lds R31,_k+1
add R30,R24
adc R31,R25
lpm R2,Z
sts _led_buff+2,R2
.dbline 70
; i++;
lds R24,_i
lds R25,_i+1
adiw R24,1
sts _i+1,R25
sts _i,R24
.dbline 71
; if(i==10) //十进位
cpi R24,10
ldi R30,0
cpc R25,R30
brne L8
X0:
.dbline 72
; {
.dbline 73
; i=0;
clr R2
clr R3
sts _i+1,R3
sts _i,R2
.dbline 74
; j++;
lds R24,_j
lds R25,_j+1
adiw R24,1
sts _j+1,R25
sts _j,R24
.dbline 75
; if(j==6) //六进位
cpi R24,6
ldi R30,0
cpc R25,R30
brne L10
X1:
.dbline 76
; {
.dbline 77
; j=0;
sts _j+1,R3
sts _j,R2
.dbline 78
; k++;
lds R24,_k
lds R25,_k+1
adiw R24,1
sts _k+1,R25
sts _k,R24
.dbline 79
; if(k==10) //十进位
cpi R24,10
ldi R30,0
cpc R25,R30
brne L12
X2:
.dbline 80
; {i=0;j=0;k=0;}
.dbline 80
sts _i+1,R3
sts _i,R2
.dbline 80
sts _j+1,R3
sts _j,R2
.dbline 80
sts _k+1,R3
sts _k,R2
.dbline 80
L12:
.dbline 81
; }
L10:
.dbline 82
; }
L8:
.dbline -2
L5:
.dbline 0 ; func end
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R3,y+
ld R2,y+
reti
.dbsym l n 1 I
.dbend
.dbfunc e keyScan _keyScan fV
; x -> R20,R21
; x -> R20,R21
; x -> R20,R21
; x -> R20,R21
; x -> R20,R21
; x -> R20,R21
.even
_keyScan::
st -y,R20
st -y,R21
.dbline -1
.dbline 86
; }
; unsigned int adc_old;
; void keyScan(void)
; {
.dbline 87
; if(adc_old!=adc_rel) //是否有键按下
lds R2,_adc_rel
lds R3,_adc_rel+1
lds R4,_adc_old
lds R5,_adc_old+1
cp R4,R2
cpc R5,R3
breq L15
X3:
.dbline 88
; adc_old=adc_rel; //有键按下,读取键值
sts _adc_old+1,R3
sts _adc_old,R2
L15:
.dbline 89
; display();
xcall _display
xjmp L18
L17:
.dbline 91
; while(s1) //是否为S1键
; { display();
.dbline 91
xcall _display
.dbline 92
; delay_ms(200); //按键消抖25MS
ldi R16,200
ldi R17,0
xcall _delay_ms
.dbline 93
; adc_old=adc_rel; //读取键值
lds R2,_adc_rel
lds R3,_adc_rel+1
sts _adc_old+1,R3
sts _adc_old,R2
xjmp L21
L20:
.dbline 97
;
; //**********个位处理
; while(!s1) //是否为S1键,不是S1时进入等待状态,并选中个位
; {
.dbline 98
; adc_old=adc_rel;
lds R2,_adc_rel
lds R3,_adc_rel+1
sts _adc_old+1,R3
sts _adc_old,R2
.dbline 99
; TIMSK2=0x00; //屏蔽定时器中断
clr R2
sts 112,R2
.dbline 101
;
; PORTE=seg_table[i]&0x7f; //点亮个位及其小数点
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_i
lds R31,_i+1
add R30,R24
adc R31,R25
lpm R24,Z
andi R24,127
out 0xe,R24
.dbline 102
; PORTB=0xef; //点亮个位
ldi R24,239
out 0x5,R24
.dbline 103
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 104
; PORTE=seg_table[j]; //点亮十位
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_j
lds R31,_j+1
add R30,R24
adc R31,R25
lpm R2,Z
out 0xe,R2
.dbline 105
; PORTB=0XDF; //点亮十位
ldi R24,223
out 0x5,R24
.dbline 106
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 107
; PORTE=seg_table[k]; //点亮百位
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_k
lds R31,_k+1
add R30,R24
adc R31,R25
lpm R2,Z
out 0xe,R2
.dbline 108
; PORTB=0XBF; //点亮百位
ldi R24,191
out 0x5,R24
.dbline 109
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 110
; adc_old=adc_rel; //读取键值
lds R2,_adc_rel
lds R3,_adc_rel+1
sts _adc_old+1,R3
sts _adc_old,R2
.dbline 111
; if(s2) //是否为S3 ,如果是S3,个位加1
lds R2,_adc_old
lds R3,_adc_old+1
ldi R24,384
ldi R25,1
cp R24,R2
cpc R25,R3
brlo X33
xjmp L23
X33:
X4:
movw R24,R2
cpi R24,32
ldi R30,2
cpc R25,R30
brlo X34
xjmp L23
X34:
X5:
.dbline 112
; {
.dbline 114
; int x;
; for(x=50;x>0;x--) //消抖且保证LED显示正常
ldi R20,50
ldi R21,0
L25:
.dbline 115
; {
.dbline 116
; PORTE=seg_table[i]&0x7f;
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_i
lds R31,_i+1
add R30,R24
adc R31,R25
lpm R24,Z
andi R24,127
out 0xe,R24
.dbline 117
; PORTB=0xef;
ldi R24,239
out 0x5,R24
.dbline 118
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 119
; PORTE=seg_table[j];
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_j
lds R31,_j+1
add R30,R24
adc R31,R25
lpm R2,Z
out 0xe,R2
.dbline 120
; PORTB=0XDF;
ldi R24,223
out 0x5,R24
.dbline 121
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 122
; PORTE=seg_table[k];
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_k
lds R31,_k+1
add R30,R24
adc R31,R25
lpm R2,Z
out 0xe,R2
.dbline 123
; PORTB=0XBF;
ldi R24,191
out 0x5,R24
.dbline 124
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 125
; }
L26:
.dbline 114
subi R20,1
sbci R21,0
.dbline 114
clr R2
clr R3
cp R2,R20
cpc R3,R21
brge X35
xjmp L25
X35:
X6:
.dbline 126
; i++; //个位加1
lds R24,_i
lds R25,_i+1
adiw R24,1
sts _i+1,R25
sts _i,R24
.dbline 127
; if(i==10)
cpi R24,10
ldi R30,0
cpc R25,R30
brne L29
X7:
.dbline 128
; {
.dbline 129
; i=0;
sts _i+1,R3
sts _i,R2
.dbline 130
; }
L29:
.dbline 131
; }
L23:
.dbline 132
; if(s4) //是否为S4 ,如果是S4,个位减1
lds R2,_adc_old
lds R3,_adc_old+1
ldi R24,720
ldi R25,2
cp R24,R2
cpc R25,R3
brlo X36
xjmp L31
X36:
X8:
movw R24,R2
cpi R24,16
ldi R30,3
cpc R25,R30
brlo X37
xjmp L31
X37:
X9:
.dbline 133
; {int x;
.dbline 134
; for(x=50;x>0;x--) //消抖且保证LED显示正常
ldi R20,50
ldi R21,0
L33:
.dbline 135
; {
.dbline 136
; PORTE=seg_table[i]&0x7f; //点亮个位及其小数点
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_i
lds R31,_i+1
add R30,R24
adc R31,R25
lpm R24,Z
andi R24,127
out 0xe,R24
.dbline 137
; PORTB=0xef; //点亮个位
ldi R24,239
out 0x5,R24
.dbline 138
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 139
; PORTE=seg_table[j]; //点亮十位
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_j
lds R31,_j+1
add R30,R24
adc R31,R25
lpm R2,Z
out 0xe,R2
.dbline 140
; PORTB=0XDF; //点亮十位
ldi R24,223
out 0x5,R24
.dbline 141
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 142
; PORTE=seg_table[k]; //点亮百位
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_k
lds R31,_k+1
add R30,R24
adc R31,R25
lpm R2,Z
out 0xe,R2
.dbline 143
; PORTB=0XBF; //点亮百位
ldi R24,191
out 0x5,R24
.dbline 144
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 145
; }
L34:
.dbline 134
subi R20,1
sbci R21,0
.dbline 134
clr R2
clr R3
cp R2,R20
cpc R3,R21
brge X38
xjmp L33
X38:
X10:
.dbline 146
; i--; //减1
lds R24,_i
lds R25,_i+1
sbiw R24,1
sts _i+1,R25
sts _i,R24
.dbline 147
; if(i==-1)
cpi R24,255
ldi R30,255
cpc R25,R30
brne L37
X11:
.dbline 148
; {
.dbline 149
; i=9;
ldi R24,9
ldi R25,0
sts _i+1,R25
sts _i,R24
.dbline 150
; }
L37:
.dbline 151
; }
L31:
.dbline 152
; }
L21:
.dbline 96
lds R24,_adc_old
lds R25,_adc_old+1
cpi R24,3
ldi R30,0
cpc R25,R30
brlo X39
xjmp L20
X39:
X12:
.dbline 153
; delay_ms(200);
ldi R16,200
ldi R17,0
xcall _delay_ms
.dbline 154
; adc_old=adc_rel;
lds R2,_adc_rel
lds R3,_adc_rel+1
sts _adc_old+1,R3
sts _adc_old,R2
xjmp L40
L39:
.dbline 157
; //********十位处理
; while(!s1) //同上
; {
.dbline 158
; adc_old=adc_rel;
lds R2,_adc_rel
lds R3,_adc_rel+1
sts _adc_old+1,R3
sts _adc_old,R2
.dbline 159
; TIMSK2=0x00;
clr R2
sts 112,R2
.dbline 160
; PORTE=seg_table[i]; //点亮个位
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_i
lds R31,_i+1
add R30,R24
adc R31,R25
lpm R2,Z
out 0xe,R2
.dbline 161
; PORTB=0xef; //点亮个位
ldi R24,239
out 0x5,R24
.dbline 162
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 163
; PORTE=seg_table[j]&0x7f; //点亮十位及其小数点
ldi R24,<_seg_table
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -