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

📄 i2c.lis

📁 用AVR控制旭光高频头JS-6B1/111程序.
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 008A           _SendByte::
 008A AA92              st -y,R10
 008C 4A93              st -y,R20
 008E A02E              mov R10,R16
 0090                   .dbline -1
 0090                   .dbline 77
 0090           ; }     
 0090           ; 
 0090           ; void SendByte(BYTE c)
 0090           ; {
 0090                   .dbline 79
 0090           ;       BYTE BitCnt;
 0090           ;       I2C_DDR=(1<<SDA)|(1<<SCL);              /*SDA SCL端口均定义为输出*/
 0090 80EA              ldi R24,160
 0092 81BB              out 0x11,R24
 0094                   .dbline 80
 0094           ;       for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
 0094 4427              clr R20
 0096 11C0              xjmp L15
 0098           L12:
 0098                   .dbline 81
 0098           ;       {
 0098                   .dbline 82
 0098           ;               if((c<<BitCnt)&0x08)            /*判断发送位*/
 0098 0A2D              mov R16,R10
 009A 142F              mov R17,R20
 009C 0E940000          xcall lsl8
 00A0 802F              mov R24,R16
 00A2 8870              andi R24,8
 00A4 11F0              breq L16
 00A6           X2:
 00A6                   .dbline 83
 00A6           ;               {
 00A6                   .dbline 84
 00A6           ;                       SDA_H;
 00A6 979A              sbi 0x12,7
 00A8                   .dbline 85
 00A8           ;               }
 00A8 01C0              xjmp L17
 00AA           L16:
 00AA                   .dbline 87
 00AA           ;               else
 00AA           ;               {
 00AA                   .dbline 88
 00AA           ;                       SDA_L;
 00AA 9798              cbi 0x12,7
 00AC                   .dbline 89
 00AC           ;               }
 00AC           L17:
 00AC                   .dbline 90
 00AC           ;               delay_us(1);
 00AC 01E0              ldi R16,1
 00AE A8DF              xcall _delay_us
 00B0                   .dbline 91
 00B0           ;               SCL_H;                                          /*置时钟线为高,通知被控器开始接收数据位*/
 00B0 959A              sbi 0x12,5
 00B2                   .dbline 92
 00B2           ;               delay_us(5);                            /*保证时钟高电平周期大于4μs*/
 00B2 05E0              ldi R16,5
 00B4 A5DF              xcall _delay_us
 00B6                   .dbline 93
 00B6           ;               SCL_L;
 00B6 9598              cbi 0x12,5
 00B8                   .dbline 94
 00B8           ;       }
 00B8           L13:
 00B8                   .dbline 80
 00B8 4395              inc R20
 00BA           L15:
 00BA                   .dbline 80
 00BA 4830              cpi R20,8
 00BC 68F3              brlo L12
 00BE           X3:
 00BE                   .dbline 95
 00BE           ;       delay_us(2);
 00BE 02E0              ldi R16,2
 00C0 9FDF              xcall _delay_us
 00C2                   .dbline 96
 00C2           ;       I2C_DDR=~(1<<SDA);                              /*SDA定义为输入,置数据线为输入方式*/
 00C2 8FE7              ldi R24,-129
 00C4 9FEF              ldi R25,-1
 00C6 81BB              out 0x11,R24
 00C8                   .dbline 97
 00C8           ;       SDA_H;                                                  /*8位发送完后释放数据线,准备接收应答位,打开内部上拉*/
 00C8 979A              sbi 0x12,7
 00CA                   .dbline 98
 00CA           ;       delay_us(2);
 00CA 02E0              ldi R16,2
 00CC 99DF              xcall _delay_us
 00CE                   .dbline 99
 00CE           ;       SCL_H;
 00CE 959A              sbi 0x12,5
 00D0                   .dbline 100
 00D0           ;       delay_us(3);
 00D0 03E0              ldi R16,3
 00D2 96DF              xcall _delay_us
 00D4                   .dbline 101
 00D4           ;       if(ACK_FAIL)                                    /*判断是否接收到应答信号*/
 00D4 80B3              in R24,0x10
 00D6 8695              lsr R24
 00D8 8695              lsr R24
 00DA 8695              lsr R24
 00DC 8695              lsr R24
 00DE 8695              lsr R24
 00E0 8695              lsr R24
 00E2 8695              lsr R24
 00E4 8170              andi R24,1
 00E6 21F0              breq L18
 00E8           X4:
 00E8                   .dbline 102
 00E8           ;       {
 00E8                   .dbline 103
 00E8           ;               ack=0;
 00E8 2224              clr R2
 00EA 20920000          sts _ack,R2
 00EE                   .dbline 104
 00EE           ;       }
 00EE 03C0              xjmp L19
 00F0           L18:
 00F0                   .dbline 106
 00F0           ;       else
 00F0           ;       {
 00F0                   .dbline 107
 00F0           ;               ack=1;
 00F0 81E0              ldi R24,1
 00F2 80930000          sts _ack,R24
 00F6                   .dbline 108
 00F6           ;       }
 00F6           L19:
 00F6                   .dbline 109
 00F6           ;       SCL_L;
 00F6 9598              cbi 0x12,5
 00F8                   .dbline 110
 00F8           ;       delay_us(2);
 00F8 02E0              ldi R16,2
 00FA 82DF              xcall _delay_us
 00FC                   .dbline -2
 00FC           L11:
 00FC                   .dbline 0 ; func end
 00FC 4991              ld R20,y+
 00FE A990              ld R10,y+
 0100 0895              ret
 0102                   .dbsym r BitCnt 20 c
 0102                   .dbsym r c 10 c
 0102                   .dbend
 0102                   .dbfunc e ReceiveByte _ReceiveByte fc
 0102           ;           retc -> R10
 0102           ;         BitCnt -> R20
                        .even
 0102           _ReceiveByte::
 0102 AA92              st -y,R10
 0104 4A93              st -y,R20
 0106                   .dbline -1
 0106                   .dbline 114
 0106           ; }
 0106           ; 
 0106           ; BYTE ReceiveByte(void)
 0106           ; {
 0106                   .dbline 117
 0106           ;       BYTE retc;
 0106           ;       BYTE BitCnt;
 0106           ;       retc=0;
 0106 AA24              clr R10
 0108                   .dbline 118
 0108           ;       I2C_DDR=~(1<<SDA);
 0108 8FE7              ldi R24,-129
 010A 9FEF              ldi R25,-1
 010C 81BB              out 0x11,R24
 010E                   .dbline 119
 010E           ;       SDA_H;                                                  /*SDA定义为输入,置数据线为输入方式*/           
 010E 979A              sbi 0x12,7
 0110                   .dbline 120
 0110           ;       for(BitCnt=0;BitCnt<8;BitCnt++)
 0110 4427              clr R20
 0112 17C0              xjmp L24
 0114           L21:
 0114                   .dbline 121
 0114           ;       {
 0114                   .dbline 122
 0114           ;               delay_us(1);
 0114 01E0              ldi R16,1
 0116 74DF              xcall _delay_us
 0118                   .dbline 123
 0118           ;               SCL_L;                                          /*置时钟线位低,准备接收数据位*/
 0118 9598              cbi 0x12,5
 011A                   .dbline 124
 011A           ;               delay_us(5);                            /*时钟低电平周期大于4.7μs*/
 011A 05E0              ldi R16,5
 011C 71DF              xcall _delay_us
 011E                   .dbline 125
 011E           ;               SCL_H;                                          /*置时钟线为高,使数据线上数据有效*/
 011E 959A              sbi 0x12,5
 0120                   .dbline 126
 0120           ;               delay_us(2);
 0120 02E0              ldi R16,2
 0122 6EDF              xcall _delay_us
 0124                   .dbline 127
 0124           ;               retc<<=1;
 0124 AA0C              lsl R10
 0126                   .dbline 128
 0126           ;               if(SDA_HIGH)
 0126 80B3              in R24,0x10
 0128 8695              lsr R24
 012A 8695              lsr R24
 012C 8695              lsr R24
 012E 8695              lsr R24
 0130 8695              lsr R24
 0132 8695              lsr R24
 0134 8695              lsr R24
 0136 8170              andi R24,1
 0138 09F0              breq L25
 013A           X5:
 013A                   .dbline 129
 013A           ;               {
 013A                   .dbline 130
 013A           ;                       retc+=1;                                /*读数据位,接收的数据位放入retc中*/
 013A A394              inc R10
 013C                   .dbline 131
 013C           ;               }
 013C           L25:
 013C                   .dbline 132
 013C           ;               delay_us(2);
 013C 02E0              ldi R16,2
 013E 60DF              xcall _delay_us
 0140                   .dbline 133
 0140           ;       }
 0140           L22:
 0140                   .dbline 120
 0140 4395              inc R20
 0142           L24:
 0142                   .dbline 120
 0142 4830              cpi R20,8
 0144 38F3              brlo L21
 0146           X6:
 0146                   .dbline 134
 0146           ;       SCL_L;
 0146 9598              cbi 0x12,5
 0148                   .dbline 135
 0148           ;       delay_us(2);
 0148 02E0              ldi R16,2
 014A 5ADF              xcall _delay_us
 014C                   .dbline 136
 014C           ;       return retc;
 014C 0A2D              mov R16,R10
 014E                   .dbline -2
 014E           L20:
 014E                   .dbline 0 ; func end
 014E 4991              ld R20,y+
 0150 A990              ld R10,y+
 0152 0895              ret
 0154                   .dbsym r retc 10 c
 0154                   .dbsym r BitCnt 20 c
 0154                   .dbend
 0154           ; }

⌨️ 快捷键说明

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