📄 master.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 + -