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

📄 方波生成器.lst

📁 方波发生器程序。AVR单片机程序。MEGA16
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0059 E5CF      LDI	R28,0x5F
    005A E0D4      LDI	R29,4
    005B BFCD      OUT	0x3D,R28
    005C BFDE      OUT	0x3E,R29
    005D 51C0      SUBI	R28,0x10
    005E 40D0      SBCI	R29,0
    005F EA0A      LDI	R16,0xAA
    0060 8308      STD	Y+0,R16
    0061 2400      CLR	R0
    0062 EBED      LDI	R30,0xBD
    0063 E0F0      LDI	R31,0
    0064 E010      LDI	R17,0
    0065 3CE0      CPI	R30,0xC0
    0066 07F1      CPC	R31,R17
    0067 F011      BEQ	0x006A
    0068 9201      ST	R0,Z+
    0069 CFFB      RJMP	0x0065
    006A 8300      STD	Z+0,R16
    006B E5E4      LDI	R30,0x54
    006C E0F0      LDI	R31,0
    006D E6A0      LDI	R26,0x60
    006E E0B0      LDI	R27,0
    006F E010      LDI	R17,0
    0070 3BE1      CPI	R30,0xB1
    0071 07F1      CPC	R31,R17
    0072 F021      BEQ	0x0077
    0073 95C8      LPM
    0074 9631      ADIW	R30,1
    0075 920D      ST	R0,X+
    0076 CFF9      RJMP	0x0070
    0077 940E0262  CALL	_main
_exit:
    0079 CFFF      RJMP	_exit
