霓虹灯模拟控制器 汇编课程设计
霓虹灯模拟控制器
汇编课程设计
............
摘要
1
前言
2
关键器件和设备
3
设计内容
4
单片机介绍
4.1概述
4.2
单片机内部逻辑结构
4.3引脚功能说明
5
硬件设计
5.1
时钟电路
5.2
复位电路
5.3
主控模块电路设计
6
软件设计
6.1
程序流程图设计
6.2
延时子程序设计
6.3
汇编语言程序
总结
致谢
参考文献
data segment
io8255a equ 288H
io8255b equ 289H
io8255c equ 28AH
io8255t equ 28BH
data ends7
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,io8255t 控制端口
mov al,81H 设置8255为A口输出
out dx,al
mov dx,io8255a
mov al,00H 设置8个灯全灭
out dx,al
mo:mov dx,io8255c
in al,dx
cmp al,01h
jz k1
cmp al,02h
jz k2
cmp al,04h
jz k3
jmp theend
k1: jmp l1
k2: jmp l2
k3: jmp l3
l1:
call deng
l2:
mov dx,io8255a
mov al,01h
out dx,al
l3:
mov dx,io8255a
mov al,00h
out dx,al
theend:
mov al,00h
mov dx,io8255a
out dx,al
jmp mo
deng proc
mov dx,io8255a 数据端口
mov al,01H 1号灯
out dx,al
call delay延迟1秒
mov al,04H 3号灯
out dx,al
call delay延迟1秒
mov al,10H 5号灯
out dx,al
call delay延迟1秒
mov al,40H 7号灯
out dx,al
call delay延迟1秒
mov cl,5
return1:mov al,55H 1,3,5,7号灯
out dx,al
call sdelay延迟1秒
mov al,00H
out dx,al
call sdelay延迟1秒
loop return1
mov al,02H 2号灯
out dx,al
call delay延迟1秒
mov al,08H 4号灯
out dx,al
call delay延迟1秒
mov al,20H 6号灯
out dx,al
call delay延迟1秒
mov al,80H 8号灯
out dx,al
call delay延迟1秒
mov cl,5
return2:mov al,0AAH 2,4,6,8号灯
out dx,al
call sdelay延迟1秒
mov al,00H
out dx,al
call sdelay延迟1秒
loop return2
deng endp
delay proc 延迟1秒的子程序
push cx
mov bx,10000
again1:mov cx,2801
wait0:loop wait0
dec bx
jnz again1
pop cx
ret
delay endp
sdelay proc 延迟0.1秒的子程序
push cx
mov bx,1000
again2:mov cx,2801
wait1:loop wait1
dec bx
jnz again2
pop cx
ret
sdelay endp
code ends
end start
Code Segment
Assume CS:Code,DS:Code
-----------------------------------------
功能:显示指定地址(Str_Addr)的字符串
入口:
Str_Addr=字符串地址(要求在数据段)
用法: Output Str_Addr
用法举例:Output PromptStr
Output MACRO Str_Addr
push dx
lea dx,Str_Addr
mov ah,9
int 21h
pop dx
EndM
-----------------------------------------
功能:输出一个字符
入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
-----------------------------------------
功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
-----------------------------------------
功能:取光标位置
入口:无
出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
-----------------------------------------
功能:置光标位置
入口:Cursor_Row=行坐标Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
-----------------------------------------
功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
入口:AL
出口:AL=转换后的ASCII码
AL_ASCII Proc Near
cmp al,10 AL<10?
jb @@To_ASCII AL<10,按数字处理
add al,7 AL>=10,按大写字母处理
@@To_ASCII: add al,'0' 转换成相应的数字或大写字母
ret
AL_ASCII EndP
-----------------------------------------
功能:将AL中的字节数据转换成十六进制显示的ASCII码
入口:AL
出口:AX=转换后的ASCII码
Byte_ASCII Proc Near
push cx
mov cx,4
xor ah,ah 将AH置0
shl ax,cl 将AX左移4位
shr al,cl 将AL右移4位
xchg ah,al
call AL_ASCII 调用子程序,将AL中的值转换成相应的ASCII码
xchg ah,al
call AL_ASCII
xchg ah,al
pop cx
ret
Byte_ASCII EndP
-----------------------------------------
功能:将AL中的字节数据转换成十六进制显示的ASCII码,并在当前光标位置显示
入口:AL
出口:AX=转换后的ASCII码
ByteD_ASCII Proc Near
push dx
push ax
call Byte_ASCII 将AL中的字节数转换成十六进制显示的ASCII码
cmp al,'9'
jbe $+7
mov dl,'0'
call Output_Chr 显示一个字符
mov dl,al
call Output_Chr 显示一个字符
mov dl,ah
call Output_Chr 显示一个字符
mov dl,'H'
call Output_Chr 显示一个字符
pop ax
pop dx
ret
ByteD_ASCII EndP
-----------------------------------------
功能:将AX中的字数据转换成十六进制显示的ASCII码,并在当前光标位置显示
入口:AX
WordD_ASCII Proc Near
push dx
push ax
push ax
xchg ah,al
call Byte_ASCII 将AL中的字节数转换成十六进制显示的ASCII码
cmp al,'9'
jbe $+7
mov dl,'0'
call Output_Chr 显示一个字符
mov dl,al
call Output_Chr 显示一个字符
mov dl,ah
call Output_Chr 显示一个字符
pop ax
call Byte_ASCII 将AL中的字节数转换成十六进制显示的ASCII码
mov dl,al
call Output_Chr 显示一个字符
mov dl,ah
call Output_Chr 显示一个字符
mov dl,'H'
call Output_Chr 显示一个字符
pop ax
pop dx
ret
WordD_ASCII EndP
-----------------------------------------
功能:输入内存单元的段地址或偏移地址
入口参数:无
出口参数:若直接回车(没有输入地址)或地址中含有无效字符,进位标志置位;
否则,进位标志清位,BX=有效地址
Input_Addr Proc Near
lea dx,Buffer 字符串缓冲区地址
mov ah,0ah
int 21h
lea si,Buffer[1] 实际输入的字符数地址
lodsb 读入实际输入的字符数
test al,0ffh
jz @@Invalid
xor bx,bx 有效地址初值
mov cl,al
xor ch,ch
@@Checking: lodsb 读入一个字符
cmp al,'0' 字符<'0'?
jb @@Letter 是,判断是否字母
cmp al,'9' 字符<='9'?
jbe @@Valid 是,累加有效地址
@@Letter: mov ah,al
and ah,0dfh
cmp ah,'A' 字符<'A'?
jb @@Invalid 是,无效字符
cmp ah,'Z' 字符<'Z'?
ja @@Invalid 是,无效字符
@@Valid: and al,0fh
push cx
mov cx,4
shl bx,cl 有效地址左移4位
or bl,al 加上低4位
pop cx
loop @@Checking 下一位
clc 进位标志清位
ret
@@Invalid: stc 进位标志置位
ret
Input_Addr EndP
-----------------------------------------
Segment_Str db 'Please input a segment address(heximal): $'
Offset_Str db 13,10,'Please input a offset address(heximal): $'
Memory_Addr dd ? 内存地址。偏移地址在前、段地址在后
Press_Key db 7,13,10,13,10,'Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es 使数据段、附加段与代码段同段
cld
Output Segment_Str 提示输入段地址
call GetCursor 取光标位置
@@Segment: call SetCursor 置光标位置
call Input_Addr 输入地址
jc @@Segment 若地址无效,重新输入
mov word ptr Memory_Addr[2],bx 保存段地址
Output Offset_Str 提示输入偏移地址
call GetCursor
@@Offset: call SetCursor
call Input_Addr
jc @@Offset
mov word ptr Memory_Addr,bx 保存偏移地址
call Output_CTLF 输出一个回车、换行
call Output_CTLF
mov dl,'['
call Output_Chr
mov ax,word ptr Memory_Addr[2] 取内存单元段地址
call WordD_ASCII 将AX中的字数据转换成十六进制显示的ASCII码,并在当前光标位置显示
mov dl,':'
call Output_Chr
mov ax,word ptr Memory_Addr 取内存单元偏移地址
call WordD_ASCII
mov dl,']'
call Output_Chr
mov dl,'='
call Output_Chr
lds si,Memory_Addr 装入有效地址
lodsb 读入这个内存单元的一个字节
push cs
pop ds
call ByteD_ASCII 将AL中的字节数据转换成十六进制显示的ASCII码
Exit_Key: Output Press_Key
mov ah,1
int 21h
Exit_Proc: mov ah,4ch 结束程序
int 21h
Buffer db 5 段地址、偏移地址输入缓冲区
Code ENDS
END Start 编译到此结束
在屏幕左上角或右下角显示数字电子表,格式为:时:分:秒;
2.
整点报时
1.
功能设计(功能模块及模块图)
2.
要用文字说明各主模块的功能。
3.
详细设计
3.1设计方法:各功能模块主要关键技术的运用,计算公式,实现方法(文字表述)
3.2各功能模块程序的流程图;
3.3本设计的重点、难点及解决方法。
4.
总结(体会)
5.
参考文献
6.
附:源程序。