📄 diy0816_05.lis
字号:
.module diy0816_05.c
.area text(rom, con, rel)
0000 .dbfile D:\SL-DIY~1\diy0208_16_5\diy0816_05.c
0000 .dbfunc e delay_us _delay_us fV
0000 ; time -> R16,R17
.even
0000 _delay_us::
0000 .dbline -1
0000 .dbline 19
0000 ; //5. 用一个I/O端口控制二个I/O端口。
0000 ; //ATmega16的PB.0端口开关(可用接插线接VCC或GND代替)
0000 ; //控制PA.0,PA.1两端口LED灯轮流闪烁;
0000 ; //LED灯轮流闪烁可模拟动物的眼睛闪烁玩具使用。
0000 ; //如果用ATmega16的PA.0端口开关控制PB.0,PB.1两端口LED灯轮流闪烁,
0000 ; //你应该怎样来修改程序。
0000 ; // www.sl.com.cn
0000 ; // teny@sl.com.cn 05-11-12
0000 ; // Target : mega16 Crystal: 8.0000Mhz
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; #define delay_time 500
0000 ; //delay_time=500,定义延时常量
0000 ; unsigned char pb_buf;
0000 ;
0000 ; void delay_us(int time)
0000 ; { //微秒延时
0000 L2:
0000 .dbline 21
0000 ; do
0000 ; {
0000 .dbline 22
0000 ; time--;
0000 0150 subi R16,1
0002 1040 sbci R17,0
0004 .dbline 23
0004 ; }
0004 L3:
0004 .dbline 24
0004 ; while (time>1);
0004 81E0 ldi R24,1
0006 90E0 ldi R25,0
0008 8017 cp R24,R16
000A 9107 cpc R25,R17
000C CCF3 brlt L2
000E .dbline -2
000E L1:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbsym r time 16 I
0010 .dbend
0010 .dbfunc e delay_ms _delay_ms fV
0010 ; time -> R20,R21
.even
0010 _delay_ms::
0010 0E940000 xcall push_gset1
0014 A801 movw R20,R16
0016 .dbline -1
0016 .dbline 28
0016 ; }
0016 ;
0016 ; void delay_ms(unsigned int time)
0016 ; { //毫秒延时
0016 05C0 xjmp L7
0018 L6:
0018 .dbline 30
0018 .dbline 31
0018 08EE ldi R16,1000
001A 13E0 ldi R17,3
001C F1DF xcall _delay_us
001E .dbline 32
001E 4150 subi R20,1
0020 5040 sbci R21,0
0022 .dbline 33
0022 L7:
0022 .dbline 29
0022 ; while(time!=0)
0022 4030 cpi R20,0
0024 4507 cpc R20,R21
0026 C1F7 brne L6
0028 X0:
0028 .dbline -2
0028 L5:
0028 0E940000 xcall pop_gset1
002C .dbline 0 ; func end
002C 0895 ret
002E .dbsym r time 20 i
002E .dbend
002E .dbfunc e shiyan5 _shiyan5 fV
.even
002E _shiyan5::
002E .dbline -1
002E .dbline 37
002E ; {
002E ; delay_us(1000);
002E ; time--;
002E ; }
002E ; }
002E ;
002E ; void shiyan5()
002E ; {
002E .dbline 38
002E ; DDRB=0x00;PORTB=0xFF;//PB口输入,内部上拉
002E 2224 clr R2
0030 27BA out 0x17,R2
0032 .dbline 38
0032 8FEF ldi R24,255
0034 88BB out 0x18,R24
0036 .dbline 39
0036 ; DDRA=0xFF;PORTA=0xFF;//PA口输出
0036 8ABB out 0x1a,R24
0038 .dbline 39
0038 8BBB out 0x1b,R24
003A 12C0 xjmp L11
003C L10:
003C .dbline 41
003C ; while(1)//循环运行
003C ; {
003C .dbline 42
003C ; pb_buf=PINB & 0x01;//检测PINB0是否为0,为1重新检测
003C 86B3 in R24,0x16
003E 8170 andi R24,1
0040 80930000 sts _pb_buf,R24
0044 .dbline 43
0044 ; if(pb_buf==0x00)//为0,PA0和PA1的两LED交替闪烁
0044 8823 tst R24
0046 51F4 brne L13
0048 .dbline 44
0048 ; {
0048 .dbline 45
0048 ; PORTA=0xfe;//只让PA0的LED亮
0048 8EEF ldi R24,254
004A 8BBB out 0x1b,R24
004C .dbline 46
004C ; delay_ms(delay_time);//延时
004C 04EF ldi R16,500
004E 11E0 ldi R17,1
0050 DFDF xcall _delay_ms
0052 .dbline 47
0052 ; PORTA = 0xfd;//只让PA1的LED亮
0052 8DEF ldi R24,253
0054 8BBB out 0x1b,R24
0056 .dbline 48
0056 ; delay_ms(delay_time);//延时
0056 04EF ldi R16,500
0058 11E0 ldi R17,1
005A DADF xcall _delay_ms
005C .dbline 49
005C ; }//重新检测
005C L13:
005C .dbline 50
005C 8FEF ldi R24,255
005E 8BBB out 0x1b,R24
0060 .dbline 51
0060 L11:
0060 .dbline 40
0060 EDCF xjmp L10
0062 X1:
0062 .dbline -2
0062 L9:
0062 .dbline 0 ; func end
0062 0895 ret
0064 .dbend
0064 .dbfunc e main _main fV
.even
0064 _main::
0064 .dbline -1
0064 .dbline 55
0064 ; PORTA=0xff;//为1,熄灭PA口的所有LED
0064 ; }
0064 ; }
0064 ;
0064 ; void main()
0064 ; {
0064 .dbline 56
0064 ; shiyan5();//实验5函数
0064 E4DF xcall _shiyan5
0066 .dbline -2
0066 L15:
0066 .dbline 0 ; func end
0066 0895 ret
0068 .dbend
.area bss(ram, con, rel)
0000 .dbfile D:\SL-DIY~1\diy0208_16_5\diy0816_05.c
0000 _pb_buf::
0000 .blkb 1
0001 .dbsym e pb_buf _pb_buf c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -