**** WRITER:COCO.LI*************
定时器T0、T1溢出周期为50MS(10MS),T0为秒计数用,T1为调整时闪烁用,
**** P1.0、P1.1、P1.2为调整按钮,P0口为字符输出口,采用共阳显示管。
********** 中断程序入口 ****************
ORG 0000H 程序执行开始地址
LJMPSTART 跳到标号START执行
ORG 0003H 外中断0中断程序入口
RETI外中断0中断返回
ORG 000BH 定时器T0中断程序入口
LJMPINTT0 跳到标号INTT0执行
ORG 0013H 外中断1中断程序入口
RETI外中断1中断返回
ORG 001BH 定时器T1中断程序入口
LJMPINTT1 跳到标号INTT1执行
ORG 0023H 串行口中断程序入口
RETI串行口中断程序返回
主程序
ORG 0030H
START:LCALL ST 上电显示年月日及班级学号
MOV R0,#70H 清70H~7AH共11个内存单元
MOV R7,#0BH
CLEARDISP:
MOV @R0,#00H
INC R0
DJNZR7,CLEARDISP
MOV 20H,#00H清20H , 标志用
MOV 7AH,#0AH放入“熄灭符”数据
MOV TMOD,#11H 设T0、T1为16位定时器
MOV TL0,#0B0H 50MS定时初值,T0计时用
MOV TH0,#3CH50MS定时初值
MOV TL1,#0B0H 50MS定时初值,T1闪烁定时用
MOV TH1,#3CH50MS定时初值
SETBEA 总中断开放
SETBET0 允许T0中断
SETBTR0 开启T0定时器
MOV R4,#14H 1 S定时用初值50MS*20
START1:
LCALL DISPLAY 调用显示子程序
JNB P3.3,SETMM1 P3.3口为0时,转时间调整程序
JNB P3.4,FUNSS 秒表功能,P3.4按键调时时作减1 *** 作
JNB P3.5,FUNPT STOP,PUSE,CLR
SJMPSTART1 P3.3口为1时跳回START1
SETMM1:
LJMPSETMM 转到时间调整程序SETMM
FUNSS:
LCALL DS20MS
JB P3.4,START1
WAIT11:
JNB P3.4,WAIT11
CPL 03H
MOV 70H,#00H
MOV 70H,#00H
MOV 70H,#00H
MOV 70H,#00H
MOV 70H,#00H
MOV 70H,#00H
AJMPSTART1
FUNPT:
LCALL DS20MS
JB P3.5,START1
WAIT22:
JNB P3.5,WAIT21
CLR ET0
CLR TR0
WAIT33:
JB P3.5,WAIT31
LCALL DS20MS
JB P3.5,WAIT33
WAIT66:
JNBP3.5,WAIT61
MOVR0,#70H 清70H~79H共10个内存单元
MOVR7,#0AH
CLEARP:
MOV@R0,#00H
INCR0
DJNZ R7,CLEARP
WAIT44:
JB P3.5,WAIT41
LCALL DS20MS
JB P3.5,WAIT44
WAIT55:
JNBP3.5,WAIT51
SETB ET0
SETB TR0
AJMP START1
WAIT21:
LCALL DISPLAY
AJMP WAIT22
WAIT31:
LCALL DISPLAY
AJMP WAIT33
WAIT41:
LCALL DISPLAY
AJMP WAIT44
WAIT51:
LCALL DISPLAY
AJMP WAIT55
WAIT61:
LCALL DISPLAY
AJMP WAIT66
1 s计时程式
T0中断服务程序
INTT0:
PUSHACC 累加器入栈保护
PUSHPSW 状态字入栈保护
CLR ET0 关T0中断允许
CLR TR0 关定时器T0
JB 03H,FSS 标志为1转秒表处理程序,,10MS定时
MOV A,#0B7H 中断响应时间同步修正
ADD A,TL0 低8位初值修正
MOV TL0,A 重装初值,,低8位修正值
MOV A,#3CH 高8位初值修正
ADDCA,TH0
MOV TH0,A 重装初值,, 高8位修正值
SETBTR0 开启定时器T0
DJNZR4,OUTT020次中断未到中断退出
ADDSS:
MOV R4,#14H 20次中断到,重赋初值,,1S
MOV R0,#71H 指向秒计时单元..71H~72H
ACALL ADD1调用加1程序,,加1S *** 作.
MOV A,R3秒数据放入A,,R3为2位十进制数组合
CLR C 清进位标志
CJNEA,#60H,ADDMM
ADDMM:
JC OUTT0 短于60S时中断退出
ACALL CLR0长于或者等于60S时对秒计数单元清0
MOV R0,#77H 指向分计时单元,,76H~77H
ACALL ADD1分计时单元加1
MOV A,R3分数据放入A
CLR C 清进位标志
CJNEA,#60H,ADDHH 秒表时最大为99
ADDHH:
JC OUTT0 短于60min时中断退出
ACALL CLR0长于或者等于60min时对分计数单元清0
MOV R0,#79H 指向分计时单元,,78H~79H
ACALL ADD1小时计时单元加1h
MOV A,R3时数据放入A
CLR C 清进位标志
JB 03H,OUTT0 秒表时最大为99
CJNEA,#24H,HOUR
HOUR:
JC OUTT0 短于24h时中断退出
ACALL CLR0长于或者等于24h时对计时单元清0
OUTT0:
MOV 72H,76H 中断退出时将分\时计时单元数据移
MOV 73H,77H 入对应显示单元
MOV 74H,78H
MOV 75H,79H
POP PSW 恢复状态字出栈
POP ACC 恢复累加器
SETBET0 开放T0中断
RETI
秒表计时程序(10min加1),低2位为0.1、0.01秒,中间2位为秒,最高2位为分.
最大计数值为99分59.99秒
FSS:MOV A,#0F7H
ADD A,TL0
MOV TL0,A
MOV A,#0D8H
ADDCA,TH0
MOV TH0,A
SETBTR0
MOV R0,#71H
ACALL ADD1
CLR C
MOV A,R3
JZ FSS1
SETBC
FSS1: AJMPADDMM
闪动调时程式
T1中断服务程序,用作时间调整单元闪烁指示
INTT1: PUSHACC
PUSHPSW
MOV TL1,#0B0H
MOV TH1,#3CH
DJNZR2,INTT1OUT
MOV R2,#06H
CPL 02H
JB 02H,FLASH1
MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
INTT1OUT:
POP PSW
POP ACC
RETI
FLASH1: JB 01H,FLASH2
MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
AJMPINTT1OUT
FLASH2: MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
AJMPINTT1OUT
加1子程序
ADD1: MOV A,@R0 取当前计时单元数据到A
DEC R0 指向前一地址
SWAPA A中数据高四位与低四位交换
ORL A,@R0 前一地址中数据放入A中低四位
ADD A,#01H A加1 *** 作
DA A 十进制调整
MOV R3,A 移入R3中暂存数据
ANL A,#0FH 高四位变0
MOV @R0,A 数据放入当前地址单元中
MOV A,R3 返回
INC R0
SWAPA
ANL A,#0FH
MOV @R0,A
RET
分减1子程序
SUB1: MOV A,@R0 取当前计时单元数据到A
DEC R0 指向前一地址
SWAPA A中数据高四位与低四位交换
ORL A,@R0 前一地址中数据放入A中低四位
JZ SUB11
DEC A A减1 *** 作
SUB111: MOV R3,A 移入R3中暂存数据
ANL A,#0FH 高四位变0
CLR C 清进位标志
SUBBA,#0AH
SUB1111:
JC SUB1110
MOV @R0,#09H 大于等于0AH,为9
SUB110:
MOV A,R3 取回R3中暂存数据
INC R0 指向当前地址单元
SWAPA A中数据高四位与低四位交换
ANL A,#0FH 高四位变0
MOV @R0,A 数据放入当前地址单元中
RET返回
SUB11: MOV A,#59H
AJMPSUB111
SUB1110:
MOV A,R3 移入R3寄存器
ANL A,#0FH
MOV @R0,A
AJMPSUB110
时减1子程序
SUBB1: MOV A,@R0 取当前计时单元数据到A
DEC R0指向前一地址
SWAPA A中数据高四位与低四位交换
ORL A,@R0 前一地址中数据放入A中低四位
JZ SUBB1100减1为23H
DEC A A减1 *** 作
SUBB111:MOV R3,A 移入R3中暂存数据
ANL A,#0FH高四位变0
CLR C 清进位标志
SUBBA,#0AH时个位大于9为9
SUBB1111:
JC SUBB1110
MOV @R0,#09H 大于等于0AH,为9
SUBB110:
MOV A,R3 取回R3中暂存数据
INC R0指向当前地址单元
SWAPA A中数据高四位与低四位交换
ANL A,#0FH高四位变0
MOV @R0,A 数据放入当前地址单元中
RET 返回
SUBB11:
MOV A,#23H
AJMPSUBB111
SUBB1110:
MOV A,R3 时个位小于0A不处理
ANL A,#0FH高四位变0
MOV @R0,A 个位移入
AJMPSUBB110
清0程序
对计时单元复0用
CLR0: CLR A 清累加器
MOV @R0,A 清当前地址单元
DEC R0 指向前一地址
MOV @R0,A 前一地址单元清0
RET子程序返回
时钟调整程序
当调时按键按下时进入此程序
SETMM: CLR ET0关定时器T0中断
CLR TR0关闭定时器T0
LCALL DL1S 调用1S延时程序
JB P3.3,CLOSEDIS 键按下时间短于1S,关闭显示,,省电
MOV R2,#06H进入调时状态,赋闪烁定时初值
SETBET1允许T1中断
SETBTR1开启T1定时器
SET2:
JNB P3.3,SET1 P3.3口为0时,等待,,键未释放
SETB00H键释放,分调整闪烁标志置1
SET4: 等待键按下
JB P3.3,SET3 等待键按下
LCALL DL05S 有键按下,延时0.5S
JNB P3.3,SETHH 按下时间长于0.5S,转调小时状态
MOV R0,#77H按下时间短于0.5S,加1min *** 作
LCALL ADD1 调用加1子程序
MOV A,R3 取调整单元数据
CLR C 消位标志
CJNEA,#60H,HHH 调整单元数据与60比较
HHH:JC SET4 调整单元数据小于60,转SET4循环
LCALL CLR0 调整单元数据大于或等于60时,清0
CLR C 清进位0
AJMPSET4 跳转到SET4循环
CLOSEDIS:
SETBET0省电状态,开T0中断,,LED灯不显示
SETBTR0开启T0中断
CLOSE:
JB P3.3,CLOSE 无键按下,等待
LCALL DISPLAY有键按下,调用显示子程序延时消抖
JB P3.3,CLOSE 是干扰,返回CLOSE等待
WAITH:
JNB P3.3,WAITH 等待键释放
LJMPSTART1 返回主程序,,LED数据显示亮
SETHH: CLR 00H分闪烁标志清除,,进入调小时状态
SETHH1: JNB P3.3,SET5 等待键释放
SETB01H小时调整标志置1
SET6: JB P3.3,SET7 等待键按下
LCALL DL05S 有键按下,延时0.5S
JNB P3.3,SETOUT按下时间长于0.5S,退出时间调整
MOV R0,#79H按下时间短于0.5S,加1h *** 作
LCALL ADD1 调用加1子程序
MOV A,R3
CLR C
CJNEA,#24H,HOUU计时单元数据与24比较
HOUU: JC SET6 小于24,转SET6循环
LCALL CLR0 大于或等于24时,清0 *** 作
AJMPSET6 跳到SET6处循环
SETOUT: JNB P3.3,SETOUT1 调时退出程序.等待键释放
LCALL DISPLAY延时消抖
JNB P3.3,SETOUT是抖动,返回SETOUT再等待
CLR 01H清调小时标志
CLR 00H清调分标志
CLR 02H清闪烁标志
CLR TR1关闭定时器T1
CLR ET1关定时器T1中断
SETBTR0开启定时器T0
SETBET0开启定时器T0中断,,计时开始
LJMPSTART1 跳回主程序
SET1: LCALL DISPLAY键释放等待调时用显示程序
AJMPSET2 防止键按下时无时钟显示
SET3: LCALL DISPLAY等待调分按键时时钟显示用
JNB P3.3,FUNSUB减1分 *** 作
AJMPSET4 调分等待
SET5: LCALL DISPLAY键释放等待调时用显示程序
AJMPSETHH1 防止键按下时无时钟显示
SET7: LCALL DISPLAY等待调小时按键时时钟显示用
JNB P3.3,FUNSUBB 小时减1 *** 作
AJMPSET6 调时等待
SETOUT1:LCALL DISPLAY退出时钟整时键释放等待
AJMPSETOUT 防止键按下时无时钟显示
FUNSUB,分减1程序?
FUNSUB: LCALL DISPLAY延时消抖
JB P3.3,SET41 干扰,返回调分等待
FUNSUB1:JNB P3.3,FUNSUB1 等待键放开
MOV R0,#77H
LCALL SUB1 分减1程序
LJMPSET4 返回调分等待
SET41: LJMPSET4
FUNSUB,时减1程序?
FUNSUBB:LCALL DISPLAY 消抖动
JB P3.4,SET61 干扰,返回调时等待
FUNSUBB1:JNBP3.4,FUNSUBB1
MOV R0,#79H
LCALL SUBB1
LJMPSET6
SET61: LJMPSET6
显示程序
显示数据在70H~75H单元内,用六位LED共阳数码管显示。
扫描控制,每个LED数码管亮1mS时间。
DISPLAY:
MOV R1,#70H 指向显示数据首址
MOV R5,#0DFH 扫描控制字初值
PLAY: MOV A,R5 扫描字放入A
MOV P2,A 从P2口输出
MOV A,@R1 取显示数据到A
MOV DPTR,#TAB 取段码表地址
MOVCA,@A+DPTR 查显示数据对应段码
MOV P0,A 段码放入P0口
MOV A,R5
JB ACC_1,LOOP5 小数点处理
CLR P0.7
LOOP5: JB ACC_3,LOOP6
CLR P0.7
LOOP6: LCALL DL1MS 显示1MS
INC R1指向下一地址
MOV A,R5 扫描控制字放入A
JNB ACC_0,ENDOUT ACC.0=0时,一次显示结束
RR A A中数据循环左移
MOV R5,A 放回R5内
MOV P0,#0FFH
AJMPPLAY 跳回:PLAY循环.
ENDOUT: MOV P2,#0FFH 一次显示结束,P2口复位
MOV P0,#0FFH P0口复位
RET 子程序返回
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
共阳段码表 1、 2、 3、 4、 5、 6、 7、 8、 9、不亮、A、—。
SDISPLAY,上电显示程序
不带小数点,有A、— 显示功能
SDISPLAY:
MOV R5,#0DFH 扫描控制字初值
SPLAY: MOV A,R5 扫描字放入A
MOV P2,A 从P2口输出
MOV A,@R1 取显示数据到A
MOV DPTR,#TABS取段码表地址
MOVCA,@A+DPTR 查显示数据对应段码
MOV P0,A 段码放入P0口
MOV A,R5
LCALL DL1MS 显示1MS
INC R1指向下一地址
MOV A,R5 扫描控制字放入A
JNB ACC_0,ENDOUTS ACC.0=0时,一次显示结束
RR A A中数据循环左移
MOV R5,A 放回R5内
AJMPSPLAY 跳回:PLAY循环.
ENDOUTS:MOV P2,#0FFH 一次显示结束,P2口复位
MOV P0,#0FFH P0口复位
RET 子程序返回
TABS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
STAB表,启动时显示2003-12-07、A01-2-28
STAB: DB 0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,01H,00H,0BH,0AH,0AH
DB 07H,00H,0CH
DB 07H,00H,0CH,02H,01H,0CH,03H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AH
注:0A不亮,0B显示“A”,0C显示“-”
ST子程序,上电时显示年月日用,采用移动显示
ST: MOV R0,#40H 将显示内容移入40H~50H单元
MOV R2,#20H
MOV R3,#00H
CLR A
MOV DPTR,#STAB
SLOOP:
MOVCA,@A+DPTR
MOV @R0,A
MOV A,R3
INC A
MOV R3,A
INC R0
DJNZR2,SLOOP 移入完毕
MOV R1,#5AH
MOV R3,#1BH 显示27个单元
SSLOOP:
MOV R2,#32H 控制移动速度
SSLOOP1:
LCALL SDISPLAY
DJNZR2,SSLOOP11
MOV A,R1
SUBBA,#07H 显示首址修正为低1个单元
MOV R1,A
DJNZR3,SSLOOP
RET
SSLOOP11:
MOV A,R1指针修正为原值
SUBB A,#06H
MOV R1,A
AJMP SSLOOP1
延时程序
1ms延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1:MOV R7,#19H
DL2:DJNZ R7,DL2
DJNZ R6,DL1
RET20MS延时程序,采用调用显示子程序,以改善LED的显示闪烁现象
DS20MS: ACALLDISPLAY
ACALLDISPLAY
ACALLDISPLAY
RET延时程序,用作按键时间的长短判断
DL1S:
LCALLDL05S
LCALLDL05S
RET
DL05S:
MOV R3,#20H8ms*32=0.196s
DL05S1:
LCALLDISPLAY
DJNZ R3,DL05S1
RET
END 程序结束
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_arith.all
use ieee.std_logic_unsigned.all
entity shicount is
port(clk,reset,enable: in std_logic
a,b,c,d,e,f,g: out std_logic
tp : out std_logic_vector(0 to 3)
xian: out std_logic_vector(0 to 6)
count :out std_logic)
end shicount
architecture xu of shicount is
signal temp :std_logic_vector(0 to 3)
signal xianshi:std_logic_vector(0 to 6)
begin
process(clk,reset,enable)
begin
if (reset='1')then temp<="0000"
elsif (enable='1') then
if (clk' event and clk='1')
then if (temp<="1000") then temp<=temp+1
else temp<="0000"
end if
end if
end if
end process
process(temp)
begin
case temp is
when "0000"=> xianshi<="0000001"count<='0'
when "0001"=> xianshi<="0110000"count<='0'
when "0010"=> xianshi<="1101101"count<='0'
when "0011"=> xianshi<="1111001"count<='0'
when "0100"=> xianshi<="0110011"count<='0'
when "0101"=> xianshi<="1011011"count<='0'
when "0110"=> xianshi<="0011111"count<='0'
when "0111"=> xianshi<="1110000"count<='0'
when "1000"=> xianshi<="1111111"count<='0'
when "1001"=> xianshi<="1110011"count<='1'
when others=> xianshi<="0000000"count<='0'
end case
end process
a<=xianshi(6) b<=xianshi(5) c<=xianshi(4) d<=xianshi(3)
e<=xianshi(2)f<=xianshi(1) g<=xianshi(0) tp<=temp
xian<=xianshi
end xu
如果只是时钟的话,其实上升沿下降沿触发区别不大,只要有一个上升沿之后就会跟着一个下降沿。不过,如果是按键的话,那就上升沿比较好了。因为平时按键不给单脉冲时,都是低电平。那如果你用下降沿触发,就得一直按着,抬起来一次才有一个下降沿出现。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)