时钟信号的频率为307.2kHz。
通过按钮可以选择输出不同频率的方波。
DATAS SEGMENT
;此处输入数据段代码
IOYO equ 0C400h;对应的端口地址
IOY1 equ 0C440h
MY8253_COUNT_0 equ IOYO+00H*4;8253计数器0端口1地址
MY8253_COUNT1 equ IOYO+01H*4;8253计数器1端口2地址
MY8253_COUNT2 equ IOYO+02H*4;8253计数器2端口3地址
MY8253_MODE equ IOYO+03H*4;8253控制器地址
MY8255_A equ IOY1+00H*4;8255计数器端口1地址
MY8255_B equ IOY1+01H*4;8255计数器端口2地址
MY8255_C equ IOY1+02H*4;8255计数器端口3地址
MY8255_MODE equ IOY1+03H*4;8255控制器地址
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov dx,MY8255_B;输入信号
in al,dx
;这里确定的D1位为1说明PB端口是输入端口,用来输入按键输入信号
;D4位为0,说明PA端口作为输出信号
mov dx,MY8255_MODE
mov al,82h;1000 0010
out dx,al
K:
;k的作用是用于轮询读入按键的输入信号
mov dx,MY8255_B;输入信号
in al,dx
cmp al,0FEh
je K1
cmp al,0FDh
je k2
cmp al,0FBh
je k3
cmp al,0f7h
je k4
;若无输入跳转到K继续读入信号
jmp k
wait_a:
;这个地方的作用是用于如果按键的输入不改变则信号显示不改变一直在这个逊汗中,例如当al=0FEh时,跳转到k1,然后输出了对应频率的波形;之后不断检查按键的输出是否改变如果改变则跳出k1,否则一直输出对应波形
mov ah,al
mov dx,MY8255_B;输入信号
in al,dx
cmp ah,al
je exit
jne k
k1:
mov di,100;
call out_fre
jmp wait_a
k2:
mov di,200;
call out_fre
jmp wait_a
k3:
mov di,300;
call out_fre
jmp wait_a
k4:
mov di,500;
call out_fre
jmp wait_a
Out_fre proc near
mov dx,MY8253_MODE;8253初始化
mov al,0b6h;10通道2,11先读写高字节,后读写低字节011方式3,0二进制计数
out dx,al
mov dx,1
mov ax,000;307.2KHz
div di
mov dx,MY8253_COUNT2
out dx,al
mov al,ah
out dx,al
ret
Out_fre endp
exit:
;退出
MOV AH,4CH
INT 21H
CODES ENDS
END START
结果:
从上到下按按钮波形逐渐变密。
方波发生器可以产生利用8253的方式三模式产生不同的频率的方波,具体频率我没有测。我的Proteus中的频率计没有测出来,大家可以试试。
补充:运行时各个信号参考:
时钟信号设置