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

📄 master.lis

📁 ICCavr编写的TWI总线协议读写函数
💻 LIS
字号:
                        .module master.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\AVR\代码\ICCdaima\TWI\master.c
 0000                   .dbfunc e twi_stop _twi_stop fV
                        .even
 0000           _twi_stop::
 0000                   .dbline -1
 0000                   .dbline 31
 0000           ; /*
 0000           ;       文件名:master.c 
 0000           ;       两个Mega8间的TWI通信实验主模式单片机程序
 0000           ;       
 0000           ;       内部 8MHz振荡器
 0000           ; 
 0000           ;       芯艺 2004-09-02   ---------- 2004-09-03
 0000           ; */
 0000           ; 
 0000           ; 
 0000           ; #include <iom8v.h>
 0000           ; #include"delay.h"
 0000           ; #define uint unsigned int
 0000           ; #define uchar unsigned char
 0000           ; #define  uchar  unsigned char
 0000           ; #define  TW_STATUS  (TWSR&0xf8)
 0000           ; #define  TW_WRITE    0xa0
 0000           ; #define  TW_READ    0xa1
 0000           ; #define WAITPRINTDEBUG Delay_nms(100)  //为从模式单片机打印调试信息而延时
 0000           ; 
 0000           ; 
 0000           ; #define KEY   0X04
 0000           ; 
 0000           ; #define FREQ 8
 0000           ; #define TWI_ADDRESS 0X32
 0000           ; 
 0000           ; /*************主模式TWI操作部分*************开始**************/
 0000           ; 
 0000           ; //总线上起动停止条件
 0000           ; void twi_stop(void)
 0000           ; {
 0000                   .dbline 32
 0000           ;       TWCR =(1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
 0000 84E9              ldi R24,148
 0002 86BF              out 0x36,R24
 0004                   .dbline -2
 0004                   .dbline 33
 0004           ; }
 0004           L1:
 0004                   .dbline 0 ; func end
 0004 0895              ret
 0006                   .dbend
 0006                   .dbfunc e twi_start _twi_start fc
 0006           ;       trycount -> R16
                        .even
 0006           _twi_start::
 0006                   .dbline -1
 0006                   .dbline 36
 0006           ; //总线上起动开始条件
 0006           ; uchar twi_start(void)
 0006           ; {
 0006                   .dbline 37
 0006           ;       uchar trycount=0;
 0006 0027              clr R16
 0008                   .dbline 39
 0008           ; 
 0008           ;       TWCR =(1<<TWINT) | (1<<TWSTA) | (1<<TWEN); 
 0008 84EA              ldi R24,164
 000A 86BF              out 0x36,R24
 000C           L3:
 000C                   .dbline 40
 000C           L4:
 000C                   .dbline 40
 000C           ;       while ((TWCR & (1<<TWINT)) == 0) ;
 000C 26B6              in R2,0x36
 000E 27FE              sbrs R2,7
 0010 FDCF              rjmp L3
 0012                   .dbline 42
 0012           ; 
 0012           ;       return TW_STATUS;
 0012 01B1              in R16,0x1
 0014 087F              andi R16,248
 0016                   .dbline -2
 0016           L2:
 0016                   .dbline 0 ; func end
 0016 0895              ret
 0018                   .dbsym r trycount 16 c
 0018                   .dbend
 0018                   .dbfunc e twi_writebyte _twi_writebyte fc
 0018           ;              c -> R16
                        .even
 0018           _twi_writebyte::
 0018                   .dbline -1
 0018                   .dbline 47
 0018           ; }
 0018           ; 
 0018           ; //写一字节
 0018           ; uchar twi_writebyte(uchar c)
 0018           ; {
 0018                   .dbline 48
 0018           ;       TWDR = c;
 0018 03B9              out 0x3,R16
 001A                   .dbline 49
 001A           ;       TWCR = (1<<TWINT) | (1<<TWEN);  
 001A 84E8              ldi R24,132
 001C 86BF              out 0x36,R24
 001E           L7:
 001E                   .dbline 50
 001E           L8:
 001E                   .dbline 50
 001E           ;       while ((TWCR & (1<<TWINT)) == 0);
 001E 26B6              in R2,0x36
 0020 27FE              sbrs R2,7
 0022 FDCF              rjmp L7
 0024                   .dbline 51
 0024           ;       return TW_STATUS;
 0024 01B1              in R16,0x1
 0026 087F              andi R16,248
 0028                   .dbline -2
 0028           L6:
 0028                   .dbline 0 ; func end
 0028 0895              ret
 002A                   .dbsym r c 16 c
 002A                   .dbend
 002A                   .dbfunc e twi_readbyte _twi_readbyte fc
 002A           ;            tmp -> R20
 002A           ;            ack -> R18
 002A           ;              c -> R16,R17
                        .even
 002A           _twi_readbyte::
 002A 00D0              rcall push_gset1
 002C                   .dbline -1
 002C                   .dbline 56
 002C           ; }
 002C           ; 
 002C           ; //读一字节 ack: true时发ACK,false时发NACK
 002C           ; uchar twi_readbyte(uchar *c ,uchar ack)
 002C           ; {
 002C                   .dbline 57
 002C           ;       uchar tmp=(1<<TWINT)|(1<<TWEN);
 002C 44E8              ldi R20,132
 002E                   .dbline 59
 002E           ;               
 002E           ;       if(ack)                  //可以选择是否发送  ACK
 002E 2223              tst R18
 0030 09F0              breq L11
 0032                   .dbline 60
 0032           ;               tmp|=(1<<TWEA);         
 0032 4064              ori R20,64
 0034           L11:
 0034                   .dbline 61
 0034           ;       TWCR=tmp;
 0034 46BF              out 0x36,R20
 0036           L13:
 0036                   .dbline 62
 0036           L14:
 0036                   .dbline 62
 0036           ;       while ((TWCR & (1<<TWINT)) == 0) ;
 0036 26B6              in R2,0x36
 0038 27FE              sbrs R2,7
 003A FDCF              rjmp L13
 003C                   .dbline 64
 003C           ; 
 003C           ;       *c=TWDR;
 003C 23B0              in R2,0x3
 003E F801              movw R30,R16
 0040 2082              std z+0,R2
 0042                   .dbline 66
 0042           ; 
 0042           ;       return TW_STATUS;
 0042 01B1              in R16,0x1
 0044 087F              andi R16,248
 0046                   .dbline -2
 0046           L10:
 0046 00D0              rcall pop_gset1
 0048                   .dbline 0 ; func end
 0048 0895              ret
 004A                   .dbsym r tmp 20 c
 004A                   .dbsym r ack 18 c
 004A                   .dbsym r c 16 pc
 004A                   .dbend
 004A                   .dbfunc e WaitKeyDown _WaitKeyDown fc
 004A           ;            key -> R20
                        .even
 004A           _WaitKeyDown::
 004A 00D0              rcall push_gset1
 004C                   .dbline -1
 004C                   .dbline 72
 004C           ; }
 004C           ; /*************主模式IIC操作部分*************结束**************/
 004C           ; 
 004C           ; //检测按键
 004C           ; uchar WaitKeyDown(void)
 004C           ; {
 004C 0FC0              rjmp L18
 004E           L17:
 004E                   .dbline 76
 004E           ;       uchar key;
 004E           ;       
 004E           ;       while(1)
 004E           ;       {
 004E                   .dbline 77
 004E           ;               key=PINC & 0x04;
 004E 43B3              in R20,0x13
 0050 4470              andi R20,4
 0052                   .dbline 78
 0052           ;               if(     key!=0x04)
 0052 4430              cpi R20,4
 0054 41F0              breq L20
 0056                   .dbline 79
 0056           ;               {
 0056                   .dbline 80
 0056           ;                       Delay_nms(20);
 0056 04E1              ldi R16,20
 0058 10E0              ldi R17,0
 005A 00D0              rcall _Delay_nms
 005C                   .dbline 81
 005C           ;                       key=PINC & 0x04;
 005C 43B3              in R20,0x13
 005E 4470              andi R20,4
 0060                   .dbline 82
 0060           ;                       if(key!=0x04)
 0060 4430              cpi R20,4
 0062 09F0              breq L22
 0064                   .dbline 83
 0064           ;                               break;
 0064 07C0              rjmp L25
 0066           L22:
 0066                   .dbline 84
 0066           ;               }
 0066           L20:
 0066                   .dbline 85
 0066 01E0              ldi R16,1
 0068 10E0              ldi R17,0
 006A 00D0              rcall _Delay_nms
 006C                   .dbline 86
 006C           L18:
 006C                   .dbline 75
 006C F0CF              rjmp L17
 006E           L24:
 006E                   .dbline 89
 006E 0AE0              ldi R16,10
 0070 10E0              ldi R17,0
 0072 00D0              rcall _Delay_nms
 0074           L25:
 0074                   .dbline 88
 0074           ;               Delay_nms(1);
 0074           ;       }
 0074           ; 
 0074           ;       while((PINC & 0x04)!=0x04)
 0074 83B3              in R24,0x13
 0076 8470              andi R24,4
 0078 8430              cpi R24,4
 007A C9F7              brne L24
 007C                   .dbline 91
 007C           ;               Delay_nms(10);  //等待按键弹起
 007C           ;               
 007C           ;       return key;
 007C 042F              mov R16,R20
 007E                   .dbline -2
 007E           L16:
 007E 00D0              rcall pop_gset1
 0080                   .dbline 0 ; func end
 0080 0895              ret
 0082                   .dbsym r key 20 c
 0082                   .dbend
 0082                   .dbfunc e main _main fV
 0082           ;              i -> R20
                        .even
 0082           _main::
 0082                   .dbline -1
 0082                   .dbline 95
 0082           ; }
 0082           ; 
 0082           ; void main(void)
 0082           ; {
 0082                   .dbline 99
 0082           ;       uchar i;
 0082           ;       
 0082           ;       //使能SCL、SDA引脚内部上拉电阻
 0082           ;       DDRC=0;
 0082 2224              clr R2
 0084 24BA              out 0x14,R2
 0086                   .dbline 100
 0086           ;       PORTC=0X3f;
 0086 8FE3              ldi R24,63
 0088 85BB              out 0x15,R24
 008A                   .dbline 103
 008A           ;       
 008A           ;       //
 008A           ;       DDRD=0;
 008A 21BA              out 0x11,R2
 008C                   .dbline 104
 008C           ;       PORTD=0;
 008C 22BA              out 0x12,R2
 008E                   .dbline 106
 008E           ;       
 008E           ;       TWBR=73;//波特率
 008E 89E4              ldi R24,73
 0090 80B9              out 0x0,R24
 0092 14C0              rjmp L29
 0094           L28:
 0094                   .dbline 109
 0094           ;       
 0094           ;       while(1)
 0094           ;       {
 0094                   .dbline 112
 0094           ;               //WaitKeyDown();  //等待按键  
 0094           ;          // Delay_nms(1000);
 0094           ;               twi_start();
 0094 B8DF              rcall _twi_start
 0096                   .dbline 113
 0096           ;               WAITPRINTDEBUG;
 0096 04E6              ldi R16,100
 0098 10E0              ldi R17,0
 009A 00D0              rcall _Delay_nms
 009C                   .dbline 114
 009C           ;               twi_writebyte(TWI_ADDRESS|TW_WRITE);
 009C 02EB              ldi R16,178
 009E BCDF              rcall _twi_writebyte
 00A0                   .dbline 115
 00A0           ;               WAITPRINTDEBUG;   //延时100MS 宏
 00A0 04E6              ldi R16,100
 00A2 10E0              ldi R17,0
 00A4 00D0              rcall _Delay_nms
 00A6                   .dbline 116
 00A6           ;               for(i=0;i<10;i++)
 00A6 4427              clr R20
 00A8 06C0              rjmp L34
 00AA           L31:
 00AA                   .dbline 117
 00AA                   .dbline 118
 00AA 042F              mov R16,R20
 00AC B5DF              rcall _twi_writebyte
 00AE                   .dbline 119
 00AE 04E6              ldi R16,100
 00B0 10E0              ldi R17,0
 00B2 00D0              rcall _Delay_nms
 00B4                   .dbline 120
 00B4           L32:
 00B4                   .dbline 116
 00B4 4395              inc R20
 00B6           L34:
 00B6                   .dbline 116
 00B6 4A30              cpi R20,10
 00B8 C0F3              brlo L31
 00BA                   .dbline 121
 00BA A2DF              rcall _twi_stop
 00BC                   .dbline 122
 00BC           L29:
 00BC                   .dbline 108
 00BC EBCF              rjmp L28
 00BE           X0:
 00BE                   .dbline -2
 00BE                   .dbline 124
 00BE           ;               {
 00BE           ;                       twi_writebyte(i);
 00BE           ;                       WAITPRINTDEBUG;  //延时100MS
 00BE           ;               }
 00BE           ;               twi_stop();      //一次发送10 个数
 00BE           ;       }
 00BE           ;       
 00BE           ; }
 00BE           L27:
 00BE                   .dbline 0 ; func end
 00BE 0895              ret
 00C0                   .dbsym r i 20 c
 00C0                   .dbend

⌨️ 快捷键说明

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