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

📄 twi.lst

📁 ICCavr编写的TWI总线协议读写函数
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    002F E5CF      LDI	R28,0x5F
    0030 E0D4      LDI	R29,4
    0031 BFCD      OUT	0x3D,R28
    0032 BFDE      OUT	0x3E,R29
    0033 51C0      SUBI	R28,0x10
    0034 40D0      SBCI	R29,0
    0035 EA0A      LDI	R16,0xAA
    0036 8308      STD	Y+0,R16
    0037 2400      CLR	R0
    0038 E8EF      LDI	R30,0x8F
    0039 E0F0      LDI	R31,0
    003A E010      LDI	R17,0
    003B 38EF      CPI	R30,0x8F
    003C 07F1      CPC	R31,R17
    003D F011      BEQ	0x0040
    003E 9201      ST	R0,Z+
    003F CFFB      RJMP	0x003B
    0040 8300      STD	Z+0,R16
    0041 E2EE      LDI	R30,0x2E
    0042 E0F0      LDI	R31,0
    0043 E6A0      LDI	R26,0x60
    0044 E0B0      LDI	R27,0
    0045 E010      LDI	R17,0
    0046 35ED      CPI	R30,0x5D
    0047 07F1      CPC	R31,R17
    0048 F021      BEQ	0x004D
    0049 95C8      LPM
    004A 9631      ADIW	R30,1
    004B 920D      ST	R0,X+
    004C CFF9      RJMP	0x0046
    004D D061      RCALL	_main
_exit:
    004E CFFF      RJMP	_exit
FILE: D:\AVR\代码\ICCdaima\TWI\delay.c
(0001) 
(0002) 
(0003) void Delay_nus(unsigned int i) 
(0004) {
(0005)    for(;i>1;i--){;}
_Delay_nus:
  i                    --> R16
    004F C002      RJMP	0x0052
    0050 5001      SUBI	R16,1
    0051 4010      SBCI	R17,0
    0052 E081      LDI	R24,1
    0053 E090      LDI	R25,0
    0054 1780      CP	R24,R16
    0055 0791      CPC	R25,R17
    0056 F3C8      BCS	0x0050
(0006) }
    0057 9508      RET
_Delay_1ms:
  i                    --> R20
    0058 D0FB      RCALL	push_gset1
(0007) void Delay_1ms(void) 
(0008) {unsigned i;
(0009)    for(i=1000;i>1;i--)
    0059 EE48      LDI	R20,0xE8
    005A E053      LDI	R21,3
    005B C005      RJMP	0x0061
(0010)    {Delay_nus(1);
    005C E001      LDI	R16,1
    005D E010      LDI	R17,0
    005E DFF0      RCALL	_Delay_nus
    005F 5041      SUBI	R20,1
    0060 4050      SBCI	R21,0
    0061 D12A      RCALL	0x018C
    0062 F3C8      BCS	0x005C
(0011)      }
(0012) }
    0063 D0F3      RCALL	pop_gset1
    0064 9508      RET
_Delay_nms:
  i                    --> R20
    0065 D0EE      RCALL	push_gset1
    0066 01A8      MOVW	R20,R16
(0013) void Delay_nms(unsigned int  i) 
(0014) {
(0015)    for(;i>1;i--)
    0067 C003      RJMP	0x006B
(0016)    {Delay_1ms();}
    0068 DFEF      RCALL	_Delay_1ms
    0069 5041      SUBI	R20,1
    006A 4050      SBCI	R21,0
    006B D120      RCALL	0x018C
    006C F3D8      BCS	0x0068
(0017) }
    006D D0E9      RCALL	pop_gset1
    006E 9508      RET
FILE: D:\AVR\代码\ICCdaima\TWI\master_1.c
(0001) #include"iom8v.h"
(0002) #include"UART.h"
(0003) #define  uchar  unsigned char
(0004) #define  STATUS  (TWSR&0xf8)
(0005) #define  SLA_W    0x32
(0006) #define  SLA_R    0x33
(0007) #define  SLAVER_ADDRESS     0x32
(0008) #define  START              0x08
(0009) #define  RE_START           0x10
(0010) #define  MT_SLA_WRITE_ACK   0x18
(0011) #define  MT_SLA_READ_ACK    0x40 
(0012) #define  MT_DATA_ACK        0x28
(0013) #define  MT_READ_ACK        0x58  
(0014)     
(0015) 
(0016) void Start(void)
(0017) {
(0018)  TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_Start:
    006F EA84      LDI	R24,0xA4
    0070 D116      RCALL	<created procedures>
(0019)  while(!(TWCR&(1<<TWINT)));
(0020) }
    0071 9508      RET
(0021) void Stop(void)
(0022) {
(0023)  TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_Stop:
    0072 E984      LDI	R24,0x94
    0073 BF86      OUT	0x36,R24
(0024) }
    0074 9508      RET
(0025) void Load(uchar i)
(0026) {
(0027)  TWDR=i;
_Load:
  i                    --> R16
    0075 B903      OUT	0x03,R16
(0028)  TWCR=(1<<TWINT)|(1<<TWEN);
    0076 E884      LDI	R24,0x84
    0077 D10F      RCALL	<created procedures>
(0029)  while(!(TWCR&(1<<TWINT))); 
(0030) 
(0031) }
    0078 9508      RET
(0032) 
(0033) void Get(unsigned char *d)
(0034) {
(0035)  TWCR=(1<<TWINT)|(1<<TWEN);
_Get:
  d                    --> R16
    0079 E884      LDI	R24,0x84
    007A D10C      RCALL	<created procedures>
(0036)  while(!(TWCR&(1<<TWINT)));
(0037)  *d= TWDR;
    007B B023      IN	R2,0x03
    007C 01F8      MOVW	R30,R16
    007D 8220      STD	Z+0,R2
(0038) }
    007E 9508      RET
_ERROR:
  state                --> R20
    007F D0D4      RCALL	push_gset1
    0080 2F40      MOV	R20,R16
(0039) void ERROR(uchar state)
(0040) {Stop();
    0081 DFF0      RCALL	_Stop
(0041) }
    0082 D0D4      RCALL	pop_gset1
    0083 9508      RET
_SendByte:
  data                 --> R20
    0084 D0CF      RCALL	push_gset1
    0085 2F40      MOV	R20,R16
(0042) 
(0043) /*写一个字节data,成功则返回1,否则
(0044)   返回0*/
(0045) uchar SendByte(uchar data)
(0046) {
(0047)    //启动I2C
(0048)    Start();
    0086 DFE8      RCALL	_Start
(0049)   if(STATUS!=START) //{ERROR(STATUS);return 0;}
    0087 B181      IN	R24,0x01
    0088 7F88      ANDI	R24,0xF8
    0089 3088      CPI	R24,0x8
    008A F019      BEQ	0x008E
(0050)                       puts("Start ERRor");
    008B E803      LDI	R16,0x83
    008C E010      LDI	R17,0
    008D D07F      RCALL	_puts
(0051)    //发送从机地址(写),等待回应, 错误检测
(0052)    Load(0);
    008E 2700      CLR	R16
    008F DFE5      RCALL	_Load
(0053)    if(STATUS!=MT_SLA_WRITE_ACK) //{ERROR(STATUS);return 0;}
    0090 B181      IN	R24,0x01
    0091 7F88      ANDI	R24,0xF8
    0092 3188      CPI	R24,0x18
    0093 F019      BEQ	0x0097
(0054)                       puts("SLA_W RROR");
    0094 E708      LDI	R16,0x78
    0095 E010      LDI	R17,0
    0096 D076      RCALL	_puts
(0055)    /*
(0056)    //发送EEPROM地址,等待回应,错误检测
(0057)    Load(addr);
(0058)    if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
(0059)    */
(0060)    //发送数据,等待回应,错误检测
(0061)    Load(data);
    0097 2F04      MOV	R16,R20
    0098 DFDC      RCALL	_Load
(0062)    if(STATUS!=MT_DATA_ACK) //{ERROR(STATUS);return 0;}
    0099 B181      IN	R24,0x01
    009A 7F88      ANDI	R24,0xF8
    009B 3288      CPI	R24,0x28
    009C F019      BEQ	0x00A0
(0063)                          puts("Date Error");
    009D E60D      LDI	R16,0x6D
    009E E010      LDI	R17,0
    009F D06D      RCALL	_puts
(0064)    Stop();
    00A0 DFD1      RCALL	_Stop
(0065)    return 1;//发送成功,返回1;
    00A1 E001      LDI	R16,1
    00A2 D0B4      RCALL	pop_gset1
    00A3 9508      RET
(0066)    
(0067) }
(0068) 
(0069) void Init_Io(void)
(0070) {
(0071)  DDRC&=~((1<<PC4)&(1<<PC5)&(1<<PC2));  
_Init_Io:
    00A4 B384      IN	R24,0x14
    00A5 7F8F      ANDI	R24,0xFF
    00A6 BB84      OUT	0x14,R24
(0072)  PORTC|= (1<<PC4)|(1<<PC5)|(1<<PC2);
    00A7 B385      IN	R24,0x15
    00A8 6384      ORI	R24,0x34
    00A9 BB85      OUT	0x15,R24
(0073)  TWCR=(1<<TWEA)|(1<<TWEN); //主机模式,使能TWI
    00AA E484      LDI	R24,0x44
    00AB BF86      OUT	0x36,R24
(0074)  TWBR=32;//波特率 100K   8M晶振
    00AC E280      LDI	R24,0x20
    00AD B980      OUT	0x00,R24
(0075) }
    00AE 9508      RET
(0076) void main()
(0077) {
(0078)   uchar temp;
(0079)   Init_Io();
_main:
  temp                 --> R20
    00AF DFF4      RCALL	_Init_Io
(0080)   uart_init();
    00B0 D07C      RCALL	_uart_init
(0081)   puts("串口工作");
    00B1 E604      LDI	R16,0x64
    00B2 E010      LDI	R17,0
    00B3 D059      RCALL	_puts
    00B4 C00B      RJMP	0x00C0
(0082)   while(1)
(0083)   for(temp=0;temp<10;temp++)
    00B5 2744      CLR	R20
    00B6 C007      RJMP	0x00BE
(0084)   {
(0085)     SendByte(temp+0x30);  
    00B7 2F04      MOV	R16,R20
    00B8 5D00      SUBI	R16,0xD0
    00B9 DFCA      RCALL	_SendByte
(0086) 	Delay_nms(10);
    00BA E00A      LDI	R16,0xA
    00BB E010      LDI	R17,0
    00BC DFA8      RCALL	_Delay_nms
    00BD 9543      INC	R20
    00BE 304A      CPI	R20,0xA
    00BF F3B8      BCS	0x00B7
    00C0 CFF4      RJMP	0x00B5
(0087)    }
(0088)   
(0089) }
    00C1 9508      RET
_put:
  d                    --> Y+0
  i                    --> R20
    00C2 D091      RCALL	push_gset1
    00C3 01A8      MOVW	R20,R16
    00C4 9728      SBIW	R28,0x8
FILE: D:\AVR\代码\ICCdaima\TWI\UART.c
(0001) #include <iom8v.h>

⌨️ 快捷键说明

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