📄 count.asm
字号:
;/********************************************************************
;* 主 页 : HTTP://WWW.QLMCU.COM
;*;
;* 程序功能 : 0~9999计数器实验
;*
;* 应用软件 : KEIL C
;*
;* 版 本 : KEIL 7.06 完整版
;*
;* 硬 件 : WS803、WS804、WS806
;*
;* 创建时间 : 2005-05-20
;*
;* 注:为了有更多实用的实验程序供大家学习,部分程序参考网上的资源,
;* 在此谢谢这些无私奉献的朋友!!!
;*
;********************************************************************/
;/* 功能介绍:本计数器程序实现了0~9999任意数的计数功能,具体的计数初值大家可以自行在程序里修改.
; 计数通过外部中断1 的按键模拟中断计数,按一下P3.3 的按键(INT1) ,计数器自动加 1 .
; 实际的扩展使用让大家自己发挥了, 比如可以加入键盘对初值的设定,
; 还加入24C02的记忆存储功能,对每次上次计数的初值的记忆等,总之更多的功能让大家发挥了,呵呵。
;*/
BEEP EQU P3.2 ;蜂鸣器端口定义
ORG 0000H
AJMP MAIN
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H ;外部中断1入口地址
LJMP INTT1
ORG 001BH
RETI
ORG 0023H
RETI
;-----------------------------------------------------------------
ORG 0100H
MAIN: ;*****主程序*******
; MOV P2,#0F8H
; MOV A,P2
; JNB ACC.3,LOOP ; 根据 P2.3 的电平对计数初值的选择!!!
; MOV 40H,#01H ;选择 100 的计数初值
; AJMP LOOP0
LOOP: MOV 40H,#00H ;系统初始设置计数初值:100 (可自行修改)
LOOP0: MOV 39H,#01H
MOV 38H,#00H
MOV 37H,#00H
MOV 30H,#00H ;数码管显示缓存 千位
MOV 29H,#00H ;数码管显示缓存 百位
MOV 28H,#00H ;数码管显示缓存 十位
MOV 27H,#00H ;数码管显示缓存 个位
MOV 30H,40H ;初值传递
MOV 29H,39H
MOV 28H,38H
MOV 27H,37H
MOV R1,#0FFH
MOV R2,#0FFH
MOV R5,#0FFH
JJJ: LCALL DISPLAY ;开始重复调用显示子程序,显示系统设置的初始值
DJNZ R1,JJJ ;多约 1 秒钟
FFF: LCALL DISPLAY
DJNZ R5,FFF
FKK: LCALL DISPLAY
DJNZ R2,FKK
MOV 30H,#00H
MOV 29H,#00H
MOV 28H,#00H
MOV 27H,#00H
SETB EA ;开启CPU中断
SETB IT1 ;边沿触发
SETB EX1 ;开启外部中断1
KKK: LCALL DISPLAY
AJMP KKK
;**************************************************
;******************外部中断1子程序*****************
;**************************************************
INTT1:
INC 27H ;累加程序
MOV A,27H
CJNE A,#10,LOOP1
MOV 27H,#00H
INC 28H
MOV A,28H
CJNE A,#10,LOOP1
MOV 28H,#00H
INC 29H
MOV A,29H
CJNE A,#10,LOOP1
MOV 29H,#00H
INC 30H
MOV A,30H
LOOP1: MOV A,27H ;比较判断程序
CLR C
SUBB A,37H
JNZ LOOP2
MOV A,28H
CLR C
SUBB A,38H
JNZ LOOP2
MOV A,29H
CLR C
SUBB A,39H
JNZ LOOP2
MOV A,30H
CLR C
SUBB A,40H
JNZ LOOP2
CLR P1.0 ;当计到系统设置的初始值后,数码管显示" - - - "
CLR P1.1
CLR P1.2
CLR P1.3
MOV P0,#10111111B
LCALL BZ ;并且蜂鸣器发出声音提示
LCALL BZ
LCALL BZ
LCALL BZ
LCALL BZ
LCALL BZ
LCALL BZ
LCALL BZ
LCALL BZ
LCALL BZ
MOV P0,#0FFH ;关闭数码管的显示输出
MOV 30H,#00H ;再给计数缓存置 0
MOV 29H,#00H
MOV 28H,#00H
MOV 27H,#00H
MOV P1,#0FFH
LOOP2: RETI
;***********************************************
;******************显示子程序*******************
;***********************************************
DISPLAY: MOV DPTR,#TAB
MOV P1,#0FFH
MOV A,30H
MOVC A,@A+DPTR
MOV P0,A
CLR P1.0
ACALL DELAY
SETB P1.0
MOV A,29H
MOVC A,@A+DPTR
MOV P0,A
CLR P1.1
ACALL DELAY
SETB P1.1
MOV A,28H
MOVC A,@A+DPTR
MOV P0,A
CLR P1.2
ACALL DELAY
SETB P1.2
MOV A,27H
MOVC A,@A+DPTR
MOV P0,A
CLR P1.3
ACALL DELAY
SETB P1.3
RET
;===========================================
TAB: DB 0C0H;0
DB 0F9H;1
DB 0A4H;2
DB 0B0H;3
DB 099H;4
DB 092H;5
DB 082H;6
DB 0F8H;7
DB 080H;8
DB 090H;9
;===========================================
DELAY: MOV R6,#1H ;动态扫描延时子程序,这个时间能短就短,不然数码管会有闪烁.
DEL1: MOV R7,#10H
DJNZ R7,$
DJNZ R6,DEL1
RET
;===========================================
DELAY1: MOV R4,#14H ;输出控制延时子程序
DEL2: MOV R3,#0C8H
DEL3: MOV R2,#0FAH
DJNZ R2,$
DJNZ R3,DEL3
DJNZ R4,DEL2
RET
BZ: ;蜂鸣器
MOV R6,#100
B1: CALL DEX
CPL BEEP
DJNZ R6,B1
MOV R5,#10
CALL DELAY
RET
DEX: MOV R7,#180
DE1: NOP
DJNZ R7,DE1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -