📄 频率计.asm
字号:
VALUEH EQU 20H ;暂存TH1的值
VALUEL EQU 21H ;暂存TL1的值
DATE0 EQU 22H ;暂存计数值的BCD码
DATE1 EQU 23H
DATE2 EQU 24H
DATE3 EQU 25H
DATE4 EQU 26H
DATE5 EQU 27H
DATE6 EQU 28H
COUNT EQU 30H
RS EQU P2.0
RW EQU P2.1
E EQU P3.7
;-----------------------------------------------------------------------------
ORG 0000H
SJMP MAIN
ORG 000BH
LJMP INT_T0
ORG 001BH
LJMP INT_T1
MAIN:
MOV SP,#60h
MOV 20H,#00H ;存储空间初始化
MOV 21H,#00H
MOV 22H,#00h
MOV 23H,#00H
MOV 24H,#00H
MOV 25H,#00H
MOV 26H,#00H
MOV 27H,#00H
MOV 28H,#0AH
MOV 29H,#0BH
MOV 30H,#00H
MOV TMOD,#15H ;定时器1工作在定时方式
;定时器0工作在计数方式
MOV TH1,#3CH
MOV TL1,#0B0H
MOV TH0,#00H
MOV TL0,#00H
MOV IE,#8AH
LCALL LCD_INIT ;对液晶写控制指令进行初始化
SETB TR0 ;启动定时
SETB TR1 ;启动计数
AJMP $
;------------------------------------------------------------------------
INT_T0: ;中断0作为计数器溢出
;溢出,R1加1
MOV TH0,#00H
MOV TL0,#00H
INC R1
CLR TF0
RETI
INT_T1:
MOV TH1,#0B7H
MOV TL1,#0ffH
INC COUNT
MOV A,COUNT
CJNE A,#100,RETUNE ;是否计满1秒
MOV COUNT,#00H
CLR TR0 ;关闭定时器
CLR TR1 ;关闭计数器
MOV VALUEL,TL0 ;存放计数值
MOV VALUEH,TH0
LCALL HTOD
LCALL LCD_DISPLAY
RETUNE:
RETI
;--------------液晶写控制-----------------------------------------------------
LCD_INIT:
LCALL DELAY ; DELAY 延时一段时间
MOV P0,#01H ; 写指令01H,清屏
LCALL ENABLE ; 读入使能信号使液晶正常工作
MOV P0,#38H ; 设置工作方式,写指令38H,设定LCD为16*2显示,5*7点阵,8位数据接口
LCALL ENABLE
MOV P0,#0FH ; 设置显示,光标,及闪烁开、关。显示开,光标开,闪烁开
LCALL ENABLE
MOV P0,#06H ; 设置光标,画面移动方式。数据读、写操作后,AC自动减一,画面平移
LCALL ENABLE
RET
;--------------------液晶显示--------------------------------------------------
LCD_DISPLAY:
SETB RS0
MOV R4,#08H
MOV R2,#80H
MOV R0,#22H
MOV DPTR,#TABLE0
DISPLAY_NUM:
/* MOV 31H,@R0
JNB 31H,DISPLAY_RT */
MOV P0,R2 ; 设置DDRAM地址,第一行起始字符地址
LCALL ENABLE
MOV A,@R0
MOVC A,@A+DPTR
LCALL DISP0
DISPLAY_RT:
INC R2
INC R0
DJNZ R4,DISPLAY_NUM
MOV TH0,#0
MOV TL0,#0
MOV R1,#0
SETB TR0 // 重新开启中断重新计数定时
SETB TR1
RET
;-------------------------------------------------------------------------------------
;这段程序将VALUEH/VALUEL中的16进制数转成10进制并且把5位数依次存入DATE0至DATE5
;-------------------------------------------------------------------------------------
HTOD:
// CLR RS0
MOV R2,VALUEH
MOV R3,VALUEL
CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#18H
LOOP1:
CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R1
RLC A
MOV R1,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP1
CZ:
MOV R0,#DATE5
MOV A,R6
ANL A,#0FH
MOV @R0,A
DEC R0
MOV A,R6
SWAP A
ANL A,#0FH
MOV @R0,A
DEC R0
MOV A,R5
ANL A,#0FH
MOV @R0,A
DEC R0
MOV A,R5
SWAP A
ANL A,#0FH
MOV @R0,A
DEC R0
MOV A,R4
ANL A,#0FH
MOV @R0,A
DEC R0
MOV A,R4
SWAP A
ANL A,#0FH
MOV @R0,A
MOV R1,#0
RET
;---------------------------------------------------------------
ENABLE:
CLR RS ; 写指令子程序
CLR RW
CLR E
LCALL DELAY
SETB E
RET
DISP0:
MOV P0,A ; 写1字节数据到显示端口
SETB RS ; 写数据时序
CLR RW
CLR E
LCALL DELAY
SETB E
RET
DELAY: ; 延时子程序
MOV R7,#255
D1: MOV R6,#255
D2: DJNZ R6,D2
DJNZ R7,D1
RET
TABLE0: DB "0123456789Hz"
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -