Clock0 Clock1
equ 210h ;定时器0的地址 equ 211h ;定时器1的地址
Clock2 equ 212h ;定时器2的地址 clockc
equ 213h ;计数器控制端口地址
Clock0Mode equ 00110000b ;通道0,先读写低位再读写高位,方式0,2进制 Clock1Mode equ 01110100b ;通道1,先读写低位再读写高位,方式2,2进制 Clock2Mode equ 10110100b ;通道2,先读写低位再读写高位,方式2,2进制 Clock1Read equ 01000100b ;通道1计数器锁存,供CPU读
Clock0Count equ 0f424h ;计数器0计数值62500,在1M/8Hz下0.5秒所需计数值) Clock1Count equ 0 ;计数器1计数值 Clock2Count equ 16 ;计数器2计数值 InputAdr equ 218h ;IO输入端口地址
StartWork equ 01h ;开始工作的检测状态(通过与运算截获第一位) Clock0End equ 02h ;检测计数器0是否工作结束(通过与运算截获第二位) Data_K equ 10 ;变量K,初始值10
CODE SEGMENT ;主函数
MAIN PROC FAR
ASSUME CS:CODE DS:CODE START: push cs pop ds
call Is_Start ;检测是否按下开始脉冲键
call InitClock2 ;初始化计数器2,并产生可编程的方波频率 call InitClock0 ;初始化计数器0 call InitClock1 ;初始化计数器1
21
call CheckClock0Over ;检测计数器0是否工作结束,并将读取的结果存入变量a中 call Display ;显示变量a的值到LED上 EndTime:
mov dx,InputAdr ;IO输入端口地址
in al,dx
and al,StartWork ;开始工作的检测状态(通过与运算截获第一位) cmp al,01h ;判断是否为高电平 jz START
jmp EndTime MAIN ENDP
;这个函数负责将提取出的变量a的值输出到LED上,最大16位 Display proc near
;初始化8279
mov di,ax ;保存频率至BX
mov al,LEDMOD ;左边输入,八位显示,外部译码八位显示 mov dx,Z8279 out dx,al
mov al,LEDFEQ ;扫描频率 out dx,al
;向LED输出数据,显示结果 mov cx,5 First1:
mov ax,di ;保存频率至AX mov dx,00h mov si,Data_K
div si
mov di,ax ;将商保存至BX mov ax,dx ;将余数保存至AX
22
lea bx,LED add ax,bx mov bx,ax mov ax,[bx]
OutPut1: mov dx,D8279 ;8279数据端口
out dx,al
dec cx cmp cx,3 ja Continu1 lea bx,Signed mov ax,[bx] cmp ax,0 ja Next1 jmp Next2 Continu1:
jmp First1
Next1: mov dx,D8279 mov al,00h
out dx,al out dx,al lea bx,Signed
mov ax,00h
mov [bx],ax Next2: cmp cx,0 ja Continu1
jmp Next3
Next3:
;空操作 ;空操作 23
mov dx,D8279 mov al,00h
out dx,al ;空操作 lea bx,Signed
mov ax,[bx] inc ax mov [bx],ax ret Display endp
;检查是否按下开始按钮,判断脉冲信号 Is_Start proc near Again:
mov dx,InputAdr ;IO输入端口地址
in al,dx
and al,StartWork ;开始工作的检测状态(通过与运算截获第一位) cmp al,00h ;判断是否为低电平 jz EndCheck jmp Again
EndCheck: ;判断结束,可以工作了 ret Is_Start endp
;设置计数器0的工作方式及计数值 InitClock0 proc near 次
mov dx,clockc ;计数器控制端地址
mov al,Clock0Mode ;通道0,先读写低位再读写高位,方式0,2进制,只定时1
out dx,al
mov dx,Clock0 ;定时器0的地址
24
mov ax,Clock0Count ;计数器0计数值62500,在1M/8Hz下0.5秒所需计数值) out dx,al mov al,ah out dx,al ret
InitClock0 endp
;设置计数器1的工作方式及计数值 InitClock1 proc near
mov dx,clockc ;计数器控制端地址
mov al,Clock1Mode ;通道1,先读写低位再读写高位,方式2,2进制 out dx,al
mov dx,Clock1 ;定时器1的地址
mov ax,Clock1Count ;计数器1计数值0 out dx,al mov al,ah out dx,al ret
InitClock1 endp
;设置计数器2的工作方式及计数值,工作频率1MHZ InitClock2 proc near
mov dx,InputAdr ;IO输入端口地址 in al,dx mov cl,2 not al
and al,11111100b
shr al,cl ;右移两位 mov ah,00h
mov cx,ax ;保存频率倍数
25