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

📄 main.s

📁 avr mega16 读取内部EEPRom
💻 S
字号:
	.module main.c
	.area lit(rom, con, rel)
_tab::
	.byte 63,6
	.byte 91,'O
	.byte 'f,'m
	.byte 125,7
	.byte 127,'o
	.dbfile D:\YM200\内部EEPROM\main.c
	.dbsym e tab _tab A[10:10]kc
	.area data(ram, con, rel)
	.dbfile D:\YM200\内部EEPROM\main.c
_buff::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\YM200\内部EEPROM\main.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\YM200\内部EEPROM\main.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\YM200\内部EEPROM\main.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\YM200\内部EEPROM\main.c
	.dbsym e buff _buff A[8:8]c
	.area text(rom, con, rel)
	.dbfile D:\YM200\内部EEPROM\main.c
	.dbfunc e delay _delay fV
;              x -> R16,R17
	.even
_delay::
	.dbline -1
	.dbline 24
; /*内部EEPROM读写实验,本实验涉及数码管串行显示,建议在掌握数码管串行显示的
; 基础上,来学习本例程。本实验可记录系统启动次数,每启动一次,数码管显示数据
; 加一,此数据保存于ATmega16内部EEPROM中。*/
; #include <iom16v.h>
; #include <macros.h>
; #include <led.h>
; 
; #define uchar unsigned char
; #define uint unsigned int
; 
; const uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段码
; uchar buff[8]={0,0,0,0,0,0,0,0};                          //8位显示缓冲区
; 
; 
; extern void EEPROM_write(unsigned int addr, unsigned char dd);
; extern void EEPROM_read(unsigned int addr,unsigned char *dd);
; 
; /*-------------------------------------------------------------------
; delay      :短延时函数
; 输入参数 x :粗略延时,x越大,延时越长
; 输出参数   :无
; --------------------------------------------------------------------*/
; void delay(unsigned int x)
; {
L2:
	.dbline 25
L3:
	.dbline 25
;   while(x--);
	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 x 16 i
	.dbend
	.dbfunc e L_delay _L_delay fV
;              y -> R20,R21
	.even
_L_delay::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 33
;  }
; /*------------------------------------------------------------------
; L_delay     :长延时函数
; 输入参数 y  :粗略延时,y越大,延时越长
; 输出参数    :无
; --------------------------------------------------------------------*/
; void L_delay(unsigned int y)
; {
	xjmp L7
L6:
	.dbline 34
	ldi R16,65000
	ldi R17,253
	xcall _delay
L7:
	.dbline 34
;   while(y--) delay(65000);
	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 y 20 i
	.dbend
	.dbfunc e PORT_init _PORT_init fV
	.even
_PORT_init::
	.dbline -1
	.dbline 42
;  }
; /*-----------------------------------------------------------
; PORT_init   :端口初始化函数
; 输入参数    :无
; 输出参数    :无
; ------------------------------------------------------------*/
; void PORT_init(void)
; {
	.dbline 43
;   LED_DATA_DDR|=LED_NCS|LED_SCK|LED_MOSI;       //设置为输出
	in R24,0x1a
	ori R24,28
	out 0x1a,R24
	.dbline 44
;   LED_SEL_DDR |=LED_SELA|LED_SELB|LED_SELC;     //设置为输出
	in R24,0x1a
	ori R24,224
	out 0x1a,R24
	.dbline 46
;    
;   LED_DATA_PORT&=~(LED_NCS|LED_SCK|LED_MOSI);   //输出0
	in R24,0x1b
	andi R24,227
	out 0x1b,R24
	.dbline 47
;   LED_SEL_PORT &=~(LED_SELA|LED_SELB|LED_SELC); //输出0
	in R24,0x1b
	andi R24,31
	out 0x1b,R24
	.dbline 49
;    
;   PORTC=0xff;
	ldi R24,255
	out 0x15,R24
	.dbline 50
;   DDRC=0x00;
	clr R2
	out 0x14,R2
	.dbline -2
L9:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e disp _disp fV
;              i -> R20
;             aa -> R22
;              j -> R10
	.even
_disp::
	xcall push_gset3
	.dbline -1
	.dbline 58
; }
; /*-----------------------------------------------------------
; disp        :数码管显示函数
; 输入参数    :无
; 输出参数    :无
; ------------------------------------------------------------*/
; void disp(void)
; {
	.dbline 61
;   uchar aa,i,j;
;   
;   for(i=0;i<8;i++)
	clr R20
	xjmp L14
L11:
	.dbline 62
;   {
	.dbline 63
;     aa=~tab[buff[7-i]];
	mov R2,R20
	clr R3
	ldi R30,7
	ldi R31,0
	sub R30,R2
	sbc R31,R3
	ldi R24,<_buff
	ldi R25,>_buff
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_tab
	ldi R25,>_tab
	add R30,R24
	adc R31,R25
	lpm R22,Z
	com R22
	.dbline 64
; 	for(j=0;j<8;j++)
	clr R10
	xjmp L18
L15:
	.dbline 65
; 	{
	.dbline 66
; 	   if((aa&0x80)!=0) LED_DATA_PORT|=LED_MOSI;
	sbrs R22,7
	rjmp L19
	.dbline 66
	sbi 0x1b,4
	xjmp L20
L19:
	.dbline 67
; 	   else LED_DATA_PORT&=~LED_MOSI;
	cbi 0x1b,4
L20:
	.dbline 68
	sbi 0x1b,3
	.dbline 69
	cbi 0x1b,3
	.dbline 70
	lsl R22
	.dbline 71
L16:
	.dbline 64
	inc R10
L18:
	.dbline 64
	mov R24,R10
	cpi R24,8
	brlo L15
	.dbline 72
; 	   LED_DATA_PORT|=LED_SCK; 
; 	   LED_DATA_PORT&=~LED_SCK;       //产生移位信号
; 	   aa=(aa<<1);
; 	}
; 	LED_SEL_PORT&=0x1f;
	in R24,0x1b
	andi R24,31
	out 0x1b,R24
	.dbline 73
; 	LED_SEL_PORT+=(i<<5);             //74HC138译码
	mov R2,R20
	lsl R2
	lsl R2
	lsl R2
	lsl R2
	lsl R2
	in R3,0x1b
	add R3,R2
	out 0x1b,R3
	.dbline 75
; 	
; 	LED_DATA_PORT|= LED_NCS;
	sbi 0x1b,2
	.dbline 76
; 	LED_DATA_PORT&=~LED_NCS;          //数据输出到并行口上
	cbi 0x1b,2
	.dbline 78
; 	
; 	delay(2000);
	ldi R16,2000
	ldi R17,7
	xcall _delay
	.dbline 79
; 	for(j=0;j<8;j++)                  //使输出置1
	clr R10
	xjmp L24
L21:
	.dbline 80
	.dbline 81
	sbi 0x1b,4
	.dbline 82
	sbi 0x1b,3
	.dbline 83
	cbi 0x1b,3
	.dbline 84
L22:
	.dbline 79
	inc R10
L24:
	.dbline 79
	mov R24,R10
	cpi R24,8
	brlo L21
	.dbline 85
	sbi 0x1b,2
	.dbline 86
	cbi 0x1b,2
	.dbline 87
L12:
	.dbline 61
	inc R20
L14:
	.dbline 61
	cpi R20,8
	brsh X2
	xjmp L11
X2:
	.dbline -2
L10:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r aa 22 c
	.dbsym r j 10 c
	.dbend
	.dbfunc e main _main fV
;             aa -> y+0
	.even
_main::
	sbiw R28,1
	.dbline -1
	.dbline 95
; 	{
; 	   LED_DATA_PORT|=LED_MOSI;
; 	   LED_DATA_PORT|=LED_SCK;
; 	   LED_DATA_PORT&=~LED_SCK;
; 	}
;     LED_DATA_PORT|= LED_NCS;
; 	LED_DATA_PORT&=~LED_NCS;
;   }
; }  
; /*-----------------------------------------------------------
; main        :主函数
; 输入参数    :无
; 输出参数    :无
; ------------------------------------------------------------*/
; void main(void)
; {
	.dbline 97
;   uchar aa;
;   PORT_init();
	xcall _PORT_init
	.dbline 98
;   EEPROM_read(0x08, &aa);
	movw R18,R28
	ldi R16,8
	ldi R17,0
	xcall _EEPROM_read
	.dbline 99
;   PORTB=~aa;
	ldd R2,y+0
	com R2
	out 0x18,R2
	.dbline 100
;   aa++;
	ldd R24,y+0
	subi R24,255    ; addi 1
	std y+0,R24
	.dbline 101
;   EEPROM_write(0x08, aa);
	mov R18,R24
	ldi R16,8
	ldi R17,0
	xcall _EEPROM_write
	.dbline 103
;   
;   buff[7]=aa%10;
	ldi R17,10
	ldd R16,y+0
	xcall mod8u
	sts _buff+7,R16
	.dbline 104
;   buff[6]=(aa/10)%10;
	ldi R17,10
	ldd R16,y+0
	xcall div8u
	ldi R17,10
	xcall mod8u
	sts _buff+6,R16
	.dbline 105
;   buff[5]=aa/100;
	ldi R17,100
	ldd R16,y+0
	xcall div8u
	sts _buff+5,R16
	xjmp L30
L29:
	.dbline 108
	.dbline 109
	xcall _disp
	.dbline 110
L30:
	.dbline 107
	xjmp L29
X3:
	.dbline -2
L25:
	adiw R28,1
	.dbline 0 ; func end
	ret
	.dbsym l aa 0 c
	.dbend

⌨️ 快捷键说明

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