📄 counter.lis
字号:
.module Counter.c
.area data(ram, con, rel)
0000 _Table::
0000 .blkb 2
.area idata
0000 3F06 .byte 63,6
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 5B4F .byte 91,'O
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 666D .byte 'f,'m
.area data(ram, con, rel)
0006 .blkb 2
.area idata
0006 7D07 .byte 125,7
.area data(ram, con, rel)
0008 .blkb 2
.area idata
0008 7F6F .byte 127,'o
.area data(ram, con, rel)
000A .dbfile C:\DOCUME~1\Administrator\桌面\张军\AVR\AVR单片机系统开发实例稿\第二章\第二章程序\定时计数器的C语言编程\基于TC0的计数器设计\Counter.c
000A .dbsym e Table _Table A[10:10]c
000A _Data::
000A .blkb 2
.area idata
000A 0000 .byte 0,0
.area data(ram, con, rel)
000C .dbfile C:\DOCUME~1\Administrator\桌面\张军\AVR\AVR单片机系统开发实例稿\第二章\第二章程序\定时计数器的C语言编程\基于TC0的计数器设计\Counter.c
000C .blkb 2
.area idata
000C 0000 .byte 0,0
.area data(ram, con, rel)
000E .dbfile C:\DOCUME~1\Administrator\桌面\张军\AVR\AVR单片机系统开发实例稿\第二章\第二章程序\定时计数器的C语言编程\基于TC0的计数器设计\Counter.c
000E .dbsym e Data _Data A[4:4]c
000E _CNT::
000E .blkb 2
.area idata
000E 0000 .word 0
.area data(ram, con, rel)
0010 .dbfile C:\DOCUME~1\Administrator\桌面\张军\AVR\AVR单片机系统开发实例稿\第二章\第二章程序\定时计数器的C语言编程\基于TC0的计数器设计\Counter.c
0010 .dbsym e CNT _CNT i
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\Administrator\桌面\张军\AVR\AVR单片机系统开发实例稿\第二章\第二章程序\定时计数器的C语言编程\基于TC0的计数器设计\Counter.c
0000 .dbfunc e DelayMs _DelayMs fV
0000 ; j -> R20,R21
0000 ; i -> R16,R17
.even
0000 _DelayMs::
0000 00D0 rcall push_gset1
0002 .dbline -1
0002 .dbline 14
0002 ; //******************************FileName: Counter.C*************************//
0002 ; //******************************ICCAVR V6.30编译***************************//
0002 ;
0002 ; #include <io8535v.h>
0002 ; #define uchar unsigned char
0002 ; #define uint unsigned int
0002 ;
0002 ; //数码管字型表,对应0,1,2,3,4,5,6,7,8,9//
0002 ; uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
0002 ; uchar Data[4]={0,0,0,0}; //显示初始值:0 0 0 0
0002 ; uint CNT=0; //初始计数值:0
0002 ;
0002 ; void DelayMs(uint i) //Ms级延时,参数i为延时时间
0002 ; {uint j;
0002 .dbline 15
0002 ; for(;i!=0;i--)
0002 0AC0 rjmp L5
0004 L2:
0004 .dbline 16
0004 .dbline 16
0004 40E4 ldi R20,8000
0006 5FE1 ldi R21,31
0008 02C0 rjmp L9
000A L6:
000A .dbline 16
000A .dbline 16
000A .dbline 16
000A L7:
000A .dbline 16
000A 4150 subi R20,1
000C 5040 sbci R21,0
000E L9:
000E .dbline 16
000E 4030 cpi R20,0
0010 4507 cpc R20,R21
0012 D9F7 brne L6
0014 X0:
0014 .dbline 16
0014 L3:
0014 .dbline 15
0014 0150 subi R16,1
0016 1040 sbci R17,0
0018 L5:
0018 .dbline 15
0018 0030 cpi R16,0
001A 0107 cpc R16,R17
001C 99F7 brne L2
001E X1:
001E .dbline -2
001E .dbline 17
001E ; {for(j=8000;j!=0;j--) {;}}
001E ; }
001E L1:
001E 00D0 rcall pop_gset1
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r j 20 i
0022 .dbsym r i 16 i
0022 .dbend
0022 .dbfunc e Display _Display fV
0022 ; sel -> R20
0022 ; i -> R22
0022 ; p -> R10,R11
.even
0022 _Display::
0022 00D0 rcall push_gset3
0024 A02E mov R10,R16
0026 B12E mov R11,R17
0028 .dbline -1
0028 .dbline 20
0028 ;
0028 ; void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
0028 ; {uchar i,sel=0x01;
0028 .dbline 20
0028 41E0 ldi R20,1
002A .dbline 21
002A ; for(i=0;i<4;i++)
002A 6627 clr R22
002C 12C0 rjmp L14
002E L11:
002E .dbline 22
002E .dbline 22
002E 45BB out 0x15,R20
0030 .dbline 23
0030 E62F mov R30,R22
0032 FF27 clr R31
0034 EA0D add R30,R10
0036 FB1D adc R31,R11
0038 E081 ldd R30,z+0
003A FF27 clr R31
003C 80E0 ldi R24,<_Table
003E 90E0 ldi R25,>_Table
0040 E80F add R30,R24
0042 F91F adc R31,R25
0044 2080 ldd R2,z+0
0046 2BBA out 0x1b,R2
0048 .dbline 24
0048 02E0 ldi R16,2
004A 10E0 ldi R17,0
004C D9DF rcall _DelayMs
004E .dbline 25
004E 440F lsl R20
0050 .dbline 26
0050 L12:
0050 .dbline 21
0050 6395 inc R22
0052 L14:
0052 .dbline 21
0052 6430 cpi R22,4
0054 60F3 brlo L11
0056 .dbline -2
0056 .dbline 27
0056 ; {PORTC=sel; //选通最右边的数码管
0056 ; PORTA=Table[p[i]]; //送字型码
0056 ; DelayMs(2); //显示延时
0056 ; sel=sel<<1; //移位以显示前一位
0056 ; }
0056 ; }
0056 L10:
0056 00D0 rcall pop_gset3
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbsym r sel 20 c
005A .dbsym r i 22 c
005A .dbsym r p 10 pc
005A .dbend
005A .dbfunc e Process _Process fV
005A ; p -> R22,R23
005A ; i -> R20
.even
005A _Process::
005A 00D0 rcall push_gset2
005C 622F mov R22,R18
005E 732F mov R23,R19
0060 402F mov R20,R16
0062 .dbline -1
0062 .dbline 32
0062 ;
0062 ; //计数值处理函数。参数i:计数值;参数p:处理数据存放的数组名//
0062 ; //功能:此函数用于将计数值拆分为BCD码的千,百,十,一数据,用于查表显示//
0062 ; void Process(uchar i,uchar *p)
0062 ; {p[0]=i/1000;
0062 .dbline 32
0062 28EE ldi R18,1000
0064 33E0 ldi R19,3
0066 042F mov R16,R20
0068 1127 clr R17
006A 00D0 rcall div16s
006C E62F mov R30,R22
006E F72F mov R31,R23
0070 0083 std z+0,R16
0072 .dbline 33
0072 ; i=i%1000;
0072 28EE ldi R18,1000
0074 33E0 ldi R19,3
0076 042F mov R16,R20
0078 1127 clr R17
007A 00D0 rcall mod16s
007C 402F mov R20,R16
007E .dbline 34
007E ; p[1]=i/100;
007E 14E6 ldi R17,100
0080 00D0 rcall div8u
0082 E62F mov R30,R22
0084 F72F mov R31,R23
0086 0183 std z+1,R16
0088 .dbline 35
0088 ; i=i%100;
0088 14E6 ldi R17,100
008A 042F mov R16,R20
008C 00D0 rcall mod8u
008E 402F mov R20,R16
0090 .dbline 36
0090 ; p[2]=i/10;
0090 1AE0 ldi R17,10
0092 00D0 rcall div8u
0094 E62F mov R30,R22
0096 F72F mov R31,R23
0098 0283 std z+2,R16
009A .dbline 37
009A ; i=i%10;
009A 1AE0 ldi R17,10
009C 042F mov R16,R20
009E 00D0 rcall mod8u
00A0 402F mov R20,R16
00A2 .dbline 38
00A2 ; p[3]=i;
00A2 E62F mov R30,R22
00A4 F72F mov R31,R23
00A6 4383 std z+3,R20
00A8 .dbline -2
00A8 .dbline 39
00A8 ; }
00A8 L15:
00A8 00D0 rcall pop_gset2
00AA .dbline 0 ; func end
00AA 0895 ret
00AC .dbsym r p 22 pc
00AC .dbsym r i 20 c
00AC .dbend
00AC .dbfunc e Init_IO _Init_IO fV
.even
00AC _Init_IO::
00AC .dbline -1
00AC .dbline 42
00AC ;
00AC ; void Init_IO(void) //初始化I/O口
00AC ; {DDRA=0xff; //设置A口为推挽1输出
00AC .dbline 42
00AC 8FEF ldi R24,255
00AE 8ABB out 0x1a,R24
00B0 .dbline 43
00B0 ; PORTA=0xff;
00B0 8BBB out 0x1b,R24
00B2 .dbline 44
00B2 ; DDRB=0x00; //设置B口为不带上拉电阻输入
00B2 2224 clr R2
00B4 27BA out 0x17,R2
00B6 .dbline 45
00B6 ; PORTB=0x00;
00B6 28BA out 0x18,R2
00B8 .dbline 46
00B8 ; DDRC=0xff; //设置C口为推挽1输出;
00B8 84BB out 0x14,R24
00BA .dbline 47
00BA ; PORTC=0xff;
00BA 85BB out 0x15,R24
00BC .dbline -2
00BC .dbline 48
00BC ; }
00BC L16:
00BC .dbline 0 ; func end
00BC 0895 ret
00BE .dbend
00BE .dbfunc e main _main fV
00BE ; Load -> R20
.even
00BE _main::
00BE .dbline -1
00BE .dbline 51
00BE ;
00BE ; void main(void)
00BE ; {uchar Load;
00BE .dbline 52
00BE ; Init_IO(); //初始化I/O口
00BE F6DF rcall _Init_IO
00C0 .dbline 53
00C0 ; PORTA=0xff; //点亮以测试所有的数码管
00C0 8FEF ldi R24,255
00C2 8BBB out 0x1b,R24
00C4 .dbline 54
00C4 ; PORTC=0x00;
00C4 2224 clr R2
00C6 25BA out 0x15,R2
00C8 .dbline 55
00C8 ; DelayMs(3000); //延时
00C8 08EB ldi R16,3000
00CA 1BE0 ldi R17,11
00CC 99DF rcall _DelayMs
00CE .dbline 56
00CE ; PORTC=0xff; //熄灭所有的数码管
00CE 8FEF ldi R24,255
00D0 85BB out 0x15,R24
00D2 .dbline 57
00D2 ; TCCR0=0x06; //T/C0工作于计数方式,下降沿计数
00D2 86E0 ldi R24,6
00D4 83BF out 0x33,R24
00D6 .dbline 58
00D6 ; TCNT0=CNT; //计数初始值0
00D6 20900E00 lds R2,_CNT
00DA 30900F00 lds R3,_CNT+1
00DE 22BE out 0x32,R2
00E0 08C0 rjmp L19
00E2 L18:
00E2 .dbline 60
00E2 .dbline 60
00E2 42B7 in R20,0x32
00E4 .dbline 61
00E4 20E0 ldi R18,<_Data
00E6 30E0 ldi R19,>_Data
00E8 042F mov R16,R20
00EA B7DF rcall _Process
00EC .dbline 62
00EC 00E0 ldi R16,<_Data
00EE 10E0 ldi R17,>_Data
00F0 98DF rcall _Display
00F2 .dbline 63
00F2 L19:
00F2 .dbline 59
00F2 F7CF rjmp L18
00F4 X2:
00F4 .dbline -2
00F4 .dbline 64
00F4 ; while(1)
00F4 ; {Load=TCNT0;
00F4 ; Process(Load,Data); //计数值处理
00F4 ; Display(Data); //动态扫描显示
00F4 ; }
00F4 ; }
00F4 L17:
00F4 .dbline 0 ; func end
00F4 0895 ret
00F6 .dbsym r Load 20 c
00F6 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -