📄 定时器.lst
字号:
__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 + -