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

📄 clock.asm

📁 51单片机汇编语言程序,是先时钟的时间设置 定时闹铃等功能
💻 ASM
字号:
RS EQU P3.7 
RW EQU P3.6 
E EQU P3.5
RAM EQU 30H
RAM2 EQU 34H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP JSQZD;计数器中断
;****************主程序*********************
MAIN:MOV P2,#0FFH
     MOV 31H,#24
     MOV RAM,#0;设置时间移位缓存
     MOV RAM2,#0;设置报警移位缓存
     MOV R0,#0;寄存
     MOV R1,#0;计数器累加
     MOV R2,#0;秒
     MOV R3,#0;分
     MOV R4,#0;时
     MOV R5,#11;报警时间秒
     MOV R6,#0;报警时间分
     MOV R7,#0;报警时间时
     MOV TMOD,#01H
     SETB EA
     SETB ET0
     MOV TH0,#46H;定时初值
     MOV TL0,#0CH
     SETB TR0
MOV P1,#01H ;清除屏幕
ACALL ENABLE 
MOV P1,#38H ;8位点阵
ACALL ENABLE 
MOV P1,#0CH ;开显示
ACALL ENABLE 
MOV P1,#04H ;移动光标
ACALL ENABLE 
;*************时钟显示程序******************
XS:LCALL DISPLAY;显示时间
   MOV A,P0;判断设置时间键是否按下
   ANL A,#40H;
   LP1:JNB P0.6,NX1;等待键打开
   CLR TR0;关定时中断
   AJMP LP1;等待
    NX1:CJNE A,#40H,QQ;无键按下
    INC RAM;有键按下,缓存加1
   LJMP SJSZ;时间设置子程序
  QQ:MOV A,P0;判断设置警报键是否按下
   ANL A,#20H
    LP2:JNB P0.5,NX2
   AJMP LP2
   NX2:CJNE A,#20H,AA;无键按下
   INC RAM2;有键按下,缓存加1
   LJMP BJSZ;报警设置子程序
   AA:MOV A,P0;关警报判断
   ANL A,#10H
    LP3:JNB P0.4,NX3
   AJMP LP3
   NX3:CJNE A,#10H,NX4;无键按下
   MOV P2,#0FFH;有键按下,关警报
  NX4:MOV A,R4;比较是否达到定时时间
   MOV 27H,R7
    CJNE A,27H,XS
     MOV A,R3
    MOV 26H,R6
    CJNE A,26H,XS
    MOV A,R2 
    MOV 25H,R5 
    CJNE A,25H,XS
    MOV P2,#00H;达到设置时间,置P2口为0
   AJMP XS;循环显示
;***************时间输出子程序***********************
DISPLAY:MOV P0,#0
MOV P1,#0CBH ;显示位置 
       ACALL ENABLE
MOV DPTR,#TABLE
MOV B,#10   ;秒显示
MOV A,R2
CJNE A,#60,X1
MOV R2,#0
MOV A,R2
INC R3
X1:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV P1,#3AH
ACALL WRITE
MOV B,#10
MOV A,R3    ;分显示
CJNE A,#60,X2
MOV R3,#0
MOV A,R3
INC R4
X2:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV P1,#3AH
ACALL WRITE
MOV B,#10   ;时显示
MOV A,#01H ;时制选择
ANL A,P0
CJNE A,#01H,XX;24时制
MOV 31H,#12;12时制
MOV A,R4
SUBB A,#12;24转12进制
JC XX1
MOV R4,A
AJMP XX1  
      XX:
      MOV 31H,#24
     XX1: MOV A,R4      
      CJNE A,31H,X3
      MOV R4,#0
     MOV A,R4
X3:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
RET
;*************时间设置子程序**************
SJSZ:MOV A,RAM;时间设置
     CJNE A,#4,N1;判断是否返回
     MOV RAM,#0;返回显示
     MOV P1,#80H;清显示提示
     ACALL ENABLE
     MOV P1,#20H
     ACALL WRITE
     SETB TR0;开计数器中断
     LJMP XS
     N1:
     CJNE A,#1,XGM;跳转分设置
   XGS:  MOV P1,#80H;秒设置
       LCALL ENABLE;显示提示
       MOV P1,#53H
       LCALL WRITE
     LCALL PD1;判断按键
     INC R2
     AJMP XGS
   XGM:MOV A,RAM;分设置
      CJNE A,#2,XGH;跳转时设置
      MOV P1,#80H
       LCALL ENABLE
       MOV P1,#4DH
       LCALL WRITE
     LCALL PD1;判断按键
     INC R3
     AJMP XGM
   XGH:MOV P1,#80H;时设置
       LCALL ENABLE
       MOV P1,#48H
       LCALL WRITE
     LCALL PD1
     INC R4
     AJMP XGH
     RET
;************判断按键子程序1*********************
  PD1:MOV A,P0;判断按键
     ANL A,#40H
     LP6:JNB P0.6,NX6;判断键是否打开
     AJMP LP6
 NX6:CJNE A,#40H,NN3;没有按下
     INC RAM;按下
     LJMP SJSZ;返回
     NN3:ACALL DISPLAY
     MOV A,#80H
     ANL A,P0
     CJNE A,#80H,PD1;判断是否改变时间
     RET
;************输出警报时间子程序****************  
DISPLAY2:MOV P0,#0;设置报警时间显示
MOV P1,#0CBH ;显示位置 
       ACALL ENABLE
MOV DPTR,#TABLE
MOV B,#10   ;秒显示
MOV A,R5
CJNE A,#60,Y1
MOV R5,#0
MOV A,R5
INC R6
Y1:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV P1,#3AH
ACALL WRITE
MOV B,#10
MOV A,R6    ;分显示
CJNE A,#60,Y2
MOV R6,#0
MOV A,R6
INC R7
Y2:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV P1,#3AH
ACALL WRITE
MOV B,#10   ;时显示
MOV A,#01H ;时制选择
ANL A,P0
CJNE A,#01H,yy;24时制
MOV 31H,#12;12时制
MOV A,R7
SUBB A,#12;24转12进制
JC yy1
MOV R7,A
AJMP yy1  
      yy:
      MOV 31H,#24
     yy1: MOV A,R7      
      CJNE A,31H,Y3
      MOV R7,#0
     MOV A,R7
Y3:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE 
MOV A,R2;当前时间保护
CJNE A,#60,c1
MOV R2,#0
INC R3
c1:MOV A,R3
CJNE A,#60,c2
MOV R3,#0
INC R4
c2:
RET
;****************报警时间设置子程序*******************
BJSZ:LCALL DISPLAY2;报警设置子程序,基本与时间设置相同
     MOV A,RAM2
     CJNE A,#4,N12
     MOV RAM2,#0
     MOV P1,#80H
     ACALL ENABLE
     MOV P1,#20H
     ACALL WRITE
     MOV P1,#0c0H
     ACALL ENABLE
     MOV P1,#20H
     ACALL WRITE
     SETB TR0
     LJMP XS
     N12:
     CJNE A,#1,XGM2
   XGS2:  MOV P1,#80H
       LCALL ENABLE
       MOV P1,#53H
       LCALL WRITE
       MOV P1,#0c0H
       LCALL ENABLE
       MOV P1,#57H
       LCALL WRITE
     LCALL PD2
     INC R5
     AJMP XGS2
   XGM2:MOV A,RAM2
      CJNE A,#2,XGH2
      MOV P1,#80H
       LCALL ENABLE
       MOV P1,#4DH
       LCALL WRITE
       MOV P1,#0c0H
       LCALL ENABLE
       MOV P1,#57H
       LCALL WRITE
     LCALL PD2
     INC R6
     AJMP XGM2
   XGH2:MOV P1,#80H
       LCALL ENABLE
       MOV P1,#48H
       LCALL WRITE
     MOV P1,#0c0H
       LCALL ENABLE
       MOV P1,#57H
       LCALL WRITE
     LCALL PD2
     INC R7
     AJMP XGH2
     RET
;************判断按键子程序2*********************
  PD2:MOV A,P0;判断设置报警按键,与设置时间按键基本相同
     ANL A,#20H
     LP62:JNB P0.5,NX62
     AJMP LP62
 NX62:CJNE A,#20H,NN32
     INC RAM2
     LJMP BJSZ
     NN32:ACALL DISPLAY2
     MOV A,#80H
     ANL A,P0
     CJNE A,#80H,PD2
     RET
 ;************记时器中断**************************   
     JSQZD:INC R1      ;定时器中断               
       CJNE R1,#21,X;没到1S跳转
       INC R2         ;秒加1
       MOV R1,#0
     X:MOV TH0,#46H
     MOV TL0,#0CH
     RETI       
;************LCD命令程序***********************
WRITE:   ;显示命令
SETB RS
CLR RW 
CLR E 
ACALL DELAY
SETB E
RET
ENABLE: ;送命令
CLR RS
CLR RW 
CLR E 
ACALL DELAY
SETB E 
RET
DELAY: ;延时子程序
mov 32H,#250
d1:mov 33H,#100
d2:djnz 33H,d2
djnz 32H,d1
ret
;*******************LCD码表**********************8 
TABLE:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H;显示字符表
END

⌨️ 快捷键说明

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