📄 led.s
字号:
.module LED.C
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\张军\AVR\AVR单片机系统开发实例稿\第二章\第二章程序\跑马灯设计\LED.C
.dbfunc e DelayMs _DelayMs fV
; j -> R20,R21
; i -> R16,R17
.even
_DelayMs::
rcall push_gset1
.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--)
rjmp L5
L2:
.dbline 11
.dbline 11
ldi R20,8000
ldi R21,31
rjmp 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
.dbline 12
; {for(j=8000;j!=0;j--) ;}
; }
L1:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 20 i
.dbsym r i 16 i
.dbend
.dbfunc e Horse _Horse fV
; i -> R16
.even
_Horse::
rcall push_gset1
.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
cpi R20,2
ldi R30,0
cpc R21,R30
breq L15
cpi R20,3
ldi R30,0
cpc R21,R30
breq L16
cpi R20,4
ldi R30,0
cpc R21,R30
breq L17
cpi R20,5
ldi R30,0
cpc R21,R30
breq L18
cpi R20,6
ldi R30,0
cpc R21,R30
breq L19
cpi R20,7
ldi R30,0
cpc R21,R30
breq L20
cpi R20,8
ldi R30,0
cpc R21,R30
breq L21
rjmp L12
X2:
.dbline 16
L14:
.dbline 16
; {case 1:PORTA=0x01;break; //0000 0001B 点亮LED1
ldi R24,1
out 0x1b,R24
.dbline 16
rjmp L12
L15:
.dbline 17
; case 2:PORTA=0x03;break; //0000 0011B 点亮LED1~LED2
ldi R24,3
out 0x1b,R24
.dbline 17
rjmp L12
L16:
.dbline 18
; case 3:PORTA=0x07;break; //0000 0111B 点亮LED1~LED3
ldi R24,7
out 0x1b,R24
.dbline 18
rjmp L12
L17:
.dbline 19
; case 4:PORTA=0x0f;break; //0000 1111B 点亮LED1~LED4
ldi R24,15
out 0x1b,R24
.dbline 19
rjmp L12
L18:
.dbline 20
; case 5:PORTA=0x1f;break; //0001 1111B 点亮LED1~LED5
ldi R24,31
out 0x1b,R24
.dbline 20
rjmp L12
L19:
.dbline 21
; case 6:PORTA=0x3f;break; //0011 1111B 点亮LED1~LED6
ldi R24,63
out 0x1b,R24
.dbline 21
rjmp L12
L20:
.dbline 22
; case 7:PORTA=0x7f;break; //0111 1111B 点亮LED1~LED7
ldi R24,127
out 0x1b,R24
.dbline 22
rjmp L12
L21:
.dbline 23
ldi R24,255
out 0x1b,R24
.dbline 23
.dbline 24
L12:
.dbline -2
.dbline 25
; case 8:PORTA=0xff;break; //1111 1111B 点亮LED1~LED8
; default:break;}
; }
L10:
rcall pop_gset1
.dbline 0 ; func end
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
rcall _DelayMs
rjmp L24
L23:
.dbline 34
; while(1) //程序无条件执行
; { for(i=0;i<9;i++) //依次点亮LED1~LED8
.dbline 34
clr R20
rjmp L29
L26:
.dbline 35
.dbline 35
mov R16,R20
rcall _Horse
.dbline 36
ldi R16,1000
ldi R17,3
rcall _DelayMs
.dbline 36
L27:
.dbline 34
inc R20
L29:
.dbline 34
cpi R20,9
brlo L26
.dbline 37
; {Horse(i);
; DelayMs(1000);} //点亮时间约1秒
; for(i=7;i!=0;i--) //依次熄灭LED8~LED1
ldi R20,7
rjmp L33
L30:
.dbline 38
.dbline 38
mov R16,R20
rcall _Horse
.dbline 39
ldi R16,1000
ldi R17,3
rcall _DelayMs
.dbline 39
L31:
.dbline 37
dec R20
L33:
.dbline 37
tst R20
brne L30
.dbline 40
L24:
.dbline 33
rjmp L23
X3:
.dbline -2
.dbline 41
; {Horse(i);
; DelayMs(1000);} //熄灭时间约1秒
; }
; }
L22:
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -