📄 i2c.lst
字号:
__text_start:
__start:
0018 E5CF LDI R28,0x5F
0019 E0D2 LDI R29,2
001A BFCD OUT P3D,R28
001B BFDE OUT P3E,R29
001C 51C0 SUBI R28,0x10
001D 40D0 SBCI R29,0
001E EA0A LDI R16,0xAA
001F 8308 STD R16,0+Y
0020 2400 CLR R0
0021 E6E6 LDI R30,0x66
0022 E0F0 LDI R31,0
0023 E010 LDI R17,0
0024 36E8 CPI R30,0x68
0025 07F1 CPC R31,R17
0026 F011 BEQ 0x0029
0027 9201 ST R0,Z+
0028 CFFB RJMP 0x0024
0029 8300 STD R16,0+Z
002A E2EA LDI R30,0x2A
002B E0F0 LDI R31,0
002C E6A0 LDI R26,0x60
002D E0B0 LDI R27,0
002E E010 LDI R17,0
002F 33E0 CPI R30,0x30
0030 07F1 CPC R31,R17
0031 F021 BEQ 0x0036
0032 95C8 LPM
0033 9631 ADIW R30,1
0034 920D ST R0,X+
0035 CFF9 RJMP 0x002F
0036 D08F RCALL _main
_exit:
0037 CFFF RJMP _exit
_i2c_Write:
RomAddress --> R22
Wdata --> R20
0038 D21B RCALL push_gset2
0039 2F62 MOV R22,R18
003A 2F40 MOV R20,R16
FILE: D:\ICC-AVR\examples.sl\I2C\I2C.c
(0000) /**********************************************
(0001) http://www.sl.com.cn
(0002) 双龙电子公司----I2C总线演示程序(ICCAVR)
(0003) 作者:詹卫前
(0004) 1、以访问AT24C02为例
(0005) 2、SDA :PORTA.0
(0006) 3、SCL : PORTA.1
(0007) 使用注意:1、应包含头文件slavr.h
(0008) 2、在工程选项中的Additional Lib中填入slavr
(0009) 使用编译器使用附加库文件libslavr.a
(0010) ***********************************************/
(0011) #include <io8515.h>
(0012) #include <slavr.h>
(0013) /* 七段译码字形表 */
(0014) #pragma data:code
(0015) const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0016) #pragma data:data
(0017) /* 显示缓冲区 */
(0018) unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x00,0x00};
(0019) unsigned char at24_add,at24_data;
(0020) /******************************************
(0021) I2C总线写一个字节
(0022) *******************************************/
(0023) void i2c_Write(unsigned char Wdata,unsigned char RomAddress)
(0024) {
(0025) Start();
003B D104 RCALL _Start
(0026) Write8Bit(0xa0);
003C EA00 LDI R16,0xA0
003D D13B RCALL _Write8Bit
(0027) TestAck();
003E D117 RCALL _TestAck
(0028) Write8Bit(RomAddress);
003F 2F06 MOV R16,R22
0040 D138 RCALL _Write8Bit
(0029) TestAck();
0041 D114 RCALL _TestAck
(0030) Write8Bit(Wdata);
0042 2F04 MOV R16,R20
0043 D135 RCALL _Write8Bit
(0031) TestAck();
0044 D111 RCALL _TestAck
(0032) Stop();
0045 D103 RCALL _Stop
(0033) delay_ms(10);
0046 E00A LDI R16,0xA
0047 E010 LDI R17,0
0048 D14F RCALL _delay_ms
(0034) }
0049 D213 RCALL pop_gset2
004A 9508 RET
_i2c_Read:
temp --> R20
RomAddress --> R20
004B D1F1 RCALL push_gset1
004C 2F40 MOV R20,R16
(0035) /******************************************
(0036) I2C总线读一个字节
(0037) *******************************************/
(0038) unsigned char i2c_Read(unsigned char RomAddress)
(0039) {
(0040) unsigned char temp;
(0041) Start();
004D D0F2 RCALL _Start
(0042) Write8Bit(0xa0);
004E EA00 LDI R16,0xA0
004F D129 RCALL _Write8Bit
(0043) TestAck();
0050 D105 RCALL _TestAck
(0044) Write8Bit(RomAddress);
0051 2F04 MOV R16,R20
0052 D126 RCALL _Write8Bit
(0045) TestAck();
0053 D102 RCALL _TestAck
(0046) Start();
0054 D0EB RCALL _Start
(0047) Write8Bit(0xa1);
0055 EA01 LDI R16,0xA1
0056 D122 RCALL _Write8Bit
(0048) TestAck();
0057 D0FE RCALL _TestAck
(0049) temp=Read8Bit();
0058 D109 RCALL _Read8Bit
0059 2E20 MOV R2,R16
005A 2E31 MOV R3,R17
005B 2D42 MOV R20,R2
(0050) NoAck();
005C D0F3 RCALL _NoAck
(0051) Stop();
005D D0EB RCALL _Stop
(0052) return temp;
005E 2F04 MOV R16,R20
005F 2711 CLR R17
0060 D1DF RCALL pop_gset1
0061 9508 RET
(0053) }
(0054) /******************************************
(0055) 端口初始化
(0056) *******************************************/
(0057) void port_init(void)
(0058) {
(0059) DDRD=0x3f;
_port_init:
0062 E38F LDI R24,0x3F
0063 BB81 OUT P11,R24
(0060) DDRB=0xff;
0064 EF8F LDI R24,0xFF
0065 BB87 OUT P17,R24
(0061) PORTD=0xff;
0066 BB82 OUT P12,R24
(0062) PORTB=0xff;
0067 BB88 OUT P18,R24
(0063) }
0068 9508 RET
_display:
i --> R20
0069 D1D3 RCALL push_gset1
(0064) /******************************************
(0065) 六路动态扫描显示电路
(0066) *******************************************/
(0067) void display(void)
(0068) {
(0069) unsigned char i;
(0070) i=at24_data%16;
006A E110 LDI R17,0x10
006B 91000066 LDS R16,_at24_data
006D D1BA RCALL mod8u
006E 2F40 MOV R20,R16
(0071) ledbuff[0]=tabel[i];
006F E18A LDI R24,0x1A
0070 E090 LDI R25,0
0071 2E24 MOV R2,R20
0072 2433 CLR R3
0073 0E28 ADD R2,R24
0074 1E39 ADC R3,R25
0075 2DE2 MOV R30,R2
0076 2DF3 MOV R31,R3
0077 95C8 LPM
0078 92000060 STS R0,0x60
(0072) i=at24_data/16;
007A E110 LDI R17,0x10
007B 91000066 LDS R16,_at24_data
007D D1AC RCALL div8u
007E 2F40 MOV R20,R16
(0073) ledbuff[1]=tabel[i];
007F E18A LDI R24,0x1A
0080 E090 LDI R25,0
0081 2E24 MOV R2,R20
0082 2433 CLR R3
0083 0E28 ADD R2,R24
0084 1E39 ADC R3,R25
0085 2DE2 MOV R30,R2
0086 2DF3 MOV R31,R3
0087 95C8 LPM
0088 92000061 STS R0,0x61
(0074) i=at24_add%16;
008A E110 LDI R17,0x10
008B 91000067 LDS R16,_at24_add
008D D19A RCALL mod8u
008E 2F40 MOV R20,R16
(0075) ledbuff[2]=tabel[i];
008F E18A LDI R24,0x1A
0090 E090 LDI R25,0
0091 2E24 MOV R2,R20
0092 2433 CLR R3
0093 0E28 ADD R2,R24
0094 1E39 ADC R3,R25
0095 2DE2 MOV R30,R2
0096 2DF3 MOV R31,R3
0097 95C8 LPM
0098 92000062 STS R0,0x62
(0076) i=at24_add/16;
009A E110 LDI R17,0x10
009B 91000067 LDS R16,_at24_add
009D D18C RCALL div8u
009E 2F40 MOV R20,R16
(0077) ledbuff[3]=tabel[i];
009F E18A LDI R24,0x1A
00A0 E090 LDI R25,0
00A1 2E24 MOV R2,R20
00A2 2433 CLR R3
00A3 0E28 ADD R2,R24
00A4 1E39 ADC R3,R25
00A5 2DE2 MOV R30,R2
00A6 2DF3 MOV R31,R3
00A7 95C8 LPM
00A8 92000063 STS R0,0x63
(0078) for (i=0;i<6;i++)
00AA 2744 CLR R20
00AB C016 RJMP 0x00C2
(0079) {
(0080) PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
00AC E680 LDI R24,0x60
00AD E090 LDI R25,0
00AE 2FE4 MOV R30,R20
00AF 27FF CLR R31
00B0 0FE8 ADD R30,R24
00B1 1FF9 ADC R31,R25
00B2 8020 LDD R2,0+Z
00B3 BA28 OUT P18,R2
(0081) PORTD=~(1<<i); //开始显示
00B4 E001 LDI R16,1
00B5 2F14 MOV R17,R20
00B6 D1AA RCALL lsl8
00B7 2E20 MOV R2,R16
00B8 9420 COM R2
00B9 BA22 OUT P12,R2
(0082) delay_1ms(); //每一位显示保持一定时间
00BA D0D3 RCALL _delay_1ms
(0083) PORTD|=(1<<i); //关闭显示
00BB E001 LDI R16,1
00BC 2F14 MOV R17,R20
00BD D1A3 RCALL lsl8
00BE B222 IN R2,P12
00BF 2A20 OR R2,R16
00C0 BA22 OUT P12,R2
(0084) }
00C1 9543 INC R20
00C2 3046 CPI R20,6
00C3 F340 BCS 0x00AC
(0085) }
00C4 D17B RCALL pop_gset1
00C5 9508 RET
(0086) /******************************************
(0087) 主程序功能:演示了读写AT24C02的过程
(0088) 说明:1、键盘上0~F键用于输入地址或数据,
(0089) SHIFT键用于切换状态
(0090) 2、上电复位后,按数字键只可以修改地
(0091) 址,程序自动显示AT24C02单元内容。
(0092) 3、按一次SHIFT键,最高位LED小数点亮
(0093) 此时可以修改数字,再按一次SHIFT键
(0094) 程序将修改后的数字写入AT24C02,然
(0095) 后回到上电复位后的状态
(0096) *******************************************/
(0097) void main(void)
(0098) {
(0099) unsigned char key1,key2;
(0100) unsigned char index,flag;
(0101) MCUCR=0;
_main:
index --> R22
flag --> R10
key1 --> R12
key2 --> R14
00C6 2422 CLR R2
00C7 BE25 OUT P35,R2
(0102) at24_add=0;
00C8 92200067 STS R2,_at24_add
(0103) at24_data=0;
00CA 92200066 STS R2,_at24_data
(0104) index=0;
00CC 2766 CLR R22
(0105) flag=0;
00CD 24AA CLR R10
(0106) port_init(); //端口初始化
00CE DF93 RCALL _port_init
00CF C068 RJMP 0x0138
(0107) while(1)
(0108) {
(0109) key1=scan_key();
00D0 D0D5 RCALL _scan_key
00D1 2E20 MOV R2,R16
00D2 2E31 MOV R3,R17
00D3 2CC2 MOV R12,R2
(0110) if (key1!=0x7f)
00D4 2D8C MOV R24,R12
00D5 378F CPI R24,0x7F
00D6 F409 BNE 0x00D8
00D7 C056 RJMP 0x012E
(0111) {
(0112) do
(0113) {
(0114) key2=scan_key();//检查按键释放
00D8 D0CD RCALL _scan_key
00D9 2E20 MOV R2,R16
00DA 2E31 MOV R3,R17
00DB 2CE2 MOV R14,R2
(0115) display();
00DC DF8C RCALL _display
(0116) }
(0117) while(key1==key2);
00DD 14CE CP R12,R14
00DE F3C9 BEQ 0x00D8
(0118) if (key1>=0x80)
00DF 2D8C MOV R24,R12
00E0 3880 CPI R24,0x80
00E1 F078 BCS 0x00F1
(0119) {
(0120) if (flag!=0x00)//SHIFT键切换数据和地址修改
00E2 20AA TST R10
00E3 F039 BEQ 0x00EB
(0121) {
(0122) i2c_Write(at24_data,at24_add);
00E4 91200067 LDS R18,_at24_add
00E6 91000066 LDS R16,_at24_data
00E8 DF4F RCALL _i2c_Write
(0123) flag=0x00;
00E9 24AA CLR R10
(0124) }
00EA C002 RJMP 0x00ED
(0125) else flag=0x80;
00EB E880 LDI R24,0x80
00EC 2EA8 MOV R10,R24
(0126) ledbuff[5]=0x00^flag;
00ED 92A00065 STS R10,0x65
(0127) index=0;
00EF 2766 CLR R22
(0128) }
00F0 C03D RJMP 0x012E
(0129) else
(0130) {
(0131) switch (index)
00F1 2F46 MOV R20,R22
00F2 2755 CLR R21
00F3 3040 CPI R20,0
00F4 0745 CPC R20,R21
00F5 F029 BEQ 0x00FB
00F6 3041 CPI R20,1
00F7 E0E0 LDI R30,0
00F8 075E CPC R21,R30
00F9 F0E1 BEQ 0x0116
00FA C033 RJMP 0x012E
(0132) {
(0133) case 0:{if (flag==0x00)
00FB 20AA TST R10
00FC F461 BNE 0x0109
(0134) {key2=at24_add&0x0f;
00FD 91800067 LDS R24,_at24_add
00FF 708F ANDI R24,0xF
0100 2EE8 MOV R14,R24
(0135) at24_add=key2|(key1<<4);
0101 2D8C MOV R24,R12
0102 708F ANDI R24,0xF
0103 9582 SWAP R24
0104 2C2E MOV R2,R14
0105 2A28 OR R2,R24
0106 92200067 STS R2,_at24_add
(0136) }
0108 C00B RJMP 0x0114
(0137) else
(0138) {key2=at24_data&0x0f;
0109 91800066 LDS R24,_at24_data
010B 708F ANDI R24,0xF
010C 2EE8 MOV R14,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -