RB-101机器人主板蜂鸣器测试

这是从MCS51转到AVR后的第二个单片机程序,该程序是控制RB-101 机器人主板上的蜂鸣器连续发声。

 1 //RB-101 机器人蜂鸣器测试程序
 2 //2005年6月25日  彭斌
 3 
 4 #include <mega8515.h> //头文件
 5 #include <delay.h>    //延时头程序调用,该文件已经存在于CodeVisionAVR里 ,安装后就有。
 6 #include <stdio.h>    //一些常用函数的头文件调用
 7 
 8 //自定义蜂鸣器蜂鸣函数 (自定义函数必须放在入口函数前面,否则编译时会出错,这个可能是该软件识别造成的,不是一种程序设计规范)
 9 void buzzer(void)                 
10 {                  
11     //定义一个变量
12     unsigned char i=0xff;  
13     //循环
14     for(;i--;) 
15     { 
16         //蜂鸣器占用PORTB.3引脚
17         PORTB.3=!PORTB.3;   //取反
18         delay_us(500);     //延时500微秒,调节该延时值将改变蜂鸣器的音调高低
19     }
20 
21 
22 //主函数入口
23 void main(void)
24 {            
25     //DDRxn 定义引脚方向,“1” 为输出,“0”为输入。  
26        
27     DDRB.3 = 1;    //蜂鸣器引脚方向设置      
28     
29     //执行一个死循环,使数码管连续的全亮
30     while(1)
31     {         
32         buzzer();   //调用自定义蜂鸣函数
33         delay_ms(1000);  //延时1000毫秒,也就是1S   ,调节该延时长短可以使蜂鸣节奏变化
34         buzzer();   //调用自定义蜂鸣函数
35         delay_ms(1000);  //延时1000毫秒,也就是1S     
36     }
37 
38 }     
39 
40          


编译软件使用:CodeVisionAVR C Compiler
编译后产生如下汇编代码:

;Chip type           : ATmega8515L
;Program type        : Application
;Clock frequency     : 4.096000 MHz
;Memory model        : Small
;Optimize for        : Size
;(s)printf features  : int
;(s)scanf features   : int, width
;External SRAM size  : 0
;Data Stack size     : 128
;Promote char to int : No
;char is unsigned    : Yes
;8 bit enums         : No
;Enhanced core instructions    : On
;Automatic register allocation : On

    .LISTMAC
    .EQU UDRE=0x5
    .EQU RXC=0x7
    .EQU USR=0xB
    .EQU UDR=0xC
    .EQU EERE=0x0
    .EQU EEWE=0x1
    .EQU EEMWE=0x2
    .EQU SPSR=0xE
    .EQU SPDR=0xF
    .EQU EECR=0x1C
    .EQU EEDR=0x1D
    .EQU EEARL=0x1E
    .EQU EEARH=0x1F
    .EQU WDTCR=0x21
    .EQU MCUCSR=0x34
    .EQU MCUCR=0x35
    .EQU EMCUCR=0x36
    .EQU GICR=0x3B
    .EQU SPL=0x3D
    .EQU SPH=0x3E
    .EQU SREG=0x3F

    .DEF R0X0=R0
    .DEF R0X1=R1
    .DEF R0X2=R2
    .DEF R0X3=R3
    .DEF R0X4=R4
    .DEF R0X5=R5
    .DEF R0X6=R6
    .DEF R0X7=R7
    .DEF R0X8=R8
    .DEF R0X9=R9
    .DEF R0XA=R10
    .DEF R0XB=R11
    .DEF R0XC=R12
    .DEF R0XD=R13
    .DEF R0XE=R14
    .DEF R0XF=R15
    .DEF R0X10=R16
    .DEF R0X11=R17
    .DEF R0X12=R18
    .DEF R0X13=R19
    .DEF R0X14=R20
    .DEF R0X15=R21
    .DEF R0X16=R22
    .DEF R0X17=R23
    .DEF R0X18=R24
    .DEF R0X19=R25
    .DEF R0X1A=R26
    .DEF R0X1B=R27
    .DEF R0X1C=R28
    .DEF R0X1D=R29
    .DEF R0X1E=R30
    .DEF R0X1F=R31

    .EQU __se_bit=0x20

    .MACRO __CPD1N
    CPI  R30,LOW(@0)
    LDI  R26,HIGH(@0)
    CPC  R31,R26
    LDI  R26,BYTE3(@0)
    CPC  R22,R26
    LDI  R26,BYTE4(@0)
    CPC  R23,R26
    .ENDM

    .MACRO __CPD2N
    CPI  R26,LOW(@0)
    LDI  R30,HIGH(@0)
    CPC  R27,R30
    LDI  R30,BYTE3(@0)
    CPC  R24,R30
    LDI  R30,BYTE4(@0)
    CPC  R25,R30
    .ENDM

    .MACRO __CPWRR
    CP   R@0,R@2
    CPC  R@1,R@3
    .ENDM

    .MACRO __CPWRN
    CPI  R@0,LOW(@2)
    LDI  R30,HIGH(@2)
    CPC  R@1,R30
    .ENDM

    .MACRO __ADDD1N
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    SBCI R22,BYTE3(-@0)
    SBCI R23,BYTE4(-@0)
    .ENDM

    .MACRO __ADDD2N
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    SBCI R24,BYTE3(-@0)
    SBCI R25,BYTE4(-@0)
    .ENDM

    .MACRO __SUBD1N
    SUBI R30,LOW(@0)
    SBCI R31,HIGH(@0)
    SBCI R22,BYTE3(@0)
    SBCI R23,BYTE4(@0)
    .ENDM

    .MACRO __SUBD2N
    SUBI R26,LOW(@0)
    SBCI R27,HIGH(@0)
    SBCI R24,BYTE3(@0)
    SBCI R25,BYTE4(@0)
    .ENDM

    .MACRO __ANDD1N
    ANDI R30,LOW(@0)
    ANDI R31,HIGH(@0)
    ANDI R22,BYTE3(@0)
    ANDI R23,BYTE4(@0)
    .ENDM

    .MACRO __ORD1N
    ORI  R30,LOW(@0)
    ORI  R31,HIGH(@0)
    ORI  R22,BYTE3(@0)
    ORI  R23,BYTE4(@0)
    .ENDM

    .MACRO __DELAY_USB
    LDI  R24,LOW(@0)
__DELAY_USB_LOOP:
    DEC  R24
    BRNE __DELAY_USB_LOOP
    .ENDM

    .MACRO __DELAY_USW
    LDI  R24,LOW(@0)
    LDI  R25,HIGH(@0)
__DELAY_USW_LOOP:
    SBIW R24,1
    BRNE __DELAY_USW_LOOP
    .ENDM

    .MACRO __CLRD1S
    CLR  R30
    STD  Y+@0,R30
    STD  Y+@0+1,R30
    STD  Y+@0+2,R30
    STD  Y+@0+3,R30
    .ENDM

    .MACRO __GETD1S
    LDD  R30,Y+@0
    LDD  R31,Y+@0+1
    LDD  R22,Y+@0+2
    LDD  R23,Y+@0+3
    .ENDM

    .MACRO __PUTD1S
    STD  Y+@0,R30
    STD  Y+@0+1,R31
    STD  Y+@0+2,R22
    STD  Y+@0+3,R23
    .ENDM

    .MACRO __POINTB1MN
    LDI  R30,LOW(@0+@1)
    .ENDM

    .MACRO __POINTW1MN
    LDI  R30,LOW(@0+@1)
    LDI  R31,HIGH(@0+@1)
    .ENDM

    .MACRO __POINTW1FN
    LDI  R30,LOW(2*@0+@1)
    LDI  R31,HIGH(2*@0+@1)
    .ENDM

    .MACRO __POINTB2MN
    LDI  R26,LOW(@0+@1)
    .ENDM

    .MACRO __POINTW2MN
    LDI  R26,LOW(@0+@1)
    LDI  R27,HIGH(@0+@1)
    .ENDM

    .MACRO __GETD1N
    LDI  R30,LOW(@0)
    LDI  R31,HIGH(@0)
    LDI  R22,BYTE3(@0)
    LDI  R23,BYTE4(@0)
    .ENDM

    .MACRO __GETD2N
    LDI  R26,LOW(@0)
    LDI  R27,HIGH(@0)
    LDI  R24,BYTE3(@0)
    LDI  R25,BYTE4(@0)
    .ENDM

    .MACRO __GETD2S
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    LDD  R24,Y+@0+2
    LDD  R25,Y+@0+3
    .ENDM

    .MACRO __GETB1MN
    LDS  R30,@0+@1
    .ENDM

    .MACRO __GETW1MN
    LDS  R30,@0+@1
    LDS  R31,@0+@1+1
    .ENDM

    .MACRO __GETD1MN
    LDS  R30,@0+@1
    LDS  R31,@0+@1+1
    LDS  R22,@0+@1+2
    LDS  R23,@0+@1+3
    .ENDM

    .MACRO __GETBRMN
    LDS  R@2,@0+@1
    .ENDM

    .MACRO __GETWRMN
    LDS  R@2,@0+@1
    LDS  R@3,@0+@1+1
    .ENDM

    .MACRO __GETB2MN
    LDS  R26,@0+@1
    .ENDM

    .MACRO __GETW2MN
    LDS  R26,@0+@1
    LDS  R27,@0+@1+1
    .ENDM

    .MACRO __GETD2MN
    LDS  R26,@0+@1
    LDS  R27,@0+@1+1
    LDS  R24,@0+@1+2
    LDS  R25,@0+@1+3
    .ENDM

    .MACRO __PUTB1MN
    STS  @0+@1,R30
    .ENDM

    .MACRO __PUTW1MN
    STS  @0+@1,R30
    STS  @0+@1+1,R31
    .ENDM

    .MACRO __PUTD1MN
    STS  @0+@1,R30
    STS  @0+@1+1,R31
    STS  @0+@1+2,R22
    STS  @0+@1+3,R23
    .ENDM

    .MACRO __PUTBMRN
    STS  @0+@1,R@2
    .ENDM

    .MACRO __PUTWMRN
    STS  @0+@1,R@2
    STS  @0+@1+1,R@3
    .ENDM

    .MACRO __GETW1R
    MOV  R30,R@0
    MOV  R31,R@1
    .ENDM

    .MACRO __GETW2R
    MOV  R26,R@0
    MOV  R27,R@1
    .ENDM

    .MACRO __GETWRN
    LDI  R@0,LOW(@2)
    LDI  R@1,HIGH(@2)
    .ENDM

    .MACRO __PUTW1R
    MOV  R@0,R30
    MOV  R@1,R31
    .ENDM

    .MACRO __PUTW2R
    MOV  R@0,R26
    MOV  R@1,R27
    .ENDM

    .MACRO __ADDWRN
    SUBI R@0,LOW(-@2)
    SBCI R@1,HIGH(-@2)
    .ENDM

    .MACRO __ADDWRR
    ADD  R@0,R@2
    ADC  R@1,R@3
    .ENDM

    .MACRO __SUBWRN
    SUBI R@0,LOW(@2)
    SBCI R@1,HIGH(@2)
    .ENDM

    .MACRO __SUBWRR
    SUB  R@0,R@2
    SBC  R@1,R@3
    .ENDM

    .MACRO __ANDWRN
    ANDI R@0,LOW(@2)
    ANDI R@1,HIGH(@2)
    .ENDM

    .MACRO __ANDWRR
    AND  R@0,R@2
    AND  R@1,R@3
    .ENDM

    .MACRO __ORWRN
    ORI  R@0,LOW(@2)
    ORI  R@1,HIGH(@2)
    .ENDM

    .MACRO __ORWRR
    OR   R@0,R@2
    OR   R@1,R@3
    .ENDM

    .MACRO __EORWRR
    EOR  R@0,R@2
    EOR  R@1,R@3
    .ENDM

    .MACRO __GETWRS
    LDD  R@0,Y+@2
    LDD  R@1,Y+@2+1
    .ENDM

    .MACRO __PUTWSR
    STD  Y+@2,R@0
    STD  Y+@2+1,R@1
    .ENDM

    .MACRO __MOVEWRR
    MOV  R@0,R@2
    MOV  R@1,R@3
    .ENDM

    .MACRO __INWR
    IN   R@0,@2
    IN   R@1,@2+1
    .ENDM

    .MACRO __OUTWR
    OUT  @2+1,R@1
    OUT  @2,R@0
    .ENDM

    .MACRO __CALL1MN
    LDS  R30,@0+@1
    LDS  R31,@0+@1+1
    ICALL
    .ENDM

    .MACRO __NBST
    BST  R@0,@1
    IN   R30,SREG
    LDI  R31,0x40
    EOR  R30,R31
    OUT  SREG,R30
    .ENDM


    .MACRO __PUTB1SN
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X,R30
    .ENDM

    .MACRO __PUTW1SN
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X+,R30
    ST   X,R31
    .ENDM

    .MACRO __PUTD1SN
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    RCALL __PUTDP1
    .ENDM

    .MACRO __PUTB1SNS
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    ADIW R26,@1
    ST   X,R30
    .ENDM

    .MACRO __PUTW1SNS
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    ADIW R26,@1
    ST   X+,R30
    ST   X,R31
    .ENDM

    .MACRO __PUTD1SNS
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    ADIW R26,@1
    RCALL __PUTDP1
    .ENDM

    .MACRO __PUTB1PMN
    LDS  R26,@0
    LDS  R27,@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X,R30
    .ENDM

    .MACRO __PUTW1PMN
    LDS  R26,@0
    LDS  R27,@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X+,R30
    ST   X,R31
    .ENDM

    .MACRO __PUTD1PMN
    LDS  R26,@0
    LDS  R27,@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    RCALL __PUTDP1
    .ENDM

    .MACRO __PUTB1PMNS
    LDS  R26,@0
    LDS  R27,@0+1
    ADIW R26,@1
    ST   X,R30
    .ENDM

    .MACRO __PUTW1PMNS
    LDS  R26,@0
    LDS  R27,@0+1
    ADIW R26,@1
    ST   X+,R30
    ST   X,R31
    .ENDM

    .MACRO __PUTD1PMNS
    LDS  R26,@0
    LDS  R27,@0+1
    ADIW R26,@1
    RCALL __PUTDP1
    .ENDM

    .MACRO __GETB1SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    LD   R30,Z
    .ENDM

    .MACRO __GETW1SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    LD   R0,Z+
    LD   R31,Z
    MOV  R30,R0
    .ENDM

    .MACRO __GETD1SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    LD   R0,Z+
    LD   R1,Z+
    LD   R22,Z+
    LD   R23,Z
    MOVW R30,R0
    .ENDM

    .MACRO __GETB2SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R26,X
    .ENDM

    .MACRO __GETW2SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R0,X+
    LD   R27,X
    MOV  R26,R0
    .ENDM

    .MACRO __GETD2SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R0,X+
    LD   R1,X+
    LD   R24,X+
    LD   R25,X
    MOVW R26,R0
    .ENDM

    .MACRO __GETBRSX
    MOVW R30,R28
    SUBI R30,LOW(-@1)
    SBCI R31,HIGH(-@1)
    LD   R@0,Z
    .ENDM

    .MACRO __GETWRSX
    MOVW R30,R28
    SUBI R30,LOW(-@2)
    SBCI R31,HIGH(-@2)
    LD   R@0,Z+
    LD   R@1,Z
    .ENDM

    .MACRO __LSLW8SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    LD   R31,Z
    CLR  R30
    .ENDM

    .MACRO __PUTB1SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    ST   X,R30
    .ENDM

    .MACRO __PUTW1SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    ST   X+,R30
    ST   X,R31
    .ENDM

    .MACRO __PUTD1SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    ST   X+,R30
    ST   X+,R31
    ST   X+,R22
    ST   X,R23
    .ENDM

    .MACRO __CLRW1SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    CLR  R0
    ST   Z+,R0
    ST   Z,R0
    .ENDM

    .MACRO __CLRD1SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    CLR  R0
    ST   Z+,R0
    ST   Z+,R0
    ST   Z+,R0
    ST   Z,R0
    .ENDM

    .MACRO __PUTB2SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    ST   Z,R26
    .ENDM

    .MACRO __PUTW2SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    ST   Z+,R26
    ST   Z,R27
    .ENDM

    .MACRO __PUTBSRX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    ST   Z,R@1
    .ENDM

    .MACRO __PUTWSRX
    MOVW R30,R28
    SUBI R30,LOW(-@2)
    SBCI R31,HIGH(-@2)
    ST   Z+,R@0
    ST   Z,R@1
    .ENDM

    .MACRO __PUTB1SNX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R0,X+
    LD   R27,X
    MOV  R26,R0
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X,R30
    .ENDM

    .MACRO __PUTW1SNX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R0,X+
    LD   R27,X
    MOV  R26,R0
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X+,R30
    ST   X,R31
    .ENDM

    .MACRO __PUTD1SNX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R0,X+
    LD   R27,X
    MOV  R26,R0
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X+,R30
    ST   X+,R31
    ST   X+,R22
    ST   X,R23
    .ENDM

    .MACRO __MULBRR
    MULS R@0,R@1
    MOV  R30,R0
    .ENDM

    .MACRO __MULBRRU
    MUL  R@0,R@1
    MOV  R30,R0
    .ENDM

    .CSEG
    .ORG 0

    .INCLUDE "main.vec"
    .INCLUDE "main.inc"

__RESET:
    CLI
    CLR  R30
    OUT  EECR,R30

;INTERRUPT VECTORS ARE PLACED
;AT THE START OF FLASH
    LDI  R31,1
    OUT  GICR,R31
    OUT  GICR,R30
    OUT  MCUCR,R30
    OUT  EMCUCR,R30

;DISABLE WATCHDOG
    LDI  R31,0x18
    OUT  WDTCR,R31
    LDI  R31,0x10
    OUT  WDTCR,R31

;CLEAR R2-R14
    LDI  R24,13
    LDI  R26,2
    CLR  R27
__CLEAR_REG:
    ST   X+,R30
    DEC  R24
    BRNE __CLEAR_REG

;CLEAR SRAM
    LDI  R24,LOW(0x200)
    LDI  R25,HIGH(0x200)
    LDI  R26,0x60
__CLEAR_SRAM:
    ST   X+,R30
    SBIW R24,1
    BRNE __CLEAR_SRAM

;GLOBAL VARIABLES INITIALIZATION
    LDI  R30,LOW(__GLOBAL_INI_TBL*2)
    LDI  R31,HIGH(__GLOBAL_INI_TBL*2)
__GLOBAL_INI_NEXT:
    LPM  R0,Z+
    LPM  R1,Z+
    MOVW R22,R30
    MOVW R30,R0
    SBIW R30,0
    BREQ __GLOBAL_INI_END
    LPM  R26,Z+
    LPM  R27,Z+
    LPM  R24,Z+
    LPM  R25,Z+
__GLOBAL_INI_LOOP:
    LPM  R0,Z+
    ST   X+,R0
    SBIW R24,1
    BRNE __GLOBAL_INI_LOOP
    MOVW R30,R22
    RJMP __GLOBAL_INI_NEXT
__GLOBAL_INI_END:

;STACK POINTER INITIALIZATION
    LDI  R30,LOW(0x25F)
    OUT  SPL,R30
    LDI  R30,HIGH(0x25F)
    OUT  SPH,R30

;DATA STACK POINTER INITIALIZATION
    LDI  R28,LOW(0xE0)
    LDI  R29,HIGH(0xE0)

    RJMP _main

    .ESEG
    .ORG 0
    .DB  0 ; FIRST EEPROM LOCATION NOT USED, SEE ATMEL ERRATA SHEETS

    .DSEG
    .ORG 0xE0
;       1 
;       2 //RB-101 机器人蜂鸣器测试程序
;       3 //2005年6月25日  彭斌
;       4 
;       5 #include 
<mega8515.h> //头文件
;       6 #include 
<delay.h>    //延时头程序调用,该文件已经存在于CodeVisionAVR里 ,安装后就有。
;       7 #include 
<stdio.h>    //一些常用函数的头文件调用
;       8 
;       9 //自定义蜂鸣器蜂鸣函数 (自定义函数必须放在入口函数前面,否则编译时会出错,这个可能是该软件识别造成的,不是一种程序设计规范)
;      10 void buzzer(void)                 
;      11 {                  

    .CSEG
_buzzer:
;      12     //定义一个变量
;      13     unsigned char i=0xff;  
;      14     //循环
;      15     for(;i--;) 
    ST   -Y,R16
;    i -> R16
    LDI  R16,255
_0x10:
    MOV  R30,R16
    SUBI R16,1
    CPI  R30,0
    BREQ _0x11
;      16     { 
;      17         //蜂鸣器占用PORTB.3引脚
;      18         PORTB.3=!PORTB.3;   //取反
    CLT
    SBIS 0x18,3
    SET
    IN   R30,0x18
    BLD  R30,3
    OUT  0x18,R30
;      19         delay_us(500);     //延时500微秒,改名该延时值将改变蜂鸣器的音调高低
    __DELAY_USW 512
;      20     }
    RJMP _0x10
_0x11:
;      21 } 
    LD   R16,Y+
    RET
;      22 
;      23 //主函数入口
;      24 void main(void)
;      25 {            
_main:
;      26     //DDRxn 定义引脚方向,“1” 为输出,“0”为输入。  
;      27        
;      28     DDRB.3 = 1;    //蜂鸣器引脚方向设置      
    SBI  0x17,3
;      29     
;      30     //执行一个死循环,使数码管连续的全亮
;      31     while(1)
_0x13:
;      32     {         
;      33         buzzer();   //调用自定义蜂鸣函数
    RCALL SUBOPT_0x0
;      34         delay_ms(1000);  //延时1000毫秒,也就是1S   ,调节该延时长短可以使蜂鸣节奏变化
;      35         buzzer();   //调用自定义蜂鸣函数
    RCALL SUBOPT_0x0
;      36         delay_ms(1000);  //延时1000毫秒,也就是1S     
;      37     }
    RJMP _0x13
;      38 
;      39 }     
_0x16:
    NOP
    RJMP _0x16
;      40 
;      41          
_getchar:
     sbis usr,rxc
     rjmp _getchar
     in   r30,udr
    RET
_putchar:
     sbis usr,udre
     rjmp _putchar
     ld   r30,y
     out  udr,r30
    ADIW R28,1
    RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x0:
    RCALL _buzzer
    LDI  R30,LOW(1000)
    LDI  R31,HIGH(1000)
    ST   -Y,R31
    ST   -Y,R30
    RJMP _delay_ms

_delay_ms:
    ld   r30,y+
    ld   r31,y+
    adiw r30,0
    breq __delay_ms1
__delay_ms0:
    __DELAY_USW 0x400
    wdr
    sbiw r30,1
    brne __delay_ms0
__delay_ms1:
    ret

posted on 2005-07-05 11:41  彭斌  阅读(2161)  评论(1编辑  收藏  举报

导航