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

📄 shi.asm

📁 用汇编编写的在51单片机运行的程序
💻 ASM
字号:
TIMEOVER EQU 100
MENU EQU  P3.1
INCK EQU P3.2
DECK EQU P3.3
ESC EQU P3.4   ;按键号
RS EQU P3.5;确定具体硬件的连接方式
RW EQU P3.6;确定具体硬件的连接方式
E EQU P3.7 ;确定具体硬件的连接方式
SHUJU EQU P0
TIMECON DATA 2DH
POINT1 DATA 2EH
POINT DATA 2FH
SEC DATA 30H
MIN DATA 31H
HOUR DATA 32H
DAY DATA 33H
MON DATA 34H
YEAR DATA 35H
XIN DATA 36H
NO DATA 37H
RAMP EQU  38H

JINWEI BIT 00H
ERYUE BIT 01H
LEAP BIT 02H
DAYUEB BIT 03H
XIAOYUE BIT 04H
KEYTIME BIT 05H
TIMESTOP BIT 06H
TIMEUP BIT 07H
ORG 0000H
LJMP MAIN
ORG 002BH
LJMP CTC2
ORG 0030H
PROC MAIN
MAIN:
    MOV SP,#07FH
    MOV R0,#1
RAMLOOP:
    MOV @R0,#0
    INC R0
    CJNE R0,#00,RAMLOOP
    MOV TIMECON,#TIMEOVER
    MOV DAY,#05
    MOV MON,#06
    MOV YEAR,#08
    MOV XIN,#04
    MOV TH2,#0D8H
    MOV TL2,#0F0H
    MOV RCAP2H,#0D8H
    MOV RCAP2L,#0F0H
    MOV T2CON,#04H
    SETB  ET2
    SETB  EA
    MOV  SHUJU,#01H     ;清屏并光标复位
    LCALL ENABLE       ;调用写入命令子程序
    MOV SHUJU,#38H     ;设置显示模式:8位2行5x7点阵
    LCALL ENABLE       ;调用写入命令子程序
    MOV SHUJU,#0CH     ;显示器开、光标关、光标不闪烁
    LCALL ENABLE       ;调用写入命令子程序
    MOV SHUJU,#06H     ;文字不动,光标自动右移
    LCALL ENABLE       ;调用写入命令子程序
    MOV SHUJU,#80H;写入显示起始地址(第1行第一个位置)
    LCALL ENABLE;调用写入命令子程序
    MOV DPTR,#TAB
    MOV R1,#16
    MOV R0,#16
    WWW1:
    MOV A,R1
    LCALL WWRITE
    INC R1
    DJNZ R0,WWW1
    MOV SHUJU,#0C0H;写入显示起始地址
    LCALL ENABLE;调用写入命令子程序
   MOV R0,#16
   MOV R1,#32
   WWW2:
   MOV A,R1
   LCALL WWRITE
   INC R1
   DJNZ R0,WWW2
LOOP:
    JB KEYTIME,KEY1
    JB TIMEUP,TIME1
    JMP LOOP

KEY1:
LCALL KEY
JMP LOOP
TIME1:
CLR TIMEUP
LCALL TIME
JMP LOOP

TAB:DB"0123456789      "
    DB"2008_06_05 4 ^_^"
    DB"00:00:00        "
    DB"NO.00 00:00 Save"

END
;**************************************************************************


PROC TIME
TIME:
     INC   SEC
     MOV A,SEC
     CJNE A,#60,N1
     N1:
     JC   SECOUT
     MOV SEC,#0
     INC MIN
     SETB JINWEI
     SECOUT:
     MOV A,POINT
     JNZ  PP1
     MOV A,SEC
     MOV B,#10
     DIV AB
     MOV SHUJU,#0C6H;写入显示起始地址
     LCALL ENABLE;调用写入命令子程序
     LCALL WWRITE
     MOV SHUJU,#0C7H
     LCALL ENABLE
     MOV A,B
     LCALL WWRITE
     PP1:
     JB JINWEI,MININ
     RET
MININ:
     CLR JINWEI
     MOV A,MIN
     CJNE A,#60,N2
N2:
     JC MINOUT
     MOV  MIN,#0
     INC  HOUR
     SETB JINWEI
MINOUT:
     MOV A,POINT
     JNZ  PP2
     MOV A,MIN
     MOV B,#10
     DIV AB
     MOV SHUJU,#0C3H
     LCALL ENABLE
     LCALL WWRITE
     MOV SHUJU,#0C4H
     LCALL ENABLE
     MOV A,B
     LCALL WWRITE
     PP2:
     JB JINWEI,HOURIN
     RET
HOURIN:
     CLR JINWEI
     MOV  A,HOUR
     CJNE A,#24,N3
N3:
     JC   HOUROUT
     MOV  HOUR,#0
     INC  XIN
     SETB JINWEI
HOUROUT:
     MOV A,POINT
     JNZ  PP3
     MOV A,HOUR
     MOV B,#10
     DIV AB
     MOV SHUJU,#0C0H
     LCALL ENABLE
     LCALL WWRITE
     MOV SHUJU,#0C1H
     LCALL ENABLE
     MOV A,B
     LCALL WWRITE
     PP3:
     JB JINWEI,XININ
     RET
XININ:
     CLR JINWEI
     MOV  A,XIN
     CJNE A,#7,N4
N4:
     JC   XINOUT
     MOV  XIN,#0
XINOUT:

     INC  DAY
     MOV A,POINT
     JNZ  DAYINC
     MOV A,XIN
     MOV SHUJU,#8BH;写入显示起始地址
     LCALL ENABLE;调用写入命令子程序
     LCALL WWRITE
DAYINC:
     MOV A, MON
     CJNE A,#8,QQ1
     QQ1:
     JC  QQ2
     RRC A
     JNC DAYUE
     JMP QQ3
     QQ2:
     MOV A,MON
     RRC A
     JC DAYUE       ;大月
     QQ3:
     MOV A,MON
     CJNE A,#2,QITA ;不是二月份
     MOV A,YEAR
     RR A
     RRC A
     JC NOTLEAP       ;不被4整除的100年内不是闰年
     SETB LEAP
     MOV A,DAY
     CJNE A,#29,N6    ;闰年的二月份只有28天
     N6:
     JC DISP
     MOV DAY,#01H
     INC MON
     SETB JINWEI
     LJMP DISP
NOTLEAP:
     CLR LEAP
     MOV A,DAY
     CJNE A,#30,N7
     N7:
     JC DISP
     MOV DAY,#01
     INC MON
     SETB JINWEI
     LJMP DISP
QITA:
   SETB XIAOYUE
   CLR DAYUEB
   MOV A,DAY
   CJNE A,#31,N8
   N8:
   JC DISP
   MOV DAY,#01
   INC MON
   SETB JINWEI
   LJMP DISP
DAYUE:
   SETB DAYUEB
   CLR XIAOYUE
   MOV A,DAY
   CJNE A,#32,N9
   N9:
   JC DISP
   MOV DAY,#01
   INC MON
   SETB JINWEI
DISP:
   MOV A,POINT
   JNZ  PP4
   MOV A,DAY
   MOV B,#10
   DIV AB
   MOV SHUJU,#88H
   LCALL ENABLE
   LCALL WWRITE
   MOV SHUJU,#89H
   LCALL ENABLE
   MOV A,B
   LCALL WWRITE
   PP4:
   JB JINWEI,MONIN
   RET
MONIN:
  CLR JINWEI
  MOV A,MON
  CJNE A,#13,N10
  N10:
  JC MONOUT
  MOV MON,#0
  INC YEAR
  SETB JINWEI
MONOUT:
  MOV A,POINT
  JNZ  PP5
  MOV A,MON
  MOV B,#10
  DIV AB
  MOV SHUJU,#85H
     LCALL ENABLE
     LCALL WWRITE
     MOV SHUJU,#86H
     LCALL ENABLE
     MOV A,B
     LCALL WWRITE
     PP5:
     JB JINWEI,YAERIN
    RET
YAERIN:
    CLR JINWEI
    MOV A,POINT
    JNZ OUT
    MOV A,YEAR
    MOV B,#10
    DIV AB
    MOV SHUJU,#82H
     LCALL ENABLE
     LCALL WWRITE
     MOV SHUJU,#83H
     LCALL ENABLE
     MOV A,B
     LCALL WWRITE
OUT:
    RET
END  ;今晚写到这里先,有空再写~~~~~~~~~~~~~~ ^_^
;************************************************************

;********************************************************

;***********************************************************
PROC KEY
KEY:
CLR KEYTIME
;**************************去抖处理************
JNB MENU,MENUK
JNB INCK,INCP
JNB DECK,DECP
JNB ESC,ESCP
RET
INCP:
LJMP INCC
DECP:
LCALL DECC
RET
ESCP:
LJMP ESCK
MENUK:
HERE:
JNB MENU,HERE
INC POINT      ;菜单指针
MOV A,POINT
CJNE A,#12,N2
N2:
JC N3
MOV POINT,#8
MOV SHUJU,#0C4H
LCALL ENABLE
INC POINT1
RET
N3:
MOV A,POINT
CJNE A,#01,N4     ;定义01为改变秒,02为改变分,03为改变时,04为改变日,05改变月,06改变年
                   ;07为改变星期,08为设闹钟的NO. 09为闹时,10为闹分

MOV SHUJU,#0C7H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N4:
CJNE A,#02,N5
MOV SHUJU,#0C4H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N5:
CJNE A,#03H,N6
MOV SHUJU,#0C1H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N6:
CJNE A,#04H,N7
MOV SHUJU,#89H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N7:
CJNE A,#05,N8
MOV SHUJU,#086H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N8:
CJNE A,#06,N9
MOV SHUJU,#083H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N9:
CJNE A,#07H,N10
MOV SHUJU,#08BH
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
;*********************************************************
N10:
CJNE A,#08,N11
MOV SHUJU,#0C0H
LCALL ENABLE

MOV R1,#48
MOV R0,#16
N12:
MOV A,R1
LCALL WWRITE
INC R1
DJNZ R0,N12
MOV SHUJU,#0C4H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N11:
CJNE A,#09,N13
MOV SHUJU,#0C7H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N13:
CJNE A,#10,N14
MOV SHUJU,#0CAH
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
N14:
CJNE A,#11,N15
MOV SHUJU,#0CDH
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
N15:
RET
;******************************************************
INCC:
MOV A,POINT
JZ OUTINC
CJNE A,#01,Q1
INCB:
JNB INCK,INCB
SETB TIMESTOP
INC SEC
MOV A,SEC
CJNE A,#60,NS1
NS1:
JC NS2
MOV SEC,#0
NS2:
   MOV A,SEC
   MOV B,#10
   DIV AB
   MOV SHUJU,#0C6H
   LCALL ENABLE

   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#0C7H
   LCALL ENABLE
   LCALL WWRITE
OUTINC:
RET
Q1:
CJNE A,#02,Q2
INCM:
JNB INCK,INCM
SETB TIMESTOP
INC MIN
MOV A,MIN
CJNE A,#60,NM1
NM1:
JC NM2
MOV MIN,#0
NM2:
  MOV A,MIN
   MOV B,#10
   DIV AB
   MOV SHUJU,#0C3H
   LCALL ENABLE

   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#0C4H
   LCALL ENABLE
   LCALL WWRITE
RET
Q2:
CJNE A,#03H,Q3
INCH:
JNB INCK,INCH
SETB TIMESTOP
INC HOUR
MOV A,HOUR
CJNE A,#24,NH1
NH1:
JC NH2
MOV HOUR,#0
NH2:
   MOV A,HOUR
   MOV B,#10
   DIV AB
   MOV SHUJU,#0C0H
   LCALL ENABLE

   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#0C1H
   LCALL ENABLE
   LCALL WWRITE
RET
Q3:
CJNE A,#04,Q4
INCD:
JNB INCK,INCD
INC DAY
MOV A,DAY
JB DAYUEB,DD
JB XIAOYUE,XX
JB LEAP,YY
CJNE A,#30,ND1
ND1:
JC ND2
MOV DAY,#0
JMP ND2
DD:
CJNE A,#32,NDD1
NDD1:
JC ND2
MOV DAY,#0
JMP ND2
XX:
CJNE A,#31H,XD
XD:
JC ND2
MOV DAY,#0
JMP ND2
YY:
CJNE A,#29,YD
YD:
JC ND2
MOV DAY,#0
ND2:
   MOV A,DAY
   MOV B,#10
   DIV AB
   MOV SHUJU,#88H
   LCALL ENABLE

   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#89H
   LCALL ENABLE
   LCALL WWRITE
RET
Q4:
CJNE A,#05,Q5
INCMON:
JNB INCK,INCMON
INC MON
MOV A,MON
CJNE A,#13,M1
M1:
JC M2
MOV MON,#0
M2:
   MOV A,MON
   MOV B,#10
   DIV AB
   MOV SHUJU,#85H
   LCALL ENABLE
   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#86H
   LCALL ENABLE
   LCALL WWRITE

RET
Q5:
CJNE A,#06,Q6
INCY:
   JNB INCK,INCY
   INC YEAR
   MOV A,YEAR
   MOV B,#10
   DIV AB
   MOV SHUJU,#82H
   LCALL ENABLE

   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#83H
   LCALL ENABLE
   LCALL WWRITE
RET
Q6:
CJNE A,#07,Q7
INCX:
JNB INCK,INCX
INC XIN
MOV A,XIN
CJNE A,#8,X1
X1:
JC OUTX
MOV XIN,#1
OUTX:
   MOV A,XIN
   MOV SHUJU,#8BH
   LCALL ENABLE
   LCALL WWRITE
   RET
Q7:
CJNE A,#8,Q8
INCN:
JNB INCK,INCN
INC NO
MOV A,NO
CJNE A,#33,TT
TT:
JC TT1
MOV NO,#0
TT1:
MOV SHUJU,#0C3H
LCALL ENABLE
MOV A,NO
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C4H
LCALL ENABLE
LCALL WWRITE
RET
Q8:
CJNE A,#9,Q9
INCL:
JNB INCK,INCL
MOV R0,#RAMP
MOV A,@R0
INC A
CJNE A,#24,TT2
TT2:
JC  TT3
MOV A,#0
TT3:
MOV SHUJU,#0C6H
LCALL ENABLE
MOV @R0,A
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C7H
LCALL ENABLE
LCALL WWRITE
Q9:
CJNE A,#10,Q10
INCV:
JNB INCK,INCV
MOV R0,#(RAMP+1)
MOV A,@R0
INC A
CJNE A,#60,TT4
TT4:
JC  TT5
MOV A,#0
TT5:
MOV SHUJU,#0C9H
LCALL ENABLE
MOV @R0,A
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0CAH
LCALL ENABLE
LCALL WWRITE
RET
Q10:
CJNE A,#11,Q11
Q11:                ;*************第二次暂停^_^ *******************
RET
;***************************************************************************
;****************************************************************************
ESCK:
NOP
CLR TIMESTOP
MOV POINT,#0
MOV POINT1,#0
MOV SHUJU,#0CH
LCALL ENABLE
   MOV SHUJU,#0C0H;写入显示起始地址
   LCALL ENABLE;调用写入命令子程序
   MOV R0,#16
   MOV R1,#32
   WWW2:
   MOV A,R1
   LCALL WWRITE
   INC R1
   DJNZ R0,WWW2
   MOV A,SEC
     MOV B,#10
     DIV AB
     MOV SHUJU,#0C6H;写入显示起始地址
     LCALL ENABLE;调用写入命令子程序
     LCALL WWRITE
     MOV SHUJU,#0C7H
     LCALL ENABLE
     MOV A,B
     LCALL WWRITE
     MOV A,MIN
     MOV B,#10
     DIV AB
     MOV SHUJU,#0C3H
     LCALL ENABLE
     LCALL WWRITE
     MOV SHUJU,#0C4H
     LCALL ENABLE
     MOV A,B
     LCALL WWRITE
     MOV A,HOUR
     MOV B,#10
     DIV AB
     MOV SHUJU,#0C0H
     LCALL ENABLE
     LCALL WWRITE
     MOV SHUJU,#0C1H
     LCALL ENABLE
     MOV A,B
     LCALL WWRITE
RET
END
;************************************************************
PROC DECC
DECC:
MOV A,POINT
JZ OUTINCD
CJNE A,#01,QD1
INCDB:
JNB DECK,INCDB
SETB TIMESTOP
DEC SEC
MOV A,SEC
CJNE A,#255,NSD2
MOV SEC,#59
NSD2:
   MOV A,SEC
   MOV B,#10
   DIV AB
   MOV SHUJU,#0C6H
   LCALL ENABLE

   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#0C7H
   LCALL ENABLE
   LCALL WWRITE
OUTINCD:
RET
QD1:
CJNE A,#02,QD2
INCMD:
JNB DECK,INCMD
SETB TIMESTOP
DEC MIN
MOV A,MIN
CJNE A,#255,NMD2
MOV MIN,#59
NMD2:
   MOV A,MIN
   MOV B,#10
   DIV AB
   MOV SHUJU,#0C3H
   LCALL ENABLE

   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#0C4H
   LCALL ENABLE
   LCALL WWRITE
RET
QD2:
CJNE A,#03H,QD3
INCHD:
JNB DECK,INCHD
SETB TIMESTOP
DEC HOUR
MOV A,HOUR
CJNE A,#255,NHD2
MOV HOUR,#23
NHD2:
   MOV A,HOUR
   MOV B,#10
   DIV AB
   MOV SHUJU,#0C0H
   LCALL ENABLE

   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#0C1H
   LCALL ENABLE
   LCALL WWRITE
RET
QD3:
CJNE A,#04,QD4
INCDD:
JNB DECK,INCDD
DEC DAY
MOV A,DAY
CJNE A,#255,NDD2
MOV DAY,#31
NDD2:
   MOV A,DAY
   MOV B,#10
   DIV AB
   MOV SHUJU,#88H
   LCALL ENABLE

   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#89H
   LCALL ENABLE
   LCALL WWRITE
RET
QD4:
CJNE A,#05,QD5
INCMOND:
JNB DECK,INCMOND
DEC MON
MOV A,MON
CJNE A,#255,MD2
MOV MON,#12
MD2:
   MOV A,MON
   MOV B,#10
   DIV AB
   MOV SHUJU,#85H
   LCALL ENABLE
   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#86H
   LCALL ENABLE
   LCALL WWRITE
RET
QD5:
CJNE A,#06,QD6
INCYD:
JNB DECK,INCYD
DEC YEAR
   MOV A,YEAR
   MOV B,#10
   DIV AB
   MOV SHUJU,#82H
   LCALL ENABLE
   LCALL WWRITE
   MOV A,B
   MOV SHUJU,#83H
   LCALL ENABLE
   LCALL WWRITE
RET
QD6:
CJNE A,#07,QD7
INCXD:
JNB DECK,INCXD
DEC XIN
MOV A,XIN
CJNE A,#0,OUTXD
MOV XIN,#7
OUTXD:
   MOV A,XIN
   MOV SHUJU,#8BH
   LCALL ENABLE
   LCALL WWRITE
QD7:
CJNE A,#08,QD8
INCND:
JNB DECK,INCND
DEC NO
MOV A,NO
CJNE A,#0,TTD
MOV NO,#1
TTD:
MOV SHUJU,#0C3H
LCALL ENABLE
MOV A,NO
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C4H
LCALL ENABLE
LCALL WWRITE
RET
QD8:
CJNE A,#09,QD9
INCLD:
JNB DECK,INCLD
MOV R0,#RAMP
MOV A,@R0
DEC A
CJNE A,#255,TTD3
MOV A,#23
TTD3:
MOV SHUJU,#0C6H
LCALL ENABLE
MOV @R0,A
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C7H
LCALL ENABLE
LCALL WWRITE
RET
QD9:
CJNE A,#10,QD10
INCVD:
JNB DECK,INCVD
MOV R0,#(RAMP+1)
MOV A,@R0
DEC A
CJNE A,#255,TTD4
MOV A,#59
TTD4:
MOV SHUJU,#0C9H
LCALL ENABLE
MOV @R0,A
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0CAH
LCALL ENABLE
LCALL WWRITE
RET
QD10:
NOP
RET
END
;*****************************************************************

;*********************************************************显示
PROC WWRITE
WWRITE:
MOVC A,@A+DPTR
MOV SHUJU,A
SETB RS
CLR RW;RW=0;准备写入数据
CLR E;E=0;执行显示命令
LCALL DELAY;判断液晶模块是否忙?
SETB E
RET
END
;******************
PROC ENABLE
ENABLE:
CLR RS;写入控制命令的子程序
CLR RW
CLR E
ACALL DELAY
SETB E
RET
END
PROC DELAY
DELAY:
MOV SHUJU,#0FFH;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P0.7,DELAY;如果P0.7为高电平表示忙就循环等待
RET
END
PROC CTC2
CTC2:
    PUSH PSW
    PUSH ACC
    SETB KEYTIME
    JB TIMESTOP,EXIT
    DJNZ TIMECON,EXIT
    SETB TIMEUP
    MOV TIMECON,#TIMEOVER
EXIT:
    POP  ACC
    POP  PSW
    CLR   TF2
    RETI
END

⌨️ 快捷键说明

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