FILE: D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) -----------------------------------------------------------------------*/
(0007) #ifndef __delay_h
(0008) #define __delay_h
(0009) void delay_nus(unsigned int n);
(0010) void delay_nms(unsigned int n);
(0011) void delay_1us(void);
(0012) void delay_1ms(void) ; 
(0013) 
(0014) void delay_1us(void)                 //1us延时函数
(0015)   {
(0016)    asm("nop");
_delay_1us:
    007A 0000      NOP
    007B 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    007C 940E0284  CALL	push_gset2
    007E 01B8      MOVW	R22,R16
(0017)   }
(0018) 
(0019) void delay_nus(unsigned int n)       //N us延时函数
(0020)   {
(0021)    unsigned int i=0;
    007F 2744      CLR	R20
    0080 2755      CLR	R21
(0022)    for (i=0;i<n;i++)
    0081 C003      RJMP	0x0085
(0023)    delay_1us();
    0082 DFF7      RCALL	_delay_1us
    0083 5F4F      SUBI	R20,0xFF
    0084 4F5F      SBCI	R21,0xFF
    0085 1746      CP	R20,R22
    0086 0757      CPC	R21,R23
    0087 F3D0      BCS	0x0082
    0088 940E0278  CALL	pop_gset2
    008A 9508      RET
(0024)   }
(0025)   
(0026) void delay_1ms(void)                 //1ms延时函数
(0027)   {
(0028)    unsigned int i;
(0029)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    008B 2700      CLR	R16
    008C 2711      CLR	R17
    008D C002      RJMP	0x0090
    008E 5F0F      SUBI	R16,0xFF
    008F 4F1F      SBCI	R17,0xFF
    0090 3704      CPI	R16,0x74
    0091 E0E4      LDI	R30,4
    0092 071E      CPC	R17,R30
    0093 F3D0      BCS	0x008E
    0094 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0095 940E0284  CALL	push_gset2
    0097 01B8      MOVW	R22,R16
(0030)   }
(0031)   
(0032) void delay_nms(unsigned int n)       //N ms延时函数
(0033)   {
(0034)    unsigned int i=0;
    0098 2744      CLR	R20
    0099 2755      CLR	R21
(0035)    for (i=0;i<n;i++)
    009A C003      RJMP	0x009E
(0036)    delay_1ms();
    009B DFEF      RCALL	_delay_1ms
    009C 5F4F      SUBI	R20,0xFF
    009D 4F5F      SBCI	R21,0xFF
    009E 1746      CP	R20,R22
    009F 0757      CPC	R21,R23
    00A0 F3D0      BCS	0x009B
    00A1 940E0278  CALL	pop_gset2
    00A3 9508      RET
FILE: D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)\1602.h
(0001) 
(0002) /* 用法:
(0003)    LCD_init();
(0004)    LCD_write_string(列,行,"字符串");
(0005)    LCD_write_char(列,行,'字符'); 
(0006)  ---------------------------------------------------------------
(0007) 下面是AVR与LCD连接信息
(0008) PC4 ->RS
(0009) PC5 ->EN
(0010) 地  ->RW
(0011) PC0 ->D4
(0012) PC1 ->D5
(0013) PC2 ->D6
(0014) PC3 ->D7
(0015) 要使用本驱动,改变下面配置信息即可
(0016) -----------------------------------------------------------------*/
(0017) #define LCD_EN_PORT    PORTC   //以下2个要设为同一个口
(0018) #define LCD_EN_DDR     DDRC
(0019) #define LCD_RS_PORT    PORTC   //以下2个要设为同一个口
(0020) #define LCD_RS_DDR     DDRC
(0021) #define LCD_DATA_PORT  PORTA   //以下3个要设为同一个口
(0022) #define LCD_DATA_DDR   DDRA    //默认情况下连线必须使用高四位端口,如果不是请注意修改
(0023) #define LCD_DATA_PIN   PINA
(0024) #define LCD_RS         (1<<PC6) //0x20   portC6       out
(0025) #define LCD_EN         (1<<PC7) //0x40   portC7       out
(0026) #define LCD_DATA       ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0   portA 4/5/6/7 out
(0027) /*--------------------------------------------------------------------------------------------------
(0028) 函数说明
(0029) --------------------------------------------------------------------------------------------------*/
(0030) void LCD_init(void);
(0031) void LCD_en_write(void);
(0032) void LCD_write_command(unsigned  char command) ;
(0033) void LCD_write_data(unsigned char data);
(0034) void LCD_set_xy (unsigned char x, unsigned char y);
(0035) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
(0036) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
(0037) 
(0038) //-----------------------------------------------------------------------------------------
(0039) 
(0040) #include <macros.h>
(0041) #include "delay.h"
(0042) 
(0043) void LCD_init(void)         //液晶初始化
(0044) {
(0045)   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
_LCD_init:
    00A4 B38A      IN	R24,0x1A
    00A5 6F80      ORI	R24,0xF0
    00A6 BB8A      OUT	0x1A,R24
(0046)   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
    00A7 9AA7      SBI	0x14,7
(0047)   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
    00A8 9AA6      SBI	0x14,6
(0048)   LCD_write_command(0x28); 
    00A9 E208      LDI	R16,0x28
    00AA D014      RCALL	_LCD_write_command
(0049)   LCD_en_write();
    00AB D00D      RCALL	_LCD_en_write
(0050)   delay_nus(40);
    00AC E208      LDI	R16,0x28
    00AD E010      LDI	R17,0
    00AE DFCD      RCALL	_delay_nus
(0051)   LCD_write_command(0x28);  //4位显示
    00AF E208      LDI	R16,0x28
    00B0 D00E      RCALL	_LCD_write_command
(0052)   LCD_write_command(0x0c);  //显示开
    00B1 E00C      LDI	R16,0xC
    00B2 D00C      RCALL	_LCD_write_command
(0053)   LCD_write_command(0x01);  //清屏
    00B3 E001      LDI	R16,1
    00B4 D00A      RCALL	_LCD_write_command
(0054)   delay_nms(2);
    00B5 E002      LDI	R16,2
    00B6 E010      LDI	R17,0
    00B7 DFDD      RCALL	_delay_nms
    00B8 9508      RET
(0055)   
(0056) 
(0057)   
(0058) }
(0059) 
(0060) void LCD_en_write(void)  //液晶使能
(0061) {
(0062)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
    00B9 9AAF      SBI	0x15,7
(0063)   delay_nus(1);
    00BA E001      LDI	R16,1
    00BB E010      LDI	R17,0
    00BC DFBF      RCALL	_delay_nus
(0064)   LCD_EN_PORT&=~LCD_EN;
    00BD 98AF      CBI	0x15,7
    00BE 9508      RET
_LCD_write_command:
  command              --> R20
    00BF 940E0286  CALL	push_gset1
    00C1 2F40      MOV	R20,R16
(0065) }
(0066) 
(0067) void LCD_write_command(unsigned char command) //写指令
(0068) {
(0069)   //连线为高4位的写法
(0070)   delay_nus(16);
    00C2 E100      LDI	R16,0x10
    00C3 E010      LDI	R17,0
    00C4 DFB7      RCALL	_delay_nus
(0071)   LCD_RS_PORT&=~LCD_RS;        //RS=0
    00C5 98AE      CBI	0x15,6
(0072)   LCD_DATA_PORT&=0X0f;         //清高四位
    00C6 B38B      IN	R24,0x1B
    00C7 708F      ANDI	R24,0xF
    00C8 BB8B      OUT	0x1B,R24
(0073)   LCD_DATA_PORT|=command&0xf0; //写高四位
    00C9 2F84      MOV	R24,R20
    00CA 7F80      ANDI	R24,0xF0
    00CB B22B      IN	R2,0x1B
    00CC 2A28      OR	R2,R24
    00CD BA2B      OUT	0x1B,R2
(0074)   LCD_en_write();
    00CE DFEA      RCALL	_LCD_en_write
(0075)   command=command<<4;          //低四位移到高四位
    00CF 2F84      MOV	R24,R20
    00D0 708F      ANDI	R24,0xF
    00D1 9582      SWAP	R24
    00D2 2F48      MOV	R20,R24
(0076)   LCD_DATA_PORT&=0x0f;         //清高四位
    00D3 B38B      IN	R24,0x1B
    00D4 708F      ANDI	R24,0xF
    00D5 BB8B      OUT	0x1B,R24
(0077)   LCD_DATA_PORT|=command&0xf0; //写低四位
    00D6 2F84      MOV	R24,R20
    00D7 7F80      ANDI	R24,0xF0
    00D8 B22B      IN	R2,0x1B
    00D9 2A28      OR	R2,R24
    00DA BA2B      OUT	0x1B,R2
(0078)   LCD_en_write();
    00DB DFDD      RCALL	_LCD_en_write
    00DC 940E0289  CALL	pop_gset1
    00DE 9508      RET
_LCD_write_data:
  data                 --> R20
    00DF 940E0286  CALL	push_gset1
    00E1 2F40      MOV	R20,R16
(0079)  
(0080) /*
(0081)   //连线为低四位的写法
(0082)   delay_nus(16);
(0083)   LCD_RS_PORT&=~LCD_RS;        //RS=0
(0084)   LCD_DATA_PORT&=0xf0;         //清高四位
(0085)   LCD_DATA_PORT|=(command>>4)&0x0f; //写高四位
(0086)   LCD_en_write();
(0087)   LCD_DATA_PORT&=0xf0;         //清高四位
(0088)   LCD_DATA_PORT|=command&0x0f; //写低四位
(0089)   LCD_en_write(); 
(0090) */
(0091)   
(0092) }
(0093) 
(0094) void LCD_write_data(unsigned char data) //写数据
(0095) {
(0096)   //连线为高4位的写法
(0097)   delay_nus(16);
    00E2 E100      LDI	R16,0x10
    00E3 E010      LDI	R17,0
    00E4 DF97      RCALL	_delay_nus
(0098)   LCD_RS_PORT|=LCD_RS;       //RS=1
    00E5 9AAE      SBI	0x15,6
(0099)   LCD_DATA_PORT&=0X0f;       //清高四位
    00E6 B38B      IN	R24,0x1B
    00E7 708F      ANDI	R24,0xF
    00E8 BB8B      OUT	0x1B,R24
(0100)   LCD_DATA_PORT|=data&0xf0;  //写高四位
    00E9 2F84      MOV	R24,R20
    00EA 7F80      ANDI	R24,0xF0
    00EB B22B      IN	R2,0x1B
    00EC 2A28      OR	R2,R24
    00ED BA2B      OUT	0x1B,R2
(0101)   LCD_en_write();
    00EE DFCA      RCALL	_LCD_en_write
(0102)   data=data<<4;               //低四位移到高四位
    00EF 2F84      MOV	R24,R20
    00F0 708F      ANDI	R24,0xF
    00F1 9582      SWAP	R24
    00F2 2F48      MOV	R20,R24
(0103)   LCD_DATA_PORT&=0X0f;        //清高四位
    00F3 B38B      IN	R24,0x1B
    00F4 708F      ANDI	R24,0xF
    00F5 BB8B      OUT	0x1B,R24
(0104)   LCD_DATA_PORT|=data&0xf0;   //写低四位
    00F6 2F84      MOV	R24,R20
    00F7 7F80      ANDI	R24,0xF0
    00F8 B22B      IN	R2,0x1B
    00F9 2A28      OR	R2,R24
    00FA BA2B      OUT	0x1B,R2
(0105)   LCD_en_write();
    00FB DFBD      RCALL	_LCD_en_write
    00FC 940E0289  CALL	pop_gset1
    00FE 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00FF 940E0284  CALL	push_gset2
    0101 2F42      MOV	R20,R18
    0102 2F60      MOV	R22,R16
(0106)   
(0107) /*
(0108)   //连线为低四位的写法 
(0109)   delay_nus(16);
(0110)   LCD_RS_PORT|=LCD_RS;       //RS=1
(0111)   LCD_DATA_PORT&=0Xf0;       //清高四位
(0112)   LCD_DATA_PORT|=(data>>4)&0x0f;  //写高四位
(0113)   LCD_en_write();
(0114)  
(0115)   LCD_DATA_PORT&=0Xf0;        //清高四位
(0116)   LCD_DATA_PORT|=data&0x0f;   //写低四位
(0117)   LCD_en_write();
(0118) */
(0119)   
(0120) }
(0121) 
(0122) 
(0123) void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
(0124) {
(0125)     unsigned char address;
(0126)     if (y == 0) address = 0x80 + x;
    0103 2344      TST	R20
    0104 F419      BNE	0x0108
    0105 2F46      MOV	R20,R22
    0106 5840      SUBI	R20,0x80
    0107 C002      RJMP	0x010A
(0127)     else   address = 0xc0 + x;
    0108 2F46      MOV	R20,R22
    0109 5440      SUBI	R20,0x40
(0128)     LCD_write_command( address);
    010A 2F04      MOV	R16,R20
    010B DFB3      RCALL	_LCD_write_command
    010C 940E0278  CALL	pop_gset2
    010E 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    010F 940E0282  CALL	push_gset3
    0111 2EA2      MOV	R10,R18
    0112 2F60      MOV	R22,R16
    0113 814E      LDD	R20,Y+6
    0114 815F      LDD	R21,Y+7
(0129) }
(0130)   
(0131) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0132) {
(0133)     LCD_set_xy( X, Y ); //写地址    
    0115 2D2A      MOV	R18,R10
    0116 2F06      MOV	R16,R22
    0117 DFE7      RCALL	_LCD_set_xy
    0118 C005      RJMP	0x011E
(0134)     while (*s)  // 写显示字符
(0135)     {
(0136)       LCD_write_data( *s );
    0119 01FA      MOVW	R30,R20
    011A 8100      LDD	R16,Z+0
    011B DFC3      RCALL	_LCD_write_data
(0137)       s ++;
    011C 5F4F      SUBI	R20,0xFF
    011D 4F5F      SBCI	R21,0xFF
    011E 01FA      MOVW	R30,R20
    011F 8020      LDD	R2,Z+0
    0120 2022      TST	R2
    0121 F7B9      BNE	0x0119
    0122 940E027B  CALL	pop_gset3
    0124 9508      RET
_LCD_write_char:
  data                 --> Y+4
  Y                    --> R22
  X                    --> R20
    0125 940E0284  CALL	push_gset2
    0127 2F62      MOV	R22,R18
    0128 2F40      MOV	R20,R16
(0138)     }
(0139)       
(0140) }
(0141) 
(0142) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0143) {
(0144)   LCD_set_xy( X, Y ); //写地址
    0129 2F26      MOV	R18,R22
    012A 2F04      MOV	R16,R20
    012B DFD3      RCALL	_LCD_set_xy
(0145)   LCD_write_data( data);
    012C 810C      LDD	R16,Y+4
    012D DFB1      RCALL	_LCD_write_data
    012E 940E0278  CALL	pop_gset2
    0130 9508      RET
_get_key:
  i                    --> R20
    0131 940E0286  CALL	push_gset1
FILE: D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)\main.c
(0001) /***************************************
(0002) *              方波生成器              *
(0003) * 程序功能: 生成占空比可调方波         *
(0004) * 时钟频率: 外部7.3728M                *
(0005) * 设    计:莫锦攀                     *
(0006) * 修改日期:2007年07月26日             *
(0007) * 编译环境:ICC-AVR6.31                *
(0008) * 实验环境:M16学习板                  *
(0009) * 使用端口: LCD:PC6,PC7,PA4~PA7        *
(0010) *           KEY:PB0,PD2,PD3            *
(0011) * 程序说明:方波范围:28HZ~22800HZ,步进*
(0012) *           2HZ,低频时可以观测到LED闪烁*
(0013) *                                      *
(0014) ***************************************/
(0015) #include <iom16v.h>
(0016) #include "1602.h"
(0017) #include "delay.h"
(0018) 
(0019) #define uchar unsigned char
(0020) #define uint  unsigned int
(0021) 
(0022) uchar get_key(void)
(0023) {
(0024)  unsigned char i;
(0025)  static unsigned char j;//按键记录 
(0026)  PORTD|=0x0c;//pd2,pd3上拉电阻
    0133 B382      IN	R24,0x12
    0134 608C      ORI	R24,0xC
    0135 BB82      OUT	0x12,R24
(0027)  DDRD&=0xf3;//pd2,pd3为输入
    0136 B381      IN	R24,0x11
    0137 7F83      ANDI	R24,0xF3
    0138 BB81      OUT	0x11,R24
(0028) 
(0029) 
(0030)  if((PIND&0x04)==0)i='A';   
    0139 9982      SBIC	0x10,2
    013A C002      RJMP	0x013D
    013B E441      LDI	R20,0x41
    013C C005      RJMP	0x0142
(0031)  else if((PIND&0x08)==0)i='B';
    013D 9983      SBIC	0x10,3
    013E C002      RJMP	0x0141
    013F E442      LDI	R20,0x42
    0140 C001      RJMP	0x0142
(0032)  else i=0x00;
    0141 2744      CLR	R20
(0033)     
(0034)  if (i == 0x00)//无有效按键按下
    0142 2344      TST	R20
    0143 F429      BNE	0x0149
(0035)    {
(0036)     j = 0x00;//清除按键记录
    0144 2422      CLR	R2
    0145 922000BD  STS	j,R2
(0037)     return 0x00;//程序退出
    0147 2700      CLR	R16
    0148 C019      RJMP	0x0162
(0038)    }
(0039)    if (j == 0x00) //为新按键
    0149 902000BD  LDS	R2,j
    014B 2022      TST	R2

⌨️ 快捷键说明

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