可以通过按键调节时分秒,用8255扩展了IO口,并且扩展了RAM和ROM各8KB
单片机源程序如下:
- ORG 0000H
- AJMP MAIN
- ORG 000BH
- LJMP INTT0
- ORG 0100H
- ;/**********主程序***********/
- MAIN:
- MOV SP,#60H ;确立堆栈区
- MOV PSW,#00H
- MOV R0,#20H ;RAM区首地址
- MOV R7,#5FH ;RAM区单元个数
- QL:
- MOV @R0,#00H ;RAM清零
- INC R0
- DJNZ R7,QL
- MOV IP,#02H ;IP初始化,优先定时器0
- MOV IE,#82H ;IE初始化
- MOV TMOD,#01H ;定时器0方式1工作
- LCALL PP ;调P.子程序
- NEXT:
- LCALL KEY ;按键检测子程序
- JB ACC.0,RUNF ;A键按下运行
- LCALL DISP ;调用显示子程序
- SJMP NEXT
- RUNF:
- LCALL OUTT ;调传送子程序
- LCALL TIME ;开电子钟
- JK:
- LCALL DISP
- LCALL KEY
- JZ JK
- LCALL ANKEY ;调用键功能子程序
- LCALL DISP
- SJMP JK
- ;/***P点显示的8LED段码初始化子程序***/
- PP:
- MOV 37H,#12 ;P点编码送寄存器,对应最左LED (共阳极,0CH )
- MOV R0,#30H ;第8个LED,最右LED,段码存储的地址
- MOV R7,#07H ;第8到第2个LED,共7个,初始化段码显示空白
- PPP:
- MOV @R0,#10 ;显示空白
- INC R0
- DJNZ R7,PPP
- RET
- ;/*********键扫描子程序***********/
- KEY:
- LCALL KEYS ;调用键值处理子程序
- JZ EXIT ;没有键按下转到返回
- LCALL DISP
- LCALL DISP ;调用显示去抖动
- LCALL KEYS
- JZ EXIT
- MOV B,20H ;保存键值
- KEYSF:
- LCALL KEYS
- JZ KEYY ;键释放,转到恢复键值
- LCALL DISP ;调显示子程序延时
- AJMP KEYSF ;等到键释放
- KEYY:
- MOV A,B ;键值送A
- EXIT: RET
- KEYS:
- ;MOV P1,#0FFH ;先向P1口写1
- ;MOV A,P1 ;P1口值送A (有按键按下,对应0,取反后1)
- ;CPL A
- ;ANL A,#0FH ;保存P1口的低4位
- ;MOV 20H,A ;A值送20H保存
- ;RET
- ;MOV A,#82H
- ;MOV DPTR,#0003H
- ;MOVX @DPTR,A
- ;MOV DPTR,#0001H
- ;MOVX A,@DPTR
- ;CPL A
- ;ANL A,#0FH
- ;MOV 20H,A
- ;RET
- CLR A
- MOV A,P3
- CPL A
- ANL A,#0FH
- MOV 20H,A
- RET
- ;/********键功能子程序********/
- ANKEY:
- CLR EA ;关中断
- CHECK:
- JB TR0,YXZ ;判断是否运行
- K0:
- CJNE A,#01H,K1
- AJMP RUN ;A键按下,恢复运行,转运行
- K1:
- CJNE A,#02H,K2
- AJMP KEY1 ;转时调整
- K2:
- CJNE A,#04H,K3
- AJMP KEY2 ;转分调整
- K3:
- CJNE A,#08H,OUT ;转
- AJMP KEY3 ;转秒调整
- YXZ:
- JB ACC.0,STOP ;A键按下,暂停
- AJMP OUT
- KEY1:
- MOV R0,#45H ;时调整
- LCALL ADD1 ;调加一子程序
- CLR C
- CJNE A,#24H,OUTT ;转传送显示数据子程序
- ACALL CLR0 ;调时间清理子程序
- AJMP OUTT
- KEY2:
- MOV R0,#43H ;分调整
- LCALL ADD1
- CLR C
- CJNE A,#60H,OUTT
- ACALL CLR0
- AJMP OUTT
- KEY3:
- MOV R0,#41H ;秒调整
- ACALL ADD1
- CLR C
- CJNE A,#60H,OUTT
- ACALL CLR0
- ;/*****传送显示数据子程序*****/
- OUTT:
- MOV 30H,40H ;秒显示单元40H-41H
- MOV 31H,41H
- MOV 32H,#11 ;"-"
- MOV 33H,42H ;分显示单元42H-43H
- MOV 34H,43H
- MOV 35H,#11 ;"-"
- MOV 36H,44H ;时显示单元44H-45H
- MOV 37H,45H
- RET
- STOP:
- CLR TR0
- RET
- RUN:
- LCALL TIME ;调运行电子钟子程序
- OUT:
- SETB EA ;无键按下或完成功能跳出
- RET
- ;/*****运行电子钟子程序*****/
- TIME:
- SETB EA
- MOV TL0,#0B0H ;3CB0H
- MOV TH0,#3CH
- MOV R4,#20 ;50ms,20次循环
- SETB TR0 ;启动定时器0
- RET
- ;/******定时器0中断处理子程序******/
- INTT0:
- PUSH ACC
- PUSH PSW
- CLR ET0
- CLR TR0
- MOV TL0,#0B0H ;重新设置定时初值
- MOV TH0,#3CH
- SETB TR0
- DJNZ R4,OUTT0 ;r4-1 != 0 1秒未到,转OUTTO
- ADDSS:
- MOV R4,#14H ;20次计数
- MOV R0,#41H ;秒十位
- ACALL ADD1
- CLR C
- CJNE A,#60H,ADDMM ;1分到
- ADDMM:
- JC OUTT0 ;1分,60秒未到
- ACALL CLR0 ;1分到,清零
- MOV R0,#43H ;分十位
- ACALL ADD1
- CLR C
- CJNE A,#60H,ADDHH ;1小时到
- ADDHH:
- JC OUTT0
- ACALL CLR0
- MOV R0,#45H ;时十位
- ACALL ADD1
- CLR C
- CJNE A,#24H,HOUR ;1天到
- HOUR:
- JC OUTT0
- ACALL CLR0
- OUTT0:
- MOV 30H,40H ;秒显示单元40H-41H
- MOV 31H,41H
- MOV 32H,#11 ;"-"
- MOV 33H,42H ;分显示单元42H-43H
- MOV 34H,43H
- MOV 35H,#11 ;"-"
- MOV 36H,44H ;时显示单元44H-45H
- MOV 37H,45H
- POP PSW
- POP ACC
- SETB ET0
- RETI
- ;/*****时间清理子程序*****/
- CLR0:
- CLR A
- MOV @R0,A
- DEC R0
- MOV @R0,A
- RET
- ;/*****加一子程序*****/
- ADD1:
- MOV A ,@R0 ;取十位
- DEC R0
- SWAP A
- ORL A,@R0 ;组合十位与个位
- ADD A,#01H ;加1
- DA A ;十进制调整
- MOV R3,A ;暂存
- ANL A,#0FH ;屏蔽十位
- MOV @R0,A ;放入个位单元
- MOV A,R3 ;取值
- INC R0
- SWAP A
- ANL A,#0FH ;屏蔽个位
- MOV @R0,A ;放入十位单元
- MOV A,R3 ;数值放入A中等待判断
- RET
- ;/*****显示子程序*****/
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
汇编语言数字钟.zip
(64.58 KB, 下载次数: 4)
|