📄 24c02.s
字号:
.module _24c02.c
.area data(ram, con, rel)
_BitTab::
.blkb 2
.area idata
.byte 254,253
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 251,247
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.dbsym e BitTab _BitTab A[4:4]c
_DispTab::
.blkb 2
.area idata
.byte 63,6
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.blkb 2
.area idata
.byte 91,'O
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.blkb 2
.area idata
.byte 'f,'m
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.blkb 2
.area idata
.byte 125,7
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.blkb 2
.area idata
.byte 127,'o
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.dbsym e DispTab _DispTab A[10:10]c
_DISP_DATA::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.dbsym e DISP_DATA _DISP_DATA A[4:4]c
.area text(rom, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.dbfunc e Delay_us _Delay_us fV
; time -> R16,R17
.even
_Delay_us::
.dbline -1
.dbline 84
; /****************************************Copyright (c)**************************************************
; ** ADEmbed Development Co.,LTD.
; ** http://www.adembed.com
; **--------------File Info-------------------------------------------------------------------------------
; ** File name: 24c02.c
; ** Last modified Date: 2008-12-13
; ** Last Version: 1.0
; ** Descriptions: 24c02 Test.
; **
; **------------------------------------------------------------------------------------------------------
; ** Created by: junbolu
; ** Created date: 2008-12-13
; ** Version: 1.0
; ** Descriptions:
; **
; **------------------------------------------------------------------------------------------------------
; ** Modified by:
; ** Modified date:
; ** Version:
; ** Descriptions:
; **
; **------------------------------------------------------------------------------------------------------
; **ICC-AVR application builder : 2008-12-13
; **Target : M16
; **Crystal: 7.3728Mhz
; **PC0--->SCL PC1--->SDA PD6--->Write_EN
; **
; **描述:按键K0被按下一次,数码管的最低位会加一,并存储在24C02中,下一次系统启动时,会读取此数据并显示。
; **
; **
; **涉及知识点:
; ** I2C
; **
; **
; *******************************************************************************************************/
;
; #include<iom16v.h>
; #include<macros.h>
; #include"Define.h"
;
; #define fose 7372800
;
; #define SCL 0
; #define SDA 1
;
; #define i2c_ddr DDRC
; #define i2c_port PORTC
; #define i2c_pin PINC
;
; #define AT24C02_ADDR 0xA0 //EEPROM设备地址
; //定义I2C的延迟参数
; #define DelayX 100 //7.3M=>1; 8.4M=>2.建议5,因为将来的ClockCPU可以是16M
;
;
; #define SCL_1 {i2c_port|=1<<SCL;Delay_us(DelayX);}
; #define SCL_0 {i2c_port&=~(1<<SCL);Delay_us(DelayX);}
; #define SDA_1 {i2c_port|=1<<SDA;Delay_us(DelayX);}
; #define SDA_0 {i2c_port&=~(1<<SDA);Delay_us(DelayX);}
;
; #define Write_EN_DO DDRD |= (1<<6);
; #define Write_EN_1 PORTD|= (1<<6);
; #define Write_EN_0 PORTD&=~(1<<6);
;
;
; unsigned char DISP_NUM; //显示的位数
; unsigned char BitTab[]={0xFE,0xFD,0xFB,0xF7}; //三位位选码
; unsigned char DispTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //LED字形码
; unsigned char DISP_DATA[4]={0,0,0,0}; //显示的数字
;
; void I2C_Ini(void);
; void IICStart(void);
; void IICStop(void);
; uint8 IICRecAck(void);
; uint8 IICReceiveByte(void);
; void IICSendByte(uint8 sendbyte);
; void IICNoAck(void);
; void IICACK(void);
; uint8 i2c_Read(uint8 subAddr,uint8 device);
; void i2c_Write(uint8 subAddr,uint8 device,uint8 data);
;
;
;
; void Delay_us(unsigned int time)
; {
L2:
.dbline 85
L3:
.dbline 85
; while(time--);
movw R2,R16
subi R16,1
sbci R17,0
tst R2
brne L2
tst R3
brne L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r time 16 i
.dbend
.dbfunc e Delay_ms _Delay_ms fV
; time -> R20,R21
.even
_Delay_ms::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 89
; }
;
; void Delay_ms(unsigned int time)
; {
xjmp L7
L6:
.dbline 91
.dbline 92
ldi R16,1000
ldi R17,3
xcall _Delay_us
.dbline 93
L7:
.dbline 90
; while(time--)
movw R2,R20
subi R20,1
sbci R21,0
tst R2
brne L6
tst R3
brne L6
X1:
.dbline -2
L5:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 i
.dbend
.dbfunc e INT0_Init _INT0_Init fV
.even
_INT0_Init::
.dbline -1
.dbline 96
; {
; Delay_us(1000);
; }
; }
; void INT0_Init()
; {
.dbline 97
; GIFR |=0X40; //清楚标志位
in R24,0x3a
ori R24,64
out 0x3a,R24
.dbline 99
; //MCUCR|=0X03; //上升沿触发中断
; MCUCR|=0X02;MCUCR&=~0X01; //下降沿触发中断
in R24,0x35
ori R24,2
out 0x35,R24
.dbline 99
in R24,0x35
andi R24,254
out 0x35,R24
.dbline 100
; GICR |=0X40; //使能外部中断0
in R24,0x3b
ori R24,64
out 0x3b,R24
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 4
jmp _int0_isr
.area text(rom, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.dbfunc e int0_isr _int0_isr fV
.even
_int0_isr::
xcall push_lset
sbiw R28,1
.dbline -1
.dbline 105
; }
;
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void)
; {
.dbline 106
; DISP_DATA[3]++;
lds R24,_DISP_DATA+3
subi R24,255 ; addi 1
sts _DISP_DATA+3,R24
.dbline 107
; if(DISP_DATA[3]>9)
ldi R24,9
lds R2,_DISP_DATA+3
cp R24,R2
brsh L12
.dbline 108
; {
.dbline 109
; DISP_DATA[3]=0;
clr R2
sts _DISP_DATA+3,R2
.dbline 110
; }
L12:
.dbline 111
; Write_EN_0;
cbi 0x12,6
.dbline 111
.dbline 112
; i2c_Write(0x02,AT24C02_ADDR,DISP_DATA[3]);
lds R2,_DISP_DATA+3
std y+0,R2
ldi R18,160
ldi R16,2
xcall _i2c_Write
.dbline 113
; Write_EN_1;
sbi 0x12,6
.dbline 113
.dbline -2
L10:
adiw R28,1
xcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e Display _Display fV
.even
_Display::
.dbline -1
.dbline 118
.dbline 119
clr R2
out 0x1b,R2
.dbline 120
ldi R24,<_BitTab
ldi R25,>_BitTab
lds R30,_DISP_NUM
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x18,R2
.dbline 121
ldi R24,<_DISP_DATA
ldi R25,>_DISP_DATA
lds R30,_DISP_NUM
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_DispTab
ldi R25,>_DispTab
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x1b,R2
.dbline 124
lds R24,_DISP_NUM
subi R24,255 ; addi 1
sts _DISP_NUM,R24
.dbline 125
cpi R24,4
brne L18
.dbline 126
clr R2
sts _DISP_NUM,R2
L18:
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 76
jmp _timer0comp
.area text(rom, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
.dbfunc e timer0comp _timer0comp fV
.even
_timer0comp::
xcall push_lset
.dbline -1
.dbline 131
; }
; //显示函数,DISP_NUM决定显示哪个LED
; //采用共阴LED动态显示方法,定时中断函数里面调用
; void Display(void)
; {
; PORTA=0x00; //清除显示再位选
; PORTB=BitTab[DISP_NUM]; //PB口接位选
; PORTA=DispTab[DISP_DATA[DISP_NUM]]; //PA口接LED的段码
;
;
; DISP_NUM++; //先显示高位,再显示低位
; if(DISP_NUM==4)
; DISP_NUM=0;
; }
;
; #pragma interrupt_handler timer0comp:20
; void timer0comp (void)
; {
.dbline 132
; Display();
xcall _Display
.dbline -2
L20:
xcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 136
; }
;
; void main(void)
; {
.dbline 138
;
; DDRA=0XFF;
ldi R24,255
out 0x1a,R24
.dbline 139
; PORTA=0X00;
clr R2
out 0x1b,R2
.dbline 140
; DDRB=0X0F;
ldi R24,15
out 0x17,R24
.dbline 141
; PORTB=0X00;
out 0x18,R2
.dbline 144
;
; //按键0端口初始化
; DDRD &=~0x04; //设置PD2为输入
cbi 0x11,2
.dbline 145
; PORTD|=0x04; //设置PD2为上拉
sbi 0x12,2
.dbline 147
;
; INT0_Init(); //TART初始化
xcall _INT0_Init
.dbline 150
;
; //t/c0初始化(10ms)
; TCCR0=0X0d;
ldi R24,13
out 0x33,R24
.dbline 151
; TCNT0=0X00;
clr R2
out 0x32,R2
.dbline 152
; OCR0=0X48;
ldi R24,72
out 0x3c,R24
.dbline 153
; TIMSK=0X02;
ldi R24,2
out 0x39,R24
.dbline 156
;
; //asm("sei");
; SEI(); //全局中断使能
sei
.dbline 158
;
; I2C_Ini();
xcall _I2C_Ini
.dbline 160
;
; Write_EN_DO;
sbi 0x11,6
.dbline 160
.dbline 161
; Write_EN_1;
sbi 0x12,6
.dbline 161
.dbline 162
; DISP_DATA[3]=i2c_Read(0x02,AT24C02_ADDR);
ldi R18,160
ldi R16,2
xcall _i2c_Read
sts _DISP_DATA+3,R16
.dbline 164
;
; for(;;)
L23:
.dbline 165
.dbline 167
.dbline 164
.dbline 164
xjmp L23
X2:
.dbline -2
L21:
.dbline 0 ; func end
ret
.dbend
.dbfunc e I2C_Ini _I2C_Ini fV
.even
_I2C_Ini::
.dbline -1
.dbline 174
; {
;
; }
; }
;
;
; //=======================================================================
; //初始化端口
; void I2C_Ini(void)
; {
.dbline 175
; i2c_ddr|=(1<<SCL); //SCK为输出
sbi 0x14,0
.dbline 176
; i2c_ddr|=(1<<SDA); //SDA为双向的,先设置为输出
sbi 0x14,1
.dbline -2
L27:
.dbline 0 ; func end
ret
.dbend
.dbfunc e IICStart _IICStart fV
.even
_IICStart::
.dbline -1
.dbline 183
;
;
; }
; //=======================================================================
; //启动总线。根据IIC协议,SCL为1时,SDA从1转变为0。
; void IICStart(void)
; { SCL_0;
.dbline 183
.dbline 183
cbi 0x15,0
.dbline 183
ldi R16,100
ldi R17,0
xcall _Delay_us
.dbline 183
.dbline 183
.dbline 185
;
; SDA_1;
.dbline 185
sbi 0x15,1
.dbline 185
ldi R16,100
ldi R17,0
xcall _Delay_us
.dbline 185
.dbline 185
.dbline 186
; SCL_1;
.dbline 186
sbi 0x15,0
.dbline 186
ldi R16,100
ldi R17,0
xcall _Delay_us
.dbline 186
.dbline 186
.dbline 187
; SDA_0;
.dbline 187
cbi 0x15,1
.dbline 187
ldi R16,100
ldi R17,0
xcall _Delay_us
.dbline 187
.dbline 187
.dbline 188
; SCL_0;
.dbline 188
cbi 0x15,0
.dbline 188
ldi R16,100
ldi R17,0
xcall _Delay_us
.dbline 188
.dbline 188
.dbline -2
L28:
.dbline 0 ; func end
ret
.dbend
.dbfunc e IICStop _IICStop fV
.even
_IICStop::
.dbline -1
.dbline 193
; }
; //=======================================================================
; //停止IIC总线。根据IIC协议,SCL为1时,SDA从0转变为1。
; void IICStop(void)
; {
.dbline 194
; SCL_0;
.dbline 194
cbi 0x15,0
.dbline 194
ldi R16,100
ldi R17,0
xcall _Delay_us
.dbline 194
.dbline 194
.dbline 195
; SDA_0;
.dbline 195
cbi 0x15,1
.dbline 195
ldi R16,100
ldi R17,0
xcall _Delay_us
.dbline 195
.dbline 195
.dbline 196
; SCL_1;
.dbline 196
sbi 0x15,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -