⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cycle_1.lst

📁 AVR单片机例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0018 E5CF      LDI	R28,0x5F
    0019 E0D2      LDI	R29,2
    001A BFCD      OUT	P3D,R28
    001B BFDE      OUT	P3E,R29
    001C 51C0      SUBI	R28,0x10
    001D 40D0      SBCI	R29,0
    001E EA0A      LDI	R16,0xAA
    001F 8308      STD	R16,0+Y
    0020 2400      CLR	R0
    0021 E6E6      LDI	R30,0x66
    0022 E0F0      LDI	R31,0
    0023 E010      LDI	R17,0
    0024 36EA      CPI	R30,0x6A
    0025 07F1      CPC	R31,R17
    0026 F011      BEQ	0x0029
    0027 9201      ST	R0,Z+
    0028 CFFB      RJMP	0x0024
    0029 8300      STD	R16,0+Z
    002A E2EA      LDI	R30,0x2A
    002B E0F0      LDI	R31,0
    002C E6A0      LDI	R26,0x60
    002D E0B0      LDI	R27,0
    002E E010      LDI	R17,0
    002F 33E0      CPI	R30,0x30
    0030 07F1      CPC	R31,R17
    0031 F021      BEQ	0x0036
    0032 95C8      LPM
    0033 9631      ADIW	R30,1
    0034 920D      ST	R0,X+
    0035 CFF9      RJMP	0x002F
    0036 D066      RCALL	_main
_exit:
    0037 CFFF      RJMP	_exit
FILE: D:\ICC-AVR\examples.sl\CYCLE\cycle_1.c
(0000) /**********************************************
(0001)              http://www.sl.com.cn
(0002)       双龙电子公司----占空比测量演示程序(ICCAVR)
(0003) 	             作者:詹卫前
(0004) 		  1、学习定时器T1捕捉(捕获)中断的使用		  
(0005) **********************************************/
(0006) #include <io8515.h>
(0007) #include <math.h>
(0008) #pragma interrupt_handler Icp_timer1:4   //   设置ICP中断
(0009)           /*   七段译码字形表     */        
(0010) const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0011)           /*     显示缓冲区       */
(0012) unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
(0013) unsigned int count_l;
(0014) unsigned int count_h;
(0015) /******************************
(0016)          1ms延时程序
(0017) ******************************/ 
(0018) void delay_1ms(void)
(0019) { 
(0020)  unsigned int i;
(0021)  for(i=1;i<1142;i++)
_delay_1ms:
  i                    --> R16
    0038 E001      LDI	R16,1
    0039 E010      LDI	R17,0
    003A C002      RJMP	0x003D
(0022)     ;
    003B 5F0F      SUBI	R16,0xFF
    003C 4F1F      SBCI	R17,0xFF
    003D 3706      CPI	R16,0x76
    003E E0E4      LDI	R30,4
    003F 071E      CPC	R17,R30
    0040 F3D0      BCS	0x003B
(0023) }
    0041 9508      RET
_display:
  i                    --> R20
    0042 D0F0      RCALL	push_gset1
(0024) /******************************
(0025)       六路动态扫描显示电路
(0026) ******************************/ 
(0027) void display(void)
(0028) {
(0029)  unsigned char i;
(0030)  for (i=0;i<6;i++)
    0043 2744      CLR	R20
    0044 C016      RJMP	0x005B
(0031)   {
(0032)    PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
    0045 E680      LDI	R24,0x60
    0046 E090      LDI	R25,0
    0047 2FE4      MOV	R30,R20
    0048 27FF      CLR	R31
    0049 0FE8      ADD	R30,R24
    004A 1FF9      ADC	R31,R25
    004B 8020      LDD	R2,0+Z
    004C BA28      OUT	P18,R2
(0033)    PORTD=~(1<<i);   //开始显示
    004D E001      LDI	R16,1
    004E 2F14      MOV	R17,R20
    004F D102      RCALL	lsl8
    0050 2E20      MOV	R2,R16
    0051 9420      COM	R2
    0052 BA22      OUT	P12,R2
(0034)    delay_1ms();     //每一位显示保持一定时间
    0053 DFE4      RCALL	_delay_1ms
(0035)    PORTD|=(1<<i);   //关闭显示
    0054 E001      LDI	R16,1
    0055 2F14      MOV	R17,R20
    0056 D0FB      RCALL	lsl8
    0057 B222      IN	R2,P12
    0058 2A20      OR	R2,R16
    0059 BA22      OUT	P12,R2
(0036)   }
    005A 9543      INC	R20
    005B 3046      CPI	R20,6
    005C F340      BCS	0x0045
(0037) }
    005D D0D8      RCALL	pop_gset1
    005E 9508      RET
