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

📄 main.s

📁 飞思卡尔的电子钟和电子琴的课程设计,包括源代码
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module main.c
	.area data
_ch::
	.blkb 28
	.area idata
	.byte 'p,'l,'e,'a,'s,'e,32,'s,'e,'t,32,'t,'i,'m,'e,33
	.byte 'E,'p,'r,'e,'s,'s,32,39,'B,39,'E,0
	.area data
_c::
	.blkb 19
	.area idata
	.byte 't,'i,'m,'e,32,'o,'u,'t,33,'E,'G,'e,'t,32,'u,'p
	.byte 33,'E,0
	.area data
_init::
	.blkb 21
	.area idata
	.byte 48,48,48,48,45,48,48,45,48,48,'E,48,48,58,48,48
	.byte 58,48,48,'E,0
	.area data
_show::
	.blkb 1
	.area idata
	.byte 32
	.area data
	.blkb 31
	.area idata
	.word 0,0,0,0,0
	.word 0,0,0,0,0
	.word 0,0,0,0,0
	.byte 0
	.area data
	.area text
_main::
; /*-----------------------------------------------------*
; *工 程 名:	                                
; *硬件连接:                                
; *程序描述: SD-HC08 模板生成                            
; */
; /*[头文件]*/
; #include "GP32C.h"                //映像寄存器地址头文件
; #include "clock.h" 
; 
; 
; unsigned char ch[]={"please set time!Epress 'B'E"};
; unsigned char c[]={"time out!EGet up!E"};
; unsigned char init[]={"0000-00-00E00:00:00E"};
; unsigned char show[32]={' '};
; unsigned char timer[2];
; unsigned char time[3];
; unsigned int date[3];
; unsigned char out;
; unsigned char timertem[4];
; unsigned char timetem[4];
; unsigned char datetem[8];
; unsigned char showtime;
; unsigned char istimer;
; unsigned char issettime;
; /*[主函数]*/
; void main(void){
; 	asm("SEI");
	SEI
; 	showtime=0x01;istimer=0x00;issettime=0;//模式初始化
	lda #1
	sta *_showtime
	clr *_istimer
	clr *_issettime
; 	DDRD=0x01;out=1;					//闹钟接口初始化
	lda #1
	sta 0x7
	lda #1
	sta *_out
; 	timer[0]=0;timer[1]=0;				//闹钟\时间初始化
	clr *_timer
	clr *_timer+1
; 	time[0]=0;time[1]=0;time[2]=0;
	clr *_time
	clr *_time+1
	clr *_time+2
; 	date[0]=0;date[1]=0;date[2]=0;
	clr *_date+1
	clr *_date
	clr *_date+2+1
	clr *_date+2
	clr *_date+4+1
	clr *_date+4
; 	LcdInit();							//LCD显示初始化
	jsr _LcdInit
; 	KB_Init();					//键盘初始化
	jsr _KB_Init
; 	INTKBSCR&= ~(1<<IntBit); //开放键盘中断(IMASKk=1)  
	bclr #1,0x1a
; 	PTD=0;
	clr 0x3
; 	Timer1init();				//定时器初始化
	jsr _Timer1init
	tsx
; 	asm("CLI");
	CLI
	bra L8
L7:
; 	while(1){
; 		if(timer[0]==time[0]&&timer[1]==time[1]&&istimer==0x01){//闹钟启动//开始响铃60秒
	lda *_timer
	cmp *_time
	bne L10
	lda *_timer+1
	cmp *_time+1
	bne L10
	lda *_istimer
	cmp #1
	bne L10
; 	 	   showtime=0;							//关闭时间显示
	clr *_showtime
; 	 	   lcdshow((unsigned char *)c);
	lda #<_c
	psha
	lda #>_c
	psha
	jsr _lcdshow
	ais #2
; 	  	   beep(2);						   
	lda #2
	psha
	jsr _beep
	ais #1
	tsx
; 	 	   showtime=1;						//开时间表显示
	lda #1
	sta *_showtime
;    		}
L10:
L8:
	bra L7
X0:
L1:
	.dbline 0 ; func end
	rts
;             in -> 0,X
_isadddate1::
	ais #-1
	tsx
; 	}
; }
; 
; unsigned char isadddate1(void){//每月天数不一,判断对应月加1
;    unsigned char in=0x00;						
	clr ,X
;    	if((date[1]==1||date[1]==3||date[1]==5||date[1]==7||date[1]==8||date[1]==10||date[1]==12)&&date[2]>=32)
	ldhx *_date+2
	cphx #1
	tsx
	beq L30
	ldhx *_date+2
	cphx #3
	tsx
	beq L30
	ldhx *_date+2
	cphx #5
	tsx
	beq L30
	ldhx *_date+2
	cphx #7
	tsx
	beq L30
	ldhx *_date+2
	cphx #8
	tsx
	beq L30
	ldhx *_date+2
	cphx #10
	tsx
	beq L30
	ldhx *_date+2
	cphx #12
	tsx
	bne L15
L30:
	ldhx *_date+4
	cphx #32
	tsx
	blo L15
; 		in=0x01;
	lda #1
	sta ,X
	jmp L16
L15:
; 	else if((date[1]==4||date[1]==6||date[1]==9||date[1]==11)&&date[2]>=31)
	ldhx *_date+2
	cphx #4
	tsx
	beq L40
	ldhx *_date+2
	cphx #6
	tsx
	beq L40
	ldhx *_date+2
	cphx #9
	tsx
	beq L40
	ldhx *_date+2
	cphx #11
	tsx
	bne L31
L40:
	ldhx *_date+4
	cphx #31
	tsx
	blo L31
; 		in=0x01;
	lda #1
	sta ,X
	bra L32
L31:
; 	else if((date[1]==2&&date[0]%4==0)&&date[2]==29)in=0x01;
	ldhx *_date+2
	cphx #2
	tsx
	bne L41
	lda *_date+1
	and #3
	sta *__r1
	clra
	sta *__r0
	ldhx *__r0
	cphx #0
	tsx
	bne L41
	ldhx *_date+4
	cphx #29
	tsx
	bne L41
	lda #1
	sta ,X
	bra L42
L41:
; 	else if((date[1]==2&&date[0]%4!=0)&&date[2]==28)in=0x01;
	ldhx *_date+2
	cphx #2
	tsx
	bne L45
	lda *_date+1
	and #3
	sta *__r1
	clra
	sta *__r0
	ldhx *__r0
	cphx #0
	tsx
	beq L45
	ldhx *_date+4
	cphx #28
	tsx
	bne L45
	lda #1
	sta ,X
L45:
L42:
L32:
L16:
; 	return in;
	lda ,X
L14:
	ais #1
	.dbline 0 ; func end
	rts
;             in -> 0,X
_addtime::
	ais #-1
	tsx
; }
; void addtime(void){				//日期,时间累加函数
;    unsigned char in;
;    time[2]++;             //秒数加1
	inc *_time+2
;    if (time[2]>=60){       //秒数未增加到60,转
	lda *_time+2
	cmp #60
	blo L51
;       time[2]=0; time[1]++;  //秒数增加到60,清0,分钟数加1
	clr *_time+2
	inc *_time+1
;    }
L51:
;    if (time[1]>=60){          //分钟数未增到60,转
	lda *_time+1
	cmp #60
	blo L56
;       time[1]=0; time[0]++;  //分钟数增加到60,清0,小时数加1
	clr *_time+1
	inc *_time
;       beep(1);
	lda #1
	psha
	jsr _beep
	ais #1
	tsx
;    }
L56:
;    if (time[0]>=24){          //小时数未增到24,转
	lda *_time
	cmp #24
	blo L60
;       time[0]=0;             //时数增加到24,清0
	clr *_time
;       date[2]++;
	lda *_date+4+1
	add #1
	sta *_date+4+1
	lda *_date+4
	adc #0
	sta *_date+4
;    }
L60:
;    in=isadddate1();
	jsr _isadddate1
	tsx
	sta *__r1
	sta ,X
;    if(in==0x01){						//满足月份加1
	cmp #1
	bne L63
; 	date[1]++;						//月份加1
	lda *_date+2+1
	add #1
	sta *_date+2+1
	lda *_date+2
	adc #0
	sta *_date+2
; 	date[2]=1;						//天回1
	mov #0,*_date+4
	mov #1,*_date+4+1
;    }
L63:
;    if(date[1]>=13){					//月大于12
	ldhx *_date+2
	cphx #13
	tsx
	blo L67
;    	  date[0]++;					//年加1,月回1
	lda *_date+1
	add #1
	sta *_date+1
	lda *_date
	adc #0
	sta *_date
;    	  date[1]=1;
	mov #0,*_date+2
	mov #1,*_date+2+1
;    }
L67:
L49:
	ais #1
	.dbline 0 ; func end
	rts
;              c -> 0,X
;           temp -> 4,X
;              i -> 6,X
;              j -> 7,X
_displaytime::
	ais #-8
	tsx
; }
; 
; void displaytime(void){			//显示时间处理
; 	if(showtime==0x01){			//可显示时才处理
	lda *_showtime
	cmp #1
	beq X1
	jmp L72
X1:
; 		unsigned char i=0,j,c[4];
	clr 6,X
;   		int temp=date[0];
	lda *_date
	sta 4,X
	lda *_date+1
	sta 5,X
	clr 7,X
	bra L77
L74:
	sthx *__r0
	clr *__r2
	lda 7,X
	add *__r1
	sta *__r1
	lda *__r2
	adc *__r0
	sta *__r0
	lda 5,X
	sta *__rlo
	lda 4,X
	sta *__rhi
	lda #10
	psha
	clra
	psha
	jsr __divmod16s
	pula
	pula
	ldhx *__r0
	sta ,x
	tsx
	lda 5,X
	sta *__rlo
	lda 4,X
	sta *__rhi
	lda #10
	psha
	clra
	psha
	jsr __divmod16s
	ais #2
	lda *__rhi
	sta 4,X
	lda *__rlo
	sta 5,X
L75:
	inc 7,X
L77:
;   		for(j=0;j<4;j++){		//年中的四位处理,放临时变量
	lda 7,X
	cmp #4
	blo L74
	clr 7,X
	bra L81
L78:
	sthx *__r0
	clr *__r2
	lda 7,X
	sta *__r3
	lda #3
	sub *__r3
	sta *__r3
	clra
	sbc *__r2
	sta *__r2
	lda *__r3
	add *__r1
	sta *__r1
	lda *__r2
	adc *__r0
	sta *__r0
	ldhx *__r0
	lda ,x
	tsx
	add #48
	sta *__r1
	clr *__r2
	lda 6,X
	add #<_show
	sta *__r3
	lda *__r2
	adc #>_show
	sta *__r2
	lda *__r1
	ldhx *__r2
	sta ,x
	tsx
	inc 6,X
L79:
	inc 7,X
L81:
;   		   c[j]=(char)(temp%10);
;   		   temp/=10;
;  	 	}
;   		for(j=0;j<4;j++){		//年存到显示单元中
	lda 7,X
	cmp #4
	blo L78
;  	 	   show[i]=c[3-j]+0x30;i++;
;  	 	}
;  	 	show[i]='-';i++;
	clr *__r0
	lda 6,X
	add #<_show
	sta *__r1
	lda *__r0
	adc #>_show
	sta *__r0
	lda #45
	ldhx *__r0
	sta ,x
	tsx
	inc 6,X
	clr 7,X
	jmp L85
L82:
;  	 	for(j=0;j<2;j++){		//月日存到显示单元中
;  	 	   show[i]=(char)date[j+1]/10+0x30;i++;
	clr *__r0
	lda 7,X
	sta *__r1
	ldhx *__r0
	aix #1
	sthx *__r0
	lsl *__r1
	rol *__r0
	lda *__r1
	add #<_date
	sta *__r1
	lda *__r0
	adc #>_date
	sta *__r0
	ldhx *__r0
	lda 1,x
	tsx
	psha
	lda #10
	psha
	jsr __div8s
	ais #2
	add #48
	sta *__r1
	clr *__r2
	lda 6,X
	add #<_show
	sta *__r3
	lda *__r2
	adc #>_show
	sta *__r2
	lda *__r1
	ldhx *__r2
	sta ,x
	tsx
	inc 6,X
;  	 	   show[i]=(char)date[j+1]%10+0x30;i++;
	clr *__r0
	lda 7,X
	sta *__r1
	ldhx *__r0
	aix #1
	sthx *__r0
	lsl *__r1
	rol *__r0
	lda *__r1
	add #<_date
	sta *__r1
	lda *__r0
	adc #>_date
	sta *__r0
	ldhx *__r0
	lda 1,x
	tsx
	psha
	lda #10
	psha
	jsr __mod8s
	ais #2
	add #48
	sta *__r1
	clr *__r2
	lda 6,X
	add #<_show
	sta *__r3
	lda *__r2
	adc #>_show
	sta *__r2
	lda *__r1
	ldhx *__r2
	sta ,x
	tsx
	inc 6,X
;  	 	   if(j==0){show[i]='-';i++;}
	lda 7,X
	bne L86
	clr *__r0
	lda 6,X
	add #<_show
	sta *__r1
	lda *__r0
	adc #>_show
	sta *__r0
	lda #45
	ldhx *__r0
	sta ,x
	tsx
	inc 6,X
L86:
L83:
	inc 7,X
L85:
	lda 7,X
	cmp #2
	bhs X2
	jmp L82
X2:
;  	 	}
;  	 	show[i]='E';i++;		//换行
	clr *__r0
	lda 6,X
	add #<_show
	sta *__r1
	lda *__r0
	adc #>_show
	sta *__r0
	lda #69
	ldhx *__r0
	sta ,x
	tsx
	inc 6,X
	clr 7,X
	jmp L91
L88:
;  	 	for(j=0;j<3;j++){		//时,分,秒存到显示单元中
; 	   		show[i]=0x30+(time[j]/10);i++;
	clr *__r0
	lda 7,X
	add #<_time
	sta *__r1
	lda *__r0
	adc #>_time
	sta *__r0
	ldhx *__r0
	lda ,x
	ldx #10
	clrh
	div
	tsx
	add #48
	sta *__r1
	clr *__r2
	lda 6,X
	add #<_show
	sta *__r3
	lda *__r2
	adc #>_show
	sta *__r2
	lda *__r1
	ldhx *__r2
	sta ,x
	tsx
	inc 6,X
;    	       	show[i]=0x30+(time[j]%10);i++;
	clr *__r0
	lda 7,X
	add #<_time
	sta *__r1
	lda *__r0
	adc #>_time
	sta *__r0
	ldhx *__r0
	lda ,x
	ldx #10
	clrh
	div
	pshh
	pula
	tsx
	add #48
	sta *__r1
	clr *__r2
	lda 6,X
	add #<_show
	sta *__r3
	lda *__r2
	adc #>_show
	sta *__r2
	lda *__r1
	ldhx *__r2
	sta ,x
	tsx
	inc 6,X
;   	     	if(j==2)break;
	lda 7,X
	cmp #2
	bne L92
	bra L90
L92:
	clr *__r0
	lda 6,X
	add #<_show
	sta *__r1
	lda *__r0
	adc #>_show
	sta *__r0
	lda #58
	ldhx *__r0
	sta ,x
	tsx
	inc 6,X
L89:
	inc 7,X
L91:
	lda 7,X
	cmp #3
	bhs X3
	jmp L88
X3:
L90:
;   	    	 show[i]=':';i++;
;  	   	}
;  	   	show[i]='E';
	clr *__r0
	lda 6,X
	add #<_show
	sta *__r1
	lda *__r0
	adc #>_show
	sta *__r0
	lda #69
	ldhx *__r0
	sta ,x
; 	  	 lcdshow((unsigned char *)show);			//显示日期时间
	lda #<_show
	psha
	lda #>_show
	psha
	jsr _lcdshow
	ais #2
	tsx
; 	  	 if(istimer==0x01)lcdshow1('*',0x4C);		//闹钟开关标志
	lda *_istimer
	cmp #1
	bne L94
	lda #76
	psha
	lda #42
	psha
	jsr _lcdshow1
	ais #2
	tsx
L94:
; 	}
L72:
L71:
	ais #8
	.dbline 0 ; func end
	rts
;           data -> 0,X
_shilfL::
	ais #-1
	tsx
; }
; void shilfL(void){						//在设置状态下光标左移
; 	if(showtime==0x00){	
	lda *_showtime
	bne L97
; 		unsigned char data;
; 		LcdCtrl&=~(1<<LcdRS);    //RS、R/W=01,读指令
	bclr #0,0x2
; 		LcdCtrl|=(1<<LcdRW);    
	bset #1,0x2
; 		LcdCtrl|=(1<<LcdE);       //E=1
	bset #2,0x2
; 	  	data=LcdData;
	lda 0x1
	sta ,X
; 	  	data&=0b01111111;
	and #127
	sta ,X
; 	  	data--;	
	dec ,X
	lda ,X
	cmp #4
	beq L103
	cmp #7
	beq L103
	cmp #66
	beq L103
	cmp #69
	bne L99
L103:
; 	  	if(data==0x04||data==0x07||data==0x42||data==0x45)data--;
	dec ,X
L99:
; 	  	if(data==0x3f)data=0x09;
	lda ,X
	cmp #63
	bne L104
	lda #9
	sta ,X
L104:
; 	  	if(data==0xff)data=0x47;
	lda ,X
	cmp #-1
	bne L106
	lda #71
	sta ,X
L106:
; 	  	data|=0b10000000;		//写AC地址指令
	lda ,X
	ora #-128
	sta ,X
; 		LcdCtrl&=~(1<<LcdRS);    //RS、R/W=00,写指令
	bclr #0,0x2
; 		LcdCtrl&=~(1<<LcdRW);    
	bclr #1,0x2
; 		Lcd_Command(data);		//AC地址减1后写AC地址
	psha
	jsr _Lcd_Command
	ais #1
	tsx
; 	}	
L97:
L96:
	ais #1
	.dbline 0 ; func end
	rts
;           data -> 0,X
_shilfR::
	ais #-1
	tsx
; }
; 
; void shilfR(void){					//在设置状态下光标右移
; 	if(showtime==0x00){
	lda *_showtime
	bne L109
; 		unsigned char data;
; 		LcdCtrl&=~(1<<LcdRS);    //RS、R/W=01,读指令
	bclr #0,0x2
; 		LcdCtrl|=(1<<LcdRW);    
	bset #1,0x2
; 		LcdCtrl|=(1<<LcdE);       //E=1
	bset #2,0x2
; 	  	data=LcdData;
	lda 0x1

⌨️ 快捷键说明

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