📄 main.s
字号:
.module main.c
.area data(ram, con, rel)
_BitTab::
.blkb 2
.area idata
.byte 254,253
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 251,247
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
.dbsym e BitTab _BitTab A[4:4]c
_DispTab::
.blkb 2
.area idata
.byte 63,6
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
.blkb 2
.area idata
.byte 91,'O
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
.blkb 2
.area idata
.byte 'f,'m
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
.blkb 2
.area idata
.byte 125,7
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
.blkb 2
.area idata
.byte 127,'o
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
.dbsym e DispTab _DispTab A[10:10]c
.area text(rom, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
.dbfunc e INT0_Init _INT0_Init fV
.even
_INT0_Init::
.dbline -1
.dbline 51
; /****************************************Copyright (c)**************************************************
; ** ADEmbed Development Co.,LTD.
; ** http://www.adembed.com
; **--------------File Info-------------------------------------------------------------------------------
; ** File name: main.c
; ** Last modified Date: 2008-12-13
; ** Last Version: 1.0
; ** Descriptions: Nixie Light Test.
; **
; **------------------------------------------------------------------------------------------------------
; ** Created by: junbolu
; ** Created date: 2008-12-13
; ** Version: 1.0
; ** Descriptions:
; **
; **------------------------------------------------------------------------------------------------------
; ** Modified by:
; ** Modified date:
; ** Version:
; ** Descriptions:
; **
; **------------------------------------------------------------------------------------------------------
; **ICC-AVR application builder : 2008-12-13
; **Target : M16
; **Crystal: 7.3728Mhz
; **PA0~PA7口接LED的段码
; **PB0~PB3口接LED的位选
; **描述:这是一个秒表实验,最大支持99.99秒。由按键K0完成启动计时和停止计时。
; **涉及知识点:
; ** T/C0的CTC工作模式
; ** INT0的下降沿中断工作模式
; *******************************************************************************************************/
; #include<iom16v.h>
; #include<macros.h>
;
; #define fose 7372800
;
; #define START 0
; #define STOP 1
; #define CLEAR 3
; unsigned char Nixie_State;
; unsigned int time_10ms;
; unsigned char DISP_NUM; //显示的位数
; unsigned char BitTab[]={0xFE,0xFD,0xFB,0xF7}; //三位位选码
; unsigned char DispTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //LED字形码
; unsigned char DISP_DATA[4]; //显示的数字
;
; void Display(void);
;
; void INT0_Init()
; {
.dbline 52
; GIFR |=0X40; //清楚标志位
in R24,0x3a
ori R24,64
out 0x3a,R24
.dbline 54
; //MCUCR|=0X03; //上升沿触发中断
; MCUCR|=0X02;MCUCR&=~0X01; //下降沿触发中断
in R24,0x35
ori R24,2
out 0x35,R24
.dbline 54
in R24,0x35
andi R24,254
out 0x35,R24
.dbline 55
; GICR |=0X40; //使能外部中断0
in R24,0x3b
ori R24,64
out 0x3b,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 4
jmp _int0_isr
.area text(rom, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
.dbfunc e int0_isr _int0_isr fV
.even
_int0_isr::
st -y,R2
st -y,R3
st -y,R24
in R2,0x3f
st -y,R2
.dbline -1
.dbline 60
; }
;
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void)
; {
.dbline 62
;
; if((PIND&0x04)!=0x00) //读取按键状态
sbis 0x10,2
rjmp L3
.dbline 63
; {
.dbline 64
; return;
xjmp L2
L3:
.dbline 66
; }
; if(Nixie_State ==STOP)
lds R24,_Nixie_State
cpi R24,1
brne L5
.dbline 67
; {
.dbline 68
; time_10ms = 0;
clr R2
clr R3
sts _time_10ms+1,R3
sts _time_10ms,R2
.dbline 69
; Nixie_State = START;
sts _Nixie_State,R2
.dbline 70
; }
xjmp L6
L5:
.dbline 72
.dbline 73
ldi R24,1
sts _Nixie_State,R24
.dbline 74
L6:
.dbline -2
L2:
ld R2,y+
out 0x3f,R2
ld R24,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e Display _Display fV
.even
_Display::
.dbline -1
.dbline 81
; else
; {
; Nixie_State = STOP;
; }
;
; }
;
; //显示函数,DISP_NUM决定显示哪个LED
; //采用共阴LED动态显示方法,定时中断函数里面调用
; void Display(void)
; {
.dbline 82
; PORTA=0x00; //清除显示再位选
clr R2
out 0x1b,R2
.dbline 83
; PORTB=BitTab[DISP_NUM]; //PB口接位选
ldi R24,<_BitTab
ldi R25,>_BitTab
lds R30,_DISP_NUM
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x18,R2
.dbline 84
; PORTA=DispTab[DISP_DATA[DISP_NUM]]; //PA口接LED的段码
ldi R24,<_DISP_DATA
ldi R25,>_DISP_DATA
lds R30,_DISP_NUM
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_DispTab
ldi R25,>_DispTab
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x1b,R2
.dbline 86
;
; if(DISP_NUM==1)
lds R24,_DISP_NUM
cpi R24,1
brne L8
.dbline 87
; PORTA|=0x80; //PA口接LED的段码
sbi 0x1b,7
L8:
.dbline 89
lds R24,_DISP_NUM
subi R24,255 ; addi 1
sts _DISP_NUM,R24
.dbline 90
cpi R24,4
brne L10
.dbline 91
clr R2
sts _DISP_NUM,R2
L10:
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 76
jmp _timer0comp
.area text(rom, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
.dbfunc e timer0comp _timer0comp fV
.even
_timer0comp::
xcall push_lset
.dbline -1
.dbline 96
;
; DISP_NUM++; //先显示低位,再显示高位
; if(DISP_NUM==4)
; DISP_NUM=0;
; }
;
; #pragma interrupt_handler timer0comp:20
; void timer0comp (void)
; {
.dbline 97
; if(Nixie_State == START)
lds R2,_Nixie_State
tst R2
brne L13
.dbline 98
; {
.dbline 99
; if(time_10ms<9999)
lds R24,_time_10ms
lds R25,_time_10ms+1
cpi R24,15
ldi R30,39
cpc R25,R30
brsh L15
.dbline 100
; {
.dbline 101
; time_10ms++;
adiw R24,1
sts _time_10ms+1,R25
sts _time_10ms,R24
.dbline 102
; }
L15:
.dbline 103
; }
L13:
.dbline 107
;
;
;
; DISP_DATA[0]=time_10ms/1000;
ldi R18,1000
ldi R19,3
lds R16,_time_10ms
lds R17,_time_10ms+1
xcall div16u
sts _DISP_DATA,R16
.dbline 108
; DISP_DATA[1]=(time_10ms/100)-(DISP_DATA[0]*10);
mov R2,R16
ldi R24,10
mul R24,R2
movw R2,R0
ldi R18,100
ldi R19,0
lds R16,_time_10ms
lds R17,_time_10ms+1
xcall div16u
movw R4,R16
sub R4,R2
sbc R5,R3
sts _DISP_DATA+1,R4
.dbline 109
; DISP_DATA[3]=time_10ms%10;
ldi R18,10
ldi R19,0
lds R16,_time_10ms
lds R17,_time_10ms+1
xcall mod16u
sts _DISP_DATA+3,R16
.dbline 110
; DISP_DATA[2]=((time_10ms%100)-DISP_DATA[3])/10;
ldi R18,100
ldi R19,0
lds R16,_time_10ms
lds R17,_time_10ms+1
xcall mod16u
movw R2,R16
lds R4,_DISP_DATA+3
clr R5
sub R2,R4
sbc R3,R5
ldi R18,10
ldi R19,0
movw R16,R2
xcall div16u
sts _DISP_DATA+2,R16
.dbline 112
;
; Display();
xcall _Display
.dbline -2
L12:
xcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 116
; }
;
; void main(void)
; {
.dbline 117
; DDRA=0XFF;
ldi R24,255
out 0x1a,R24
.dbline 118
; PORTA=0X00;
clr R2
out 0x1b,R2
.dbline 119
; DDRB=0X0F;
ldi R24,15
out 0x17,R24
.dbline 120
; PORTB=0X00;
out 0x18,R2
.dbline 123
;
; //按键0端口初始化
; DDRD &=~0x04; //设置PD2为输入
cbi 0x11,2
.dbline 124
; PORTD|=0x04; //设置PD2为上拉
sbi 0x12,2
.dbline 126
;
; INT0_Init(); //TART初始化
xcall _INT0_Init
.dbline 129
;
; //t/c0初始化(10ms)
; TCCR0=0X0d;
ldi R24,13
out 0x33,R24
.dbline 130
; TCNT0=0X00;
clr R2
out 0x32,R2
.dbline 131
; OCR0=0X48;
ldi R24,72
out 0x3c,R24
.dbline 132
; TIMSK=0X02;
ldi R24,2
out 0x39,R24
.dbline 134
;
; time_10ms=0;
clr R3
sts _time_10ms+1,R3
sts _time_10ms,R2
.dbline 137
;
; //asm("sei");
; SEI(); //全局中断使能
sei
.dbline 139
;
; Nixie_State = STOP;
ldi R24,1
sts _Nixie_State,R24
.dbline 140
; for(;;)
L22:
.dbline 141
.dbline 143
.dbline 140
.dbline 140
xjmp L22
X0:
.dbline -2
L21:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\数码管秒表系统\main.c
_DISP_DATA::
.blkb 4
.dbsym e DISP_DATA _DISP_DATA A[4:4]c
_DISP_NUM::
.blkb 1
.dbsym e DISP_NUM _DISP_NUM c
_time_10ms::
.blkb 2
.dbsym e time_10ms _time_10ms i
_Nixie_State::
.blkb 1
.dbsym e Nixie_State _Nixie_State c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -