📄 main.s
字号:
.module main.c
.area lit(rom, con, rel)
_tab::
.byte 63,6
.byte 91,'O
.byte 'f,'m
.byte 125,7
.byte 127,'o
.dbfile D:\YM200\内部EEPROM\main.c
.dbsym e tab _tab A[10:10]kc
.area data(ram, con, rel)
.dbfile D:\YM200\内部EEPROM\main.c
_buff::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\YM200\内部EEPROM\main.c
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\YM200\内部EEPROM\main.c
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\YM200\内部EEPROM\main.c
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\YM200\内部EEPROM\main.c
.dbsym e buff _buff A[8:8]c
.area text(rom, con, rel)
.dbfile D:\YM200\内部EEPROM\main.c
.dbfunc e delay _delay fV
; x -> R16,R17
.even
_delay::
.dbline -1
.dbline 24
; /*内部EEPROM读写实验,本实验涉及数码管串行显示,建议在掌握数码管串行显示的
; 基础上,来学习本例程。本实验可记录系统启动次数,每启动一次,数码管显示数据
; 加一,此数据保存于ATmega16内部EEPROM中。*/
; #include <iom16v.h>
; #include <macros.h>
; #include <led.h>
;
; #define uchar unsigned char
; #define uint unsigned int
;
; const uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段码
; uchar buff[8]={0,0,0,0,0,0,0,0}; //8位显示缓冲区
;
;
; extern void EEPROM_write(unsigned int addr, unsigned char dd);
; extern void EEPROM_read(unsigned int addr,unsigned char *dd);
;
; /*-------------------------------------------------------------------
; delay :短延时函数
; 输入参数 x :粗略延时,x越大,延时越长
; 输出参数 :无
; --------------------------------------------------------------------*/
; void delay(unsigned int x)
; {
L2:
.dbline 25
L3:
.dbline 25
; while(x--);
movw R2,R16
subi R16,1
sbci R17,0
tst R2
brne L2
tst R3
brne L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r x 16 i
.dbend
.dbfunc e L_delay _L_delay fV
; y -> R20,R21
.even
_L_delay::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 33
; }
; /*------------------------------------------------------------------
; L_delay :长延时函数
; 输入参数 y :粗略延时,y越大,延时越长
; 输出参数 :无
; --------------------------------------------------------------------*/
; void L_delay(unsigned int y)
; {
xjmp L7
L6:
.dbline 34
ldi R16,65000
ldi R17,253
xcall _delay
L7:
.dbline 34
; while(y--) delay(65000);
movw R2,R20
subi R20,1
sbci R21,0
tst R2
brne L6
tst R3
brne L6
X1:
.dbline -2
L5:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r y 20 i
.dbend
.dbfunc e PORT_init _PORT_init fV
.even
_PORT_init::
.dbline -1
.dbline 42
; }
; /*-----------------------------------------------------------
; PORT_init :端口初始化函数
; 输入参数 :无
; 输出参数 :无
; ------------------------------------------------------------*/
; void PORT_init(void)
; {
.dbline 43
; LED_DATA_DDR|=LED_NCS|LED_SCK|LED_MOSI; //设置为输出
in R24,0x1a
ori R24,28
out 0x1a,R24
.dbline 44
; LED_SEL_DDR |=LED_SELA|LED_SELB|LED_SELC; //设置为输出
in R24,0x1a
ori R24,224
out 0x1a,R24
.dbline 46
;
; LED_DATA_PORT&=~(LED_NCS|LED_SCK|LED_MOSI); //输出0
in R24,0x1b
andi R24,227
out 0x1b,R24
.dbline 47
; LED_SEL_PORT &=~(LED_SELA|LED_SELB|LED_SELC); //输出0
in R24,0x1b
andi R24,31
out 0x1b,R24
.dbline 49
;
; PORTC=0xff;
ldi R24,255
out 0x15,R24
.dbline 50
; DDRC=0x00;
clr R2
out 0x14,R2
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbend
.dbfunc e disp _disp fV
; i -> R20
; aa -> R22
; j -> R10
.even
_disp::
xcall push_gset3
.dbline -1
.dbline 58
; }
; /*-----------------------------------------------------------
; disp :数码管显示函数
; 输入参数 :无
; 输出参数 :无
; ------------------------------------------------------------*/
; void disp(void)
; {
.dbline 61
; uchar aa,i,j;
;
; for(i=0;i<8;i++)
clr R20
xjmp L14
L11:
.dbline 62
; {
.dbline 63
; aa=~tab[buff[7-i]];
mov R2,R20
clr R3
ldi R30,7
ldi R31,0
sub R30,R2
sbc R31,R3
ldi R24,<_buff
ldi R25,>_buff
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_tab
ldi R25,>_tab
add R30,R24
adc R31,R25
lpm R22,Z
com R22
.dbline 64
; for(j=0;j<8;j++)
clr R10
xjmp L18
L15:
.dbline 65
; {
.dbline 66
; if((aa&0x80)!=0) LED_DATA_PORT|=LED_MOSI;
sbrs R22,7
rjmp L19
.dbline 66
sbi 0x1b,4
xjmp L20
L19:
.dbline 67
; else LED_DATA_PORT&=~LED_MOSI;
cbi 0x1b,4
L20:
.dbline 68
sbi 0x1b,3
.dbline 69
cbi 0x1b,3
.dbline 70
lsl R22
.dbline 71
L16:
.dbline 64
inc R10
L18:
.dbline 64
mov R24,R10
cpi R24,8
brlo L15
.dbline 72
; LED_DATA_PORT|=LED_SCK;
; LED_DATA_PORT&=~LED_SCK; //产生移位信号
; aa=(aa<<1);
; }
; LED_SEL_PORT&=0x1f;
in R24,0x1b
andi R24,31
out 0x1b,R24
.dbline 73
; LED_SEL_PORT+=(i<<5); //74HC138译码
mov R2,R20
lsl R2
lsl R2
lsl R2
lsl R2
lsl R2
in R3,0x1b
add R3,R2
out 0x1b,R3
.dbline 75
;
; LED_DATA_PORT|= LED_NCS;
sbi 0x1b,2
.dbline 76
; LED_DATA_PORT&=~LED_NCS; //数据输出到并行口上
cbi 0x1b,2
.dbline 78
;
; delay(2000);
ldi R16,2000
ldi R17,7
xcall _delay
.dbline 79
; for(j=0;j<8;j++) //使输出置1
clr R10
xjmp L24
L21:
.dbline 80
.dbline 81
sbi 0x1b,4
.dbline 82
sbi 0x1b,3
.dbline 83
cbi 0x1b,3
.dbline 84
L22:
.dbline 79
inc R10
L24:
.dbline 79
mov R24,R10
cpi R24,8
brlo L21
.dbline 85
sbi 0x1b,2
.dbline 86
cbi 0x1b,2
.dbline 87
L12:
.dbline 61
inc R20
L14:
.dbline 61
cpi R20,8
brsh X2
xjmp L11
X2:
.dbline -2
L10:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r aa 22 c
.dbsym r j 10 c
.dbend
.dbfunc e main _main fV
; aa -> y+0
.even
_main::
sbiw R28,1
.dbline -1
.dbline 95
; {
; LED_DATA_PORT|=LED_MOSI;
; LED_DATA_PORT|=LED_SCK;
; LED_DATA_PORT&=~LED_SCK;
; }
; LED_DATA_PORT|= LED_NCS;
; LED_DATA_PORT&=~LED_NCS;
; }
; }
; /*-----------------------------------------------------------
; main :主函数
; 输入参数 :无
; 输出参数 :无
; ------------------------------------------------------------*/
; void main(void)
; {
.dbline 97
; uchar aa;
; PORT_init();
xcall _PORT_init
.dbline 98
; EEPROM_read(0x08, &aa);
movw R18,R28
ldi R16,8
ldi R17,0
xcall _EEPROM_read
.dbline 99
; PORTB=~aa;
ldd R2,y+0
com R2
out 0x18,R2
.dbline 100
; aa++;
ldd R24,y+0
subi R24,255 ; addi 1
std y+0,R24
.dbline 101
; EEPROM_write(0x08, aa);
mov R18,R24
ldi R16,8
ldi R17,0
xcall _EEPROM_write
.dbline 103
;
; buff[7]=aa%10;
ldi R17,10
ldd R16,y+0
xcall mod8u
sts _buff+7,R16
.dbline 104
; buff[6]=(aa/10)%10;
ldi R17,10
ldd R16,y+0
xcall div8u
ldi R17,10
xcall mod8u
sts _buff+6,R16
.dbline 105
; buff[5]=aa/100;
ldi R17,100
ldd R16,y+0
xcall div8u
sts _buff+5,R16
xjmp L30
L29:
.dbline 108
.dbline 109
xcall _disp
.dbline 110
L30:
.dbline 107
xjmp L29
X3:
.dbline -2
L25:
adiw R28,1
.dbline 0 ; func end
ret
.dbsym l aa 0 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -