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

📄 hard_i2c.lis

📁 meg16 的所有功能实例
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 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 + -