_hextobcd:
  temp                 --> R20
  i                    --> R22
  count                --> R10
    005F D0ED      RCALL	push_gset3
    0060 2EA0      MOV	R10,R16
    0061 2EB1      MOV	R11,R17
(0038) /************************************
(0039)   将count十六进制数据转换为LED七段码
(0040) ************************************/
(0041) void hextobcd(unsigned int count)
(0042) {
(0043)   unsigned char i,temp;
(0044)   for (i=0;i<6;i++)
    0062 2766      CLR	R22
    0063 C01F      RJMP	0x0083
(0045)   {temp=count%10;
    0064 E02A      LDI	R18,0xA
    0065 E030      LDI	R19,0
    0066 2D0A      MOV	R16,R10
    0067 2D1B      MOV	R17,R11
    0068 D0AB      RCALL	mod16u
    0069 2F40      MOV	R20,R16
    006A 2F51      MOV	R21,R17
(0046)    ledbuff[i]=tabel[temp];
    006B E18A      LDI	R24,0x1A
    006C E090      LDI	R25,0
    006D 2E24      MOV	R2,R20
    006E 2433      CLR	R3
    006F 0E28      ADD	R2,R24
    0070 1E39      ADC	R3,R25
    0071 2DE2      MOV	R30,R2
    0072 2DF3      MOV	R31,R3
    0073 95C8      LPM
    0074 E680      LDI	R24,0x60
    0075 E090      LDI	R25,0
    0076 2FE6      MOV	R30,R22
    0077 27FF      CLR	R31
    0078 0FE8      ADD	R30,R24
    0079 1FF9      ADC	R31,R25
    007A 8200      STD	R0,0+Z
(0047)    count=count/10;
    007B E02A      LDI	R18,0xA
    007C E030      LDI	R19,0
    007D 2D0A      MOV	R16,R10
    007E 2D1B      MOV	R17,R11
    007F D096      RCALL	div16u
    0080 2EA0      MOV	R10,R16
    0081 2EB1      MOV	R11,R17
(0048)   }
    0082 9563      INC	R22
    0083 3066      CPI	R22,6
    0084 F2F8      BCS	0x0064
(0049) }
    0085 D0CA      RCALL	pop_gset3
    0086 9508      RET
(0050) /******************************
(0051)           MCU初始化
(0052) ******************************/ 
(0053) void mcu_init(void)
(0054)  {
(0055)   DDRD=0x3f;
_mcu_init:
    0087 E38F      LDI	R24,0x3F
    0088 BB81      OUT	P11,R24
(0056)   DDRB=0xff;
    0089 EF8F      LDI	R24,0xFF
    008A BB87      OUT	P17,R24
(0057)   PORTD=0xff;
    008B BB82      OUT	P12,R24
(0058)   PORTB=0xff;//端口初始化
    008C BB88      OUT	P18,R24
(0059)   TIMSK =0x08;//使能T1捕捉中断
    008D E088      LDI	R24,0x8
    008E BF89      OUT	P39,R24
(0060)   TCCR1A=0x00;
    008F 2422      CLR	R2
    0090 BC2F      OUT	P2F,R2
(0061)   TCCR1B=0xC2;//CK/8,捕捉周期的单位为1us
    0091 EC82      LDI	R24,0xC2
    0092 BD8E      OUT	P2E,R24
(0062)   ICR1=0;            
    0093 2433      CLR	R3
    0094 92300045  STS	R3,0x45
    0096 92200044  STS	R2,0x44
(0063)   TCNT1=0;          
    0098 9230004D  STS	R3,0x4D
    009A 9220004C  STS	R2,0x4C
(0064)  }
    009C 9508      RET
_main:
  y                    --> Y+4
  x                    --> Y+0
  n                    --> R10
    009D 9728      SBIW	R28,0x8
(0065) /************************************************
(0066)         主程序:测量ICP引脚上信号的占空比
(0067) ************************************************/ 
(0068) void main()
(0069) {
(0070)  unsigned char n;
(0071)  unsigned long x,y;
(0072)  mcu_init();  
    009E DFE8      RCALL	_mcu_init
(0073)  SREG|=0x80;     //使能全局中断
    009F 9478      BSET	7
(0074)  for(;;)
(0075)     { 
(0076)      x=count_h*100;
    00A0 91300067  LDS	R19,_count_h+1
    00A2 91200066  LDS	R18,_count_h
    00A4 E604      LDI	R16,0x64
    00A5 E010      LDI	R17,0
    00A6 D059      RCALL	mpy16s
    00A7 2E20      MOV	R2,R16
    00A8 2E31      MOV	R3,R17
    00A9 2444      CLR	R4
    00AA 2455      CLR	R5
    00AB 2FEC      MOV	R30,R28
    00AC 2FFD      MOV	R31,R29
    00AD 8220      STD	R2,0+Z
    00AE 8231      STD	R3,1+Z
    00AF 8242      STD	R4,2+Z
    00B0 8253      STD	R5,3+Z
(0077) 	 y=count_l+count_h;
    00B1 90300067  LDS	R3,_count_h+1
    00B3 90200066  LDS	R2,_count_h
    00B5 90500069  LDS	R5,_count_l+1
    00B7 90400068  LDS	R4,_count_l
    00B9 0C42      ADD	R4,R2
    00BA 1C53      ADC	R5,R3
    00BB 2C24      MOV	R2,R4
    00BC 2C35      MOV	R3,R5
    00BD 2444      CLR	R4
    00BE 2455      CLR	R5
    00BF 8224      STD	R2,4+Z
    00C0 8235      STD	R3,5+Z
    00C1 8246      STD	R4,6+Z
    00C2 8257      STD	R5,7+Z
(0078) 	 n=x/y;       //计算占空比
    00C3 8060      LDD	R6,0+Z
    00C4 8071      LDD	R7,1+Z
    00C5 8082      LDD	R8,2+Z
    00C6 8093      LDD	R9,3+Z
    00C7 925A      ST	R5,-Y
    00C8 924A      ST	R4,-Y
    00C9 923A      ST	R3,-Y
    00CA 922A      ST	R2,-Y
    00CB 2D06      MOV	R16,R6
    00CC 2D17      MOV	R17,R7
    00CD 2D28      MOV	R18,R8
    00CE 2D39      MOV	R19,R9
    00CF D0C9      RCALL	div32u
    00D0 2EA0      MOV	R10,R16
(0079) 	 hextobcd(n);	
    00D1 2711      CLR	R17
    00D2 DF8C      RCALL	_hextobcd
(0080) 	 display();  //显示测量值 
    00D3 DF6E      RCALL	_display
(0081)     }
    00D4 CFCB      RJMP	0x00A0
    00D5 9628      ADIW	R28,0x8
    00D6 9508      RET
_Icp_timer1:
    00D7 922A      ST	R2,-Y
    00D8 923A      ST	R3,-Y
    00D9 938A      ST	R24,-Y
    00DA B62F      IN	R2,P3F
    00DB 922A      ST	R2,-Y

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -