📄 cymometer.lis
字号:
.module cymometer.c
.area vector(rom, abs)
.org 14
000E 93C0 rjmp _timer0
.org 6
0006 D0C0 rjmp _timer1
.area code(ram, con, rel)
.area lit(rom, con, rel)
0000 _tabel::
0000 3F06 .byte 63,6
0002 5B4F .byte 91,'O
0004 666D .byte 'f,'m
0006 7D07 .byte 125,7
0008 7F6F .byte 127,'o
000A 777C .byte 'w,124
000C 395E .byte 57,94
000E 7971 .byte 'y,'q
0010 .dbfile D:\ICC-AVR\examples.sl\cymometer\cymometer.c
0010 .dbsym s tabel _tabel Ac[16:16]
.area data(ram, con, rel)
0000 .dbfile D:\ICC-AVR\examples.sl\cymometer\cymometer.c
0000 _ledbuff::
0000 .blkb 2
.area idata
0000 3F3F .byte 63,63
.area data(ram, con, rel)
0002 .dbfile D:\ICC-AVR\examples.sl\cymometer\cymometer.c
0002 .blkb 2
.area idata
0002 3F3F .byte 63,63
.area data(ram, con, rel)
0004 .dbfile D:\ICC-AVR\examples.sl\cymometer\cymometer.c
0004 .blkb 2
.area idata
0004 3F3F .byte 63,63
.area data(ram, con, rel)
0006 .dbfile D:\ICC-AVR\examples.sl\cymometer\cymometer.c
0006 .dbsym s ledbuff _ledbuff Ac[6:6]
.area text(rom, con, rel)
0000 .dbfile D:\ICC-AVR\examples.sl\cymometer\cymometer.c
0000 .dbfunc s port_init _port_init fI
.even
0000 _port_init::
0000 .dbline 28{
; /**********************************************
; http://www.sl.com.cn
; 双龙电子公司----频率计演示程序(ICCAVR)
; 作者:詹卫前
; 1、学习定时器T1捕捉(捕获)中断的使用
; 2、学习频率计的设计方法
; 3、通过对timecount的修改,可实现多量程
; 频率计编程。
; **********************************************/
; #include <io8515.h>
; #include <macros.h>
; #pragma interrupt_handler timer0:8
; #pragma interrupt_handler timer1:4
; extern void delay_ms(unsigned int n);//引用外部函数
; extern void delay_1ms(void);
; #pragma data:code
; /* 七段译码字形表 */
; const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
; #pragma data:data
; /* 显示缓冲区 */
; unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
; unsigned long count;//频率测量计数变量
; unsigned int timecount;//频率测量闸门控制变量
; /******************************
; 初始化
; ******************************/
; void port_init(void)
; {
0000 .dbline 29
; MCUCR=0x00;
0000 2224 clr R2
0002 25BE out 0x35,R2
0004 .dbline 30
; DDRD=0x3f;
0004 8FE3 ldi R24,63
0006 81BB out 0x11,R24
0008 .dbline 31
; DDRB=0xff;
0008 8FEF ldi R24,255
000A 87BB out 0x17,R24
000C .dbline 32
; PORTD=0xff;
000C 82BB out 0x12,R24
000E .dbline 33
; PORTB=0xff;
000E 88BB out 0x18,R24
0010 .dbline 34
; TIMSK=0x0a;//开放T0溢出中断和T1捕捉中断
0010 8AE0 ldi R24,10
0012 89BF out 0x39,R24
0014 .dbline 35
; TCCR0=0x03;
0014 83E0 ldi R24,3
0016 83BF out 0x33,R24
0018 .dbline 36
; TCCR1A=0x00;
0018 2FBC out 0x2f,R2
001A .dbline 37
; TCCR1B=0xc0;
001A 80EC ldi R24,192
001C 8EBD out 0x2e,R24
001E .dbline 38
; TCNT0=0x83;
001E 83E8 ldi R24,131
0020 82BF out 0x32,R24
0022 .dbline 39
; timecount=1000;
0022 88EE ldi R24,1000
0024 93E0 ldi R25,3
0026 90930100 sts _timecount+1,R25
002A 80930000 sts _timecount,R24
002E .dbline 40}
; }
002E L1:
002E 0895 ret
0030 .dbfunc s display _display fI
; i -> R20
.even
0030 _display::
0030 00D0 rcall push_gset1
0032 .dbline 45{
; /******************************
; 六路动态扫描显示电路
; ******************************/
; void display(void)
; {
0032 .dbline 47
; unsigned char i;
; for (i=0;i<6;i++)
0032 4427 clr R20
0034 16C0 rjmp L6
0036 L3:
0036 .dbline 48
0036 .dbline 49
0036 80E0 ldi R24,<_ledbuff
0038 90E0 ldi R25,>_ledbuff
003A E42F mov R30,R20
003C FF27 clr R31
003E E80F add R30,R24
0040 F91F adc R31,R25
0042 2080 ldd R2,z+0
0044 28BA out 0x18,R2
0046 .dbline 50
0046 01E0 ldi R16,1
0048 142F mov R17,R20
004A 00D0 rcall lsl8
004C 202E mov R2,R16
004E 2094 com R2
0050 22BA out 0x12,R2
0052 .dbline 51
0052 00D0 rcall _delay_1ms
0054 .dbline 52
0054 01E0 ldi R16,1
0056 142F mov R17,R20
0058 00D0 rcall lsl8
005A 22B2 in R2,0x12
005C 202A or R2,R16
005E 22BA out 0x12,R2
0060 .dbline 53
0060 L4:
0060 .dbline 47
0060 4395 inc R20
0062 L6:
0062 .dbline 47
0062 4630 cpi R20,6
0064 40F3 brlo L3
0066 .dbline 54}
; {
; PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
; PORTD=~(1<<i); //开始显示
; delay_1ms(); //每一位显示保持一定时间
; PORTD|=(1<<i); //关闭显示
; }
; }
0066 L2:
0066 00D0 rcall pop_gset1
0068 0895 ret
006A .dbsym r i 20 c
006A .dbfunc s hextobcd _hextobcd fI
; temp -> R10
; i -> R12
.even
006A _hextobcd::
006A 00D0 rcall push_gset4
006C .dbline 59{
; /************************************
; 将count十六进制数据转换为LED七段码
; ************************************/
; void hextobcd(void)
; {
006C .dbline 61
; unsigned char i,temp;
; for (i=0;i<6;i++)
006C CC24 clr R12
006E 42C0 rjmp L11
0070 L8:
0070 .dbline 62
0070 .dbline 62
0070 00E0 ldi R16,<L12
0072 10E0 ldi R17,>L12
0074 00D0 rcall lpm32
0076 50900500 lds R5,_count+2+1
007A 40900400 lds R4,_count+2
007E 30900300 lds R3,_count+1
0082 20900200 lds R2,_count
0086 3A93 st -y,R19
0088 2A93 st -y,R18
008A 1A93 st -y,R17
008C 0A93 st -y,R16
008E 022D mov R16,R2
0090 132D mov R17,R3
0092 242D mov R18,R4
0094 352D mov R19,R5
0096 00D0 rcall mod32u
0098 A02E mov R10,R16
009A .dbline 63
009A 80E0 ldi R24,<_tabel
009C 90E0 ldi R25,>_tabel
009E 2A2C mov R2,R10
00A0 3324 clr R3
00A2 280E add R2,R24
00A4 391E adc R3,R25
00A6 E22D mov R30,R2
00A8 F32D mov R31,R3
00AA C895 lpm
00AC 80E0 ldi R24,<_ledbuff
00AE 90E0 ldi R25,>_ledbuff
00B0 EC2D mov R30,R12
00B2 FF27 clr R31
00B4 E80F add R30,R24
00B6 F91F adc R31,R25
00B8 0082 std z+0,R0
00BA .dbline 64
00BA 00E0 ldi R16,<L12
00BC 10E0 ldi R17,>L12
00BE 00D0 rcall lpm32
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -