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

📄 main.s

📁 摩托罗拉的时钟的原代码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module main.c
	.area lit
L2:
	.byte 49,46,32,'S,'e,'t,32,'T,'i,'m,'e,0
L3:
	.byte 50,46,32,'S,'e,'t,32,'A,'l,'a,'r,'m,0
L4:
	.byte 49,46,32,'O,'p,'e,'n,32,'A,'l,'a,'r,'m,0
L5:
	.byte 50,46,32,'C,'l,'o,'s,'e,32,'A,'l,'a,'r,'m,0
	.area text
;           str2 -> 0,X
;           str1 -> 13,X
;              y -> 25,X
;              i -> 26,X
;              x -> 27,X
;              j -> 28,X
;           str4 -> 29,X
;           str3 -> 44,X
;              t -> 58,X
;       Keyvalue -> 59,X
_main::
	ais #-60
	tsx
; /*-----------------------------------------------------*
; *工 程 名:clock	                                
; *硬件连接:                                
; *程序描述:                             
; */
; /*[头文件]*/
; #include "GP32C.h"               //映像寄存器地址头文件
; #include "KB.h"                  //键盘中断头文件    
; #define  Light_P     PTA         //蜂鸣器接在PTA口
; #define  Light_D     DDRA        //相应的方向寄存器
; #define  Light_Pin   1           //蜂鸣器所在的引脚
; /*[函数声明]*/
;    //在LCD第m行第n列显示一个字符
; extern void LcdshowCharacter(unsigned char str,unsigned char m,unsigned char n); 
; extern void Lcd_Command(unsigned char cmd);    //命令执行子程序
; extern void Lcdshow(unsigned char temp[]) ;    //显示时间
; extern void Timer1init(void);      //定时器1初始化
; extern void LcdInit(void);         //Lcd初始化子程序
; extern void LcdShowCursor(unsigned char m,unsigned char n);    //显示光标在第m行,第n列
;    //显示大小为n字符数组在第m行
; extern void LcdShowString(unsigned char str[],unsigned char n,unsigned char m);
; extern void Delay(void);    //延时
;    //将输入的键值传送到相应位置的位
; extern void Transmission(unsigned char Keyvalue,unsigned char temp[],unsigned char m,unsigned char n);
; extern unsigned char Discriminant(unsigned char key);       //判断按下的键是否数字键
; extern void Changetime(int temp1[],unsigned char temp2[]);  //将数组temp1拆分存储到数组temp2
; extern void Change(void);     //将数组time组合存储到数组Tdate
; extern void Change2(void);    //将数组alarm组合存储到数组Tdate2
; extern void Controle(void);   //控制时钟的日期时间合法
; extern void Controle2(void);  //控制闹钟的日期时间合法
; /*全局变量声明*/
; unsigned char time[14];       //存放时钟年、月、日、时、分、秒
; int Tdate[3];                 //存放时钟年、月、日
; unsigned char Ttime[3];       //存放时钟时、分、秒
; unsigned char alarm[14];      //存放闹钟的年、月、日、时、分、秒
; int Tdate2[3];                //存放闹钟年、月、日
; unsigned char Ttime2[3];      //存放闹钟时、分、秒
; unsigned char Key;            //存放按下键的定义值
; unsigned char k;              //光标向右移动的次数
; unsigned char l;              //光标向下移动的次数
; unsigned char o;              //闹钟功能标志位,等于1时开,等于0时关
; /*[主函数]*/
; void main()
;   {
;      unsigned char i; 
; 	 unsigned char j;
; 	 unsigned char Keyvalue;
; 	 unsigned char x;
; 	 unsigned char y;
; 	 unsigned char t;
; 	 unsigned char str1[12]="1. Set Time";
	aix #13
	sthx *__r0
	tsx
	lda #12
	psha
	clra
	psha
	lda #<L2
	psha
	lda #>L2
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __asgnblk
	ais #6
; 	 unsigned char str2[13]="2. Set Alarm";
	sthx *__r0
	lda #13
	psha
	clra
	psha
	lda #<L3
	psha
	lda #>L3
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __asgnblk
	ais #6
; 	 unsigned char str3[14]="1. Open Alarm";
	aix #44
	sthx *__r0
	tsx
	lda #14
	psha
	clra
	psha
	lda #<L4
	psha
	lda #>L4
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __asgnblk
	ais #6
; 	 unsigned char str4[15]="2. Close Alarm";
	aix #29
	sthx *__r0
	lda #15
	psha
	clra
	psha
	lda #<L5
	psha
	lda #>L5
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __asgnblk
	ais #6
;  	 asm("SEI");                //关总中断
	SEI
;  	   //[I/O初始化]
;      Light_D|=1<<Light_Pin;     //令蜂鸣器引脚为输出
	bset #1,0x4
;      Light_P|=1<<Light_Pin;     //初始时,蜂鸣器"停"
	bset #1,0
;  	 Timer1init();              //调定时器1初始化子程序       
	jsr _Timer1init
;  	 KB_Init();
	jsr _KB_Init
;      INTKBSCR&= ~(1<<IntBit);   //开放键盘中断(IMASKk=1)
	bclr #1,0x1a
; 	 asm("CLI");                //开总中断
	CLI
; 	 
; 	  //赋初时钟始值2007年6月1日12点0分0秒;闹钟初始值2007年6月1日0时0分0秒
; 	 Tdate[0]=2007;Tdate[1]=6;Tdate[2]=1;Ttime[0]=12;Ttime[1]=0;Ttime[2]=0;
	mov #7,*_Tdate
	mov #-41,*_Tdate+1
	mov #0,*_Tdate+2
	mov #6,*_Tdate+2+1
	mov #0,*_Tdate+4
	mov #1,*_Tdate+4+1
	lda #12
	sta *_Ttime
	clr *_Ttime+1
	clr *_Ttime+2
; 	 Tdate2[0]=2007;Tdate2[1]=6;Tdate2[2]=1; Ttime2[0]=0;Ttime2[1]=0;Ttime2[2]=0;
	mov #7,*_Tdate2
	mov #-41,*_Tdate2+1
	mov #0,*_Tdate2+2
	mov #6,*_Tdate2+2+1
	mov #0,*_Tdate2+4
	mov #1,*_Tdate2+4+1
	clr *_Ttime2
	clr *_Ttime2+1
	clr *_Ttime2+2
; 	 Changetime((int *)Tdate,(unsigned char *)Ttime); 
	lda #<_Ttime
	psha
	lda #>_Ttime
	psha
	lda #<_Tdate
	psha
	lda #>_Tdate
	psha
	jsr _Changetime
	ais #4
	tsx
; 	 o=0;      //初始时关闹钟
	clr *_o
; 	 i=Ttime[2];y=time[9];
	lda *_Ttime+2
	sta 26,X
	lda *_time+9
	sta 25,X
	jmp L18
L17:
; 	
; 	 
; BEGING:	 
; 	 while(1)
; 	{ 
; 	  j=Ttime[2];
	lda *_Ttime+2
	sta 28,X
; 	  if (i!=j)            //秒增1          
	lda 26,X
	cmp 28,X
	beq L21
; 	     { 
; 	       Lcdshow((unsigned char *)time);       //显示日期时间
	lda #<_time
	psha
	lda #>_time
	psha
	jsr _Lcdshow
	ais #2
	tsx
; 	       if(o==1) LcdshowCharacter('A',1,1);  //左上角字符A标志开闹钟功能
	lda *_o
	cmp #1
	bne L23
	lda #1
	psha
	psha
	lda #65
	psha
	jsr _LcdshowCharacter
	ais #3
	tsx
L23:
; 	       if(o==0) LcdshowCharacter(' ',1,1);  //关闹钟功能时消去左上角字符A   
	lda *_o
	bne L25
	lda #1
	psha
	psha
	lda #32
	psha
	jsr _LcdshowCharacter
	ais #3
	tsx
L25:
; 	       i=j;
	lda 28,X
	sta 26,X
; 	     }
L21:
; 	  x=time[9];
	lda *_time+9
	sta 27,X
; 	  if(y!=x)                 //整点报时
	lda 25,X
	cmp 27,X
	beq L28
; 	     {  for(t=0;t<3;t++)   //报时三响
	clr 58,X
	bra L33
L30:
	bset #1,0
	jsr _Delay
	bclr #1,0
	jsr _Delay
	tsx
L31:
	inc 58,X
L33:
	lda 58,X
	cmp #3
	blo L30
; 	         { Light_P|=1<<Light_Pin;    //蜂鸣器“鸣”
;                Delay();   //延时      
; 	           Light_P&=~(1<<Light_Pin); //蜂鸣器“停”
;                Delay();   //延时
; 	         }
; 	       y=x;  
	lda 27,X
	sta 25,X
; 	     } 
L28:
; 	  if(Tdate[0]==Tdate2[0]&&Tdate[1]==Tdate2[1]&&Tdate[2]==Tdate2[2]&&    //闹钟预设时间响
	ldhx *_Tdate
	cphx *_Tdate2
	tsx
	bne L34
	ldhx *_Tdate+2
	cphx *_Tdate2+2
	tsx
	bne L34
	ldhx *_Tdate+4
	cphx *_Tdate2+4
	tsx
	bne L34
	lda *_Ttime
	cmp *_Ttime2
	bne L34
	lda *_Ttime+1
	cmp *_Ttime2+1
	bne L34
	lda *_Ttime+2
	cmp *_Ttime2+2
	bne L34
; 	       Ttime[0]==Ttime2[0]&&Ttime[1]==Ttime2[1]&&Ttime[2]==Ttime2[2])
; 	     {  for(t=0;t<15;t++)             //闹钟
	clr 58,X
	bra L47
L44:
	bset #1,0
	jsr _Delay
	bclr #1,0
	jsr _Delay
	tsx
L45:
	inc 58,X
L47:
	lda 58,X
	cmp #15
	blo L44
; 	         { Light_P|=1<<Light_Pin;    //蜂鸣器“鸣”
;                Delay();   //延时      
; 	           Light_P&=~(1<<Light_Pin); //蜂鸣器“停”
;                Delay();   //延时
; 	         }
; 	     }
L34:
; 	  if(Key=='A')   //弹出菜单
	lda *_Key
	cmp #65
	beq X4
	jmp L48
X4:
; 	     { 
L50:
; MENU:	   LcdShowString((unsigned char *)str1,11,1);   //显示菜单:1. Set Time;
	lda #1
	psha
	lda #11
	psha
	aix #13
	pshx
	pshh
	jsr _LcdShowString
	ais #4
	tsx
;            LcdShowString((unsigned char *)str2,12,2);   //         2. Set Alarm
	lda #2
	psha
	lda #12
	psha
	pshx
	pshh
	jsr _LcdShowString
	ais #4
	tsx
; 	       Key=0;
	clr *_Key
	jmp L52
L51:
; 	       while(1)
; 	       { if(Key=='B')     //返回
	lda *_Key
	cmp #66
	bne L54
;                { Key=0;
	clr *_Key
;                  goto BEGING;
	jmp L18
L54:
;                }
; 	         if(Key=='1')    //选择子菜单1
	lda *_Key
	cmp #49
	beq X5
	jmp L56
X5:
; 	           { Lcdshow((unsigned char *)time);
	lda #<_time
	psha
	lda #>_time
	psha
	jsr _Lcdshow
	ais #2
; 	             LcdShowCursor(1,4);     //光标初始位置(1,4),第一行第四列
	lda #4
	psha
	lda #1
	psha
	jsr _LcdShowCursor
	ais #2
	tsx
; 	             k=1;l=1;
	lda #1
	sta *_k
	lda #1
	sta *_l
; 	             Key=0;
	clr *_Key
	jmp L59
L58:
; 	             while(1)
; 	              { if(Key=='#')         //光标右移
	lda *_Key
	cmp #35
	bne L61
; 	                 { ++k;
	inc *_k
; 	                   if(l%2==0)        //现在光标在第一行
	lda *_l
	ldx #2
	clrh
	div
	pshh
	pula
	tsx
	tsta
	bne L63
	lda *_k
	cmp #4
	beq L67
	lda *_k
	cmp #7
	bne L65
L67:
; 	                    { if(k==4||k==7) ++k;
	inc *_k
L65:
; 	                      if(k>9) k=0;   //现在光标在末端
	lda *_k
	cmp #9
	bls L68
	clr *_k
L68:
; 	                      LcdShowCursor((1+l),(4+k));
	lda *_k
	add #4
	psha
	lda *_l
	add #1
	psha
	jsr _LcdShowCursor
	ais #2
	tsx
; 	                     }
	bra L64
L63:
	lda *_k
	cmp #3
	beq L72
	lda *_k
	cmp #6
	bne L70
L72:
; 	                   else              //现在光标在第二行
; 	                    { if(k==3||k==6) ++k;
	inc *_k

⌨️ 快捷键说明

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