微机原理课程设计报告简易电子广告牌设计

一 选题介绍

题目:简易电子广告牌设计

意义: 由于单片机技术的不断发展和高亮度LED发光管的出现使得大屏幕高亮度LED电子广告屏成为可能,与传统的霓虹灯广告在显示效果以及可修改性上都有着无法比拟的优势,而且单片机的日益平民化以及LED技术的不断创新,使得高亮度高清晰的LED点阵广告牌与传统霓虹灯广告牌的成本日益接近。简易广告牌的设计发展在市场又很大的潜力

功能:实验箱上设有一个共阳极8×8点阵的红黄两色LED显示器。编程使LED显示器循环显示一条广告语,例如:欢迎光临。要求:广告语可以自己任意选择,但字数不少于3个;广告语的颜色红黄交替显示,例如:先显示红色广告语,再显示黄色广告语,如此交替循环;广告语中每个字符显示的时间由8253定时器控制,定时时间到显示下一个字符,设置每个字符显示的时间为数秒不等,可以自行设置;若键盘输入“R”则返回DOS,结束程序。

设计原理: 实验箱上是一个共阳极8×8点阵的红黄两色LED显示器该点阵对外引出24条线,其中8条行线,8条红色列线,8条黄色列线。若使某一种颜色、某一个LED发光,只要将与其相连的行线加高电平,列线加低电平即可。例如欲显示汉字“年”,采用逐列循环发光。

首先由“年”的点阵轮廓,确定点阵代码(如图所示)根据“年”的点阵代码,确定逐列循环发光的顺序如下:

① 行代码输出 44H; 红色列代码输 01H;第一列2个红色LED发光。

② 行代码输出 54H; 红色列代码输 02H;第二列3个红色LED发光。

③ 行代码输出 54H; 红色列代码输 04H;第三列3个红色LED发光。

④ 行代码输出 7FH; 红色列代码输 08H;第四列7个红色LED发光。

⑤ 行代码输出 54H; 红色列代码输 10H;第五列3个红色LED发光。

⑥ 行代码输出 DCH; 红色列代码输 20 H;第六列5个红色LED发光。

⑦ 行代码输出 44H; 红色列代码输 40 H;第七列2个红色LED发光。

⑧ 行代码输出 24H; 红色列代码输 80 H;第八列2个红色LED发光。

在步骤①~⑧之间可插入几ms的延时,重复进行①~⑧即可在LED上稳定的显示出红色“年”字。若想显示黄色“年”,只需把红色列码改为黄色列码即可。

电路图:

二 硬件设计:

1.基本工作原理和编程方法:

硬件电路连接:

 

文本框: +5V 

 

重要芯片功能说明:

8*8LED显示器:

三个片选端,分别为行片选,红色列片选,黄色列片选。

8253可编程定时/计数器:

本实验中只使用计数器0,并将其设置为工作方式0,16为计数。

8255可编程并行接口:

8255有3种工作方式,在8255中有一个控制字用来选择工作方式和A、B、C三个端口。

按图1虚线连接电路,将计数器0设置为方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。

2.8255方式0的工作原理:

(1)三个数据端口A、B、C,每个端口均为8位,可选择输入或输出操作;

(2)A组控制和B组控制:端口A和端口C的高4位构成A组端口B和断口C的低4位构成B组,分别又A组和B组控制电路控制。两组控制电路内各有一个控制寄存器,接受CPU输出的控制字,决定各端口的工作方式;

(3)数据总线缓冲器:这是个三态双向的8位缓冲器,起着8255A与CPU数据总线接口的作用,用来传送输入/输出的数据、CPU发出的控制字及状态信息;

  

实验电路:

实验系统原理图及硬件原理说明:

     1、用8253的计数器0和计数器1作为1MHz时间的的分频,使间脉冲变成1Hz,由计数器1的OUT口输出,并把OUT口接到8255的PA0端口,目的是让8255去读这个端口的值,为程序中的定时,当时间到时就变换字。

