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

📄 smg.s

📁 AVR单片机开发版资料测试程序里的源程序
💻 S
字号:
	.module SMG.C
	.area text(rom, con, rel)
	.dbfile C:/icc/include/AVR_PQ1A.h
	.dbfunc e Delayus _Delayus fV
;              i -> R20,R21
;             US -> R22,R23
	.even
_Delayus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 28
; /*******************************************
;   文件:SMG.C
;   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
;   硬件:ATMEGA16芯片
;   日期:2006年12月10日 
;   功能:驱动开发板上的数码管,滚动显示1、2、3、4、5、6
;   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
; /******************************************/
; #include <iom16v.h>			//包含型号头文件
; #include <macros.h>			//包含"位"操作头文件
; #include <stdio.h>			//标准输入输出头文件
; #include <AVR_PQ1A.h>		//包含自定义常量头文件
; 
; #pragma data:code 
; const SEGMENT[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
; 		   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
; 
; /*******************************************
; 函数名称: One_smg_display
; 功    能: 指定的数码管显示指定的内容
; 参    数: data--显示的内容(0-15)
; 	  	  number--指定的数码管(1-6)
; 返回值  : 无
; /********************************************/
; void One_smg_display(uchar data,uchar number)
; { 
;  PORTB|=0x3F;			   //输出位选
;  PORTA|=BIT(BITLK);		   //更新位选
	.dbline 30
;  Delayus(50);			   //调整时序
;  PORTA&=~BIT(BITLK);	   //锁存位选
	ldi R16,5
	ldi R17,0
	movw R18,R22
	xcall empy16s
	movw R22,R16
	lsr R23
	ror R22
	lsr R23
	ror R22
	.dbline 31
	clr R20
	clr R21
	xjmp L5
L2:
	.dbline 31
L3:
	.dbline 31
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 31
; 
	cp R20,R22
	cpc R21,R23
	brlo L2
	.dbline -2
	.dbline 32
;  PORTB=SEGMENT[data];	   //输出段选
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r US 22 i
	.dbend
	.dbfunc e Delayms _Delayms fV
;              i -> R20,R21
;              j -> R22,R23
;             MS -> R16,R17
	.even
_Delayms::
	xcall push_gset2
	.dbline -1
	.dbline 40
;  PORTA|=BIT(SEGLK);		   //更新段选
;  Delayus(50);			   //调整时序
;  PORTA&=~BIT(SEGLK);	   //锁存段选
;  
;  number=~BIT(number-1);	   //调整位选(指定时是1~6,而操作的时候是0~5)
;  PORTB=number;			   //输出位选
;  PORTA|=BIT(BITLK);		   //更新位选
;  Delayus(50);				   //调整时序
	.dbline 42
;  PORTA&=~BIT(BITLK);	   //锁存位选
; }
	clr R20
	clr R21
	xjmp L10
L7:
	.dbline 43
	clr R22
	clr R23
	xjmp L14
L11:
	.dbline 43
L12:
	.dbline 43
	subi R22,255  ; offset = 1
	sbci R23,255
L14:
	.dbline 43
	cpi R22,117
	ldi R30,4
	cpc R23,R30
	brlo L11
L8:
	.dbline 42
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 42
	cp R20,R16
	cpc R21,R17
	brlo L7
	.dbline -2
	.dbline 44
; /*******************************************
; 函数名称: All_smg_display
L6:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r MS 16 i
	.dbend
	.dbfunc e Board_init _Board_init fV
	.even
_Board_init::
	.dbline -1
	.dbline 52
; 功    能: 6个数码管显示指定的内容
; 参    数: *pdata--显示内容数组地址
; 返回值  : 无
; /********************************************/
; void All_smg_display(uchar *pdata)
; {
;  uchar i;
;  for(i=0;i<6;i++)
	.dbline 53
;  	{
	ldi R24,255
	out 0x1a,R24
	.dbline 54
; 	 One_smg_display(pdata[i],i+1);
	out 0x17,R24
	.dbline 55
; 	 Delayms(1);
	out 0x14,R24
	.dbline 56
; 	}
	out 0x11,R24
	.dbline 58
; }
; /*******************************************
	clr R2
	out 0xd,R2
	.dbline 60
; 函数名称: Cycle_smg_display
; 功    能: 6个数码管从右向左循环滚动显示指定的内容(循环一次)
	sbi 0x1b,6
	.dbline 61
; 参    数: *pdata--显示内容数组地址
	cbi 0x15,6
	.dbline 62
; 返回值  : 无
	cbi 0x1b,1
	.dbline 63
; /********************************************/
	out 0x18,R24
	.dbline 64
; void Cycle_smg_display(uchar *pdata)
	sbi 0x1b,2
	.dbline 65
; {
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 66
;  uchar i,j;
	cbi 0x1b,2
	.dbline 68
;  for(i=0;i<240;i++)			 //共滚动6次,每次内容显示40个循环
;  { 
	clr R2
	out 0x18,R2
	.dbline 69
;   for(j=0;j<6;j++)			 //扫描6个数码管
	sbi 0x1b,3
	.dbline 70
;  	{
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 71
; 	 One_smg_display(pdata[(i/40+j)%6],j+1);//显示
	cbi 0x1b,3
	.dbline 73
; 	 Delayus(2000);			 //调整显示时间和亮度(时间越长亮度越高,但是太长数码管就闪了)
; 	}
	ldi R24,255
	out 0x18,R24
	.dbline 74
;  }
	sbi 0x1b,4
	.dbline 75
; }
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 76
; /*******************************************
	cbi 0x1b,4
	.dbline 78
; 函数名称: main
; 功    能: 6个数码管循环滚动显示指定的内容
	ldi R24,255
	out 0x12,R24
	.dbline 79
; 参    数: 无
	sbi 0x1b,7
	.dbline 80
; 返回值  : 无
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 81
; /********************************************/
	cbi 0x1b,7
	.dbline -2
	.dbline 84
; void main(void)
; {	 
; 	 uchar data[6]={1,2,3,4,5,6};//六个数码管滚动显示1,2,3,4,5,6	 
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.area code(ram, con, rel)
	.dbfile C:/icc/include/AVR_PQ1A.h
	.area lit(rom, con, rel)
_SEGMENT::
	.word 63
	.word 6
	.word 91
	.word 79
	.word 102
	.word 109
	.word 125
	.word 7
	.word 127
	.word 111
	.word 119
	.word 124
	.word 57
	.word 94
	.word 121
	.word 113
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\2_SMG\SMG.C
	.dbsym e SEGMENT _SEGMENT A[32:16]I
	.area text(rom, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\2_SMG\SMG.C
	.dbfunc e One_smg_display _One_smg_display fV
;         number -> R20
;           data -> R22
	.even
_One_smg_display::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 26
	.dbline 27
	in R24,0x18
	ori R24,63
	out 0x18,R24
	.dbline 28
	sbi 0x1b,4
	.dbline 29
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 30
	cbi 0x1b,4
	.dbline 32
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_SEGMENT
	ldi R25,>_SEGMENT
	add R30,R24
	adc R31,R25
	lpm R0,Z+
	lpm R1,Z
	movw R30,R0
	out 0x18,R30
	.dbline 33
	sbi 0x1b,3
	.dbline 34
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 35
	cbi 0x1b,3
	.dbline 37
	mov R17,R20
	subi R17,1
	ldi R16,1
	xcall lsl8
	mov R20,R16
	com R20
	.dbline 38
	out 0x18,R20
	.dbline 39
	sbi 0x1b,4
	.dbline 40
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 41
	cbi 0x1b,4
	.dbline -2
	.dbline 42
L16:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r number 20 c
	.dbsym r data 22 c
	.dbend
	.dbfunc e All_smg_display _All_smg_display fV
;              i -> R20
;          pdata -> R22,R23
	.even
_All_smg_display::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 50
	.dbline 52
	clr R20
	xjmp L21
L18:
	.dbline 53
	.dbline 54
	mov R18,R20
	subi R18,255    ; addi 1
	mov R30,R20
	clr R31
	add R30,R22
	adc R31,R23
	ldd R16,z+0
	xcall _One_smg_display
	.dbline 55
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 56
L19:
	.dbline 52
	inc R20
L21:
	.dbline 52
	cpi R20,6
	brlo L18
	.dbline -2
	.dbline 57
L17:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r pdata 22 pc
	.dbend
	.dbfunc e Cycle_smg_display _Cycle_smg_display fV
;              i -> R20
;              j -> R10
;          pdata -> R22,R23
	.even
_Cycle_smg_display::
	xcall push_gset3
	movw R22,R16
	.dbline -1
	.dbline 65
	.dbline 67
	clr R20
	xjmp L26
L23:
	.dbline 68
	.dbline 69
	clr R10
	xjmp L30
L27:
	.dbline 70
	.dbline 71
	mov R18,R10
	subi R18,255    ; addi 1
	ldi R24,40
	ldi R25,0
	mov R16,R20
	clr R17
	push R18
	push R19
	movw R18,R24
	xcall div16s
	movw R2,R16
	pop R19
	pop R18
	mov R4,R10
	clr R5
	add R2,R4
	adc R3,R5
	ldi R24,6
	ldi R25,0
	push R18
	push R19
	movw R18,R24
	movw R16,R2
	xcall mod16s
	movw R30,R16
	pop R19
	pop R18
	add R30,R22
	adc R31,R23
	ldd R16,z+0
	xcall _One_smg_display
	.dbline 72
	ldi R16,2000
	ldi R17,7
	xcall _Delayus
	.dbline 73
L28:
	.dbline 69
	inc R10
L30:
	.dbline 69
	mov R24,R10
	cpi R24,6
	brlo L27
	.dbline 74
L24:
	.dbline 67
	inc R20
L26:
	.dbline 67
	cpi R20,240
	brlo L23
	.dbline -2
	.dbline 75
L22:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r j 10 c
	.dbsym r pdata 22 pc
	.dbend
	.area lit(rom, con, rel)
L32:
	.byte 1,2
	.byte 3,4
	.byte 5,6
	.area text(rom, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\2_SMG\SMG.C
	.dbfunc e main _main fV
;           data -> y+0
	.even
_main::
	sbiw R28,6
	.dbline -1
	.dbline 83
	.dbline 84
	ldi R24,<L32
	ldi R25,>L32
	movw R30,R28
	ldi R16,6
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 85
; 	 Board_init( );	   //初始化开发板
	xcall _Board_init
	xjmp L34
L33:
	.dbline 87
	.dbline 88
	movw R16,R28
	xcall _Cycle_smg_display
	.dbline 89
L34:
	.dbline 86
	xjmp L33
X0:
	.dbline -2
	.dbline 90
; 	 while(1)
; 	 {
; 	  Cycle_smg_display(data);
; 	 }
; }
L31:
	adiw R28,6
	.dbline 0 ; func end
	ret
	.dbsym l data 0 A[6:6]c
	.dbend

⌨️ 快捷键说明

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