📄 main.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 52C0 SUBI R28,0x20
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E018F CALL _main
_exit:
004A CFFF RJMP _exit
FILE: D:\avr\+++精华+++\24c02\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) -----------------------------------------------------------------------*/
(0008) #ifndef __delay_h
(0009) #define __delay_h
(0010) void delay_nus(unsigned int n);
(0011) void delay_nms(unsigned int n);
(0012) void delay_1us(void);
(0013) void delay_1ms(void) ;
(0014)
(0015) void delay_1us(void) //1us延时函数
(0016) {
(0017) asm("nop");
_delay_1us:
004B 0000 NOP
004C 9508 RET
_delay_nus:
i --> R20
n --> R22
004D 940E01C9 CALL push_gset2
004F 01B8 MOVW R22,R16
(0018) }
(0019)
(0020) void delay_nus(unsigned int n) //N us延时函数
(0021) {
(0022) unsigned int i=0;
0050 2744 CLR R20
0051 2755 CLR R21
(0023) for (i=0;i<n;i++)
0052 C003 RJMP 0x0056
(0024) delay_1us();
0053 DFF7 RCALL _delay_1us
0054 5F4F SUBI R20,0xFF
0055 4F5F SBCI R21,0xFF
0056 1746 CP R20,R22
0057 0757 CPC R21,R23
0058 F3D0 BCS 0x0053
0059 940E01BD CALL pop_gset2
005B 9508 RET
(0025) }
(0026)
(0027) void delay_1ms(void) //1ms延时函数
(0028) {
(0029) unsigned int i;
(0030) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
005C 2700 CLR R16
005D 2711 CLR R17
005E C002 RJMP 0x0061
005F 5F0F SUBI R16,0xFF
0060 4F1F SBCI R17,0xFF
0061 3704 CPI R16,0x74
0062 E0E4 LDI R30,4
0063 071E CPC R17,R30
0064 F3D0 BCS 0x005F
0065 9508 RET
_delay_nms:
i --> R20
n --> R22
0066 940E01C9 CALL push_gset2
0068 01B8 MOVW R22,R16
(0031) }
(0032)
(0033) void delay_nms(unsigned int n) //N ms延时函数
(0034) {
(0035) unsigned int i=0;
0069 2744 CLR R20
006A 2755 CLR R21
(0036) for (i=0;i<n;i++)
006B C003 RJMP 0x006F
(0037) delay_1ms();
006C DFEF RCALL _delay_1ms
006D 5F4F SUBI R20,0xFF
006E 4F5F SBCI R21,0xFF
006F 1746 CP R20,R22
0070 0757 CPC R21,R23
0071 F3D0 BCS 0x006C
0072 940E01BD CALL pop_gset2
0074 9508 RET
_I2C_Write:
RegAddress --> R22
Wdata --> R20
0075 940E01C9 CALL push_gset2
0077 2F62 MOV R22,R18
0078 2F40 MOV R20,R16
FILE: D:\avr\+++精华+++\24c02\I2C.h
(0001) #include <macros.h>
(0002) #include "delay.h"
(0003)
(0004) //I2C 状态定义
(0005) //MT 主方式传输 MR 主方式接受
(0006) #define START 0x08
(0007) #define RE_START 0x10
(0008) #define MT_SLA_ACK 0x18
(0009) #define MT_SLA_NOACK 0x20
(0010) #define MT_DATA_ACK 0x28
(0011) #define MT_DATA_NOACK 0x30
(0012) #define MR_SLA_ACK 0x40
(0013) #define MR_SLA_NOACK 0x48
(0014) #define MR_DATA_ACK 0x50
(0015) #define MR_DATA_NOACK 0x58
(0016)
(0017) #define RD_DEVICE_ADDR 0xA1
(0018) #define WD_DEVICE_ADDR 0xA0
(0019)
(0020) //常用TWI操作(主模式写和读)
(0021) #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动I2C
(0022) #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //停止I2C
(0023) #define Wait() {while(!(TWCR&(1<<TWINT)));} //等待中断发生
(0024) #define TestAck() (TWSR&0xf8) //观察返回状态
(0025) #define SetAck (TWCR|=(1<<TWEA)) //做出ACK应答
(0026) #define SetNoAck (TWCR&=~(1<<TWEA)) //做出Not Ack应答
(0027) #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动I2C
(0028) #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} //写数据到TWDR
(0029)
(0030) unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress);
(0031) unsigned char I2C_Read(unsigned RegAddress);
(0032)
(0033) /*********************************************
(0034) I2C总线写一个字节
(0035) 返回0:写成功
(0036) 返回1:写失败
(0037) **********************************************/
(0038) unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress)
(0039) {
(0040)
(0041) Start(); //I2C启动
0079 EA84 LDI R24,0xA4
007A BF86 OUT 0x36,R24
(0042) Wait();
007B B626 IN R2,0x36
007C FE27 SBRS R2,7
007D CFFD RJMP 0x007B
(0043) if(TestAck()!=START)
007E B181 IN R24,0x01
007F 7F88 ANDI R24,0xF8
0080 3088 CPI R24,0x8
0081 F011 BEQ 0x0084
(0044) return 1; //ACK
0082 E001 LDI R16,1
0083 C02B RJMP 0x00AF
(0045)
(0046) Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
0084 EA80 LDI R24,0xA0
0085 B983 OUT 0x03,R24
0086 E884 LDI R24,0x84
0087 BF86 OUT 0x36,R24
(0047) Wait();
0088 B626 IN R2,0x36
0089 FE27 SBRS R2,7
008A CFFD RJMP 0x0088
(0048) if(TestAck()!=MT_SLA_ACK)
008B B181 IN R24,0x01
008C 7F88 ANDI R24,0xF8
008D 3188 CPI R24,0x18
008E F011 BEQ 0x0091
(0049) return 1; //ACK
008F E001 LDI R16,1
0090 C01E RJMP 0x00AF
(0050)
(0051) Write8Bit(RegAddress); //写器件相应寄存器地址
0091 B963 OUT 0x03,R22
0092 E884 LDI R24,0x84
0093 BF86 OUT 0x36,R24
(0052) Wait();
0094 B626 IN R2,0x36
0095 FE27 SBRS R2,7
0096 CFFD RJMP 0x0094
(0053) if(TestAck()!=MT_DATA_ACK)
0097 B181 IN R24,0x01
0098 7F88 ANDI R24,0xF8
0099 3288 CPI R24,0x28
009A F011 BEQ 0x009D
(0054) return 1; //ACK
009B E001 LDI R16,1
009C C012 RJMP 0x00AF
(0055)
(0056) Write8Bit(Wdata); //写数据到器件相应寄存器
009D B943 OUT 0x03,R20
009E E884 LDI R24,0x84
009F BF86 OUT 0x36,R24
(0057) Wait();
00A0 B626 IN R2,0x36
00A1 FE27 SBRS R2,7
00A2 CFFD RJMP 0x00A0
(0058) if(TestAck()!=MT_DATA_ACK)
00A3 B181 IN R24,0x01
00A4 7F88 ANDI R24,0xF8
00A5 3288 CPI R24,0x28
00A6 F011 BEQ 0x00A9
(0059) return 1; //ACK
00A7 E001 LDI R16,1
00A8 C006 RJMP 0x00AF
(0060)
(0061) Stop(); //I2C停止
00A9 E984 LDI R24,0x94
00AA BF86 OUT 0x36,R24
(0062) delay_nms(10); //延时
00AB E00A LDI R16,0xA
00AC E010 LDI R17,0
00AD DFB8 RCALL _delay_nms
(0063) return 0;
00AE 2700 CLR R16
00AF 940E01BD CALL pop_gset2
00B1 9508 RET
_I2C_Read:
temp --> R20
RegAddress --> R16
00B2 940E01CB CALL push_gset1
(0064) }
(0065)
(0066) /*********************************************
(0067) I2C总线读一个字节
(0068) 返回0:读成功
(0069) 返回1:读失败
(0070) **********************************************/
(0071)
(0072) unsigned char I2C_Read(unsigned RegAddress)
(0073)
(0074) {
(0075) unsigned char temp;
(0076) Start();//I2C启动
00B4 EA84 LDI R24,0xA4
00B5 BF86 OUT 0x36,R24
(0077) Wait();
00B6 B626 IN R2,0x36
00B7 FE27 SBRS R2,7
00B8 CFFD RJMP 0x00B6
(0078) if (TestAck()!=START)
00B9 B181 IN R24,0x01
00BA 7F88 ANDI R24,0xF8
00BB 3088 CPI R24,0x8
00BC F011 BEQ 0x00BF
(0079) return 1; //ACK
00BD E001 LDI R16,1
00BE C040 RJMP 0x00FF
(0080)
(0081) Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
00BF EA80 LDI R24,0xA0
00C0 B983 OUT 0x03,R24
00C1 E884 LDI R24,0x84
00C2 BF86 OUT 0x36,R24
(0082) Wait();
00C3 B626 IN R2,0x36
00C4 FE27 SBRS R2,7
00C5 CFFD RJMP 0x00C3
(0083) if (TestAck()!=MT_SLA_ACK)
00C6 B181 IN R24,0x01
00C7 7F88 ANDI R24,0xF8
00C8 3188 CPI R24,0x18
00C9 F011 BEQ 0x00CC
(0084) return 1; //ACK
00CA E001 LDI R16,1
00CB C033 RJMP 0x00FF
(0085)
(0086) Write8Bit(RegAddress); //写器件相应寄存器地址
00CC B903 OUT 0x03,R16
00CD E884 LDI R24,0x84
00CE BF86 OUT 0x36,R24
(0087) Wait();
00CF B626 IN R2,0x36
00D0 FE27 SBRS R2,7
00D1 CFFD RJMP 0x00CF
(0088) if (TestAck()!=MT_DATA_ACK)
00D2 B181 IN R24,0x01
00D3 7F88 ANDI R24,0xF8
00D4 3288 CPI R24,0x28
00D5 F011 BEQ 0x00D8
(0089) return 1;
00D6 E001 LDI R16,1
00D7 C027 RJMP 0x00FF
(0090)
(0091) Start(); //I2C重新启动
00D8 EA84 LDI R24,0xA4
00D9 BF86 OUT 0x36,R24
(0092) Wait();
00DA B626 IN R2,0x36
00DB FE27 SBRS R2,7
00DC CFFD RJMP 0x00DA
(0093) if (TestAck()!=RE_START)
00DD B181 IN R24,0x01
00DE 7F88 ANDI R24,0xF8
00DF 3180 CPI R24,0x10
00E0 F011 BEQ 0x00E3
(0094) return 1;
00E1 E001 LDI R16,1
00E2 C01C RJMP 0x00FF
(0095)
(0096) Write8Bit(RD_DEVICE_ADDR); //写I2C从器件地址和读方式
00E3 EA81 LDI R24,0xA1
00E4 B983 OUT 0x03,R24
00E5 E884 LDI R24,0x84
00E6 BF86 OUT 0x36,R24
(0097) Wait();
00E7 B626 IN R2,0x36
00E8 FE27 SBRS R2,7
00E9 CFFD RJMP 0x00E7
(0098) if(TestAck()!=MR_SLA_ACK)
00EA B181 IN R24,0x01
00EB 7F88 ANDI R24,0xF8
00EC 3480 CPI R24,0x40
00ED F011 BEQ 0x00F0
(0099) return 1; //ACK
00EE E001 LDI R16,1
00EF C00F RJMP 0x00FF
(0100)
(0101) Twi(); //启动主I2C读方式
00F0 E884 LDI R24,0x84
00F1 BF86 OUT 0x36,R24
(0102) Wait();
00F2 B626 IN R2,0x36
00F3 FE27 SBRS R2,7
00F4 CFFD RJMP 0x00F2
(0103) if(TestAck()!=MR_DATA_NOACK)
00F5 B181 IN R24,0x01
00F6 7F88 ANDI R24,0xF8
00F7 3588 CPI R24,0x58
00F8 F011 BEQ 0x00FB
(0104) return 1; //ACK
00F9 E001 LDI R16,1
00FA C004 RJMP 0x00FF
(0105)
(0106) temp=TWDR;//读取I2C接收数据
00FB B143 IN R20,0x03
(0107) Stop();//I2C停止
00FC E984 LDI R24,0x94
00FD BF86 OUT 0x36,R24
(0108) return temp;
00FE 2F04 MOV R16,R20
00FF 940E01CE CALL pop_gset1
0101 9508 RET
FILE: D:\avr\+++精华+++\24c02\1602.h
(0001)
(0002) /* 用法:
(0003) LCD_init();
(0004) LCD_write_string(列,行,"字符串");
(0005) LCD_write_char(列,行,'字符');
(0006) ---------------------------------------------------------------
(0007) 下面是AVR与LCD连接信息
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -