📄 led.s
字号:
.module Led.c
.area text(rom, con, rel)
.dbfile F:\机器人3\avr\AVR典型实例\第2章程序\复件IO~1\跑马灯设计\Led.c
.dbfunc e DelayMs _DelayMs fV
; j -> R20,R21
; i -> R16,R17
.even
_DelayMs::
st -y,R20
st -y,R21
.dbline -1
.dbline 9
; //******************************FileName: LED.C******************************//
; //******************************ICCAVR V6.30编译****************************//
;
; #include<io8535v.h> //头文件,AT90S8535单片机的寄存器定义
; #define uchar unsigned char //数据类型说明
; #define uint unsigned int //数据类型说明
;
; void DelayMs(uint i) //Ms级延时函数,参数i:延时时间
; {uint j;
.dbline 10
; for(;i!=0;i--)
xjmp L5
L2:
.dbline 11
; {for(j=8000;j!=0;j--) ;}
.dbline 11
ldi R20,8000
ldi R21,31
xjmp L9
L6:
.dbline 11
L7:
.dbline 11
subi R20,1
sbci R21,0
L9:
.dbline 11
cpi R20,0
cpc R20,R21
brne L6
X0:
.dbline 11
L3:
.dbline 10
subi R16,1
sbci R17,0
L5:
.dbline 10
cpi R16,0
cpc R16,R17
brne L2
X1:
.dbline -2
L1:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r j 20 i
.dbsym r i 16 i
.dbend
.dbfunc e Horse _Horse fV
; i -> R16
.even
_Horse::
st -y,R20
st -y,R21
.dbline -1
.dbline 15
; }
;
; void Horse(uchar i) //跑马灯程序,通过步判断点亮相应的LED
; {switch(i) //高电平点亮LED
.dbline 15
mov R20,R16
clr R21
cpi R20,1
ldi R30,0
cpc R21,R30
breq L14
X2:
cpi R20,2
ldi R30,0
cpc R21,R30
breq L15
X3:
cpi R20,3
ldi R30,0
cpc R21,R30
breq L16
X4:
cpi R20,4
ldi R30,0
cpc R21,R30
breq L17
X5:
cpi R20,5
ldi R30,0
cpc R21,R30
breq L18
X6:
cpi R20,6
ldi R30,0
cpc R21,R30
breq L19
X7:
cpi R20,7
ldi R30,0
cpc R21,R30
breq L20
X8:
cpi R20,8
ldi R30,0
cpc R21,R30
breq L21
X9:
xjmp L12
L14:
.dbline 16
; {case 1:PORTA=0x01;break; //0000 0001B 点亮LED1
ldi R24,1
out 0x1b,R24
.dbline 16
xjmp L12
L15:
.dbline 17
; case 2:PORTA=0x03;break; //0000 0011B 点亮LED1~LED2
ldi R24,3
out 0x1b,R24
.dbline 17
xjmp L12
L16:
.dbline 18
; case 3:PORTA=0x07;break; //0000 0111B 点亮LED1~LED3
ldi R24,7
out 0x1b,R24
.dbline 18
xjmp L12
L17:
.dbline 19
; case 4:PORTA=0x0f;break; //0000 1111B 点亮LED1~LED4
ldi R24,15
out 0x1b,R24
.dbline 19
xjmp L12
L18:
.dbline 20
; case 5:PORTA=0x1f;break; //0001 1111B 点亮LED1~LED5
ldi R24,31
out 0x1b,R24
.dbline 20
xjmp L12
L19:
.dbline 21
; case 6:PORTA=0x3f;break; //0011 1111B 点亮LED1~LED6
ldi R24,63
out 0x1b,R24
.dbline 21
xjmp L12
L20:
.dbline 22
; case 7:PORTA=0x7f;break; //0111 1111B 点亮LED1~LED7
ldi R24,127
out 0x1b,R24
.dbline 22
xjmp L12
L21:
.dbline 23
; case 8:PORTA=0xff;break; //1111 1111B 点亮LED1~LED8
ldi R24,255
out 0x1b,R24
.dbline 23
.dbline 24
; default:break;}
L12:
.dbline -2
L10:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r i 16 c
.dbend
.dbfunc e main _main fV
; i -> R20
.even
_main::
.dbline -1
.dbline 28
; }
;
; void main(void)
; {uchar i;
.dbline 29
; DDRA=0xff; //端口设置:PA口设置为推挽1输出
ldi R24,255
out 0x1a,R24
.dbline 30
; PORTA=0xff;
out 0x1b,R24
.dbline 31
; PORTA=0x00; //PORTA初始值为0,灭掉所有的LED
clr R2
out 0x1b,R2
.dbline 32
; DelayMs(1000);
ldi R16,1000
ldi R17,3
xcall _DelayMs
xjmp L24
L23:
.dbline 34
; while(1) //程序无条件执行
; { for(i=0;i<9;i++) //依次点亮LED1~LED8
.dbline 34
clr R20
xjmp L29
L26:
.dbline 35
; {Horse(i);
.dbline 35
mov R16,R20
xcall _Horse
.dbline 36
; DelayMs(1000);} //点亮时间约1秒
ldi R16,1000
ldi R17,3
xcall _DelayMs
.dbline 36
L27:
.dbline 34
inc R20
L29:
.dbline 34
cpi R20,9
brlo L26
X10:
.dbline 37
; for(i=7;i!=0;i--) //依次熄灭LED8~LED1
ldi R20,7
xjmp L33
L30:
.dbline 38
; {Horse(i);
.dbline 38
mov R16,R20
xcall _Horse
.dbline 39
; DelayMs(1000);} //熄灭时间约1秒
ldi R16,1000
ldi R17,3
xcall _DelayMs
.dbline 39
L31:
.dbline 37
dec R20
L33:
.dbline 37
tst R20
brne L30
X11:
.dbline 40
; }
L24:
.dbline 33
xjmp L23
X12:
.dbline -2
L22:
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -