📄 hard_i2c.lis
字号:
0082 90E0 ldi R25,>_BitTab
0084 E0910000 lds R30,_DISP_NUM
0088 FF27 clr R31
008A E80F add R30,R24
008C F91F adc R31,R25
008E 2080 ldd R2,z+0
0090 28BA out 0x18,R2
0092 .dbline 136
0092 80E0 ldi R24,<_DISP_DATA
0094 90E0 ldi R25,>_DISP_DATA
0096 E0910000 lds R30,_DISP_NUM
009A FF27 clr R31
009C E80F add R30,R24
009E F91F adc R31,R25
00A0 E081 ldd R30,z+0
00A2 FF27 clr R31
00A4 80E0 ldi R24,<_DispTab
00A6 90E0 ldi R25,>_DispTab
00A8 E80F add R30,R24
00AA F91F adc R31,R25
00AC 2080 ldd R2,z+0
00AE 2BBA out 0x1b,R2
00B0 .dbline 139
00B0 80910000 lds R24,_DISP_NUM
00B4 8F5F subi R24,255 ; addi 1
00B6 80930000 sts _DISP_NUM,R24
00BA .dbline 140
00BA 8430 cpi R24,4
00BC 19F4 brne L18
00BE .dbline 141
00BE 2224 clr R2
00C0 20920000 sts _DISP_NUM,R2
00C4 L18:
00C4 .dbline -2
00C4 L17:
00C4 .dbline 0 ; func end
00C4 0895 ret
00C6 .dbend
.area vector(rom, abs)
.org 76
004C 0C946300 jmp _timer0comp
.area text(rom, con, rel)
00C6 .dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\HARD_I~1\Hard_I2C.c
00C6 .dbfunc e timer0comp _timer0comp fV
.even
00C6 _timer0comp::
00C6 0E940000 xcall push_lset
00CA .dbline -1
00CA .dbline 146
00CA ; }
00CA ; //显示函数,DISP_NUM决定显示哪个LED
00CA ; //采用共阴LED动态显示方法,定时中断函数里面调用
00CA ; void Display(void)
00CA ; {
00CA ; PORTA=0x00; //清除显示再位选
00CA ; PORTB=BitTab[DISP_NUM]; //PB口接位选
00CA ; PORTA=DispTab[DISP_DATA[DISP_NUM]]; //PA口接LED的段码
00CA ;
00CA ;
00CA ; DISP_NUM++; //先显示高位,再显示低位
00CA ; if(DISP_NUM==4)
00CA ; DISP_NUM=0;
00CA ; }
00CA ;
00CA ; #pragma interrupt_handler timer0comp:20
00CA ; void timer0comp (void)
00CA ; {
00CA .dbline 147
00CA ; Display();
00CA D8DF xcall _Display
00CC .dbline -2
00CC L20:
00CC 0E940000 xcall pop_lset
00D0 .dbline 0 ; func end
00D0 1895 reti
00D2 .dbend
00D2 .dbfunc e main _main fV
.even
00D2 _main::
00D2 .dbline -1
00D2 .dbline 151
00D2 ; }
00D2 ;
00D2 ; void main(void)
00D2 ; {
00D2 .dbline 153
00D2 ;
00D2 ; DDRA=0XFF;
00D2 8FEF ldi R24,255
00D4 8ABB out 0x1a,R24
00D6 .dbline 154
00D6 ; PORTA=0X00;
00D6 2224 clr R2
00D8 2BBA out 0x1b,R2
00DA .dbline 155
00DA ; DDRB=0X0F;
00DA 8FE0 ldi R24,15
00DC 87BB out 0x17,R24
00DE .dbline 156
00DE ; PORTB=0X00;
00DE 28BA out 0x18,R2
00E0 .dbline 159
00E0 ;
00E0 ; //按键0端口初始化
00E0 ; DDRD &=~0x04; //设置PD2为输入
00E0 8A98 cbi 0x11,2
00E2 .dbline 160
00E2 ; PORTD|=0x04; //设置PD2为上拉
00E2 929A sbi 0x12,2
00E4 .dbline 162
00E4 ;
00E4 ; INT0_Init(); //TART初始化
00E4 A6DF xcall _INT0_Init
00E6 .dbline 165
00E6 ;
00E6 ; //t/c0初始化(10ms)
00E6 ; TCCR0=0X0d;
00E6 8DE0 ldi R24,13
00E8 83BF out 0x33,R24
00EA .dbline 166
00EA ; TCNT0=0X00;
00EA 2224 clr R2
00EC 22BE out 0x32,R2
00EE .dbline 167
00EE ; OCR0=0X48;
00EE 88E4 ldi R24,72
00F0 8CBF out 0x3c,R24
00F2 .dbline 168
00F2 ; TIMSK=0X02;
00F2 82E0 ldi R24,2
00F4 89BF out 0x39,R24
00F6 .dbline 171
00F6 ;
00F6 ; //asm("sei");
00F6 ; SEI(); //全局中断使能
00F6 7894 sei
00F8 .dbline 174
00F8 ;
00F8 ; //I2C_Ini();
00F8 ; TWSR = 0X03; /* TWI clock prescaler (TWPS) value = 0 */
00F8 83E0 ldi R24,3
00FA 81B9 out 0x1,R24
00FC .dbline 175
00FC ; TWBR = 0X10;
00FC 80E1 ldi R24,16
00FE 80B9 out 0x0,R24
0100 .dbline 177
0100 ;
0100 ; TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
0100 84EA ldi R24,164
0102 86BF out 0x36,R24
0104 .dbline 179
0104 ;
0104 ; Write_EN_DO;
0104 8E9A sbi 0x11,6
0106 .dbline 179
0106 .dbline 180
0106 ; Write_EN_1;
0106 969A sbi 0x12,6
0108 .dbline 180
0108 .dbline 181
0108 ; DISP_DATA[3]=i2c_Read(0x02);
0108 02E0 ldi R16,2
010A 4AD0 xcall _i2c_Read
010C 00931100 sts _DISP_DATA+3,R16
0110 .dbline 183
0110 ;
0110 ; for(;;)
0110 L23:
0110 .dbline 184
0110 .dbline 186
0110 .dbline 183
0110 .dbline 183
0110 FFCF xjmp L23
0112 X2:
0112 .dbline -2
0112 L21:
0112 .dbline 0 ; func end
0112 0895 ret
0114 .dbend
0114 .dbfunc e I2C_Ini _I2C_Ini fV
.even
0114 _I2C_Ini::
0114 .dbline -1
0114 .dbline 193
0114 ; {
0114 ;
0114 ; }
0114 ; }
0114 ;
0114 ;
0114 ; //=======================================================================
0114 ; //初始化端口
0114 ; void I2C_Ini(void)
0114 ; {
0114 .dbline 194
0114 ; i2c_ddr|=(1<<SCL); //SCK为输出
0114 A09A sbi 0x14,0
0116 .dbline 195
0116 ; i2c_ddr|=(1<<SDA); //SDA为双向的,先设置为输出
0116 A19A sbi 0x14,1
0118 .dbline -2
0118 L27:
0118 .dbline 0 ; func end
0118 0895 ret
011A .dbend
011A .dbfunc e i2c_Write _i2c_Write fc
011A ; number -> R20
011A ; Wdata -> R22
011A ; RomAddress -> R10
.even
011A _i2c_Write::
011A 0E940000 xcall push_gset3
011E 622F mov R22,R18
0120 A02E mov R10,R16
0122 .dbline -1
0122 .dbline 206
0122 ;
0122 ;
0122 ; }
0122 ;
0122 ; /******************************************
0122 ; I2C总线写一个字节
0122 ; 返回1:写成功
0122 ; 返回非1:写失败
0122 ; *******************************************/
0122 ; unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata)
0122 ; {unsigned char number=10;
0122 .dbline 206
0122 4AE0 ldi R20,10
0124 2FC0 xjmp L30
0126 L29:
0126 .dbline 208
0126 ; while(number--)
0126 ; {
0126 .dbline 209
0126 ; Start();//I2C启动
0126 84EA ldi R24,164
0128 86BF out 0x36,R24
012A .dbline 210
012A L32:
012A .dbline 210
012A L33:
012A .dbline 210
012A ; Wait();
012A 26B6 in R2,0x36
012C 27FE sbrs R2,7
012E FDCF rjmp L32
0130 .dbline 210
0130 .dbline 210
0130 .dbline 211
0130 ; if(TestAck()!=START) continue;//ACK
0130 81B1 in R24,0x1
0132 887F andi R24,248
0134 8830 cpi R24,8
0136 09F0 breq L35
0138 .dbline 211
0138 25C0 xjmp L30
013A L35:
013A .dbline 212
013A ; Write8Bit(wr_device_add);//写I2C从器件地址和写方式
013A .dbline 212
013A 80EA ldi R24,160
013C 83B9 out 0x3,R24
013E .dbline 212
013E 84E8 ldi R24,132
0140 86BF out 0x36,R24
0142 .dbline 212
0142 .dbline 212
0142 .dbline 213
0142 L37:
0142 .dbline 213
0142 L38:
0142 .dbline 213
0142 ; Wait();
0142 26B6 in R2,0x36
0144 27FE sbrs R2,7
0146 FDCF rjmp L37
0148 .dbline 213
0148 .dbline 213
0148 .dbline 215
0148 ;
0148 ; if(TestAck()!=MT_SLA_ACK)
0148 81B1 in R24,0x1
014A 887F andi R24,248
014C 8831 cpi R24,24
014E 29F0 breq L40
0150 .dbline 216
0150 ; {putchar(0);
0150 .dbline 216
0150 0027 clr R16
0152 1127 clr R17
0154 0E940000 xcall _putchar
0158 .dbline 217
0158 ; continue;//ACK
0158 15C0 xjmp L30
015A L40:
015A .dbline 219
015A ; }
015A ; Write8Bit(RomAddress);//写24C02的ROM地址
015A .dbline 219
015A A3B8 out 0x3,R10
015C .dbline 219
015C 84E8 ldi R24,132
015E 86BF out 0x36,R24
0160 .dbline 219
0160 .dbline 219
0160 .dbline 220
0160 L42:
0160 .dbline 220
0160 L43:
0160 .dbline 220
0160 ; Wait();
0160 26B6 in R2,0x36
0162 27FE sbrs R2,7
0164 FDCF rjmp L42
0166 .dbline 220
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -