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

📄 at24c02.s

📁 I2C AVR单片机使用I2C总线的例子
💻 S
字号:
	.module AT24C02.c
	.area code(ram, con, rel)
	.area lit(rom, con, rel)
_tabel::
	.byte 63,6
	.byte 91,'O
	.byte 'f,'m
	.byte 125,7
	.byte 127,'o
	.byte 'w,124
	.byte 57,94
	.byte 'y,'q
	.dbfile D:\ICC-AVR\examples.sl\I2C\AT24C02.c
	.dbsym s tabel _tabel Ac[16:16]
	.area data(ram, con, rel)
	.dbfile D:\ICC-AVR\examples.sl\I2C\AT24C02.c
_ledbuff::
	.blkb 2
	.area idata
	.byte 63,63
	.area data(ram, con, rel)
	.dbfile D:\ICC-AVR\examples.sl\I2C\AT24C02.c
	.blkb 2
	.area idata
	.byte 63,63
	.area data(ram, con, rel)
	.dbfile D:\ICC-AVR\examples.sl\I2C\AT24C02.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\ICC-AVR\examples.sl\I2C\AT24C02.c
	.dbsym s ledbuff _ledbuff Ac[6:6]
	.area text(rom, con, rel)
	.dbfile D:\ICC-AVR\examples.sl\I2C\AT24C02.c
	.dbfunc s port_init _port_init fI
	.even
_port_init::
	.dbline 22{
; /**********************************************
;              http://www.sl.com.cn
;       双龙电子公司----I2C总线演示程序(ICCAVR)
; 	             作者:詹卫前
; 		  1、以访问AT24C02为例
; 		  2、SDA :PORTA.0
; 		  3、SCL : PORTA.1
; **********************************************/
; #include <io8515.h>
; #include <slavr.h>
;           /*   七段译码字形表     */
; #pragma data:code		          
; const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
; #pragma data:data
;           /*     显示缓冲区       */
; unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x00,0x00};
; unsigned char at24_add,at24_data;
; /******************************************
;                端口初始化
; *******************************************/
; void port_init(void)
;  {
	.dbline 23
;   DDRD=0x3f;
	ldi R24,63
	out 0x11,R24
	.dbline 24
;   DDRB=0xff;
	ldi R24,255
	out 0x17,R24
	.dbline 25
;   PORTD=0xff;
	out 0x12,R24
	.dbline 26
;   PORTB=0xff;
	out 0x18,R24
	.dbline 27}
;  }
L1:
	ret
	.dbfunc s display _display fI
;              i -> R20
	.even
_display::
	rcall push_gset1
	.dbline 32{
; /******************************************
;           六路动态扫描显示电路
; *******************************************/
; void display(void)
; {
	.dbline 34
;  unsigned char i;
;   i=at24_data%16;
	ldi R17,16
	lds R16,_at24_data
	rcall mod8u
	mov R20,R16
	.dbline 35
;   ledbuff[0]=tabel[i];
	ldi R24,<_tabel
	ldi R25,>_tabel
	mov R2,R20
	clr R3
	add R2,R24
	adc R3,R25
	mov R30,R2
	mov R31,R3
	lpm
	sts _ledbuff,R0
	.dbline 36
;   i=at24_data/16;
	ldi R17,16
	lds R16,_at24_data
	rcall div8u
	mov R20,R16
	.dbline 37
;   ledbuff[1]=tabel[i];
	ldi R24,<_tabel
	ldi R25,>_tabel
	mov R2,R20
	clr R3
	add R2,R24
	adc R3,R25
	mov R30,R2
	mov R31,R3
	lpm
	sts _ledbuff+1,R0
	.dbline 38
;   i=at24_add%16;
	ldi R17,16
	lds R16,_at24_add
	rcall mod8u
	mov R20,R16
	.dbline 39
;   ledbuff[2]=tabel[i];
	ldi R24,<_tabel
	ldi R25,>_tabel
	mov R2,R20
	clr R3
	add R2,R24
	adc R3,R25
	mov R30,R2
	mov R31,R3
	lpm
	sts _ledbuff+2,R0
	.dbline 40
;   i=at24_add/16;
	ldi R17,16
	lds R16,_at24_add
	rcall div8u
	mov R20,R16
	.dbline 41
;   ledbuff[3]=tabel[i];
	ldi R24,<_tabel
	ldi R25,>_tabel
	mov R2,R20
	clr R3
	add R2,R24
	adc R3,R25
	mov R30,R2
	mov R31,R3
	lpm
	sts _ledbuff+3,R0
	.dbline 42
;  for (i=0;i<6;i++)
	clr R20
	rjmp L9
L6:
	.dbline 43
	.dbline 44
	ldi R24,<_ledbuff
	ldi R25,>_ledbuff
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0x18,R2
	.dbline 45
	ldi R16,1
	mov R17,R20
	rcall lsl8
	mov R2,R16
	com R2
	out 0x12,R2
	.dbline 46
	rcall _delay_1ms
	.dbline 47
	ldi R16,1
	mov R17,R20
	rcall lsl8
	in R2,0x12
	or R2,R16
	out 0x12,R2
	.dbline 48
L7:
	.dbline 42
	inc R20
L9:
	.dbline 42
	cpi R20,6
	brlo L6
	.dbline 49}
;   {
;    PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
;    PORTD=~(1<<i);   //开始显示
;    delay_1ms();     //每一位显示保持一定时间
;    PORTD|=(1<<i);   //关闭显示
;   }
; }
L2:
	rcall pop_gset1
	ret
	.dbsym r i 20 c
	.dbfunc s main _main fI
;          index -> R22
;           flag -> R10
;           key1 -> R12
;           key2 -> R14
	.even
_main::
	sbiw R28,1
	.dbline 62{
; /******************************************
;     主程序功能:演示了读写AT24C02的过程
; 	说明:1、键盘上0~F键用于输入地址或数据,
; 	         SHIFT键用于切换状态
; 		  2、上电复位后,按数字键只可以修改地
; 		     址,程序自动显示AT24C02单元内容。
; 		  3、按一次SHIFT键,最高位LED小数点亮
; 		     此时可以修改数字,再按一次SHIFT键
; 			 程序将修改后的数字写入AT24C02,然
; 			 后回到上电复位后的状态		
; *******************************************/
; void main(void)
; {
	.dbline 65
;  unsigned char key1,key2;
;  unsigned char index,flag;
;  MCUCR=0;
	clr R2
	out 0x35,R2
	.dbline 66
;  at24_add=0;
	sts _at24_add,R2
	.dbline 67
;  at24_data=0;
	sts _at24_data,R2
	.dbline 68
;  index=0;
	clr R22
	.dbline 69
;  flag=0;
	clr R10
	.dbline 70
;  port_init(); //端口初始化
	rcall _port_init
	rjmp L12
L11:
	.dbline 72
;  while(1)
;   {  
	.dbline 73
;      key1=scan_key();
	rcall _scan_key
	mov R2,R16
	mov R3,R17
	mov R12,R2
	.dbline 74
;   	 if (key1!=0x7f)
	mov R24,R12
	cpi R24,127
	brne X2
	rjmp L14
X2:
	.dbline 75
; 	    {
L16:
	.dbline 77
; 		 do 
; 		   {
	.dbline 78
; 		    key2=scan_key();//检查按键释放
	rcall _scan_key
	mov R2,R16
	mov R3,R17
	mov R14,R2
	.dbline 79
; 	  	    display();
	rcall _display
	.dbline 80
; 			}
L17:
	.dbline 81
; 		 while(key1==key2);
	cp R12,R14
	breq L16
	.dbline 82
; 		 if (key1>=0x80)
	mov R24,R12
	cpi R24,128
	brlo L19
	.dbline 83
; 		    {
	.dbline 84
; 			 if (flag!=0x00)//SHIFT键切换数据和地址修改
	tst R10
	breq L21
	.dbline 85
; 			     { 
	.dbline 86
; 				   Write24c02(&at24_data,at24_add,1);
	ldi R24,1
	std y+0,R24
	lds R18,_at24_add
	ldi R16,<_at24_data
	ldi R17,>_at24_data
	rcall _Write24c02
	.dbline 87
; 				   flag=0x00;
	clr R10
	.dbline 88
; 				  }			 
	rjmp L22
L21:
	.dbline 89
; 			 else flag=0x80;
	ldi R24,128
	mov R10,R24
L22:
	.dbline 90
; 			 ledbuff[5]=0x00^flag;
	sts _ledbuff+5,R10
	.dbline 91
; 			 index=0;
	clr R22
	.dbline 92
; 			 }
	rjmp L20
L19:
	.dbline 94
; 		 else
; 		    {
	.dbline 95
; 			 switch (index)
	mov R20,R22
	clr R21
	cpi R20,0
	cpc R20,R21
	breq L27
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L30
	rjmp L24
X0:
	.dbline 96
; 			   {
L27:
	.dbline 97
; 			    case 0:{if (flag==0x00)
	.dbline 97
	tst R10
	brne L28
	.dbline 98
; 				           {key2=at24_add&0x0f;
	.dbline 98
	lds R24,_at24_add
	andi R24,15
	mov R14,R24
	.dbline 99
; 						    at24_add=key2|(key1<<4);
	mov R24,R12
	andi R24,#0x0F
	swap R24
	mov R2,R14
	or R2,R24
	sts _at24_add,R2
	.dbline 100
; 						    }
	rjmp L29
L28:
	.dbline 102
; 				        else
; 						   {key2=at24_data&0x0f;
	.dbline 102
	lds R24,_at24_data
	andi R24,15
	mov R14,R24
	.dbline 103
; 						    at24_data=key2|(key1<<4);
	mov R24,R12
	andi R24,#0x0F
	swap R24
	mov R2,R14
	or R2,R24
	sts _at24_data,R2
	.dbline 104
; 							}
L29:
	.dbline 105
; 						index=01;							
	ldi R22,1
	.dbline 106
; 						break;	     
	rjmp L25
L30:
	.dbline 108
; 				       }
; 				case 1:{if (flag==0x00)
	.dbline 108
	tst R10
	brne L31
	.dbline 109
; 				           {key2=at24_add&0xf0;
	.dbline 109
	lds R24,_at24_add
	andi R24,240
	mov R14,R24
	.dbline 110
; 						    at24_add=key2|(key1&0x0f);
	mov R24,R12
	andi R24,15
	mov R2,R14
	or R2,R24
	sts _at24_add,R2
	.dbline 111
; 						    }
	rjmp L32
L31:
	.dbline 113
; 				        else
; 						   {key2=at24_data&0xf0;
	.dbline 113
	lds R24,_at24_data
	andi R24,240
	mov R14,R24
	.dbline 114
; 						    at24_data=key2|(key1&0x0f);
	mov R24,R12
	andi R24,15
	mov R2,R14
	or R2,R24
	sts _at24_data,R2
	.dbline 115
; 							}
L32:
	.dbline 116
; 						index=00;	
	clr R22
	.dbline 117
; 						break;	
L24:
L25:
	.dbline 120
; 				       }
; 			   }    			
; 			} 	
L20:
	.dbline 121
; 		 }	 	 		 		 			  
L14:
	.dbline 122
;      if (flag==0x00)
	tst R10
	brne L33
	.dbline 123
; 	 Read24c02(&at24_data,at24_add,1);
	ldi R24,1
	std y+0,R24
	lds R18,_at24_add
	ldi R16,<_at24_data
	ldi R17,>_at24_data
	rcall _Read24c02
L33:
	.dbline 124
	rcall _display
	.dbline 125
L12:
	.dbline 71
	rjmp L11
X1:
	.dbline 126}
; 	 display();	  
;   }
; }
L10:
	adiw R28,1
	ret
	.dbsym r index 22 c
	.dbsym r flag 10 c
	.dbsym r key1 12 c
	.dbsym r key2 14 c
	.area bss(ram, con, rel)
	.dbfile D:\ICC-AVR\examples.sl\I2C\AT24C02.c
_at24_data::
	.blkb 1
	.dbsym s at24_data _at24_data c
_at24_add::
	.blkb 1
	.dbsym s at24_add _at24_add c

⌨️ 快捷键说明

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