8086程序

;================================================================================

(1)实验电路中D触发器CLK端输入脉冲时,上升沿使Q端输出高电平,L7发光;D触发器的CD端输入低电平,L7灭。

;===========================================
;源程序:  YMQ.ASM
;数据及变量初始化
;===========================================
outport1 equ 2a0h ;初始化I/O端口准备
outport2 equ 2a8h 
;===========================================
;代码段及主程序
code segment ;代码段
assume cs:code
start:  ;程序开始
mov dx,outport1 ;I/O端口准备
out dx,al
call delay        ;调延时子程序
mov dx,outport2 ;I/O端口准备
out dx,al
call delay        ;调延时子程序
mov ah,1  ;判断有无输入
int 16h  ;int 16h--"键盘驱动程序"
je start  ;ZF=1,无输入,=0,有输入"?"
mov ah,4ch ;DOS返回
int 21h   
delay proc near   ;延时子程序
mov bx,200
lll: mov cx,0 ;标号头字母不能为数字“1”改为"I"
ll: loop ll  
dec bx
jne lll
ret
delay endp ;过程结束
code ends ;代码段结束
end start  ;程序结束

;================================================================================

ls273 equ 2a8h  ;地址初始化
code segment
assume cs:code
start: mov ah,2         ;显示输出字符
mov dl,0dh  ;输出“回车符”
int 21h   ;调用中断
mov ah,1                ;等待键盘输入
int 21h
cmp al,27               ;判断是否为ESC键
je exit                 ;若是则退出
mov dx,ls273            ;若不是,从2A8H输出其ASCII码
out dx,al
jmp start               ;转start
exit: mov ah,4ch        ;返回
int 21h
code ends
end start
;=======================================================================
ls244 equ 2a0h   ;地址初始化
code segment   
assume cs:code
start:
mov dx,ls244             ;从2A0输入一数据
in al,dx   ;读数据到AL
mov dl,al                ;将所读数据保存在DL中
mov ah,02   ;显示要输出字符(DL) 
int 21h
mov dl,0dh               ;显示回车符
int 21h
mov dl,0ah               ;显示换行符
int 21h
mov ah,06                ;DOS的06H功能(控制I/O),是否有键按下
mov dl,0ffh   ;dl=0ffh(输入),=字符(输出)
int 21h
jnz exit   ;?判断条件是?
je start                 ;若无,则转start
exit: mov ah,4ch         ;返回
int 21h
code ends
end start

 

;================================================================================
;===========================================
;源程序:  E8253_1.ASM
;数据及变量初始化
;===========================================
io8253a equ 283h
io8253b equ 280h
;===========================================
;代码段及主程序
code segment
assume cs:code
start:
mov al,14h              ;设置8253通道0为工作方式2,二进制计数
mov dx,io8253a       ;端口操作,采用间接寻址,因为地址大于255(间接寻址必须使用DX)
out dx,al
mov dx,io8253b       ;送计数初值为0FH
mov al,0fh
out dx,al
lll: in al,dx                ;读计数初值
call disp                   ;调显示子程序
push dx
mov ah,06h             ;直接控制台I/O,DL=0ffh(输入),=字符(输出)
mov dl,0ffh
int 21h
pop dx
jz lll
mov ah,4ch              ;退出
int 21h
;===========================================
;Function:disp
disp proc near           ;显示子程序
push dx
and al,0fh                ;首先取低四位
mov dl,al
cmp dl,9                  ;判断是否<=9
jle num                    ;若是则为'0'-'9',ASCII码加30H
add dl,7                   ;否则为'A'-'F',ASCII码加37H
num:    add dl,30h
mov ah,02h              ;显示
int 21h
mov dl,0dh               ;加回车符
int 21h
mov dl,0ah               ;加换行符
int 21h
pop dx
ret                         ;子程序返回
disp endp

code ends
end start                ;程序结束

;===========================================
;源程序:  E8253_2.ASM
;数据及变量初始化
;===========================================
io8253a equ 280h
io8253b equ 281h
io8253c equ 283h
;===========================================
;代码段及主程序
code segment
assume cs:code
start:
mov dx,io8253c         ;向8253写控制字
mov al,36h                ;使0通道为工作方式3
out dx,al
mov ax,1000             ;写入循环计数初值1000
mov dx,io8253a
out dx,al                  ;先写入低字节
mov al,ah
out dx,al                  ;后写入高字节
mov dx,io8253c
mov al,76h               ;设8253通道1工作方式2
out dx,al
mov ax,1000            ;写入循环计数初值1000
mov dx,io8253b
out dx,al                  ;先写低字节
mov al,ah
out dx,al                  ;后写高字节
mov ah,4ch              ;程序退出
int 21h
code ends
end start
;===========================================
;源程序:  E8253_3.ASM
;数据及变量初始化
;===========================================
;数据段
data segment
mesg0 db 13,10,'******** 8253 program********',13,10,'$'
mesg1 db 13,10,'Counter1:','$'
mesg2 db 13,10,'Counter2:','$'
mesg3 db 13,10,'Continue?(Y/N)','$'
mesg4 db 13,10,13,10,'Thank You ! ',13,10,'$'
errorm db 13,10,'Input Error ! ','$'
counter1 dw 0
counter2 dw 0
data ends
;===========================================
;代码段
code segment
assume cs:code,ds:data
;===========================================
;Function:main
main proc far
start:
mov dx,seg data
mov ds,dx
mov dx,offset mesg0
mov ah,09h                ;显示字符串
int 21h
do: sub bx,bx
sub ax,ax
mov counter1,0
mov counter2,0 ;init
l1:
mov dx,offset mesg1
mov ah,09h
int 21h
rd1 :                         ;read counter1
mov al,0                    ;判断有无输入
mov ah,01                 ;read a char
int 21h
cmp al,0
jz rd1
cmp al,13                  ;if enter
je fdone1
jmp tdone1
fdone1: jmp done1
tdone1: cmp al,10
je fdone1
cmp al,'0'                 ;if input<0 or input>9 error
jb error
cmp al,'9'
ja error
push ax
mov ax,10
mul counter1
mov counter1,ax       ;counter1=counter*10
pop ax
sub bx,bx
mov bl,al
sub bl,30h
add counter1,bx       ;counter=counter+input
jmp rd1
error:
mov dx,offset errorm
mov ah,09h
int 21h
mov dl,7
mov ah,2
int 21h
jmp done3
tr:                           ;for jmp do
mov dl,al
mov ah,02h
int 21h
mov dl,10
int 21h
mov dl,13
int 21h
jmp do
l2:
mov dx,offset mesg2
mov ah,09h
int 21h
rd2:
mov al,0                ;判断有无输入
mov ah,01             ;read counter2
int 21h
cmp al,0
jz rd2
cmp al,13             ;if enter
je fdone2
cmp al,10
je fdone2
jmp tdone2
fdone2: jmp done2
tdone2:
cmp al,10
je fdone2
cmp al,'0'
jb error
cmp al,'9'
ja error
push ax
mov ax,10
mul counter2
mov counter2,ax       ;counter2=counter2*10
pop ax
sub bx,bx
mov bl,al
sub bl,30h                ;bh=0
add counter2,bx       ;counter2=counter2+input
jmp rd2
done1:
jmp l2
done2:
jmp out8253             ;after enter two counters
done3:                     ; set 8253 and do it
mov dx,offset mesg3
mov ah,09h
int 21h
l3:     mov ah,07h     ;直接控制台输入(没有回显),AL=输入的字符
int 21h
cmp al,'Y'
je tr
cmp al,'y'
je tr
cmp al,'N'
je quit
cmp al,'n'
je quit
mov dl,7
mov ah,02h            ;显示器输出字符
int 21h
jmp l3
out8253:               ;work code
mov al,00110110b
mov dx,283h          ;端口操作,详细注释请看后面的程序(有详细的提及)
out dx,al   
mov ax, counter1
mov dx,280h
out dx,al
mov al,ah
out dx,al
mov al,01110110b
mov dx,283h
out dx,al
mov ax,counter2
mov dx,281h
out dx,al
mov al,ah
out dx,al
mov cx,2801
delay: loop delay
jmp done3
quit: ;return to DOS
mov dx,offset mesg4
mov ah,9
int 21h
mov ax,4c00h      ;退出dos
int 21h
main endp

code ends
end start            ;程序结束

 

;================================================================================
;===========================================
;源程序:  E8255.ASM
;数据及变量初始化
;===========================================
io8255a equ 288h
io8255b equ 28bh
io8255c equ 28ah
;===========================================
;代码段及主程序
code segment
assume cs:code
start: 
mov dx,io8255b                 ;设8255为C口输入,A口输出
mov al,8bh
out dx,al                          ;端口操作,
inout: mov dx,io8255c        ;从C口输入一数据
in al,dx
mov dx,io8255a                 ;从A口输出刚才自C口
out dx,al                           ;所输入的数据
mov dl,0ffh                       ;判断是否有按键
mov ah,06h                      ;直接控制台I/O,DL=0ffh(输入),=字符(输出)
int 21h
jz inout                             ;若无,则继续自C口输入,A口输出
mov ah,4ch                       ;否则返回
int 21h
code ends
end start

;================================================================================
;===========================================
;源程序: E8255_1.ASM
;数据及变量初始化
;===========================================
;数据段
data segment
chip db 13,10
db 13,10
db ’Program to test the chip of 74LS138’,13,10 
db 13,10
db 13,10
db ’ +------------------------------+’,13,10
db ’ |   A    B    C    G1  G2A+G2B |’,13,10
db ’ |                              |’,13,10
db ’ |           74LS138            |’,13,10
db ’ |                              |’,13,10
db ’ |Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7|',13,10
db’  +------------------------------+’,13,10, ’$’
mess    db’After you have ready,Please press any key ! ’, ’$’
mes2    db ’Test Again ?(Y/N) ’, ’$’
InA     db 0
OutC    db 0
cll     db ’ ’, ’$’
data    ends
;===========================================
;代码段及主程序
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
again: call cls
call InputB            ;Output CTRLcode(write) to 28Bh
mov dx,28bh
mov al,10001011b
out dx,al                              ;Output In to 288h
mov dx,288h
mov al,InA                         
out dx,al            
call OutputC
jmp1:   mov ah,2                  ;设置光标位置,DH、DL=行、列
mov dh,15
mov dl,20                          
int 10h                               ;显示器驱动程序
mov ah,09                 
lea dx,mes2
int 21h
mov ah,1                            ;键盘输入字符
int 21h
cmp al,'y'
je again
cmp al,'n'
je exit
mov ah,2                           ;显示输出字符
mov dh,15
mov dl,0
int 10h
lea dx,cll 
mov ah,9                           ;显示字符串
int 21h
jmp jmp1
exit: mov ah,4ch
int 21h
;===========================================
;Function:InputB
InputB proc near
mov ah,2
mov bh,0
mov dx,0
int 10h
mov ah,09
lea dx,chip
int 21h
mov ah,2
mov bh,0
mov dh,15
mov dl,10
int 10h
mov ah,09h
lea dx,mess
int 21h
mov ah,0ch
mov al,08h
int 21h
wait1:  mov ah,0Bh          ;检查标准输入状态,Al=0(无输入),=0ffh(有输入)
int 21h
cmp al,0
jne wait1
mov ah,2
mov bh,0
mov dh,15
mov dl,10
int 10h
lea dx,cll
mov ah,9
int 21h
mov dh,4
mov dl,18
jmp3:   push dx
mov ah,2
mov bh,0
int 10h
jmp4:   mov ah,7          ;直接控制台输入无回显
int 21h
cmp al,'1'
jne jmp2
mov ah,2
xchg al,dl
int 21h
mov cl,1
mov bl,InA
sal bl,cl
add bl,1
mov InA,bl
jmp jmp5
jmp2:   cmp al,'0'
jne jmp4
mov ah,2
xchg al,dl
int 21h
mov cl,1
mov bl,InA
sal bl,cl
mov InA,bl
jmp5:   pop dx
add dl,5
cmp dl,43
jb jmp3
mov cl,3
mov bl,InA
sal bl,cl
mov InA,bl
ret
InputB endp
;===========================================
;Function:Cls
Cls    proc near
mov ah,6
mov al,0
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,7
int 10h
ret
cls endp
;===========================================
;Function:OutputC
OutputC proc near
mov dx,28ah
in al,dx
mov OutC,al
mov dh,12
mov dl,16
j: push dx
mov ah,2
mov bh,0
int 10h
mov al,OutC
mov bl,01h
and bl,al
mov cl,1
shr al,cl
mov OutC,al
add bl,30h
xchg bl,dl
mov ah,2
int 21h
pop dx
add dl,4
cmp dl,46
jb j
ret
OutputC endp

code    ends
end start

 

;================================================================================


;===========================================
;源程序:   E8251.ASM
;数据及变量初始化
;===========================================
io8253a equ 280h
io8253b equ 283h
io8251a equ 2b8h
io8251b equ 2b9h
;===========================================
;数据段
data segment
mes1 db 'you can play a key on the keybord!',0dh,0ah,24h
mes2 dd mes1
data ends
;===========================================
;代码段及主程序
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,io8253b      ;设置8253计数器0工作方式
mov al,16h             ;端口操作,详细请看后面的程序
out dx,al
mov dx,io8253a
mov al,52            ;给8253计数器0送初值
out dx,al
mov dx,io8251b      ;初始化8251
xor al,al
mov cx,03h            ;向8251控制端口送3个0
delay:  call out1
loop delay
mov al,40h           ;向8251控制端口送40H,使其复位
call out1
mov al,4eh           ;设置为1个停止位,8个数据位,波特率因子为16
call out1
mov al,27h           ;向8251送控制字允许其发送和接收
call out1
lds dx,mes2          ;显示提示信息
mov ah,09h
int 21h
waiti:  mov dx,io8251b
in al,dx
test al,01h           ;发送是否准备好
jz waiti
mov ah,01h            ;是,从键盘上读一字符
int 21h
cmp al,27            ;若为ESC,结束
jz exit
mov dx,io8251a
inc al
out dx,al            ;发送
mov cx,40h
s51:    loop s51       ;延时
next:    mov dx,io8251b
in al,dx
test al,02h           ;检查接收是否准备好
jz next              ;没有,等待
mov dx,io8251a
in al,dx             ;准备好,接收
mov dl,al
mov ah,02h            ;将接收到的字符显示在屏幕上
int 21h
jmp waiti
exit:   mov ah,4ch   ;退出
int 21h
;===========================================
;Function:out1
out1    proc near    ;向外发送一字节的子程序
out dx,al
push cx
mov cx,40h
gg:     loop gg        ;延时
pop cx
ret
out1 endp

code ends
end start

 

;================================================================================
;===========================================
;源程序:  DA_1.ASM
;数据及变量初始化
;===========================================
io0832a equ 290h
;===========================================
;代码段及主程序
code segment
assume cs:code
start:
mov cl,0
mov dx,io0832a
lll:    mov al,cl
out dx,al
inc cl                   ;cl加1
inc cl
inc cl
inc cl
inc cl
inc cl
inc cl
push dx
mov ah,06h               ;判断是否有键按下
mov dl,0ffh
int 21h
pop dx
jz lll                          ;若无则转LLL
mov ah,4ch              ;返回
int 21h
code ends
end start                 ;程序结束

;===========================================
;源程序:  DA_2.ASM
;数据及变量初始化
;===========================================
io0832a equ 290h
;===========================================
;数据段
data segment
sin     db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据
data ends
;===========================================
;代码段及主程序
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
ll:     mov si,offset sin  ;置正弦波数据的偏移地址为SI
mov bh,32  ;一组输出32个数据
lll:    mov al,[si]   ;将数据输出到D/A转换器
mov dx,io0832a
out dx,al
mov ah,06h
mov dl,0ffh
int 21h
jne exit
mov cx,1
delay:  loop delay   ;延时
inc si                                   ;取下一个数据
dec bh
jnz lll                                   ;若未取完32个数据则转lll
jmp ll
exit: mov ah,4ch                   ;退出
int 21h
code ends
end start

;================================================================================


;===========================================
;源程序: AD_1.ASM
;数据及变量初始化
;===========================================
io0809a equ 298h
;===========================================
;代码段及主程序
code segment
assume cs:code
start:
mov dx,io0809a         ;启动A/D转换器
out dx,al
mov cx,0ffh              ;延时
delay: loop delay
in al,dx                     ;从A/D转换器输入数据
mov bl,al                  ;将AL保存到BL
mov cl,4
shr al,cl                    ;将AL右移四位
call disp                    ;调显示子程序显示其高四位
mov al,bl
and al,0fh
call disp                    ;调显示子程序显示其低四位
mov ah,02
mov dl,20h               ;加回车符
int 21h
mov dl,20h
int 21h
push dx
mov ah,06h             ;判断是否有键按下
mov dl,0ffh
int 21h
pop dx
je start                   ;若没有转START
mov ah,4ch             ;退出
int 21h
;===========================================
;Function:disp
disp proc near         ;显示子程序
mov dl,al
cmp dl,9                 ;比较DL是否>9
jle ddd                   ;若不大于则为'0'-'9',加30h为其ASCII码
add dl,7                 ;否则为'A'-'F',再加7
ddd:    add dl,30h   ;显示
mov ah,02
int 21h
ret
disp endp

code ends
end start

;===========================================
;源程序: AD_2.ASM
;数据及变量初始化
;===========================================
io0809b equ 299h
;===========================================
;代码段及主程序
code segment
assume cs:code
start:  mov ax,0012h        ;设屏幕显示方式为VGA 640X480模示
int 10h
start1: mov ax,0600h
int 10h                           ;清屏
and cx,0                         ;cx为横坐标
draw:   mov dx,io0809b    ;启动A/D转换器通道1
out dx,al
mov bx,200                    ;延时
delay:  dec bx
jnz delay
in al,dx                          ;读入数据
mov ah,0
mov dx,368                   ;dx为纵坐标
sub dx,ax
mov al,0ah                    ;设置颜色
mov ah,0ch                   ;画点
int 10h
cmp cx,639                   ;一行是否满
jz start1                        ;是则转start
inc cx                           ;继续画点
push dx
mov ah,06h                   ;是否有键按下
mov dl,0ffh
int 21h
pop dx
je draw                         ;无,则继续画点
mov ax,0003                 ;有恢复屏幕为字符方式
int 10h
mov ah,4ch                   ;返回
int 21h
code ends
end start

 

;================================================================================


;===========================================
;源程序:  LED1.ASM
;数据及变量初始化
;===========================================
io8255a equ 288h
io8255b equ 28bh
;===========================================
;数据段
data segment
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
mesg1 db 0dh,0ah,'Input a num (0--9),other key is exit:',0dh,0ah,'$'
data ends
;===========================================
;代码段及主程序
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,io8255b               ;使8255的A口为输出方式
mov ax,80h     
out dx,al
sss: mov dx,offset mesg1   ;显示提示信息
mov ah,09h
int 21h
mov ah,01h                       ;从键盘接收字符
int 21h
cmp al,'0'                         ;是否小于0
jl exit                               ;若是则退出
cmp al,'9'                         ;是否大于9
jg exit                             ;若是则退出
sub al,30h                       ;将所得字符的ASCII码减30H
mov bx,offset led             ;bx为数码表的起始地址
xlat                                ;求出相应的段码
mov dx,io8255a               ;从8255的A口输出
out dx,al
jmp sss                            ;转SSS
exit: mov ah,4ch              ;返回
int 21h
code ends
end start


;===========================================
;源程序:  LED2.ASM
;数据及变量初始化
;===========================================
io8255a equ 28ah
io8255b equ 28bh
io8255c equ 288h
;===========================================
;数据段
data segment
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码
buffer1 db 6,5             ;存放要显示的个位和十位
bz dw ?                    ;位码
data ends
;===========================================
;代码段及主程序
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,io8255b                ;将8255设为A口输出
mov al,80h
out dx,al
mov di,offset buffer1        ;设di为显示缓冲区
loop2:  mov bh,02
lll:    mov byte ptr bz,bh
push di
dec di
add di, bz
mov bl,[di]                       ;bl为要显示的数
pop di
mov al,0
mov dx,io8255a
out dx,al
mov bh,0
mov si,offset led               ;置led数码表偏移地址为SI
add si,bx                         ;求出对应的led数码
mov al,byte ptr [si]
mov dx,io8255c               ;自8255A的口输出
out dx,al
mov al,byte ptr bz            ;使相应的数码管亮
mov dx,io8255a
out dx,al
mov cx,3000
delay:  loop delay             ;延时
mov bh,byte ptr bz
shr bh,1
jnz lll
mov dx,0ffh
mov ah,06h                     ;6号调用
int 21h
je loop2                        ;有键按下则退出
mov dx,io8255a
mov al,0                        ;关掉数码管显示
out dx,al
mov ah,4ch                    ;返回
int 21h
code ends
end start


;===========================================
;源程序: LED3.ASM
;数据及变量初始化
;===========================================
io8255a equ 28ah
io8255b equ 28bh
io8255c equ 288h
;===========================================
;数据段
data segment
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码
buffer1 db 0,0               ;存放要显示的十位和个位
bz dw ?                        ;位码
data ends
;===========================================
;代码段及主程序
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,io8255b                 ;将8255设为A口输出
mov al,80h
out dx,al
mov di,offset buffer1          ;设di为显示缓冲区
loop1:  mov cx,030h           ;循环次数
loop2:  mov bh,02
lll:    mov byte ptr bz,bh
push di
dec di
add di, bz
mov bl,[di]                       ;bl为要显示的数
pop di
mov bh,0
mov si,offset led              ;置led数码表偏移地址为SI
add si,bx                         ;求出对应的led数码
mov al,byte ptr [si]
mov dx,io8255c              ;自8255A的口输出
out dx,al
mov al,byte ptr bz          ;使相应的数码管亮
mov dx,io8255a
out dx,al
push cx
mov cx,100
delay: loop delay            ;延时
pop cx
mov al,00h
out dx,al
mov bh,byte ptr bz
shr bh,1
jnz lll
loop loop2                   ;循环延时
mov ax,word ptr [di]
cmp ah,09h                  
jnz set
cmp al,09h
jnz set
mov ax,0000
mov [di],al
mov [di+1],ah
jmp loop1
set:    mov ah,01h
int 16h
jne exit                      ;有键按下则转exit
mov ax,word ptr [di]
inc al
aaa
mov [di],al                 ;al为十位
mov [di+1],ah            ;ah中为个位
jmp loop1
exit:   mov dx,io8255a
mov al,0                   ;关掉数码管显示
out dx,al
mov ah,4ch              ;返回
int 21h
code ends
end start

 

;================================================================================

    还有十几个呢,可是没时间发表,忙啊, 空闲的时候再跟大家分享呢!!!!!MicroAC

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值