汇编课程设计1,汇编课程设计电子时钟数码管只显示一位
汇编课程设计----可编程作息时间控制器,200分求完整代码
主程序: 在程序开始时,首先初始化,设置中断0源允许、总允许为一,两个定时器的工作模式为一模式,整个程序由P2.6接低电平时启动,启动后,进入A段工作。在A短工作中调用显示子程序,A段工作完时进入B段工作,每段工作时都要调用显示子程序,,最后一段工作完时,关闭显示,即对P2送入0FFH
显示子程序:首先,对定时器赋初值,然后进行拆字,拆字采用除以十进行,除以十后,分别把商和余数送到显缓单元,再查七段码,把七段码送到P1,送字位口到P2口,进行动态显示,每次显示一位时延时255个指令周期(即FFH个指令周期),四位显示完后,再进行多次扫描,保证人眼看不到闪烁,最后判断设定的工作时间到没,到了几跳出显示子程序。
中断程序:进入中断后输出报警信号,同时显示器全部显示0,,最后跳出中断。
四:程序及其说明:
1.程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP BAOJING
ORG 0010H
;初始化程序
MAIN:SETB EA ;设置中断
SETB EX0
CLR IT0
MOV TMOD,#11H ;设置定时器工作模式
SETB P3.4 ;驱动继电器
SETB P3.5
SETB P3.6
SETB P3.7
HERE:JB P2.6,HERE ;判断是否启动
;进入工作阶段
GONGZUO:MOV 41H,#0AH ;工作于A段
MOV R7,#0AH ;A段工作时间
CLR P3.4 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.4 ;关断外部驱动
MOV 41H,#0BH ;工作于B段
MOV R7,#14H ;B段工作时间
CLR P3.5 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.5 ;关断外部驱动
MOV 41H,#0CH ;工作于C段
MOV R7,#1EH ;C段工作时间
CLR P3.6 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.6 ;关断外部驱动
MOV 41H,#0DH ;工作于D段
MOV R7,#28H
CLR P3.7 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.7 ;关断外部驱动
MOV P2,#0FFH ;关显示
LJMP HERE ;返回判断处,确定是否继续工作
;中断报警程序
BAOJING: MOV P2.4,#00H ;指示灯亮
Mov P2.5,#00H
MOV TL0,#0E0H ;定时20ms
MOV TH0,#0B1H
SETB TR0 ;启动定时
LP:MOV P1,#3FH ; 全部显示为零
MOV P2,#00H
MOV P2.5,#00H ;扬声器工作
JNB TF0,LP ;查询定时时间到否
SETB P2.4 ;关指示灯
SETB P2.5 ;关扬声器
RETI
;显示子程序
ORG 0F00H
SCAN: MOV 42H,#0EH ;“—”(横线)的七段码
MOV R1,#32H ;延时常数
MOV TL1,#0E0H ;定时20ms的常数
MOV TH1,#0B1H
LP1: MOV A,R7 ;拆字程序(采用除法拆字)
MOV B,#10
DIV AB
MOV 43H,A ;送显缓单元
MOV 44H,B
LP2: MOV R0,#41H ;设置显缓的初始单元
MOV R4,#0FFH ;延时常数
MOV R5,#0FEH ;送字位口
LP3: MOV A,@R0
MOV P2,#0FFH ;关显示
MOV DPTR,#TAB ;查七段码、显示
MOVC A,@A+DPTR
MOV P1,A
MOV P2,R5
LP4: DJNZ R4,LP4
INC R0 ;修改指针
MOV A,R5 ;改变显示单元
RL A
MOV R5,A
JB ACC.4,LP3 ;判断四位是否显示完
SETB TR1 ;启动定时器
JNB TF1,LP2 ;判断定时时间是否到
DJNZ R1,LP2 ;延时一秒是否到
DJNZ R7,LP1 ;判断设定时间是否到
RET
ORG 10FFH
;七段码表单
TAB: DB 3FH ,06H,5BH, 4FH, 66H,6DH , 7DH
DB 07H, 7FH,6FH,77H, 7CH,39H, 5EH, 40H
2.说明:
主程序:设整个系统工作有四个阶段,分为ABCD段,每段工作时间设为10S、20S、30S、40S,在程序的初始化阶段设定定时器的工作模式、中断允许,程序的运行由单片机的P2.6脚接低电平启动,进入工作阶段,在每个工作阶段显示工作段数和剩余工作时间。
在A段工作时,把“A”这个字符送达41H显缓单元,再设定A段的工作时间,送到R7寄存器中,设定对应的输出脚的工作电平值,然后调显示子程序,A段工作完毕,关闭对应的驱动输出脚。
B、C、D段工作均和A段工作相似,只是驱动不同的输出对象,最后一段工作完后,对P2口赋值高电平,关所有的显示,最后跳回判断处,判断是否继续工作。
显示子程序:在显示子程序中因为每段工作时,均要显示“—”,所以在开始时把“—”的对应序号(在本程序的七段码表中对应的序号为0EH)送到显缓单元,对定时器T1定时20ms进行赋初值,计算初值的公式为:
T1初值=2^n-fosc/12×t
由于定时器工作在1模式,振荡频率为12MHZ,所以计时器T1的初值为:E0B1(十六进制)
将设定的时间进行拆字,然后送到显缓单元。拆字采用除法的方式进行,将定时时间送到寄存器A中,然后在B中送常数10,经过相除后在寄存器A中得到高位送到显缓43H中,在寄存器B中得到低位送到显缓44H单元中,显缓单元指针首先指向显缓首地址,通过变址寻址方式查询对应的七段码送到P1口(字形口),对P2口送入字位口,每个显示位显示后经过延时255指令周期再进入下一步工作。每位显示完后,修改显示单元的指针,对指针单元的当前值自加一,然后对字位口进行左移,修改显示单元,再进行判断四位是否显示完,即判断字位口的第五位是否为1,若为1,则程序转移,继续显示;若为0,则依次执行。四位显示完后,启动定时器1,定时20ms,查询TF1的值,若TF1为0,则在此等待,若TF1为1,则R1自减1并判断是否为0,若不为0,则转移到显示部分,若为0,则顺序执行(即判断1S到否);1S到则R7自减1并判断R7是否为0,若不为0,转移到拆字部分,若为0,则跳出调用(即判断每段工作时间到设定时间没有)。
中断程序:若外部出现故障(外部故障用P3.2接低电平表示),P2.4、P2.5接低电平(即输出报警信号,指示灯亮,扬声器发出声音),对定时器定T0时20ms赋初值,计算公式为:
T0初值=2^n-fosc/12×t
由于定时器工作在1模式,振荡频率为12MHZ,所以计时器T1的初值为:E0B1(十六进制)
对P1口送入“0”的七段码,P2口送入00,每个显示单元全部显示为0,启动定时器,若定时时间没有到,则转到显示处,继续让全部显示0,,若时间到,则对P2.4、P2.5全部送入高电平,关闭报警提示,中断返回。
七段码表单:将要显示的数码或字母的七段码按在日常生活中的默认顺序定义在一个表单中,通过把表单的首地址付给DPTR,再把需要显示的数字或字母的对应序号送到寄存器A中,通过变址寻址的方式(即MOVC指令)即可查出对应的七段码。
微机原理汇编语言课程设计 中的LED 灯显示控制代码怎么写?
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
霓虹灯模拟控制器 汇编课程设计
霓虹灯模拟控制器
汇编课程设计
............
摘要
1
前言
2
关键器件和设备
3
设计内容
4
单片机介绍
4.1概述
4.2
单片机内部逻辑结构
4.3引脚功能说明
5
硬件设计
5.1
时钟电路
5.2
复位电路
5.3
主控模块电路设计
6
软件设计
6.1
程序流程图设计
6.2
延时子程序设计
6.3
汇编语言程序
总结
致谢
参考文献
汇编语言电子时钟的课程设计
;name: ELECTRONIC CLOCK
data segment
mess1 db ' ****************ASM ASSIGNMENT**************** ',0ah,0dh
db ' ',0ah,0dh
db ' ***************ELECTRONIC CLOCK*************** ',0ah,0dh
db ' ',0ah,0dh
db ' ',0ah,0dh
db ' *******Press C or c to correct the time******* ',0ah,0dh
db ' ',0ah,0dh
db ' ***********Press ESC button to exit*********** ',0ah,0dh,'$'
tn db 'Please input the new time (hh:mm:ss):',0dh,0ah,'$'
mess2 db '*******Time is:',0ah,0dh,'$'
t_buff db 40 ;在数据段开一段时间显示缓冲区
db ?
db 40 dup (?)
hor db ?
min db ?
sec db ?
fg db 0
data ends
stack segment
db 100 dup(?)
stack ends
code segment
assume cs:code,ss:stack,ds:data ;确定各个逻辑段的类型
start:
call clear ;调用清屏子程序
display: ;时间显示部分
mov ax,data
mov ds,ax
mov bx,offset t_buff ;送t_buff的偏移地址到BX
mov ah,2ch ;调用DOS时间调用功能,功能号:2cH,小时,分钟,秒数分别保存在CH,CL,DH中
int 21h
mov al,ch ;小时数设定
mov ah,0
call bctd ;调用进制转换子程序
push ax
and al,0f0h ;选取al高四位
mov cl,4 ;设置右循环的次数
rol al,cl ;右循环
or al,30h ;加30h得到ACSII码
mov [bx],al ;将得到的结果送到t_buff缓冲区
inc bx ;BX自加1,指针指向下一个缓冲区的下一个地址
pop ax
and al,0fh ;选取低四位
or al,30h
mov [bx],al ;将转换后的低四位值送入缓冲区的第二个地址
inc bx
;----------------------------------------------------------
mov al,':' ;显示分隔符号
mov [bx],al
inc bx
;-------------------------------------------------------
mov ah,2ch
int 21h
mov al,cl ;分钟数设定
mov ah,0
call bctd
push ax
and al,0f0h
mov cl,4
rol al,cl
or al,30h
mov [bx],al
inc bx
pop ax
and al,0fh
or al,30h
mov [bx],al
inc bx
;-------------------------------------------------------------------------
mov al,':' ;显示分隔符号
mov [bx],al
inc bx
;-------------------------------------------------------------------------
mov ah,2ch ;秒设定
int 21h
mov al,dh
mov ah,0
call bctd
push ax
and al,0f0h
mov cl,4
rol al,cl
or al,30h
mov [bx],al
inc bx
pop ax
and al,0fh
or al,30h
mov [bx],al
inc bx
;----------------------------------------------------------------------
mov al,'$' ;将字符串的结束位送至显示缓冲区的最后一位
mov [bx],al
;------------------------------------------------------------------------
push bx ;置光标位置 ,AH=2,BH=0,DH跟DL分别为行号与列号,并入栈保护BX
mov ah,2
mov bh,0
mov dh,17
mov dl,41
int 10h
pop bx
lea dx,t_buff ;送t_buff偏移地址到DX,并调用DOS显示功能,功能号为9
mov ah,9
int 21h
push bx ;置光标位置
mov ah,2
mov bh,0
mov dh,0
mov dl,0
int 10h
pop bx
lea dx,mess1
mov ah,9
int 21h
push bx ;置光标位置
mov ah,2
mov bh,0
mov dh,17
mov dl,21
int 10h
pop bx
lea dx,mess2
mov ah,9
int 21h
;-----------------------------
call delay1
mov ah,1 ;调用键盘I/O中断功能号1,获取键值到AL
int 16h
cmp al,'c' ;是c键,转到时间修改程序
je Cor
cmp al,'C' ;是C键,转到时间修改程序
je Cor
cmp al,1bh
jz quit ;是ESC键,退出程序
jmp display
quit:
mov ah,4ch ;程序终止功能号
int 21h
ret
Cor: call correct ;调用时间修改子程序
;-------------------------------
bctd proc near ;二进制转BCD码子程序
;AX输入参数
;AX输出参数,存放调整过的BCD码
mov dx,ax
mov ax,0
mov cx,16 ;设循环次数
bctd1:
clc ;清进位标志C
rcl dx,1 ;通过进位的循环右移
adc al,al ;带进位加法
daa ;加法的十进制调整
xchg al,ah ;交换高、低八位
adc al,al
daa
xchg al,ah
loop bctd1 ;循环次数保存在CX里
ret
bctd endp
;-------------------------------------------
clear proc near
push ax ;入栈保护现场
push bx
push cx
push dx
mov ax,0600h ;ah=06(滚动)al=00(全屏空白)
mov bh,3eh ;设置背景颜色(2)和前景颜色(e)
sub cx,cx
mov dx,5f5fh
int 10h
pop dx ;出栈恢复现场
pop cx
pop bx
pop ax
ret
clear endp
;-----------------------------------------
delay1 PROC ;精确延迟时间子程序
MOV DX,04ffh ;循环次数
up: XOR CX,CX
a: NOP
LOOP a
DEC DX
JNZ up
RET
delay1 ENDP
;----------------------------
correct proc ;时间修改子程序
call input ;调用键盘输入子程序输入数据
mov ch,hor
mov cl,min
mov dh,sec
and dl,0h
mov ah,2dh
int 21h
jmp start
ret
correct endp
;----------------------------------
input proc ;键盘输入子程序
push ax ;入栈保护数据
push bx
push cx
push dx
pushf
mov dx,offset tn ;显示修改时间的格式提示
mov ah,09h
int 21h
mov dx,offset t_buff ;数据缓冲区的数据输入
mov ah,0ah
int 21h
and dx,0h
lea bx,t_buff
inc bx
inc bx
mov dh,[bx]
sub dh,30h
inc bx
mov dl,[bx]
sub dl,30h
mov cl,10
mov al,dh
mul cl
add al,dl
mov ch,al
mov hor,al
inc bx
inc bx
mov dh,[bx]
sub dh,30h
inc bx
mov dl,[bx]
sub dl,30h
mov cl,10
mov al,dh
mul cl
add al,dl
mov cl,al
mov min,al
inc bx
inc bx
mov dh,[bx]
sub dh,30h
inc bx
mov dl,[bx]
sub dl,30h
mov cl,10
mov al,dh
mul cl
add al,dl
mov dh,al
mov sec,al
popf ;出栈恢复数据
pop dx
pop cx
pop bx
pop ax
ret
input endp
;----------------------------
code ends
end start
汇编语言课程设计屏幕上设计一个图形,用不同的颜色进行填充
结构体定义
;char year[4] // 年
; 空格(1 Byte)
;int income (4 Bytes)// 收入
; 空格
;empoyer num (2 Bytes) // 雇员数
; 空格
;人均收入 (2 Bytes)
; 空格
; 要求:将data段的数据拷贝进table段数据,并结构化如上述格式,然后计算21年的人均收入
assume ds:data, es:table, cs:code, ss:stack
data segment
db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
db '1993', '1994', '1995'
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
dw 11542, 14430, 15257, 17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
display segment
db 21 dup ('year summ ne ?? ')
display ends
; 弄个栈,没什么用
; 就用来有时候腾出个寄存器来用
stack segment
dw 16 dup(0)
stack ends
code segment
start:
; 设置data段,以及ds:bx指向data段的第一个单元,即ds:[bx]的内容就是data段第一个单元的内容
mov ax, data
mov ds, ax
; 设置table段
mov ax, table
mov es, ax
; 设置堆栈段
mov ax, stack
mov ss, ax
mov sp, 16
; 初始化三个变址寄存器
mov bx, 0
mov si, 0
mov di, 0
; 准备复制,需要用到循环,21次
mov cx, 21
s_start:
; 年
mov ax, ds:[bx+0] ; 这里写个0是为了下面的对照,清晰点
mov es:[si+0], ax
mov ax, ds:[bx+2]
mov es:[si+2], ax
; 空格
mov al, 32
mov es:[si+4], al
; 收入
mov ax, ds:[bx+84]
mov es:[si+5], ax
mov ax, ds:[bx+86]
mov es:[si+7], ax
; 空格
mov al, 32
mov es:[si+9], al
; 雇员数,小心处理
mov ax, ds:[di+168]
mov es:[si+0ah], ax
; 空格
mov al, 32
mov es:[si+0ch], al
; 算人均收入,这里小心高低位
mov ax, ds:[bx+84]
mov dx, ds:[bx+86]
push cx ; 临时用一下cx,因为不可以 div ds:[bx+168]
mov cx, ds:[di+168]
div word ptr cx
pop cx
mov es:[si+0dh], ax
; 空格
mov al, 32
mov es:[si+0fh], al
add si, 16
add bx, 4
add di, 2 ; 这里记住要加上2
loop s_start
; 上面已经将数据排列好放在table段里,table 段在es:[0] 开始
; 下面就是要读这些数据,并计算好行列,显示在屏幕上
; 结构化的数据按字节排列如下:
; 0123 年(字符) 4 空格(字符) 5678 收入(数据) 9 空格 A B 雇员数(数据) C 空格 D E 人均收入(数据) F 空格
; 总共21年
; 其中收入、雇员数、人均收入是需要转字符格式的
mov ax, display
mov ds, ax
mov si, 0
mov di, 0
mov bx, 0
mov cx, 21
loop_display:
push cx
; #### 年
mov si, 0
mov ax, es:[di]
mov ds:[si], ax
mov ax, es:[di + 2]
mov ds:[si+2], ax
mov ax, 0
mov ds:[si+4], ax ; 原来的显示错误,mov ds:[si+5], ax , 错一个字节都不行。。。
; 显示年
mov dl, 20 ; 第20列
call dis
; #### 收入
mov ax, es:[di+5] ; 低16位
mov dx, es:[di+7] ; 高16位
mov si, 0
call dwtoc ; ds:si 指向字符串首地址
; 显示收入
mov dl, 28 ; 第28列
call dis
; #### 雇员数
mov ax, es:[di+0Ah]
mov si, 0
call dtoc
; 显示雇员数
mov dl, 36 ; 第36列
call dis
; ####人均收入
mov ax, es:[di+0Dh]
mov si, 0
call dtoc
; 显示人均收入
mov dl, 44 ; 第44列
call dis
add di, 16
pop cx
sub cx, 1
jcxz end_main
jmp near ptr loop_display
end_main:
mov ah, 01h
int 21h
mov ax, 4c00h
int 21h
; 子程序dis
; 功能:封装一些相同的操作
; 参数:(dl) 为列数
dis:
push ax
push bx
push cx
push dx
push di
push si
mov ax, di
mov dh, 16
div dh
mov dh, al
add dh, 2 ; dh = di/16+2
mov si, 0
mov cl, 2
call show_str
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
; 子程序:dtoc
; 功能:将word型数据转变成表示十进制的字符串,字符串以0结尾
; 参数:(ax) = word 型数据
; ds:si 指向字符串首地址
; 返回:无
dtoc:
王爽汇编课程设计1怎么在屏幕上显示大于65535的数值
8086寄存器只能保存65535以内的值,超过65535可以用两个寄存器保存。