汇编课程设计1,汇编课程设计电子时钟数码管只显示一位

http://www.itjxue.com  2023-01-24 01:08  来源:未知  点击次数: 

汇编课程设计----可编程作息时间控制器,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可以用两个寄存器保存。

(责任编辑:IT教学网)

更多

推荐DNS服务器文章