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