📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile D:\avr\+++精华+++\频率计/delay.h
0000 .dbfunc e delay_1us _delay_1us fV
.even
0000 _delay_1us::
0000 .dbline -1
0000 .dbline 15
0000 ; /*****************************************
0000 ; * 基于频率计程序设计 *
0000 ; * 功 能:频率计 *
0000 ; * 时钟频率:内部8M *
0000 ; * 设 计:莫锦攀 *
0000 ; * 修改日期:2007年07月05日 *
0000 ; * 编译环境:ICC-AVR6.31 *
0000 ; * 实验环境:M16学习板 *
0000 ; * 使用端口:PC6,PC7,PA4~PA7,PD6(ICP) *
0000 ; *****************************************/
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include "1602.h"
0000 ;
0000 ; #define uint unsigned int
0000 .dbline 16
0000 ; #define uchar unsigned char
0000 0000 nop
0002 .dbline -2
0002 L1:
0002 .dbline 0 ; func end
0002 0895 ret
0004 .dbend
0004 .dbfunc e delay_nus _delay_nus fV
0004 ; i -> R20,R21
0004 ; n -> R22,R23
.even
0004 _delay_nus::
0004 0E940000 xcall push_gset2
0008 B801 movw R22,R16
000A .dbline -1
000A .dbline 20
000A ;
000A ; uint Cnt1; //第一次捕获值
000A ; uint Cnt2; //第二次捕获值
000A ; uint Cnt; //捕获差值
000A .dbline 21
000A ; uchar Flag=0; //捕获次数
000A 4427 clr R20
000C 5527 clr R21
000E .dbline 22
000E ; uchar Data[6]={0,0,0,0,0,0};//显示初值,最后一个0是结束符,方便液晶显示
000E 03C0 xjmp L6
0010 L3:
0010 .dbline 23
0010 F7DF xcall _delay_1us
0012 L4:
0012 .dbline 22
0012 4F5F subi R20,255 ; offset = 1
0014 5F4F sbci R21,255
0016 L6:
0016 .dbline 22
0016 4617 cp R20,R22
0018 5707 cpc R21,R23
001A D0F3 brlo L3
001C .dbline -2
001C L2:
001C 0E940000 xcall pop_gset2
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r i 20 i
0022 .dbsym r n 22 i
0022 .dbend
0022 .dbfunc e delay_1ms _delay_1ms fV
0022 ; i -> R16,R17
.even
0022 _delay_1ms::
0022 .dbline -1
0022 .dbline 27
0022 ;
0022 ; void init_timer1(void) //初始化T/C1的输入捕获中断
0022 ; {
0022 ; TIMSK=1<<OCIE0; //0X02输入捕获使能
0022 ; TCCR1B=0xC2; //输入捕获噪音使能,下降沿捕获,时钟8分频1us计数一次
0022 .dbline 29
0022 0027 clr R16
0024 1127 clr R17
0026 02C0 xjmp L11
0028 L8:
0028 .dbline 29
0028 L9:
0028 .dbline 29
0028 0F5F subi R16,255 ; offset = 1
002A 1F4F sbci R17,255
002C L11:
002C .dbline 29
002C ; TIFR=1<<ICF1; //0x20写"1"清输入捕获标志位
002C ; SREG=SREG&0x7f; //全局中断关
002C 0437 cpi R16,116
002E E4E0 ldi R30,4
0030 1E07 cpc R17,R30
0032 D0F3 brlo L8
0034 .dbline -2
0034 L7:
0034 .dbline 0 ; func end
0034 0895 ret
0036 .dbsym r i 16 i
0036 .dbend
0036 .dbfunc e delay_nms _delay_nms fV
0036 ; i -> R20,R21
0036 ; n -> R22,R23
.even
0036 _delay_nms::
0036 0E940000 xcall push_gset2
003A B801 movw R22,R16
003C .dbline -1
003C .dbline 33
003C ; }
003C ;
003C ; void hz(uint i,uchar *p) //显示处理,+48是因为液晶显示的是ASCII码
003C ; {p[4]=i%10+48;//个
003C .dbline 34
003C ; p[3]=i/10%10+48;//十
003C 4427 clr R20
003E 5527 clr R21
0040 .dbline 35
0040 ; p[2]=i/100%10+48;//百
0040 03C0 xjmp L16
0042 L13:
0042 .dbline 36
0042 EFDF xcall _delay_1ms
0044 L14:
0044 .dbline 35
0044 4F5F subi R20,255 ; offset = 1
0046 5F4F sbci R21,255
0048 L16:
0048 .dbline 35
0048 4617 cp R20,R22
004A 5707 cpc R21,R23
004C D0F3 brlo L13
004E .dbline -2
004E L12:
004E 0E940000 xcall pop_gset2
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbsym r i 20 i
0054 .dbsym r n 22 i
0054 .dbend
0054 .dbfile D:\avr\+++精华+++\频率计/1602.h
0054 .dbfunc e LCD_init _LCD_init fV
.even
0054 _LCD_init::
0054 .dbline -1
0054 .dbline 45
0054 ; p[1]=i/1000%10+48;//千
0054 ; p[0]=i/10000%10+48;//万
0054 ; }
0054 ;
0054 ;
0054 ; void timer1(void) //捕获检测
0054 ; {if(TIFR&0x20)
0054 ; {TIFR|=0x20; //清除捕获标志位
0054 ; Cnt=ICR1L; //cnt暂存
0054 ; Cnt2=(ICR1H<<8)+ICR1L; //cnt2存放点前捕获值
0054 .dbline 46
0054 ; Cnt=Cnt2-Cnt1; //cnt存放两次时间差
0054 8AB3 in R24,0x1a
0056 806F ori R24,240
0058 8ABB out 0x1a,R24
005A .dbline 47
005A ; Cnt1=Cnt2; //cnt1存放上次捕获值
005A A79A sbi 0x14,7
005C .dbline 48
005C ; Flag++; //检测到第一次捕获
005C A69A sbi 0x14,6
005E .dbline 49
005E ; if(Flag==2) //检测到第二次捕获
005E 08E2 ldi R16,40
0060 14D0 xcall _LCD_write_command
0062 .dbline 50
0062 ; {Flag=0; //清除捕获标志位
0062 0DD0 xcall _LCD_en_write
0064 .dbline 51
0064 ; hz(Cnt,Data); //显示处理
0064 08E2 ldi R16,40
0066 10E0 ldi R17,0
0068 CDDF xcall _delay_nus
006A .dbline 52
006A ; LCD_write_string(6,1,Data); //显示
006A 08E2 ldi R16,40
006C 0ED0 xcall _LCD_write_command
006E .dbline 53
006E ; delay_nms(100);
006E 0CE0 ldi R16,12
0070 0CD0 xcall _LCD_write_command
0072 .dbline 54
0072 ; Cnt=0;Cnt1=0;Cnt2=0; //清除捕获值几捕获差值
0072 01E0 ldi R16,1
0074 0AD0 xcall _LCD_write_command
0076 .dbline 55
0076 ; }
0076 02E0 ldi R16,2
0078 10E0 ldi R17,0
007A DDDF xcall _delay_nms
007C .dbline -2
007C L17:
007C .dbline 0 ; func end
007C 0895 ret
007E .dbend
007E .dbfunc e LCD_en_write _LCD_en_write fV
.even
007E _LCD_en_write::
007E .dbline -1
007E .dbline 59
007E ; }
007E ; }
007E ;
007E ;
007E .dbline 60
007E ; void main(void)
007E AF9A sbi 0x15,7
0080 .dbline 61
0080 ; {
0080 01E0 ldi R16,1
0082 10E0 ldi R17,0
0084 BFDF xcall _delay_nus
0086 .dbline 62
0086 ; LCD_init();//液晶初始化
0086 AF98 cbi 0x15,7
0088 .dbline -2
0088 L18:
0088 .dbline 0 ; func end
0088 0895 ret
008A .dbend
008A .dbfunc e LCD_write_command _LCD_write_command fV
008A ; command -> R20
.even
008A _LCD_write_command::
008A 0E940000 xcall push_gset1
008E 402F mov R20,R16
0090 .dbline -1
0090 .dbline 66
0090 ; init_timer1();
0090 ; DDRD=0x00;
0090 ; PORTD=0xff;//设置D口为带上拉电阻输入
0090 ; while(1)
0090 .dbline 67
0090 ; {LCD_write_string(3,0,"ICP BY MJP");
0090 00E1 ldi R16,16
0092 10E0 ldi R17,0
0094 B7DF xcall _delay_nus
0096 .dbline 68
0096 ; timer1();
0096 AE98 cbi 0x15,6
0098 .dbline 69
0098 ; }
0098 8BB3 in R24,0x1b
009A 8F70 andi R24,15
009C 8BBB out 0x1b,R24
009E .dbline 70
009E ;
009E 842F mov R24,R20
00A0 807F andi R24,240
00A2 2BB2 in R2,0x1b
00A4 282A or R2,R24
00A6 2BBA out 0x1b,R2
00A8 .dbline 71
00A8 ; }
00A8 EADF xcall _LCD_en_write
00AA .dbline 72
00AA ; }
00AA 842F mov R24,R20
00AC 8F70 andi R24,#0x0F
00AE 8295 swap R24
00B0 482F mov R20,R24
00B2 .dbline 73
00B2 ; }
00B2 8BB3 in R24,0x1b
00B4 8F70 andi R24,15
00B6 8BBB out 0x1b,R24
00B8 .dbline 74
00B8 ; }
00B8 842F mov R24,R20
00BA 807F andi R24,240
00BC 2BB2 in R2,0x1b
00BE 282A or R2,R24
00C0 2BBA out 0x1b,R2
00C2 .dbline 75
00C2 ; }
00C2 DDDF xcall _LCD_en_write
00C4 .dbline -2
00C4 L19:
00C4 0E940000 xcall pop_gset1
00C8 .dbline 0 ; func end
00C8 0895 ret
00CA .dbsym r command 20 c
00CA .dbend
00CA .dbfunc e LCD_write_data _LCD_write_data fV
00CA ; data -> R20
.even
00CA _LCD_write_data::
00CA 0E940000 xcall push_gset1
00CE 402F mov R20,R16
00D0 .dbline -1
00D0 .dbline 80
00D0 ; }
00D0 ; }
00D0 ; }
00D0 ; }
00D0 ; }
00D0 .dbline 81
00D0 ; }
00D0 00E1 ldi R16,16
00D2 10E0 ldi R17,0
00D4 97DF xcall _delay_nus
00D6 .dbline 82
00D6 ; }
00D6 AE9A sbi 0x15,6
00D8 .dbline 83
00D8 ; }
00D8 8BB3 in R24,0x1b
00DA 8F70 andi R24,15
00DC 8BBB out 0x1b,R24
00DE .dbline 84
00DE ; }
00DE 842F mov R24,R20
00E0 807F andi R24,240
00E2 2BB2 in R2,0x1b
00E4 282A or R2,R24
00E6 2BBA out 0x1b,R2
00E8 .dbline 85
00E8 ; }
00E8 CADF xcall _LCD_en_write
00EA .dbline 86
00EA ; }
00EA 842F mov R24,R20
00EC 8F70 andi R24,#0x0F
00EE 8295 swap R24
00F0 482F mov R20,R24
00F2 .dbline 87
00F2 ; }
00F2 8BB3 in R24,0x1b
00F4 8F70 andi R24,15
00F6 8BBB out 0x1b,R24
00F8 .dbline 88
00F8 ; }
00F8 842F mov R24,R20
00FA 807F andi R24,240
00FC 2BB2 in R2,0x1b
00FE 282A or R2,R24
0100 2BBA out 0x1b,R2
0102 .dbline 89
0102 ; }
0102 BDDF xcall _LCD_en_write
0104 .dbline -2
0104 L20:
0104 0E940000 xcall pop_gset1
0108 .dbline 0 ; func end
0108 0895 ret
010A .dbsym r data 20 c
010A .dbend
010A .dbfunc e LCD_set_xy _LCD_set_xy fV
010A ; address -> R20
010A ; y -> R20
010A ; x -> R22
.even
010A _LCD_set_xy::
010A 0E940000 xcall push_gset2
010E 422F mov R20,R18
0110 602F mov R22,R16
0112 .dbline -1
0112 .dbline 94
0112 ; }
0112 ; }
0112 ; }
0112 ; }
0112 ; }
0112 .dbline 96
0112 ; }
0112 ; }
0112 4423 tst R20
0114 19F4 brne L22
0116 .dbline 96
0116 462F mov R20,R22
0118 4058 subi R20,128 ; addi 128
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -