西南交大微机实验代码

更新时间:2023-09-07 07:53:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验2

开关实验:

io8255a equ 288h

io8255c equ 28ah

io8255z equ 28bh

code segment

assume cs:code

start:

mov dx,io8255z

mov al,8bh

out dx,al

inout:

mov dx,io8255c

in al,dx

mov dx,io8255a

out dx,al

mov dl,0ffh

mov ah,06h

int 21h

jz inout

mov ah,4ch

int 21h

code ends

end start

交通灯控制实验:

data segment

io8255c equ 28Ah

io8255z equ 28Bh

portc1 db 21h

db 81h,01h,81h,01h,81h,01h,81h,01h,81h,01h,81h,01h

db 44h

db 42h,40h,42h,40h,42h,40h,42h,40h,42h,40h,42h,40h

db 0ffh

data ends

code segment

assume cs:code,ds:data

start:

mov ax,data

mov ds,ax

mov dx,io8255z

mov al,90h

out dx,al

mov dx,io8255c

re_on:

mov bx,0;

on:

mov al,portc1[bx]

cmp al,0ffh

jz re_on

out dx,al

inc bx

mov cx,200

test al,24h

jz de1

mov cx,10000

de1: mov di,9000

de0:

dec di

jnz de0

loop de1

push dx

mov ah,06h

mov dl,0ffh

int 21h

pop dx

jz on

exit:mov ah,4ch

int 21h

code ends

end start

七段数码管静态显示实验:

io8255a equ 288h

io8255z 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,io8255z

mov ax,80h

out dx,al

sss:

mov dx,offset mesg1

mov ah,09h

int 21h

mov ah,01

int 21h

cmp al,’0’

jl exit

cmp al,’9’

jg exit

sub al,30h

mov bx,offset led

xlat

mov dx,io8255a

out dx,al

jmp sss

exit:

mov ah,4ch

int 21h

code ends

end start

数码管循环显示00—99

data segment

io8255a equ 288h

io8255b equ 289h

io8255c equ 28ah

io8255z equ 28bh

led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh

buffer1 db 0,0

bz dw 01,00

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,0300h;循环次数

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,3000 ;若显示过快,可更改cx值最大为0ffffh

delay: loop delay ;延时

pop cx

mov bh,byte ptr bz

shr bh,1

jnz lll

loop loop2 ;循环延时

mov ax,word ptr[di]

mov ah,01

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;返回DOS

int 21h

code ends

end start

键盘接口实验(行扫描法)

data segment

io8255a equ 288h

io8255c equ 28ah

io8255z equ 28bh

key db 37h,38h,39h,41h,54h,52h

db 34h,35h,36h,42h,53h,4dh

db 31h,32h,33h,43h,48h,4ch

db 30h,46h,45h,44h,58h,4eh

data ends

code segment

assume cs:code,ds:data

start:

mov ax,data

mov ds,ax

lp0:

mov dx,io8255z

mov al,90h

out dx,al

mov di,0

mov si,0

mov al,0

mov dx,io8255c

out dx,al

mov dx,io8255a

in al,dx

and al,00111111b

cmp al,00111111b

jz lp0

call delay

mov al,0

mov dx,io8255c

out dx,al

mov dx,io8255a

in al,dx

and al,00111111b

cmp al,00111111b

jz lp0

call delay

ABC: mov al,0

mov dx,io8255c

out dx,al

mov dx,io8255a

and al,00111111b

cmp al,00111111b

jz ABC

call delay

mov ah,11111110b;仅使A0输出0

mov cx,4;共四条行线

BCA: mov al,ah

mov dx,io8255c

out dx,al;输出行值

mov dx,io8255a

in al,dx;读入列值

and al,00111111b;保留低4位有效值

cmp al,00111111b;判断A0行是否有键按下

mov bl,al;有键按下,确定该键的值

rol ah;本行无键按下则继续查找下一行,循环左移(使下一行输出0)

loop BCA

jmp ABC

realy: mov dx,io8255c

in al,dx

nop

nop

nop

and al,0fh

cmp al,0fh

jnz realy

mov cx,4

mov al,bl

lp1: shr al,1

jnc lp2

inc di

loop lp1

lp2:

mov cx,6

mov al,ah

lp20:

shr al,1

jnc lp3

loop lp20

lp3:

mov bx,di

mov al,6

mul bl

add ax,si

disp:

mov bx,offset key

xlat

mov dh,0

mov dl,al

mov ah,2

int 21h

jmp lp0

exit:

mov ah,4ch

int 21h

delay proc near

push cx

mov cx,20h

l1: loop l1

pop cx

ret

delay endp

code ends

end start

3.1 脉冲个数记录实验

timer_ctl equ 283h

timer0 equ 280h

io8255z equ 28bh

io8255c equ 28ah

code segment

assume cs:code

start:

mov dx,io8255z

mov al,80h

out dx,al

mov al,00010000b

mov dx,timer_ctl

out dx,al

mov dx,timer0 3 实验

out dx,al

display:

mov al,00000000b

mov dx,timer_ctl

out dx,al

mov dx,timer0

in al,dx

mov bl,al

mov al,9

sub al,bl

mov dx,io8255c

out dx,al

mov ah,06h

mov dl,0ffh

int 21h

jz display

mov ah,4ch

int 21h

code ends

end start

3.2 可编程时钟发生器实验

timer_ctl equ 283h

timer0 equ 280h

timer1 equ 281h

mode03 equ 36h

mode12 equ 76h

code segment

assume cs:code

start:

mov dx,timer_ctl

mov al,mode03

out dx,al

mov dx,timer0

mov ax,500

out dx,al

mov al,ah

out dx,al

mov dx,timer_ctl

mov al,mode12

mov dx,timer1

mov ax,500

out dx,al

mov al,ah

out dx,al

mov ah,4ch

int 21h

code ends

end start

3.3 继电器实验

timer0 equ 280h

timer1 equ 281h

timerctl equ 283h

io8255a equ 288h

io8255z equ 28bh

code segment

assume cs:code

start:

mov dx,io8255z

mov al,90h

out dx,al

ll1:

mov al,0

out dx,al

call delay

mov al,1

out dx,al

call delay

jmp ll1

delay proc near

push dx

mov dx,timerctl

mov al,36h

out dx,al

mov dx,timer0

mov ax,1000

out dx,al

mov al,ah

out dx,al

mov dx,timerctl

mov al,70h

mov dx,timer1

mov ax,500

out dx,al

mov al,ah

out dx,al

ll2:

mov ah,06

mov dl,0ffh

int 21h

jne exit

mov dx,io8255a

in al,dx

and al,01

jz ll2

pop dx

ret

exit:

mov ah,4ch

int 21h

delay endp

code ends

end start

3.4 电子琴

data segment

io8255a equ 288h

io8255z equ 28bh

timer0 equ 280h

timerctl equ 283h

table dw 524,588,660,784,880,988,1048 ;高音的

;table dw 262,294,330,347,392,440,524 ;低音的

msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'

data ends

code segment

assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

mov dx,offset msg

mov ah,9

int 21h

sing:

mov ah,7

int 21h

cmp al,1bh

je finish

cmp al,'1'

jl sing

cmp al,'8'

jg sing

sub al,32h

shl al,1

mov bl,al

mov bh,0

mov ax,4240H

mov dx,0FH

div word ptr[table+bx]

mov bx,ax

mov dx,timerctl

mov al,00110110B

out dx,al

mov dx,timer0

mov ax,bx

out dx,al

mov al,ah

out dx,al

mov dx,io8255z

mov al,10000000B

out dx,al

mov dx,io8255a

mov al,03h

out dx,al

call delay

mov al,0h

out dx,al

jmp sing

finish:

mov ax,4c00h

int 21h

delay proc near

push cx

push ax

mov ax,15

x1: mov cx,0ffffh

x2: dec cx

jnz x2

dec ax

jnz x1

pop ax

pop cx

ret

delay endp

code ends

end start

3.5 演奏乐曲实验

data segment

io8255a equ 288h

io8255z equ 28bh

timer0 equ 280h

timerctl equ 283h

;table dw 524,588,660,698,784,880,998,1048

table dw 262,294,330,347,392,440,494,524

;music_dataxxx db 1,1,5,5,6,6,5,4,4,3,3,2,2,1,5,5,4,4,3,3,2,5,5,4,4,3,3,2,1,1,5,5,6,6,5,4,4,3,3,,2,2,1 music_datalzlh db 1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,2,5,1,2,5,1

mus_t1 db

50,50,50,100,50,50,50,100,50,50,25,50,50,25,15,15,15,15,50,25,15,15,15,15,50,25,50,75,50,50,70,50

;mus_t db

50,50,50,50,50,50,50,100,50,50,50,50,50,50,50,100,50,50,50,50,50,50,50,100,50,50,50,50,50,50,50,100,50,50,50,50,50,50,50,100,50,50,50,50,50,50,50,100

msg db 'xiao xing xing:',0dh,0ah,'$'

data ends

code segment

assume cs:code,ds:data

start:

mov ax,data

mov ds,ax

mov dx,offset msg

mov ah,9

int 21h ;tishi

mov bx,0

push bx

sing:

pop bx

; mov si,offset music_dataxxx

mov si,offset music_datalzlh

add si,bx

push bx

mov al,byte ptr[si] ; que pu zhi

;cmp al,'1'

;jl sing

;cmp al,'8'

;jg sing

;sub al,31h

shl al,1

mov bl,al

mov bh,0

mov ax,4240h

mov dx,0fh

div word ptr[table+bx]

mov bx,ax

mov dx,timerctl

mov al,00110110B

out dx,al

mov dx,timer0

mov ax,bx

out dx,al

mov al,ah

out dx,al

mov dx,io8255z ;she zhi 8255

mov al,10000000B

out dx,al

mov dx,io8255a

out dx,al

lea si,mus_t1

;lea si,mus_t ;diao yon shi jian biao

mov bx,[si]

call MUS_D

;out dx,al

call delay

mov al,0h

out dx,al ;guan yang sheng qi

pop bx

cmp bx,42

je hehe

add bx,1

push bx

jmp sing

hehe:

mov bx,0

push bx

jmp sing

finish:

mov ax,4c00h

int 21h

MUS_D proc

Leng:

mov cx,2081

delay1: Loop delay1

dec bx

jnz Leng

ret

MUS_D endp

delay proc near

push cx

push ax

x1:mov cx,0ffffh

x2:dec cx

jnz x2

dec ax

jnz x1

pop ax

pop cx

ret

delay endp

code ends

end start

int00 equ 288h

int01 equ 289h

io8255c equ 282h

io8255z equ 283h

N equ 7

code segment

assume cs:code

start:

call I8255

cli

mov bx,0

call WRITE0B

call I8259

mov cl,0

sti

l1:

cmp cl,N

jnz l1

mov ah,4ch

int 21h

INT_SERVICE PROC

push dx

; mov dx,io8255c

;mov al,0FFH

;out dx,al

inc bx

mov al,bl

mov ah,bh

mov dx,io8255c 4 实验

NOP

NOP

NOP

mov al,20h

out 20h,al

NOP

pop dx

iret

NT_SERVICE ENDP

WRITE0B PROC

mov ax,code

mov ds,ax

mov dx,offset INT_SERVICE

mov ax,250bh

int 21h

ret

WRITE0B ENDP

I8255 PROC

mov al,80h

mov dx,io8255z

out dx,al

ret

I8255 ENDP

I8259 PROC

mov al,00010011b

mov dx,int00

out dx,al

mov al,8

mov dx,int01

out dx,al

mov al,00000001b

out dx,al

mov al,0

out dx,al

in al,21h

and al,0f7h

out 21h,al

ret

I8259 ENDP

code ends

end start

实验5

锯齿波:

io0832a equ 290h

code segment

assume cs:code

start:

mov cl,0

mov dx,io0832a

ll1:

mov al,cl

out dx,al

add cl,1

push dx

mov ah,06h ;判断是否有键按下 mov dl,0ffh

int 21h

pop dx

jz ll1

mov ah,4ch

int 21h

code ends

end start

正弦波:

data segment

io0832a equ 290h

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

l1:

mov si,offset sin

mov bh,32

ll1:

mov al,[si]

mov dx,io0832a

out dx,al

mov ah,06h ;判断是否有键按下

mov dl,0ffh

int 21h

jne exit

mov cl,1

delay: loop delay

inc si

dec bh

jnz ll1

jmp l1

exit:

mov ah,4ch

int 21h

code ends

end start

直流电机转速控制:

data segment

io8032a equ 290h

io8255c equ 282h

io8255z equ 283h

data ends

code segment

assume cs:code,ds:data

start:

mov ax,data

mov ds,ax

mov al,85h ;8255初始化

mov dx,io8255z

out dx,al

lp1: mov dx,io8255c ;开关值赋给cx作为循环次数 in al,dx

mov ah,0

mov cx,ax

lp2: mov al,0ffh

mov dx,io8032a

out dx,al

mov ah,06h ;判断是否有键按下 mov dl,0ffh

int 21h

jne exit

loop lp2

lp3: mov cx,32

lp4: mov al,80h

mov dx,io8032a

out dx,al

mov ah,06h ;

mov dl,0ffh

int 21h

jne exit

loop lp4

jmp lp1

exit: mov ah,4ch

int 21h

code ends

end start

数模转换

io0809a equ 298h

code segment

assume cs:code

start:mov dx,io0809a

out dx,al

mov cx,0ffh

delay:loop delay

in al,dx

mov bl,al

mov cl,4

shr al,cl

call disp

mov al,bl

and al,0fh

call disp 判断是否有键按下 实验六

本文来源:https://www.bwwdw.com/article/ch9h.html

Top