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

📄 14iic.lst

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0046 EFCF      LDI	R28,0xFF
    0047 E1D0      LDI	R29,0x10
    0048 BFCD      OUT	0x3D,R28
    0049 BFDE      OUT	0x3E,R29
    004A 51C0      SUBI	R28,0x10
    004B 40D0      SBCI	R29,0
    004C EA0A      LDI	R16,0xAA
    004D 8308      STD	Y+0,R16
    004E 2400      CLR	R0
    004F E0E0      LDI	R30,0
    0050 E0F1      LDI	R31,1
    0051 E011      LDI	R17,1
    0052 30E0      CPI	R30,0
    0053 07F1      CPC	R31,R17
    0054 F011      BEQ	0x0057
    0055 9201      ST	R0,Z+
    0056 CFFB      RJMP	0x0052
    0057 8300      STD	Z+0,R16
    0058 E8EC      LDI	R30,0x8C
    0059 E0F0      LDI	R31,0
    005A E0A0      LDI	R26,0
    005B E0B1      LDI	R27,1
    005C E010      LDI	R17,0
    005D 38EC      CPI	R30,0x8C
    005E 07F1      CPC	R31,R17
    005F F021      BEQ	0x0064
    0060 95C8      LPM
    0061 9631      ADIW	R30,1
    0062 920D      ST	R0,X+
    0063 CFF9      RJMP	0x005D
    0064 940E008B  CALL	_main
_exit:
    0066 CFFF      RJMP	_exit
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
    0067 940E01B1  CALL	push_gset2