2、8253的两个计数器用工作方式2(分频器)和工作方式3(方波发生器),8255采用工作方式0,输出口为A口的第一个口PA0。

3、显示块的三个片选端口分别接的是实验板上I/O口地址的298h(行显示),288h(红色列显示线),290h(黄色列显示线)

4、接通电源,运行测试程序,由8253计时,8255检测8253OUT口的电平值,直到低电平就显示下一个字,并且中间有一定的器件延时。

图片1.png

四  软件设计

流程图:

 

                                                           

代码

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

ioport  equ 0c400h-0280h   ;实验箱的端口地址

proth   equ ioport+280h    ;行片选信号CS1端口地址

protlr  equ ioport+288h    ;红列片选信号 CS2端口地址

protly  equ ioport+290h    ;黄列片选信号 CS3端口地址

io8253a equ ioport+29bh    ;8253控制字端口地      址

io8253b equ ioport+298h    ;计数器0端口地址

io8253c equ ioport+299h    ;计数器1端口地址

io8255a equ ioport+2a3h    ;8255控制字端口地址

io8255b equ ioport+2a0h    ;8255 P0口地址

;-------------------------------------------------------------------------

DATA SEGMENT

MESS DB 'Strike the "r" key ,return to DOS!',0AH,0DH,'$' ;运行界面信息提示

min1 DB 00h,01h,02h,03h,04h,05h,06h,07h

count2 db ?                                              ;定义计字变量

BUFF   dw ?                                              ;定义行码地址变量

BUFF1   DB 43h,21h,11H,0ffh,00h,0ffh,24h,22h          ;“北”字

BUFF2   DB 00H,41H,07AH,68H,0EFH,69H,7AH,41H       ;“京”字

BUFF3   DB 0C2H,84H,0FFH,85H,42H,80H,7FH,20H       ;“你”字

BUFF4   DB 48H,68H,5FH,49H,3DH,0E2H,3DH,20H        ;“好” 字

DATA ENDS

;-------------------------------------------------------------------------

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

;-------------------------------------------------------------------------

START: MOV AX,DATA

MOV DS,AX

MOV DX,OFFSET MESS

MOV AH,09

INT 21H                    ;显示提示信息

;-------------------------------------------------------------------------

;-------------------------------------------------------------------------

mov dx,io8255a             ;设8255A口输入

mov al,9bh

out dx,al

 mov al,16h                ;设置8253通道0为工作方式3,二进制计数

mov dx,io8253a

out dx,al

 mov al,70h                ;设置8253通道1为工作方式0,先低后高,二进制计数

mov dx,io8253a

out dx,al

 mov dx,io8253b            ;计数器0的端口地址

 mov  al,0fh               ;写低8位计数值

out dx,al

 agn:  mov count2,04h        ;赋值给计字变量

 mov bx,offset buff1      

 mov buff,bx               ;给行赋初值

 c2: mov dx,io8253c            ;计数器1的端口地址

 mov  al,0ffh                ;先写低8位计数值

 out dx,al

 mov al,0ffh                 ;再写高8位计数值

 out dx,al

d2: mov ah,01h             ;列初值

mov cx,0008h               ;列循环次数

mov si,offset min1

next: mov dh,count2        ;判断字变量是否已经为0

 cmp dh,00h

 jz agn1                   ;是,转向agn1显示黄色字

d4: mov al,[si]

 mov bx, buff

xlat                       ;得到第一行码

mov dx,proth

out dx,al                  ;显示第一行码

mov al,ah

mov dx,protlr

out dx,al                  ;显示第一列,红色字

shl ah,01                  ;左移1位

inc si

push cx

mov cx,0ffffh

delay2: loop delay2        ;延时

mov cx,0ffffh

delay5: loop delay5       ;延时

mov dx,io8255b

in al,dx                   ;从8255A口读一字节

test al,01                 ;判PA0口是否为0

 jz d5                    ;若不为0,表示定时时间未到,则转d5

dec [count2]               ;为0,则计字变量减1

  mov dx,buff

 add dx,08h                ;把下一个字的行代码地址给buff

 mov buff,dx                

mov al,00                  ;不为0,则继续往下执行

mov dx,protlr              ;关闭所有列显示

out dx,al

jmp c2                     ;跳转回去,循环显示

d5: pop cx

 loop next                  ;循环显示

 mov al,00                  ;不为0,则继续往下执行

mov dx,protlr              ;关闭所有列显示

out dx,al

 mov ah,01

int 16h                    ;判断是否按了"r"

 jz b1

 call PANDUAN

b1: jmp d2                     ;不是,则循环显示

;-------------------------------------------------------------------------

a8: jmp a3

;-------------------------------------------------------------------------

a6: jmp agn

;-------------------------------------------------------------------------

a7: jmp a3

;-------------------------------------------------------------------------

;显示黄色字体

;-------------------------------------------------------------------------

agn1:  mov count2,04h            ;赋值给计字变量

 mov bx,offset buff1      

 mov buff,bx               ;给行赋初值

 c1: mov dx,io8253c            ;计数器1的端口地址

 mov al,0ffh                 ;先写低8位计数值

 out dx,al

 mov al,0ffh                 ;再写高8位计数值

 out dx,al

d1: mov ah,01h             ;列初值

mov cx,0008h               ;列循环次数

mov si,offset min1

next1: mov dh,count2       ;判断字变量是否已经为0

cmp dh,00h

jz a6                      ;是,转向agn显示红色字

d7: mov al,[si]

 mov bx, buff

xlat                       ;得到第一行码

mov dx,proth

out dx,al                  ;显示第一行码

mov al,ah

mov dx,protly

out dx,al                  ;显示第一列,黄色字

shl ah,01                  ;左移1位

inc si

push cx

mov cx,0ffffh

delay3: loop delay3        ;延时

mov cx,0ffffh

delay4: loop delay4        ;延时

mov dx,io8255b

in al,dx                   ;从8255A口读一字节

 test al,01                ;判PA0口是否为0

 jz d8                    ;若不为0,则转d8

dec [count2]               ;为0,则表示定时时间已到,计字变量减1

 mov dx,buff

 add dx,08h                ;把下一个字的行代码地址给buff

 mov buff,dx      

 mov al,00                  ;不为0,则继续往下执行

mov dx,protly              ;关闭所有列显示

out dx,al

 jmp c1                    ;调回循环显示

d8: pop cx

  loop next1                ;循环显示

 mov al,00                  ;不为0,则继续往下执行

mov dx,protly              ;关闭所有列显示

out dx,al

 mov ah,01

 int 16h

 jz b2

 call PANDUAN

b2: jmp d1                     ;不是,则循环显示

;-------------------------------------------------------------------------

DELAY PROC NEAR            ;延迟子程序

push cx

mov cx,0ffh

ccc: loop ccc

pop cx

ret

DELAY ENDP

;-------------------------------------------------------------------------

PANDUAN PROC NEAR           

mov ah,00

int 16h                     ;判断是否按了"r"

CMP AL,52H

JZ a3                     

 ret

PANDUAN ENDP

;------------------------------------------------------------------------

a3: MOV AH,4CH             ;是"r",返回

INT 21H

CODE ENDS

END START                  ;整个程序结束

;-------------------------------------------------------------------------

五,心得体会

    通过一次综合的小型微机应用系统的软硬件设计,通过课程设计,进一步巩固所学的知识,并将所学的内容加以综合运用。将所学的理论与实际问题或应用相结合,进一步培养了我们自主学习的能力,综合运用知识的能力,以及创新实践的能力。并且了解双色点阵LED显示器的基本原理 ,掌握PC机控制双色点阵LED显示程序的设计方法 。

参考文献:

1). 许兴存   曾琪琳编著 《微型计算机接口技术》 

北京 电子工业出版社 2003.8.

2). 戴梅萼   史嘉权编著《微型计算机技术及应用》

北京 清华大学出版社 2004.1.

相关推荐