📄 main.s
字号:
.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 + -