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

📄 定时器.lst

📁 avr单片机的定时计数器的使用。包括各种延时子程序的调用。内有电路图。
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0035 E5CF      LDI	R28,0x5F
    0036 E0D4      LDI	R29,4
    0037 BFCD      OUT	0x3D,R28
    0038 BFDE      OUT	0x3E,R29
    0039 51C0      SUBI	R28,0x10
    003A 40D0      SBCI	R29,0
    003B EA0A      LDI	R16,0xAA
    003C 8308      STD	Y+0,R16
    003D 2400      CLR	R0
    003E E7E6      LDI	R30,0x76
    003F E0F0      LDI	R31,0
    0040 E010      LDI	R17,0
    0041 37E6      CPI	R30,0x76
    0042 07F1      CPC	R31,R17
    0043 F011      BEQ	0x0046
    0044 9201      ST	R0,Z+
    0045 CFFB      RJMP	0x0041
    0046 8300      STD	Z+0,R16
    0047 E5E4      LDI	R30,0x54
    0048 E0F0      LDI	R31,0
    0049 E6A0      LDI	R26,0x60
    004A E0B0      LDI	R27,0
    004B E010      LDI	R17,0
    004C 36EA      CPI	R30,0x6A
    004D 07F1      CPC	R31,R17
    004E F021      BEQ	0x0053
    004F 95C8      LPM
    0050 9631      ADIW	R30,1
    0051 920D      ST	R0,X+
    0052 CFF9      RJMP	0x004C
    0053 940E019F  CALL	_main
_exit:
    0055 CFFF      RJMP	_exit
FILE: D:\avr\+++精华+++\+M16范例+\定时器\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:
    0056 0000      NOP
    0057 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0058 940E01CD  CALL	push_gset2
    005A 01B8      MOVW	R22,R16
(0017)   }
(0018) 
(0019) void delay_nus(unsigned int n)       //N us延时函数
(0020)   {
(0021)    unsigned int i=0;
    005B 2744      CLR	R20
    005C 2755      CLR	R21
(0022)    for (i=0;i<n;i++)
    005D C003      RJMP	0x0061
(0023)    delay_1us();
    005E DFF7      RCALL	_delay_1us
    005F 5F4F      SUBI	R20,0xFF
    0060 4F5F      SBCI	R21,0xFF
    0061 1746      CP	R20,R22
    0062 0757      CPC	R21,R23
    0063 F3D0      BCS	0x005E
    0064 940E01C1  CALL	pop_gset2
    0066 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
    0067 2700      CLR	R16
    0068 2711      CLR	R17
    0069 C002      RJMP	0x006C
    006A 5F0F      SUBI	R16,0xFF
    006B 4F1F      SBCI	R17,0xFF
    006C 3704      CPI	R16,0x74
    006D E0E4      LDI	R30,4
    006E 071E      CPC	R17,R30
    006F F3D0      BCS	0x006A
    0070 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0071 940E01CD  CALL	push_gset2
    0073 01B8      MOVW	R22,R16
(0030)   }
(0031)   
(0032) void delay_nms(unsigned int n)       //N ms延时函数
(0033)   {
(0034)    unsigned int i=0;
    0074 2744      CLR	R20
    0075 2755      CLR	R21
(0035)    for (i=0;i<n;i++)
    0076 C003      RJMP	0x007A
(0036)    delay_1ms();
    0077 DFEF      RCALL	_delay_1ms
    0078 5F4F      SUBI	R20,0xFF
    0079 4F5F      SBCI	R21,0xFF
    007A 1746      CP	R20,R22
    007B 0757      CPC	R21,R23
    007C F3D0      BCS	0x0077
    007D 940E01C1  CALL	pop_gset2
    007F 9508      RET
FILE: D:\avr\+++精华+++\+M16范例+\定时器\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:
    0080 B38A      IN	R24,0x1A
    0081 6F80      ORI	R24,0xF0
    0082 BB8A      OUT	0x1A,R24
(0046)   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
    0083 9AA7      SBI	0x14,7
(0047)   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
    0084 9AA6      SBI	0x14,6
(0048)   LCD_write_command(0x28); 
    0085 E208      LDI	R16,0x28
    0086 D014      RCALL	_LCD_write_command
(0049)   LCD_en_write();
    0087 D00D      RCALL	_LCD_en_write
(0050)   delay_nus(40);
    0088 E208      LDI	R16,0x28
    0089 E010      LDI	R17,0
    008A DFCD      RCALL	_delay_nus
(0051)   LCD_write_command(0x28);  //4位显示
    008B E208      LDI	R16,0x28
    008C D00E      RCALL	_LCD_write_command
(0052)   LCD_write_command(0x0c);  //显示开
    008D E00C      LDI	R16,0xC
    008E D00C      RCALL	_LCD_write_command
(0053)   LCD_write_command(0x01);  //清屏
    008F E001      LDI	R16,1
    0090 D00A      RCALL	_LCD_write_command
(0054)   delay_nms(2);
    0091 E002      LDI	R16,2
    0092 E010      LDI	R17,0
    0093 DFDD      RCALL	_delay_nms
    0094 9508      RET
(0055)   
(0056) 
(0057)   
(0058) }
(0059) 
(0060) void LCD_en_write(void)  //液晶使能
(0061) {
(0062)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
    0095 9AAF      SBI	0x15,7
(0063)   delay_nus(1);
    0096 E001      LDI	R16,1
    0097 E010      LDI	R17,0
    0098 DFBF      RCALL	_delay_nus
(0064)   LCD_EN_PORT&=~LCD_EN;
    0099 98AF      CBI	0x15,7
    009A 9508      RET
_LCD_write_command:
  command              --> R20
    009B 940E01CF  CALL	push_gset1
    009D 2F40      MOV	R20,R16
(0065) }
(0066) 
(0067) void LCD_write_command(unsigned char command) //写指令
(0068) {
(0069)   //连线为高4位的写法
(0070)   delay_nus(16);
    009E E100      LDI	R16,0x10
    009F E010      LDI	R17,0
    00A0 DFB7      RCALL	_delay_nus
(0071)   LCD_RS_PORT&=~LCD_RS;        //RS=0
    00A1 98AE      CBI	0x15,6
(0072)   LCD_DATA_PORT&=0X0f;         //清高四位
    00A2 B38B      IN	R24,0x1B
    00A3 708F      ANDI	R24,0xF
    00A4 BB8B      OUT	0x1B,R24
(0073)   LCD_DATA_PORT|=command&0xf0; //写高四位
    00A5 2F84      MOV	R24,R20
    00A6 7F80      ANDI	R24,0xF0
    00A7 B22B      IN	R2,0x1B
    00A8 2A28      OR	R2,R24
    00A9 BA2B      OUT	0x1B,R2
(0074)   LCD_en_write();
    00AA DFEA      RCALL	_LCD_en_write
(0075)   command=command<<4;          //低四位移到高四位
    00AB 2F84      MOV	R24,R20
    00AC 708F      ANDI	R24,0xF
    00AD 9582      SWAP	R24
    00AE 2F48      MOV	R20,R24
(0076)   LCD_DATA_PORT&=0x0f;         //清高四位
    00AF B38B      IN	R24,0x1B
    00B0 708F      ANDI	R24,0xF
    00B1 BB8B      OUT	0x1B,R24
(0077)   LCD_DATA_PORT|=command&0xf0; //写低四位
    00B2 2F84      MOV	R24,R20
    00B3 7F80      ANDI	R24,0xF0
    00B4 B22B      IN	R2,0x1B
    00B5 2A28      OR	R2,R24
    00B6 BA2B      OUT	0x1B,R2
(0078)   LCD_en_write();
    00B7 DFDD      RCALL	_LCD_en_write
    00B8 940E01D2  CALL	pop_gset1
    00BA 9508      RET
_LCD_write_data:
  data                 --> R20
    00BB 940E01CF  CALL	push_gset1
    00BD 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);
    00BE E100      LDI	R16,0x10
    00BF E010      LDI	R17,0
    00C0 DF97      RCALL	_delay_nus
(0098)   LCD_RS_PORT|=LCD_RS;       //RS=1
    00C1 9AAE      SBI	0x15,6
(0099)   LCD_DATA_PORT&=0X0f;       //清高四位
    00C2 B38B      IN	R24,0x1B
    00C3 708F      ANDI	R24,0xF
    00C4 BB8B      OUT	0x1B,R24
(0100)   LCD_DATA_PORT|=data&0xf0;  //写高四位
    00C5 2F84      MOV	R24,R20
    00C6 7F80      ANDI	R24,0xF0
    00C7 B22B      IN	R2,0x1B
    00C8 2A28      OR	R2,R24
    00C9 BA2B      OUT	0x1B,R2
(0101)   LCD_en_write();
    00CA DFCA      RCALL	_LCD_en_write
(0102)   data=data<<4;               //低四位移到高四位
    00CB 2F84      MOV	R24,R20
    00CC 708F      ANDI	R24,0xF
    00CD 9582      SWAP	R24
    00CE 2F48      MOV	R20,R24
(0103)   LCD_DATA_PORT&=0X0f;        //清高四位
    00CF B38B      IN	R24,0x1B
    00D0 708F      ANDI	R24,0xF
    00D1 BB8B      OUT	0x1B,R24
(0104)   LCD_DATA_PORT|=data&0xf0;   //写低四位
    00D2 2F84      MOV	R24,R20
    00D3 7F80      ANDI	R24,0xF0
    00D4 B22B      IN	R2,0x1B
    00D5 2A28      OR	R2,R24
    00D6 BA2B      OUT	0x1B,R2
(0105)   LCD_en_write();
    00D7 DFBD      RCALL	_LCD_en_write
    00D8 940E01D2  CALL	pop_gset1
    00DA 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00DB 940E01CD  CALL	push_gset2
    00DD 2F42      MOV	R20,R18
    00DE 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;
    00DF 2344      TST	R20
    00E0 F419      BNE	0x00E4
    00E1 2F46      MOV	R20,R22
    00E2 5840      SUBI	R20,0x80
    00E3 C002      RJMP	0x00E6
(0127)     else   address = 0xc0 + x;
    00E4 2F46      MOV	R20,R22
    00E5 5440      SUBI	R20,0x40

⌨️ 快捷键说明

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