;数码管段码接法A-PD0,B-PD1....G-PD6,H-PD7
;数码管位码接法OM0-PC0...COM4-PC3
;源码下载: http://www.51hei.com/f/htzdqt.rar
;1.开中断
;2.中断中防抖
;3.查表
;4.间接寻址
;5.定时器的使用
;中断嵌套处理
include HT66F50.inc
ORG 0000H
JMP A1
ORG 04H ;外部中断0入口地址
JMP ZD01 ;
ORG 0014H ;多功能中断入口地址
JMP ZD1
ORG 30H ;
Q1:
DC 03FH ; 0
DC 006H ; 1
DC 05BH ; 2
DC 04FH ; 3
DC 066H ; 4
DC 06DH ; 5
DC 07DH ; 6
DC 007H ; 7
DC 07FH ; 8
DC 06FH ; 9
DC 077H ; A
DC 07CH ; B
DC 039H ; C
DC 05EH ; D
DC 079H ; E
DC 071H ; F
A1:
MOV A,0 ;显示内容
MOV [8AH],A ;第一位数码管段码显示内容寄存器
MOV A,0 ;显示内容
MOV [8BH],A ;第二位数码管段码显示内容寄存器
MOV A,0 ;显示内容
MOV [8CH],A ;第三位数码管段码显示内容寄存器
MOV A,0 ;显示内容
MOV [8DH],A ;第四位数码管显示内容寄存器
MOV A,08H ;跟CP1C寄存器设置要求选择数据
MOV CP1C,A ;设置PC口为I/0口而不是中断口
CLR PCC ;设置pc 口为输出口
CLR PDC ;设置PD 口为输出口
MOV A,1 ;设置初始显示位码显示第一位
MOV [80H],A ;位码寄存器
MOV A,8AH ;设置对应第一位段码寄存器
MOV MP0,A ;间接寄存器指针
MOV A,00000000B ;
MOV PRM1,A ;设置外部中断0的管脚为PA.3
MOV A,00000010B ;
MOV INTEG,A ;设置外部中断0为下降沿触发
CLR ACERL ;设置PA口不为AD输入口
SET PAPU.3 ;设置PA.3上拉
SET PAC.3 ;设置PA.3为输入口
MOV A,08H ;
MOV CP0C,A ;设置PA3不为比较器输入口
CLR PDC ;设置PD口为输出口
MOV A,01H ;设置PD口初始状态
MOV PD,A ;PD口显示初始状态
MOV A,00000000B ;设置TM2 计数时钟位为fSYS/4
MOV TM2C0,A
MOV A,11000001B ;设置TM2中断为定时/计数模式选择比较器A匹配
MOV TM2C1,A
MOV A,LOW 5000 ;设置中断时间为5000个时钟周期
MOV TM2AL,A ;低8位
MOV A,HIGH 5000 ;设置中断时间为5000个时钟周期
MOV TM2AH,A ;高8位
CLR MF0F ;清多功能中断0标志
CLR T2AF ;清定时器2较器A中断标志
SET MF0E ;使能多功能0中断
SET T2AE ;使能定时器2较器A中断
CLR INT0F ;清中断0标志
SET INT0E ;使能外部0中断
SET EMI ;使能总中断
SET T2ON ;开始计数
JMP $[page]
;*************************************************
; 外部中断0服务子程序
;*************************************************
ZD01: ;进入中断自动关闭总中断
SET EMI ;打开总中断允许嵌套
CLR INT0E ;关闭外部中断0避免为完成操作2次中断
MOV [0F2H],A ;压栈ACC到0F2H
MOV A,STATUS ;
MOV [0F3H],A ;压栈status标志寄存器到0F3H
INC [8DH] ;个位数码管加1
MOV A,10 ;
SUB A,[8DH] ;用10减个位数码管的数判断是否相等
SNZ Z ;结果为0相等Z为1跳过一条指令否则z为1继续执行
JMP A2 ;Z=1结果不等返回继续加1
MOV A,0 ;Z=0结果相等
MOV [8DH],A ;存0继续显示
INC [8CH] ;十位数码管加1
MOV A,10 ;用10减十位数码管的数判断是否相等
SUB A,[8CH] ;
SNZ Z ;结果为0相等Z为1跳过一条指令否则z为1继续执行
JMP A2 ;Z=1结果不等返回继续加1
MOV A,0 ;Z=0结果相等
MOV [8CH],A ;存0继续显示
INC [8BH] ;百位数码管加1
MOV A,10 ;
SUB A,[8BH] ;用10减百位数码管的数判断是否相等
SNZ Z ;结果为0相等Z为1跳过一条指令否则z为1继续执行
JMP A2 ;Z=1结果不等返回继续加1
MOV A,0 ;Z=0结果相等
MOV [8BH],A ;存0继续显示
INC [8AH] ;千位数码管加1
MOV A,10 ;用10减千位数码管的数判断是否相等
SUB A,[8AH] ;
SNZ Z ;结果为0相等Z为1跳过一条指令否则z为1继续执行
JMP A2 ;Z=1结果不等返回继续加1
MOV A,0 ;Z=0结果相等
MOV [8AH],A ;存0继续显示
JMP A2 ;已经到9999清为0000返回反复执行
A2:
CALL M001
SNZ PA.3 ;判断PA3是否为高电平(去抖)
JMP A2 ;是低电平则返回判断
CALL M001 ;延时防止抖动
SNZ PA.3 ;
JMP A2 ;
MOV A,[0F3H] ;弹栈后进先出先进后出
MOV STATUS,A ;弹栈0F1H的数到标志寄存器
MOV A,[0F2H] ;弹栈0F0H的数到acc
CLR INT0F ;清中断标志
SET INT0E ;使能外部中断
RETI ;中断返回
;*******************************************************
; 中断服务子程序
;*******************************************************
ZD1:
MOV [0F0H],A ;压栈ACC到0F0H
MOV A,STATUS ;
MOV [0F1H],A ;压栈status标志寄存器到0F1H
CLR PC ;清PC(清屏幕)
MOV A,Q1 ;数据表地址
CLR TBHP ;清数据表地址高位否则出错
ADD A,IAR0 ;利用间接寄存器找到要显示段码所在数据表的地址
MOV TBLP,A ;表格指针寄存器TBLP
TABRD PD ;查表并将数据存到PD口寄存器
MOV A,[80H] ;位码寄存器
MOV PC,A ;将位码寄存器的数存到PC口寄存器
;段码和位码的数都有了所以数码管被点亮
INC MP0 ;间接寄存器指针加1指向下一个段码寄存器
RL [80H] ;左移位码寄存器控制下一个数码管
SNZ [80H].5 ;判断是否控制完4个数码管
JMP ZD2 ;退出中断继续
MOV A,1 ;是则从新初始化寄存器数据
MOV [80H],A ;
MOV A,8AH ;千位数码管对应寄存器
MOV MP0,A ;存到间接寄存器0
ZD2:
MOV A,[0F1H] ;弹栈后进先出先进后出
MOV STATUS,A ;弹栈0F1H的数到标志寄存器
MOV A,[0F0H] ;弹栈0F0H的数到acc
CLR MF0F ;清多功能标志
CLR T2AF ;清定时器2比较器A标志
RETI ;中断返回
;**************************************
; 延时子程序
;**************************************
M001:
MOV A,1
MOV [85H],A
M002:
MOV A,10
MOV [86H],A
M003:
MOV A,250
MOV [87H],A
M004:
SDZ [87H]
JMP M004
SDZ [86H]
JMP M003
SDZ [85H]
JMP M002
RET
END
上一篇:合泰单片机笔段式LCD显示程序+电路图
下一篇:合泰单片机定时器数码管显示
推荐阅读最新更新时间:2024-03-16 14:02