FILE: E:\ICCAVR\project\AVRMEG~3\icc\014-24C02-LED\main.c
(0001) /*
(0002) 实验十四:
(0003) 
(0004) 	AVR单片机I2C总线实验。
(0005) 	1、用24C02记录CPU启动次数,并在PB口上显示出来。
(0006) 	2、内部1 M晶振,程序采用单任务方式,软件延时。
(0007) 	3、进行此实验请插上LED短路块。
(0008) 	4、通过此实验,可以I2C总线操作有个初步认识。
(0009) 	
(0010) 	AVR  mega128学习板
(0011) 	www.iccavr.com 阿发
(0012) 	14:42 2007-10-19
(0013) */
(0014) 
(0015) #include "iom128v.h"
(0016) 
(0017) extern unsigned char twi_write(unsigned char addr, unsigned char dd);
(0018) extern unsigned char twi_read(unsigned char addr, unsigned char *dd);
(0019) 
(0020) /*延时函数*/
(0021) void delay_ms(unsigned char i) {
(0022) 
(0023) 	unsigned char a, b;
(0024) 	for (a = 0; a < i; a++) {
    0069 2744      CLR	R20
    006A C006      RJMP	0x0071
(0025) 		for (b = 1; b; b++);
    006B E061      LDI	R22,1
    006C C001      RJMP	0x006E
    006D 9563      INC	R22
    006E 2366      TST	R22
    006F F7E9      BNE	0x006D
    0070 9543      INC	R20
    0071 1740      CP	R20,R16
    0072 F3C0      BCS	0x006B
    0073 940E01A8  CALL	pop_gset2
    0075 9508      RET
(0026) 		}
(0027) }
(0028) 
(0029) /*IO口初始化函数*/
(0030) void io_init(void) {
(0031) 
(0032) 	DDRA = 0x00;										/*方向输入*/
_io_init:
    0076 2422      CLR	R2
    0077 BA2A      OUT	0x1A,R2
(0033) 	PORTA = 0xFF;										/*打开上拉*/
    0078 EF8F      LDI	R24,0xFF
    0079 BB8B      OUT	0x1B,R24
(0034) 	DDRB = 0xFF;										/*方向输出*/
    007A BB87      OUT	0x17,R24
(0035) 	PORTB = 0xFF;										/*输出高电平*/
    007B BB88      OUT	0x18,R24
(0036) 	DDRC = 0x00;										/*不用的IO口建议设置为输入带上拉*/
    007C BA24      OUT	0x14,R2
(0037) 	PORTC = 0xFF;
    007D BB85      OUT	0x15,R24
(0038) 	DDRD = 0x00;
    007E BA21      OUT	0x11,R2
(0039) 	PORTD = 0xFF;
    007F BB82      OUT	0x12,R24
(0040) 	DDRE = 0x00;
    0080 B822      OUT	0x02,R2
(0041) 	PORTE = 0xFF;
    0081 B983      OUT	0x03,R24
(0042) 	DDRF = 0x00;
    0082 92200061  STS	0x61,R2
(0043) 	PORTF = 0xFF;
    0084 93800062  STS	0x62,R24
(0044) 	DDRG = 0x00;
    0086 92200064  STS	0x64,R2
(0045) 	PORTG = 0xFF;
    0088 93800065  STS	0x65,R24
    008A 9508      RET
_main:
  temp                 --> Y+0
    008B 9721      SBIW	R28,1
(0046) }
(0047) 
(0048) void main(void) {
(0049) 
(0050) 	unsigned char temp;
(0051) 	
(0052) 	io_init();
    008C DFE9      RCALL	_io_init
(0053) 	delay_ms(250);										/*启动延时*/
    008D EF0A      LDI	R16,0xFA
    008E DFD8      RCALL	_delay_ms
(0054) 	twi_read(0x08, &temp);								/*读出记录*/
    008F 019E      MOVW	R18,R28
    0090 E008      LDI	R16,0x8
    0091 940E0128  CALL	_twi_read
(0055) 	PORTB = ~temp;										/*显示记录*/
    0093 8028      LDD	R2,Y+0
    0094 9420      COM	R2
    0095 BA28      OUT	0x18,R2
(0056) 	temp ++;											/*刷新记录*/
    0096 8188      LDD	R24,Y+0
    0097 5F8F      SUBI	R24,0xFF
    0098 8388      STD	Y+0,R24
(0057) 	twi_write(0x08, temp);								/*写入记录*/
    0099 2F28      MOV	R18,R24
    009A E008      LDI	R16,0x8
    009B 940E00CF  CALL	_twi_write
(0058) 
(0059) 	while (1) {
    009D CFFF      RJMP	0x009D
    009E 9621      ADIW	R28,1
    009F 9508      RET
_error:
  type                 --> R16
    00A0 940E01B3  CALL	push_gset1
FILE: E:\ICCAVR\project\AVRMEG~3\icc\014-24C02-LED\twi.c
(0001) /*
(0002) 	I2C总线/TWI操作模块
(0003) 	1、读取和写入函数
(0004) 	2、地址有效范围255
(0005) 	3、数据长度为单字节
(0006) 	4、函数采用查询方式
(0007) 	5、可直接嵌入到项目中使用
(0008) 	6、晶振频率:1M
(0009) 	7、总线速度:50K
(0010) 
(0011) 	AVR_AFA
(0012) 	www.iccavr.com
(0013) */
(0014) 
(0015) #include "iom128v.h"
(0016) 
(0017) /*I2C总线主机模式错误处理*/
(0018) void error(unsigned char type) {
(0019) 
(0020) 	switch (type & 0xF8) {
    00A2 2F40      MOV	R20,R16
    00A3 2755      CLR	R21
    00A4 7F48      ANDI	R20,0xF8
    00A5 7050      ANDI	R21,0
    00A6 3340      CPI	R20,0x30
    00A7 E0E0      LDI	R30,0
    00A8 075E      CPC	R21,R30
    00A9 F0D9      BEQ	0x00C5
    00AA E380      LDI	R24,0x30
    00AB E090      LDI	R25,0
    00AC 1784      CP	R24,R20
    00AD 0795      CPC	R25,R21
    00AE F02C      BLT	0x00B4
    00AF 3240      CPI	R20,0x20
    00B0 E0E0      LDI	R30,0
    00B1 075E      CPC	R21,R30
    00B2 F071      BEQ	0x00C1
    00B3 C018      RJMP	0x00CC
    00B4 3348      CPI	R20,0x38
    00B5 E0E0      LDI	R30,0
    00B6 075E      CPC	R21,R30
    00B7 F0A1      BEQ	0x00CC
    00B8 3348      CPI	R20,0x38
    00B9 E0E0      LDI	R30,0
    00BA 075E      CPC	R21,R30
    00BB F084      BLT	0x00CC
    00BC 3448      CPI	R20,0x48
    00BD E0E0      LDI	R30,0
    00BE 075E      CPC	R21,R30
    00BF F049      BEQ	0x00C9
    00C0 C00B      RJMP	0x00CC
(0021) 		case 0x20:					/*址址写失败*/
(0022) 			/*stop 停止*/
(0023) 			TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    00C1 E984      LDI	R24,0x94
    00C2 93800074  STS	0x74,R24
(0024) 			break;
    00C4 C007      RJMP	0x00CC
(0025) 		case 0x30:					/*数据写失败*/
(0026) 			/*stop 停止*/
(0027) 			TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    00C5 E984      LDI	R24,0x94
    00C6 93800074  STS	0x74,R24
(0028) 			break;
    00C8 C003      RJMP	0x00CC
(0029) 		case 0x38:					/*仲裁失败*/
(0030) 			break;
(0031) 		case 0x48:					/*址址读失败*/
(0032) 			/*stop 停止*/
(0033) 			TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    00C9 E984      LDI	R24,0x94
    00CA 93800074  STS	0x74,R24
(0034) 			break;
    00CC 940E01B6  CALL	pop_gset1
    00CE 9508      RET
_twi_write:
  dd                   --> R20
  addr                 --> R22
    00CF 940E01B1  CALL	push_gset2
    00D1 2F42      MOV	R20,R18
    00D2 2F60      MOV	R22,R16
(0035) 		}
(0036) }
(0037) 
(0038) /*I2C总线单字节写入*/
(0039) unsigned char twi_write(unsigned char addr, unsigned char dd) {
(0040) 
(0041) 	TWBR = 2;
    00D3 E082      LDI	R24,2
    00D4 93800070  STS	0x70,R24
(0042) 
(0043) 	/*start 启动*/
(0044) 	TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
    00D6 EA84      LDI	R24,0xA4
    00D7 93800074  STS	0x74,R24
(0045) 	while (!(TWCR & (1 << TWINT)));
    00D9 90200074  LDS	R2,0x74
    00DB FE27      SBRS	R2,7
    00DC CFFC      RJMP	0x00D9
(0046) 	if ((TWSR & 0xF8) != 0x08) {
    00DD 91800071  LDS	R24,0x71
    00DF 7F88      ANDI	R24,0xF8
    00E0 3088      CPI	R24,0x8
    00E1 F029      BEQ	0x00E7
(0047) 		error(TWSR);
    00E2 91000071  LDS	R16,0x71
    00E4 DFBB      RCALL	_error
(0048) 		return 0;
    00E5 2700      CLR	R16
    00E6 C03E      RJMP	0x0125
(0049) 		}
(0050) 
(0051) 	/*SLA_W 芯片地址*/
(0052) 	TWDR = 0xA0;
    00E7 EA80      LDI	R24,0xA0
    00E8 93800073  STS	0x73,R24
(0053) 	TWCR = (1 << TWINT) | (1 << TWEN);
    00EA E884      LDI	R24,0x84
    00EB 93800074  STS	0x74,R24
(0054) 	while (!(TWCR & (1 << TWINT)));

⌨️ 快捷键说明

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