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

合集下载

8255控制键盘与显示实验

8255控制键盘与显示实验

实验六 8255 控制键盘与显示实验一、实验目的1.掌握8255 输入、输出编程方法。

2.掌握阵列键盘和数码管动态扫描显示的控制方法。

二、实验内容用8255 可编程并行口做一个键盘、显示扫描实验,把按键输入的键值,显示在8255 控制的七段数码管上。

8255 PB 口做键盘输入线,PC 口做显示扫描线,PA 口做显示数据线。

三、实验要求根据实验内容编写一个程序,并在实验仪上调试和验证。

四、实验说明和电路原理图本实验需要用到 CPU 模块(F3 区)、8255 模块(C6 区)、8279 键盘与显示模块(E7 区)。

8255 键盘与显示电路原理图参见图7-1A、图7-1B,及前一实验的图6-1。

CS_8255 接8000H,则8255 状态/命令口地址为8003H,PA 口地址为8000H,PB 口地址为8001H、PC 口地址为8002H。

图7-1A 键盘显示电路1图7-1B 键盘显示电路2五、实验步骤1)系统各跳线器处在初始设置状态,S11E 和S12E 红开关全部打到下方(OFF)。

2)用8 位数据线对应连接8255 模块的JD3C(PA 口)、JD4C(PB 口)、JD5C(PC 口)到8279模块的JD3E、JD2E、JD4E;用导线连接8255 模块的CS_8255 到地。

3)启动PC 机,打开THGMW-51 软件,输入源程序,并编译源程序。

编译无误后,下载程序运行。

4)在键盘上按任一单键,观察数码管的显示,数码管低位显示按键值。

D8255A EQU 8000H ;8255 PA 口地址D8255B EQU 8001H ;8255 PB 口地址D8255C EQU 8002H ;8255 PC 口地址D8255 EQU 8003H ;8255 状态/命令口地址LEDBUF EQU 50H ;显示缓存KEYVAL EQU 60H ;读到的键码ORG 0000HLJMP STARTORG 0100HSTART: MOV SP,#80H ;堆栈指针指到80HMOV DPTR,#D8255MOV A,#90H ;方式0,PB,PC口输出,PA口输入MOVX @DPTR,AMOV LEDBUF,#10H ;预置地址MOV LEDBUF+1,#11H ;低四位显示---MOV LEDBUF+2,#11HMOV LEDBUF+3,#11HMOV LEDBUF+4,#5 ;高四位显示8255MOV LEDBUF+5,#5MOV LEDBUF+6,#2MOV LEDBUF+7,#8KB_DIS:LCALL RD_KB ;读键盘MOV A,#0FFHCJNE A,KEYVAL,TOSHOW ;判读到键SJMP SHOW ;没有则继续读键TOSHOW:MOV LEDBUF,KEYVALSHOW: LCALL DISPLAYSJMP KB_DISRD_KB: ;键盘扫描MOV A,#02H ;扫描第一行MOV DPTR,#D8255CMOVX @DPTR,AMOV DPTR,#D8255A MOVX A,@DPTRMOV R1,#00H ;行首键号0CJNE A,#0FFH,KEYCAL ;判键是否按下MOV A,#01H ;扫描第二行MOV DPTR,#D8255CMOVX @DPTR,AMOV DPTR,#D8255AMOVX A,@DPTRMOV R1,#08H ;行首键号8CJNE A,#0FFH,KEYCALSJMP NOKEY ;无键按下KEYCAL: MOV R0,#08H ;计算键码循环8次SHIFT: RRC AJNC TORETINC R1DJNZ R0,SHIFTSJMP NOKEY ;无键按下TORET: MOV KEYVAL,R1RETNOKEY: MOV KEYVAL,#0FFH ;返回无键标志RETDisplay:MOV R7,#8 ;8个数码管MOV R5,#0MOV R0,#LEDBUFDLOOP:MOV A,R5RL A ;JD4E移到PC3、PC4、PC5RL ARL AANL A,#11111011BINC R5MOV DPTR,#D8255CMOVX @DPTR,A ;点亮对应的LEDMOV A,@R0MOV DPTR,#LEDSEGMOVC A,@A+DPTRINC R0MOV DPTR,#D8255BMOVX @DPTR,A ;显示数据LCALL DelayDJNZ R7,DLOOPRETDelay: PUSH R7MOV R7,#200DelayLoop:NOPDJNZ R7,DelayLoopPOP R7RETLEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH;0,1,2,3,4,5DB 7DH,07H,7FH,6FH,77H,7CH;6,7,8,9,A,BDB 39H,5EH,79H,71H,00H,40H;C,D,E,F, ,-END六、实验结果及分析当我们载入程序后我们可以看到数码管上显示“8255-- ”。

可编程并行接口与七段数码管动态显示

可编程并行接口与七段数码管动态显示

实验报告实验人:学号:0938 日期:2011-05-17 院(系):软件学院专业(班级):实验题目:可编程并行接口与七段数码管动态显示一、实验目的1、通过实验,掌握8255工作于方式0以及设备A口为输出口,C口为输入口的方法2、进一步熟悉8255,掌握数码管显示数字的原理二、实验原理1、实验电路连接图图一 74LS273的连线图二 8255的连线关于实验电路连接图的分析:(1)74LS273是由八个D触发器组成的译码器。

IOW’信号是I/O写操作,低电平有效,即在低电平的情况下执行输出指令。

2A8H是74LS138地址译码器的译码输出。

(2)LED灯和七段数码管均要显示,所以连接以上元件(3)LS273起到缓存作用是为了使得走马灯和数码管同时显示;图二连接主要用于走马灯的显示;图一连接用于接受内部总线数据,译码后用于七段数码管的显示2实验流程:三、实验内容1、如图4-1连接,LED走马灯实验。

利用K7~K0的八位开关,控制LED产生八种走马灯花样。

例如,将开关1闭合时,8个LED彩灯从两边向中间依次点亮;将开关2闭合时,8个LED彩灯从中间向两边依次点亮等等。

实现方法,先设置LED点亮花样的8组数据。

每组数据依次定义八个数据对应的LED灯得状态,从A口输出每个数据后需要延时。

2、如图5-2连接好电路,七段数码管如图5-1连接。

位驱动输入端S1,S0连接8255 C口的PC1 PC0。

编程显示自己的学号。

3、七段数码管的字型代码表一如下:表一四、实验器材1、电脑及TPC-USB软件2、试验箱及连接导线五、实验分析与设计TPC-USB上的汇编程序;*******************************;;* 8种花样的LED走马灯及学号显示 *;;*******************************;.MODEL SMALL.STACK 64.DATALIGHT0 DB 0,0,0,0,0,0,0,0LIGHT1 DB 10000001B, 01000010B, 00100100B, 00011000B, 10000001B, 01000010B, 00100100B, 00011000B ;两边到中间LIGHT2 DB 00011000B, 00100100B, 01000010B, 10000001B, 10000001B, 01000010B, 00100100B, 00011000B ;中间到两边LIGHT3 DB 10000001B, 11000011B, 11100111B, 11111111B, 11111111B, 11100111B, 11000011B, 10000001B ;花样LIGHT4 DB 10000001B, 11000011B, 11100111B, 11111111B, 11100111B, 11000011B, 10000001B, 00000001BLIGHT5 DB 11000001B, 11100000B, 01110000B, 00111000B, 00011100B, 00001110B, 00000111B, 10000011BLIGHT6 DB 11110000B, 01111000B, 00111100B, 00011110B, 00001111B, 10000111B, 11000011B, 11100001BLIGHT7 DB 11111000B, 01111100B, 00111110B, 00011111B, 10001111B, 11000111B, 11100011B, 11110001BLIGHT8 DB 11111100B, 01111110B, 00111111B, 10011111B, 11001111B, 11100111B, 11110011B, 11111001BLIGHT9 DB 3FH,6FH,4FH,'$';学号io8255a equ 288Hio8255b equ 28bHio8255c equ 28aHcode segmentassume cs:codestart: MOV AX, @DATAMOV DS, AXmov al,8bH ;设8255为C口输入,A口输出inout: mov dx,28bHout dx,almov al,0hmov dx,28aH ;从C口输入一数据in al,dx ;赋值给alCMP AL,0JE E0MOV BL,AL ;BL储存AL数据,逐个对掩码进行and操AND BL,1H ;作用于识别最右边一个被拨上的开关CMP BL,1JE E1MOV BL,ALAND BL,2HCMP BL,2HJE E2MOV BL,ALAND BL,4HCMP BL,4hJE E3MOV BL,ALAND BL,8HCMP BL,8hJE E4MOV BL,ALAND BL,10HCMP BL,10hJE E5MOV BL,ALAND BL,20HCMP BL,20hJE E6MOV BL,ALAND BL,40HCMP BL,40hJE E7MOV BL,ALAND BL,80HCMP BL,80hJE E8;-----------------------------------E0: MOV DI,OFFSET LIGHT0 ;根据输入的信息将花样JMP SHOW ;所在地址赋值给DIE1: MOV DI,OFFSET LIGHT1JMP SHOWE2: MOV DI,OFFSET LIGHT2JMP SHOWE3: MOV DI,OFFSET LIGHT3JMP SHOWE4: MOV DI,OFFSET LIGHT4JMP SHOWE5: MOV DI,OFFSET LIGHT5JMP SHOWE6: MOV DI,OFFSET LIGHT6JMP SHOWE7: MOV DI,OFFSET LIGHT7JMP SHOWE8: MOV DI,OFFSET LIGHT8JMP SHOW;-----------------------------------SHOW: MOV CX,08SET_ID: MOV SI,OFFSET LIGHT9 ;设置学号所在地址,用于数码管显示BACK: MOV DX,288H ;输出端口设为288,显示走马灯MOV AL, [DI]OUT DX,ALMOV DX,2A8H ;改变输出端口,显示学号MOV AL,[SI]CMP [DI],0 ;若此时LED灯有显示,则关闭数码管显示 JE OUT1 ;为零则进行学号显示MOV AL,0OUT1: OUT DX,ALCMP [SI],'$' ;显示完了跳回学号第一个字符JE SET_IDCALL DELAY2 ;显示一种花样用时约八秒CALL DELAY_OFF ;闪烁显示INC DIINC SIDEC CXCMP CX,0JE JMP_FORJMP NNJMP_FOR:JMP FAR PTR inoutNN: JMP BACKmov aH,4cH ;否则返回int 21H;-----------------------------------DELAY PROC NEAR ;DELAY 1/2-SECONDSPUSH CXPUSH AXMOV CX, 33144WAITF1: IN AL, 61HAND AL, 10HCMP AL, AHJE WAITF1MOV AH, ALLOOP WAITF1POP AXPOP CXRETDELAY ENDP;-----------------------------------DELAY2 PROC NEAR ;DELAY 1-SECONDSCALL DELAYCALL DELAYRETDELAY2 ENDP;-----------------------------------DELAY_OFF PROC NEAR;5ms DELAYMOV CX,331G1: LOOP G1RETDELAY_OFF ENDP;-----------------code endsend start六、实验心得在上一次实验的基础上我们进行了这次控制输入输出以达到简单的彩灯变化的实验,首先对8255输出端口的操作颇费功夫,起初打算将花样都存在一个数据标签内,但是后来对数据地址的操作出现很多问题,于是我干脆对每一个花样都进行标识,缺点是因此增加了代码的冗余。

实验报告 实验七 八段数码管显示实验

实验报告      实验七   八段数码管显示实验

实验报告实验七八段数码管显示实验----b46086b6-6eaf-11ec-8071-7cb59b590d7d实验报告--实验七-八段数码管显示实验EDA实验报告七段或八段数码管显示实验1、实验目的1)了解数码管动态显示的原理。

2)了解如何通过总线控制数码管显示器2、实验要求:利用实验仪提供的显示电路,动态显示一行数据.提示:显示显示缓冲区的内容(例如,可以使用60H~65h作为缓冲区)。

修改显示缓冲区的内容时,可以显示修改后的内容(为键盘扫描和显示实验做准备)。

3、实验说明实验仪器提供了一个6位8段编码的LED显示电路。

学生可以控制显示,只要他们根据地址输出相应的数据。

显示器共有6位,以动态方式显示。

8位段码和6位码由两个74ls374芯片输出。

位代码由mc1413或uln2022反相驱动后,选择相应的显示位。

本实验仪中8位段码输出地址为0x004h,位码输出地址为0x002h。

此处x是由key/ledcs决定,参见地址译码。

在进行键盘和led实验时,需要将按键/LEDC连接到相应的地址解码。

以便使用相应的地址进行访问。

例如,如果钥匙/ledcs连接到CS0,则段代码地址为08004h,位代码地址为08002h。

七段数码管的字型代码表如下表:a-----f | | b | |------| g | e | c-----d。

h显示字体gfedcba段代码001111113FH100011006H210110115BH3100111114FH41100111066H51016DH61111017DH70000 1107H81111117FH911011116fha111011177hb11111007chc011100139hd10111105ehe111100179hf111000171h4.原理图和接线5、实验内容1)使用仪器和仪表开发平台模型本实验用到了wave6000软件平台,电脑一台,lab6000实验箱,示波器,若干连线,串行数据线。

七段数码管实验

七段数码管实验

;段码





LOOP2: OV ADD MOV MOV OUT MOV MOV OUT PUSH MOV
BH,02 BYTE PTR BZ,BH DI DI DI, BZ BL,[DI] ;bl为要显示的数 DI BH,0 SI,OFFSET LED ;置led数码表偏移地址为SI SI,BX ;求出对应的led数码 AL,BYTE PTR [SI] DX,IO8255B ;自8255B的口输出 DX,AL AL,BYTE PTR BZ ;使相应的数码管亮 DX,IO8255A DX,AL AX AX,05

MOV


AH,01 ;从键盘接收字符 INT 21H CMP AL,'0' ;是否小于0 JL EXIT ;若是则退出 CMP AL,'9' ;是否大于9 JG EXIT ;若是则退出 SUB AL,30H ;将所得字符的ASCII码减30H MOV BX,OFFSET LED ;bx为数码表的起始地址 XLAT ;求出相应的段码 MOV DX,IO8255B ;从8255的A口输出 OUT DX,AL JMP SSS ;转SSS EXIT: MOV AH,4CH ;返回 INT 21H CODE ENDS END START
LED2.ASM

DATA SEGMENT IOPORT EQU 0A400H IO8255A EQU IOPORT+0A0H IO8255B EQU IOPORT+0A2H IO8255CON EQU IOPORT+0A6H LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH BUFFER1 DB 5,6 ;存放要显示的个位和十位 BZ DW ? ;位码 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,IO8255CON ;将8255设为B,A口输出 MOV AL,80H OUT DX,AL MOV DI,OFFSET BUFFER1 ;设di为显示缓冲区

实验报告2--7段数码管显示实验

实验报告2--7段数码管显示实验

SPI主机实验——7段数码显示一、实验目的1、通过本实验进一步掌握对ARM7.0软件和EasyJTAG仿真器的使用;2、进一步熟悉EasyARM2131开发板硬件结构,掌握各引脚功能和接线;3、掌握SPI主机实验,熟悉该实验程序,并能作出简单的修改并实现其功能;4、在SPI实验中,通过改变实验程序,实现7段数码管和流水灯同时运行的功能。

二、实验仪器装有ADS1.2及EasyJTAG仿真器的电脑一台;ARM7开发板一块。

三、实验原理图4.61 SPI接口控制74HC595图中已经将最高位输出(SQH)连线到LPC2131的SPI接口的MISO0,可用来读回74HC595移位输出的数据。

下图是8路LED控制电路:该实验演示在7段数码管上显示一些字符,字符的字模表存于一数组中,流程图如下图4.62所示。

图4.62 LED数码管显示实验流程图1、特性2、结构SPI总线配置及数据传输3、SPI外设描述4、基本操作5主机操作四、实验内容与结果1、实验程序如下#include "config.h"#define HC595_CS (1 << 29) // P0.29口为74HC595的片选const uint32 LEDS8 = (0xFF << 18); // P1[25:18]控制LED8~LED1,低电平点亮/************************************************************************ ******************************** 函数名称:DelayNS()** 函数功能:长软件延时** 入口参数:dly 延时参数,值越大,延时越久** 出口参数:无************************************************************************* *******************************/void DelayNS(uint32 dly){uint32 i;for(; dly>0; dly--)for(i=0; i<50000; i++);}const uint32 LED_TBL[] = {0x00, 0xFF, // 全部熄灭后,再全部点亮0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // 依次逐个点亮0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // 依次逐个叠加0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, // 依次逐个递减0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, // 两个靠拢后分开0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81 // 从两边叠加后递减};/********************************************************************************************************** 函数名称:MSPI_Init()** 函数功能:初始化SPI接口,设置为主机。

实验28255七段数码管静动态显示

实验28255七段数码管静动态显示

微机实验报告书同组名单:实验日期:2012.12.21实验题目:七段数码管的静态显示实验目标:掌握数码管显示数字的原理(功能:键盘输入一位十进制数字(0~9),用七段数码管显示。

)解题思路:1.静态显示:按图10 (a)连接好电路,将8255的A口 PAO-PA鲂别与七段数码管的断码驱动输入端a-g项链,位码驱动输入端S1接+5V, SO dp2.动态显示:按图10 (b)连接好电路,七段数码管段码连接不变,位码驱动输入端S1, S0接8255C口的PC1, PCQ编程在两个数码管上显示“56” 程序框图:静态显示见图11( a),动态显示见图11 (b)。

学号:_______ 姓名: 班级:________S 10琵接电路图图11流程图关键问题分析(静态显示):1、按键判断和程序结束判断按键来说,由于程序中必须输入数字,所以没有必要对是否按键进行判断, 只需要判断按键是否在0-9之间即可。

用以下程序即可:条件转移指令,即在小于时转移 条件转移指令,即在大于时转移程序中还要用到“ cmp'即比较指令,用来比较输入数与0、9的大小关系 程序结束:如若输入的数字小于0或者大于9,必须直接跳出程序,即结束指令必 须单独占用一个程序段,这样,程序顺序执行完毕也可以顺利返回DOS 2、七段码显示。

始丿将所得字符的 ASCII 码减如H1查表求出对应的盅码将段码自8药5A 口输出(b)cmp al,'0'jl exit; jl,cmp al,'9' 从键盘接收字符实验指导书中给出了七段码的字型代码。

这样一来, 七段码的显示只需要用换码 指令“XLAT 便可以轻松实现。

前提是必须将七段码字型编成数码表以字符串的 形式写进程序中。

3、数字键ASCII 码与数值间的转换。

因为0的ASCII 码为30H,所以数字键ASCII 码与数值间的转换时只需减去30F 即可, 可用下列语句实现:sub al,30h 程序清单:静态显示:data segmentioport equ 0c800h-0280hio8255aequ ioport+288h io8255b equ ioport+28bhled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhmesg1 db dataends codesegment0dh,0ah,'Input a num (0--9h):',0dh,0ah,'$' assume cs:code,ds:datastart: mov ax,data mov ds,ax mov dx,io8255b从键盘接收字符 是否小于 0 如若小于 0,则跳转到 exit 退岀程序 是否大于 9 如若大于 9,则跳转到 exit 退岀程序 将所得字符的ASCII 码减30H,数字键ascii 码同数值转换 为数码表的起始地址 求岀相应的段码 从8255的A 口输岀 转 zbymov al,80hout dx,al ;10000000B ,控制字PA 以方式0输岀 使8255的A 口为输岀方式zby: mov dx,offset mesg1 ;mov ah,09h int 21h movah,01 ;int 21h cmp al,'0' ;jl exit ;cmp al,'9'; jg exit ;sub al,30h ; movbx,offset led ;bxxlat ;mov dx,io8255a ; outdx,al jmp zby ;exit: mov ah,4ch ; 显示提示信息 返回 DOSint 21h code ends end start动态显示:data segmentioport equ 0c800h-0280hio8255a equ ioport+28ahio8255b equ ioport+28bhio8255c equ ioport+288hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ; 段码buffer1 db 5,6 ; 存放要显示的个位和十位bz dw ? ; 位码data endscode segmentassume cs:code,ds:datastart: mov ax,data mov ds,ax mov dx,io8255bmov al,80h ;10000000B out dx,almov di,offset buffer1 ;loop2: mov bh,02 zby: mov byte ptr bz,bhpush di dec di add di, bz movbl,[di] ;bl pop di mov al,0 movdx,io8255a out dx,al mov bh,0mov si,offset led ; add si,bx ;mov al,byte ptr [si] movdx,io8255c ;out dx,al mov al,byte ptr bz ;mov dx,io8255a out dx,al movcx,3000delay: loop delay ;,控制字PA以方式0输岀设di 为显示缓冲区为要显示的数置led 数码表偏移地址为SI 求岀对应的led 数码自8255A的口输岀使相应的数码管亮延时将8255设为A口输岀mov bh,byte ptr bzshr bh,1jnz zbymov dx,0ffhmov ah,06int 21hje loop2 ; 有键按下则退出mov dx,io8255amov al,0 ; 关掉数码管显示out dx,almov ah,4ch ; 返回int 21hcode endsend start运行结果:静态显示:在键盘上输入一个 0-9 的任意数字,会显示在数码管上。

微原实验3——七段数码管显示

微原实验3——七段数码管显示

微原实验:七段数码管一、实验目的掌握接口芯片的编址方法,掌握8255的初始化设置,及数码管显示原理,掌握段控及位控的概念。

二、实验内容①连接地址译码器与8255的连线及8255与数码管的连线;②在数据段中存放0到9的字型码;③从微机键盘输入2个数字的ASCII码,在输入过程中检查如非数字键的重新输入;④然后将输入的ASCII码变成相应的数字,再利用换码指令XLAT查表得到的相应的字型码;⑤将字型码送到8255输出口所接的数码管显示。

四、硬件连线实验箱上设有两个共阴极七段数码管及驱动电路,如下图示,段码为同相驱动器,位码为反向驱动器,从段码与位码的驱动器输入端(段码输入端:a、b、c、d、e、f、dp,位码输入端:s1、s2)输入不同的代码即可显示不同数字或符号。

连接电路时,将8255的A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端S1,S0接8255C口的PC1,PC0。

连线时:CS——288H~28FH,PA0——a,PA1——b,PA2——c,PA3——d,PA4——ePA5——f,PA6——g,dp——GND,PC0——S0,PC1——S1四、程序流程图五、实验程序stack segment stackdw 100 dup(?)stack ends;data segmentx1 db 2 dup(0)val db 3fh,06h,5bh,4fh,66h,6dh,7dh,7fh porta equ 0ef00h-280h+288hportb equ 0ef00h-280h+289hportc equ 0ef00h-280h+28ahportcrl equ 0ef00h-280h+28bhdata ends;code segmentassume cs:code,ss:stackmain procmov ax,datamov ds,axmov al,10000010bmov dx,portcrlout dx,almov si,offset x1mov cx,2next1: call keyinand al,0fhmov si,[al]inc siloop next1mov si,offset x1mov bx,offset valnext: mov dx,portamov al,[si]out dx,almov dx,portcmov al,10bout dx,alcall delaymov dx,portamov al,[si+1]xlatout dx,almov dx,portcmov al,01bout dx,alcall delaymov dl,0ffhmov ah,6int 21hjz nextmov ah,4chint 21hmain endp;delay procpush bxpush cxmov bx,100mov cx,0next2: loop next2 dec bxjnz next2pop cxpop bxret;keyin procagain: mov ah,8int 21hcmp al,30hjb againcmp al,39hja againpush axmov dl,almov ah,2int 21hpop axkeyin endp;code endsend main六、结论符合预期,输入两个数字,七段数码管显示这两个数字。

8255与多位LED数码管的显示

8255与多位LED数码管的显示
A组控制 部件 A组端口 A(8) I/O PA7~PA0
双向数据总线 D7~D0
8位内部 数据总 线缓冲 器 数据总线
A组端口 C上半部 (4)
I/O PC7~PC4
B组端口 C上半部 下半部 (4) RD WR A1 A0 RESET
I/O PC3~PC0
读/写控 制部件
B组控制 部件
B组端口 B(8)
2、编程并全速或单步运行。 3、全速运行时按动键盘,观察数码管的变化。 4、编写实验报告。
七、实验程序流程图 初始化8255
取字形码
显示输出
九、实验程序
assume cs:code code segment org 100h start: nop nop start1: mov cx,08h ;设置循环次数 mov bx,00feh ;bh=0000 0000,bl=1111 1110B mov dx, 04a6h ;控制寄存器地址 mov ax,80h ;设置为A口输出,B口输出 out dx, ax ;8255的初始化 disp: mov di, offset segcod ;取偏移地址送入di寄存器 mov dx, 04a0h ;A口地址 mov al, bh ;aL=0000 0000 mov ah, 00h ;ah=0000 0000 add di, ax ;得到第一个变量(字形码)3fh的偏移地址 mov al, cs:[di] ;将3fh送入al寄存器 out dx, al ;将字形码从A口输出
本实验中8255的地址分配如下: 端口A 04A0H 端口B 04A2H 端口C 04A4H 控制口 04A6H
mov dx, 04a2h ;B口地址 mov al, bl ;al=1111 1110B out dx, al ; al的内容从B口输出,使LED1有效 push cx ; 循环次数入栈保护 call delay pop cx ; 循环次数出栈 inc bh ;bh内容加1,指向第二个字形码 rol bl,1 ; bl=1111 1110B循环左移,使下个位控有效 loop disp jmp start1 delay: mov cx,43h ;延时程序,将此数改为最大观察结果 delay1: nop nop loop delay1 ret segcod db 3fh,06h,5bh,4fh,66h,77h code ends end start

七段数码管动态显示控制

七段数码管动态显示控制

实验二七段数码管动态显示控制一、实验目的利用AT89S52和使用两位数码管显示器,循环显示两位数00-99。

其中P2.0和P2.1端口分别控制数码管的个位和十位的供电,当相应的端口变成低电平时,驱动相应的三极管会导通,+5V通过驱动三极管给数码管相应的位供电,这时只要P3口送出数字的显示代码,数码管就能正常显示数字。

二、实验要求1、使用两位数码管显示器,循环显示两位数00-99;2、具有电源开关和指示灯,有复位键;3、数码管动态显示,即扫描方式,每一位每间隔一段时间扫描一次。

字符的亮度及清晰度与每位点亮的停留时间和每位显示的时间内轮换导通次数有关。

三、实验电路四、实验器材AT89S52;动态扫描显示;共阳极数码管;电阻五、实验原理说明图1 AT89S52引脚图图2 共阳极七段数码管引脚图1AT89S52引脚图,说明如下:按照功能,AT89S52的引脚可分为主电源、外接晶体振荡或振荡器、多功能I/O 口、控制和复位等。

1.多功能I/O口AT89S52共有四个8位的并行I/O口:P0、P1、P2、P3端口,对应的引脚分别是P0.0 ~ P0.7,P1.0 ~ P1.7,P2.0 ~ P2.7,P3.0 ~ P3.7,共32根I/O线。

每根线可以单独用作输入或输出。

①P0端口,该口是一个8位漏极开路的双向I/O口。

在作为输出口时,每根引脚可以带动8个TTL输入负载。

当把“1”写入P0时,则它的引脚可用作高阻抗输入。

当对外部程序或数据存储器进行存取时,P0可用作多路复用的低字节地址/数据总线,在该模式,P0口拥有内部上拉电阻。

在对Flash存储器进行编程时,P0用于接收代码字节;在校验时,则输出代码字节;此时需要外加上拉电阻。

②P1端口,该口是带有内部上拉电阻的8位双向I/O端口,P1口的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。

对端口写“1”时,通过内部的上拉电阻把端口拉到高电位,此时可用作输入口。

EDA实验二 八位七段数码管动态显示电路的设计

EDA实验二  八位七段数码管动态显示电路的设计

实验名称八位七段数码管动态显示电路的设计一、实验目的1、了解数码管的工作原理。

2、学习七段数码管显示译码器的设计。

3、学习Verilog的CASE语句及多层次设计方法。

二、实验原理七段数码管是电子开发过程中常用的输出显示设备。

在实验系统中使用的是两个四位一体、共阴极型七段数码管。

其单个静态数码管如下图4-1所示。

图4-1 静态七段数码管由于七段数码管公共端连接到GND(共阴极型),当数码管的中的那一个段被输入高电平,则相应的这一段被点亮。

反之则不亮。

共阳极性的数码管与之相么。

四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。

八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。

三、实验内容本实验要求完成的任务是在时钟信号的作用下,通过输入的键值在数码管上显示相应的键值。

在实验中时,数字时钟选择1KHZ作为扫描时钟,用四个开关做为输入,当四个开关置为一个二进制数时,在数码管上显示其十六进制的值。

实验箱中的拨动开关与FPGA的接口电路,以及开关FPGA的管脚连接在实验一中都做了详细说明,这里不在赘述。

数码管显示模块的电路原理如图4-2所示,表4-1是其数码管的输入与FPGA的管脚连接表。

图4-2 数字时钟信号模块电路原理信号名称对应FPGA管脚名说明7SEG-A G6 七段码管A段输入信号7SEG-B G7 七段码管B段输入信号7SEG-C H3 七段码管C段输入信号7SEG-D H4 七段码管D段输入信号7SEG-E H5 七段码管E段输入信号7SEG-F H6 七段码管F段输入信号7SEG-G J4 七段码管G段输入信号7SEG-DP L8 七段码管dp段输入信号7SEG-SEL0 G5 七段码管位选输入信号7SEG-SEL1 G3 七段码管位选输入信号7SEG-SEL2 F4 七段码管位选输入信号表4-1 数码管与FPGA的管脚连接表四、实验步骤1、打开QUARTUSII软件,新建一个工程。

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

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

微机实验报告书学号:姓名:班级:同组名单:实验日期: 2012.12.21实验题目:七段数码管的静态显示实验目标:掌握数码管显示数字的原理(功能:键盘输入一位十进制数字(0~9),用七段数码管显示。

)解题思路:1.静态显示:按图 10(a)连接好电路,将8255的A口PA0-PA6分别与七段数码管的断码驱动输入端a-g项链,位码驱动输入端S1接+5V,S0、dp接地。

编程从键盘输入一位十进制数字,在七段数码管上显示出来。

2.动态显示:按图10(b)连接好电路,七段数码管段码连接不变,位码驱动输入端S1,S0接8255C口的PC1,PC0。

编程在两个数码管上显示“56”。

程序框图:静态显示见图11(a),动态显示见图11(b)。

关键问题分析(静态显示):1、按键判断和程序结束判断按键来说,由于程序中必须输入数字,所以没有必要对是否按键进行判断,只需要判断按键是否在0-9之间即可。

用以下程序即可:cmp al,'0'jl exit ; jl,条件转移指令,即在小于时转移cmp al,'9'jg exit ;jg, 条件转移指令,即在大于时转移程序中还要用到“cmp”即比较指令,用来比较输入数与0、9的大小关系。

程序结束:如若输入的数字小于0或者大于9,必须直接跳出程序,即结束指令必须单独占用一个程序段,这样,程序顺序执行完毕也可以顺利返回DOS。

2、七段码显示。

实验指导书中给出了七段码的字型代码。

这样一来,七段码的显示只需要用换码指令“XLAT”便可以轻松实现。

前提是必须将七段码字型编成数码表以字符串的形式写进程序中。

3、数字键ASCII码与数值间的转换。

因为0的ASCII码为30H,所以数字键ASCII码与数值间的转换时只需减去30H即可,可用下列语句实现:sub al,30h程序清单:静态显示:data segmentioport equ 0c800h-0280hio8255a equ ioport+288hio8255b equ ioport+28bhled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhmesg1 db 0dh,0ah,'Input a num (0--9h):',0dh,0ah,'$'data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8255b ;使8255的A口为输出方式mov al,80h ;10000000B,控制字PA以方式0输出out dx,alzby: mov dx,offset mesg1 ;显示提示信息mov ah,09hint 21hmov ah,01 ;从键盘接收字符int 21hcmp al,'0' ;是否小于0jl exit ;如若小于0,则跳转到exit退出程序cmp al,'9' ;是否大于9jg exit ; 如若大于9,则跳转到exit退出程序sub al,30h ;将所得字符的ASCII码减30H,数字键ascii码同数值转换mov bx,offset led ;bx为数码表的起始地址xlat ;求出相应的段码mov dx,io8255a ;从8255的A口输出out dx,aljmp zby ;转zbyexit: mov ah,4ch ;返回DOSint 21hcode endsend start动态显示:data segmentioport equ 0c800h-0280hio8255a equ ioport+28ahio8255b equ ioport+28bhio8255c equ ioport+288hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码buffer1 db 5,6 ;存放要显示的个位和十位bz dw ? ;位码data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8255b ;将8255设为A口输出mov al,80h ;10000000B,控制字PA以方式0输出out dx,almov di,offset buffer1 ;设di为显示缓冲区loop2: mov bh,02zby: mov byte ptr bz,bhpush didec diadd di, bzmov bl,[di] ;bl为要显示的数pop dimov al,0mov dx,io8255aout dx,almov bh,0mov si,offset led ;置led数码表偏移地址为SIadd si,bx ;求出对应的led数码mov al,byte ptr [si]mov dx,io8255c ;自8255A的口输出out dx,almov al,byte ptr bz ;使相应的数码管亮mov dx,io8255aout dx,almov cx,3000delay: loop delay ;延时mov bh,byte ptr bzshr bh,1jnz zbymov dx,0ffhmov ah,06int 21hje loop2 ;有键按下则退出mov dx,io8255amov al,0 ;关掉数码管显示out dx,almov ah,4ch ;返回int 21hcode endsend start运行结果:静态显示:在键盘上输入一个0-9的任意数字,会显示在数码管上。

七段数码管的动态扫描显示实验

七段数码管的动态扫描显示实验

七段数码管的动态扫描显示实验七段数码管的动态扫描显示实验一、实验名称:七段数码管的动态扫描显示实验二、实验目的:(1)进一步熟悉QuartusII软件进行FPGA设计的流程(2)掌握利用宏功能模块进行常用的计数器,译码器的设计(3)学习和了解动态扫描数码管的工作原理的程序设计方法三、实验原理:实验板上常用4位联体的共阳极7段数码管,其接口电路是把所有数码管的8个笔划段a-h同名端连在一起,而每一个数码管由一个独立的公共极COM端控制。

当向数码管发送字形码时,所有数码管都接收到相同的字形码时,但究竟是那个数码管亮,取决于COM端,这一端是由I/O控制的,所以就可以自行决定何时显示哪一位。

动态扫描即采用分时方法,轮流控制各个LED轮流点亮。

在轮流点亮扫描过程中,每一位显示器的点亮时间是极为短暂的,但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上每个显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

四、实验要求:实现显示0000-9999的十进制计数器。

五、实验步骤1.建立工程建立名为leddisplay的工程,并建立顶层图。

2.设计技术时钟设计一分频器,对50MHz分频输出到计数器,让计数器以较慢速度递增。

打开File..New,新建一个.v文件。

输入以下程序: module int_div(clk, div_out); input clk;output reg div_out; reg [31:0] clk_div;parameter CLK_FREQ = 'D50_000_000; //系统时钟50MHz parameterDCLK_FREQ = 'D10; //输出频率10/2Hz always @(posedge clk) beginif(clk_div Set as top-level Entity。

分析该设计文件:执行工具栏处的“Start Analysis &Synthesis命令按钮,开始分析综合,此步骤在这里用于检查设计错误。

实验九 8255控制键盘与显示实验

实验九  8255控制键盘与显示实验

贵州大学实验报告纸实验九8255控制键盘与显示实验一、实验目的1.掌握8255输入、输出的编程方法。

2.掌握阵列键盘和数码管动态扫描显示的控制方法。

二、实验内容1、用8255可编程并行口会、做一个键盘、显示扫描实验,把按键输入的键值,显示在8255控制的七段数码管上。

8255PB口做键盘输入线,PC口做显示扫描线,PA口做显示数据线。

2、键入值后在数码管显示按键的ASCII.3、并且要求字母键可以实现大小写转换(用F键做切换)三、实验要求根据实验内容编写一个程序,并在实验仪上调试和验证。

四、实验说明和电路原理图本实验需要用到CPU模块(F3区)、8255模块(C6区)、8279键盘与显示模块(E7区)。

8255键盘与显示电路原理图参见图9-1A、图9-1B,及实验四的图4-1。

CS_8255接200H,则8255 状态/命令口地址为203H,PA口地址为8000H,PB口地址为201H、PC口地址为202H。

图9-1A 键盘显示电路1 图9-1B 键盘显示电路2五、实验程序;//********************************************************* ;文件名: 55KeyD for 8088;功能: 8255控制键盘显示实验;接线: 连接8279键盘显示模块的JD3E到8255模块的JD3C(PA口);; JD2E到8255模块的JD4C(PB口);; JD4E到8255模块的JD5C(PC口);; 用导线连接CPU模块的200H到8255模块的CS_8255。

;//********************************************************* D8255A EQU 200H ;8255 PA 口地址D8255B EQU 201H ;8255 PB 口地址D8255C EQU 202H ;8255 PC 口地址D8255 EQU 203H ;8255 状态/命令口地址DATA SEGMENTCOUNT DB ?DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATAstart:push cspop dsMOV AL,90H ;方式0,PB,PC口输出,PA口输入MOV DX,D8255OUT DX,AL ;点亮对应的LEDMOV AH,0FFHMOV BH,7DHKB_DIS:CALL KEY ;读键盘CALL DISPLAYJMP KB_DISMAIN ENDPKEY proc nearMOV AL,02H ;扫描第一行MOV DX,D8255COUT DX,ALMOV DX,D8255AIN AL,DXMOV AH,0CMP AL,0FFHJNZ KEYCALL ;判键是否按下MOV AL,01H ;扫描第二行MOV DX,D8255COUT DX,ALMOV DX,D8255AIN AL,DXMOV AH,8CMP AL,0FFHJNZ KEYCALL ;判键是否按下JMP FABH ;无键按下KEYCALL:MOV CX,08H ;计算键码SHIFT: SAR AL,1JNC TORETINC AHLOOP SHIFTJMP FABHTORET: MOV BL,AHFABH: RETKEY ENDPDISPLAY PROC NEARCMP AH,0FFHJE ABGMOV AL,11010011B ;显示位置第2个数码管 MOV DX,D8255COUT DX,ALCMP AH,0AHJB ABCSUB AH,09HCMP AH,06HJNE ABFADD CL,1MOV AL,CLSHR AL,1JC ABDMOV AL,66H ;显示4MOV BH,ALJMP ABEABD: MOV AL,7DH ;显示6MOV BH,ALJMP ABEABC: MOV AL,4FH ;显示3MOV BH,ALABF: MOV BL,AHMOV AL,BHABE: MOV DX,D8255BOUT DX,ALCALL SOFTDLYPUSH BXMOV AL,11001011B ;显示位置第1个数码管MOV DX,D8255COUT DX,AL ;点亮对应的LEDMOV AL,AH ;取键值LEA BX,LEDXLAT ;取显示段码MOV DX,D8255B ;将AL中内容写到数码管上 OUT DX,ALCALL SOFTDLYPOP BXABG: MOV AL,11000011B ;显示位置第0个数码管 MOV DX,D8255COUT DX,ALMOV AL,76HMOV DX,D8255BOUT DX,ALCALL SOFTDLYRETLED DB 3FH,06H,5BH,4FH,66H,6DH;0,1,2,3,4,5 DB 7DH,07H,7FH,6FH,77H,7CH;6,7,8,9,A,B DB 39H,5EH,79H,71H,00H,40H;C,D,E,F, ,- Display endpSOFTDLY PROC NEARPUSH CXPUSH BXMOV BX,2DELAY: MOV CX,2801WAIT:LOOP WAITDEC BXJNZ DELAYPOP BXPOP CXRETSOFTDLY ENDPcode endsend start六、实验步骤1)系统各跳线器处在初始设置状态,S11E和S12E红开关全部打到下方(OFF)。

实验2LED数码管动态和静态显示实验

实验2LED数码管动态和静态显示实验

广东海洋大学学生实验报告书实验名称实验2 LED数码管动态和静态显示课程名称计算机控制技术系自动化系专业自动化班级1132 学生姓名袁明星/201311632223 实验地点科技楼403实验日期王波成绩指导教师一、设计目的:LED数码管动态和静态显示二、设计任务:1.LED数码管动态显示,动态扫描时间间隔可调;2.LED数码管静态显示,显示动态扫描时间间隔;三、操作流图:步骤:1.上排的三个数码管用静态扫描方式,显示动态扫描时间间隔;2.下排的6用数码管用动态扫描方式,显示时钟;3.一个独立的按键,每按一次,可增加动态扫描时间间隔四、实验要求:1、态度严谨,独立完成,勤于思考,善于总结;2、认真完成实验报告。

ORG 0000HAJMP STARTORG 0003HAJMP INT_0ORG 000BHAJMP INT_T0ORG 0030H START:MOV 30H,#0 ;秒MOV 31H,#0 ;分MOV 32H,#0 ;时MOV 33H,#1MOV SP,#40HSETB IT0MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HMOV IE,#83HSETB TR0MOV R0,#20V1: MOV A,33HMOV B,#100DIV ABMOV DPTR,#TABMOVC A,@A+DPTRMOV P3,#4FHMOV P2,AMOV A,BMOV B,#10DIV ABMOV DPTR,#TABMOVC A,@A+DPTRMOV P3,#2FHMOV P2,AMOV A,BMOV DPTR,#TABMOVC A,@A+DPTRMOV P3,#1FHMOV P2,AMOV A,30HMOV B,#10DIV ABMOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,#02H MOV P0,AACALL DELAY MOV A,BMOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,#01H MOV P0,AACALL DELAYMOV A,31HMOV B,#10DIV ABMOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,#08H MOV P0,AACALL DELAY MOV A,BMOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,#04H MOV P0,AACALL DELAYMOV A,32HMOV B,#10DIV ABMOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,#20H MOV P0,AACALL DELAY MOV A,BMOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,#10H MOV P0,AACALL DELAYAJMP V1INT_T0:PUSH ACCDJNZ R0,NEXTMOV A,30HINC ACJNE A,#60,NEXT1MOV 30H,#0MOV A,31HINC ACJNE A,#60,NEXT2MOV 31H,#0MOV A,32HINC ACJNE A,#24,NEXT3MOV 32H,#0AJMP NEXT4NEXT1: MOV 30H,AAJMP NEXT4NEXT2: MOV 31H,AAJMP NEXT4NEXT3: MOV 32H,ANEXT4: MOV R0,#20 NEXT: MOV TH0,#3CHMOV TL0,#0B0HPOP ACCRETIINT_0: PUSH ACCMOV A,33HCJNE A,#100,NEXT01MOV 33H,#1AJMP NEXT0NEXT01:MOV B,#10MUL ABMOV 33H,ANEXT0: POP ACCRETIDELAY:MOV R7,33HDEL1: MOV R6,#4NOPDEL2: MOV R5,#123DEL3: DJNZ R5,DEL3DJNZ R6,DEL2DJNZ R7,DEL1RETTAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H END六、实验心得:通过实验,让我对这门课程有了更深入的了解。

FPGA实验三 七段数码管静态与动态显示实验报告

FPGA实验三 七段数码管静态与动态显示实验报告

得分:数字系统设计课程实验实验三七段数码管静态与动态显示实验项目三实验名称:七段数码管静态与动态显示实验目的:通过一个七段数码管显示器的设计,让学生掌握组合逻辑电路的设计方法;掌握组合逻辑电路的静态测试方法;再次基础上扩展了解数码管动态驱动方法并实现,要求在数码管上动态显示4个不同数字。

实验类型:设计、验证实验学时:2学时每组人数:1人实验内容及方法:用七段数码显示器显示0-F16个数字。

设计部分采用VHDL语言完成。

在完成静态显示后思考如何完成动态显示。

实验仪器设备:计算机,红芯开发板。

注意:实验板所用的数码管是共阳极。

原来PPT上讲的例子是共阴极。

在程序编写时注意频率的问题。

通过数码管片选信号选通数码管,以控制输出。

段选时0有效一、VHDL代码:--七段数码管静态与动态显-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;---------------------------------------------------------entity decl7isgeneric(DWIDTH:integer:=18);port(clk,en:in std_logic;led7s:out std_logic_vector(6downto0);bitsele:out std_logic_vector(3downto0));end decl7;---------------------------------------------------------architecture behave of decl7issignal key:std_logic_vector(3downto0);signal temp:std_logic_vector(DWIDTH-1downto0);signal count:std_logic_vector(1downto0);signal fp:std_logic;signal clkout:std_logic;------------------------------------------------------------------------------------------------------------------begin---------------------------------------------------------P1:process(clk)--时钟进行18次分频(引脚上接的是50MHZ时钟);beginif en='1'thenif clk'event and clk='1'then temp<=temp+'1';else NULL;end if;else NULL;end if;end process;clkout<=temp(DWIDTH-1);---------------------------------------------------------P2:process(clkout)--分频后的时钟作为位选时钟;beginif clkout'event and clkout='1'thenif count="11"then count<="00";else count<=count+"01";end if;else null;end if;end process;---------------------------------------------------------P3:process(count)--位选(片选)的同时跳转到段,位选(片选)0有效;begincase count iswhen"00"=>bitsele<="1110";key<="0010";--数码管最后一位显示2;when"01"=>bitsele<="1101";key<="0001";--数码管倒数第二位显示1;when"10"=>bitsele<="1011";key<="0100";--数码管第二位显示4;when"11"=>bitsele<="0111";key<="1001";--数码管第一位显示9;when others=>null;end case;end process;---------------------------------------------------------P4:process(key)--段选,数码管为共阳极,段选0有效;begincase key iswhen"0000"=>led7s<="1000000";--数码管显示0;when"0001"=>led7s<="1111001";--数码管显示1;when"0010"=>led7s<="0100100";--数码管显示2;when"0011"=>led7s<="0110000";--数码管显示3;when"0100"=>led7s<="0011001";--数码管显示4;when"0101"=>led7s<="0010010";--数码管显示5;when"0110"=>led7s<="0000010";--数码管显示6;when"0111"=>led7s<="1111000";--数码管显示7;when"1000"=>led7s<="0000000";--数码管显示8;when"1001"=>led7s<="0010000";--数码管显示9;when"1010"=>led7s<="0001000";--数码管显示A;when"1011"=>led7s<="0000011";--数码管显示b;when"1100"=>led7s<="1000110";--数码管显示c;when"1101"=>led7s<="0100001";--数码管显示d;when"1110"=>led7s<="0000110";--数码管显示E;when"1111"=>led7s<="0001110";--数码管显示F;when others=>null;end case;end process;---------------------------------------------------------end behave;---------------------------------------------------------二、波形仿真:波形仿真截图仿真时,clk输入的是50MHZ的方波,使能端en输入高低平有效,数码管位选输出1110,也就是在仿真的630ns内数码管最后一位被选通,与此同时,段选输出为0100100,也就是数码管显示数字2。

[指南]七段数码管的静态显示

[指南]七段数码管的静态显示

七段数码管的动态显示1、实验内容:数码管的动态显示利用实验板上的某四位数码管依次显示 16 进制的0000~FFFF。

为实现功能重用的目的,我们仍然将系统划分为几个部分:(1)时钟分频模块:将开发板上的 50MHz 高速时钟进行分频产生一个5Hz 的时钟用于计数。

(2)计数模块:实现从 0000~FFFF 的计数功能。

用4位十六进制数来实现,其中15‐12 位表示十六进制数的最高位,11‐8 位表示次高位,7‐4 位表示次低位,3‐0位表示最低位(3)数码管动态显示模块:将计数模块的输出作为显示字符的输入值,分时送出相应段码,实现数码管的动态显示效果。

2、参考程序:module SegDynamicDisp(CLK,rst_n,SEG0,SEG1,SEG2,SEG3);//数码管动态显示模块?input CLK;input rst_n;output [7:0]SEG0;//定义输出数码管0的段码带output [7:0]SEG1;//定义输出数码管1的段码带output [7:0]SEG2;//定义输出数码管2的段码带output [7:0]SEG3;//定义输出数码管3的段码带//......................................................... .....reg [7:0]SEG0;//定义输出数码管0的段码带reg [7:0]SEG1;//定义输出数码管1的段码带reg [7:0]SEG2;//定义输出数码管2的段码带reg [7:0]SEG3;//定义输出数码管3的段码带//......................................................... .........parameter seg0=8'hC0,seg1=8'hF9,seg2=8'hA4,seg3=8'hB0,seg4=8'h99,seg5=8'h92,seg6=8'h82,seg7=8'hF8,seg8=8'h80,seg9=8'h90,sega=8'h88,segb=8'h83,segc=8'hC6,segd=8'hA1,sege=8'h86,segf=8'h8E;//......................................................... ...........reg[23:0] cnt;//定义计数寄存器,用来实现定时的功能reg [15:0]counter;//定义计数寄存器,用于实现显示的数值always @(posedge CLK or negedge rst_n)//计数过程,记录当前显示的位选序号if(!rst_n)begincnt<=24'D0;//复位时cnt初始化为0counter<=2'b00;//复位时counter初始化为0endelsebegincnt<=cnt+1'b1;//实现计数的功能if(cnt==24'D1*******)begincnt<=0;//当达到计数值以后回复初始值counter<=counter+1;//当达到计时时间以后显示的数值也相应的+1endend//....................................................always @(posedge CLK or negedge rst_n)if(!rst_n)beginSEG0<=0;SEG1<=0;SEG2<=0;SEG3<=0;endelsealways @(counter)begincase(counter[3:0])4'h0: sm_dbr <= seg0; 4'h1: sm_dbr <= seg1; 4'h2: sm_dbr <= seg2; 4'h3: sm_dbr <= seg3; 4'h4: sm_dbr <= seg4; 4'h5: sm_dbr <= seg5; 4'h6: sm_dbr <= seg6; 4'h7: sm_dbr <= seg7; 4'h8: sm_dbr <= seg8; 4'h9: sm_dbr <= seg9; 4'ha: sm_dbr <= sega; 4'hb: sm_dbr <= segb; 4'hc: sm_dbr <= segc; 4'hd: sm_dbr <= segd; 4'he: sm_dbr <= sege; 4'hf: sm_dbr <= segf; default: ;endcasecase(counter[7:4])4'h0: sm_dbr <= seg0; 4'h1: sm_dbr <= seg1; 4'h2: sm_dbr <= seg2; 4'h3: sm_dbr <= seg3; 4'h4: sm_dbr <= seg4; 4'h5: sm_dbr <= seg5; 4'h6: sm_dbr <= seg6; 4'h7: sm_dbr <= seg7; 4'h8: sm_dbr <= seg8; 4'h9: sm_dbr <= seg9;4'hb: sm_dbr <= segb; 4'hc: sm_dbr <= segc; 4'hd: sm_dbr <= segd; 4'he: sm_dbr <= sege; 4'hf: sm_dbr <= segf; default: ;endcasecase(counter[11:8]) 4'h0: sm_dbr <= seg0; 4'h1: sm_dbr <= seg1; 4'h2: sm_dbr <= seg2; 4'h3: sm_dbr <= seg3; 4'h4: sm_dbr <= seg4; 4'h5: sm_dbr <= seg5; 4'h6: sm_dbr <= seg6; 4'h7: sm_dbr <= seg7; 4'h8: sm_dbr <= seg8; 4'h9: sm_dbr <= seg9; 4'ha: sm_dbr <= sega; 4'hb: sm_dbr <= segb; 4'hc: sm_dbr <= segc; 4'hd: sm_dbr <= segd; 4'he: sm_dbr <= sege; 4'hf: sm_dbr <= segf; default: ;endcasecase(counter[15:12]) 4'h0: sm_dbr <= seg0; 4'h1: sm_dbr <= seg1; 4'h2: sm_dbr <= seg2;4'h4: sm_dbr <= seg4; 4'h5: sm_dbr <= seg5; 4'h6: sm_dbr <= seg6; 4'h7: sm_dbr <= seg7; 4'h8: sm_dbr <= seg8; 4'h9: sm_dbr <= seg9; 4'ha: sm_dbr <= sega; 4'hb: sm_dbr <= segb; 4'hc: sm_dbr <= segc; 4'hd: sm_dbr <= segd; 4'he: sm_dbr <= sege; 4'hf: sm_dbr <= segf; default: ;endcaseendendmodule3、接口:clk--PIN_N2rst_n--PIN_N25SEG0[0]--PIN_AF10SEG0[1]--PIN_AB12SEG0[2]--PIN_AC12SEG0[3]--PIN_AD11SEG0[4]--PIN_AE11SEG0[5]--PIN_V14SEG0[6]--PIN_V13SEG1[0]--PIN_V20SEG1[1]--PIN_V21SEG1[2]--PIN_W21SEG1[3]--PIN_Y22SEG1[4]--PIN_AA24SEG1[5]--PIN_AA23SEG1[6]--PIN_AB24SEG2[0]--PIN_AB23SEG2[1]--PIN_V22SEG2[2]--PIN_AC25SEG2[3]--PIN_AC26SEG2[4]--PIN_AB26SEG2[5]--PIN_AB25SEG2[6]--PIN_Y24SEG3[0]--PIN_Y23SEG3[1]--PIN_AA25SEG3[2]--PIN_AA26SEG3[3]--PIN_Y26SEG3[4]--PIN_Y25SEG3[5]--PIN_U22SEG3[6]--PIN_W244、上机程序module SegDynamicDisp(CLK,rst_n,SEG0,SEG1,SEG2,SEG3); input CLK;input rst_n;output [6:0]SEG0;output [6:0]SEG1;output [6:0]SEG2;output [6:0]SEG3;reg [6:0]SEG0;reg [6:0]SEG1;reg [6:0]SEG2;reg [6:0]SEG3;//........以上是定义的一些输入输出接口..........................parameter seg0=7'hC0,seg1=7'hF9,seg2=7'hA4,seg3=7'hB0,seg4=7'h99,seg5=7'h92,seg6=7'h82,seg7=7'hF8,seg8=7'h80,seg9=7'h90,sega=7'h88,segb=7'h83,segc=7'hC6,segd=7'hA1,sege=7'h86,segf=7'h8E;//..............以上是定义的参数,用来标记段代码...................reg[23:0] cnt;reg [15:0]counter;always @(posedge CLK or negedge rst_n)if(!rst_n)begincnt<=24'D0;counter<=2'b00;endelsebegincnt<=cnt+1'b1;if(cnt==24'D1*******)begincnt<=0;counter<=counter+1;endend//..........用来实现计数功能和控制数字递增的速度....................always @(counter)begincase(counter[3:0])4'h0: SEG0 <= seg0;4'h1: SEG0 <= seg1;4'h2: SEG0 <= seg2;4'h3: SEG0 <= seg3;4'h4: SEG0 <= seg4;4'h5: SEG0 <= seg5;4'h6: SEG0 <= seg6;4'h7: SEG0 <= seg7; 4'h8: SEG0 <= seg8; 4'h9: SEG0 <= seg9; 4'ha: SEG0 <= sega; 4'hb: SEG0 <= segb; 4'hc: SEG0 <= segc; 4'hd: SEG0 <= segd; 4'he: SEG0 <= sege; 4'hf: SEG0 <= segf; default: ; endcasecase(counter[7:4]) 4'h0: SEG1 <= seg0; 4'h1: SEG1 <= seg1; 4'h2: SEG1 <= seg2; 4'h3: SEG1 <= seg3; 4'h4: SEG1 <= seg4; 4'h5: SEG1 <= seg5; 4'h6: SEG1 <= seg6; 4'h7: SEG1 <= seg7; 4'h8: SEG1 <= seg8; 4'h9: SEG1 <= seg9; 4'ha: SEG1 <= sega; 4'hb: SEG1 <= segb; 4'hc: SEG1 <= segc; 4'hd: SEG1 <= segd; 4'he: SEG1 <= sege; 4'hf: SEG1 <= segf; default: ; endcasecase(counter[11:8])4'h1: SEG2 <= seg1; 4'h2: SEG2 <= seg2; 4'h3: SEG2 <= seg3; 4'h4: SEG2 <= seg4; 4'h5: SEG2 <= seg5; 4'h6: SEG2 <= seg6; 4'h7: SEG2 <= seg7; 4'h8: SEG2 <= seg8; 4'h9: SEG2 <= seg9; 4'ha: SEG2 <= sega; 4'hb: SEG2 <= segb; 4'hc: SEG2 <= segc; 4'hd: SEG2 <= segd; 4'he: SEG2 <= sege; 4'hf: SEG2 <= segf; default: ;endcasecase(counter[15:12]) 4'h0: SEG3 <= seg0; 4'h1: SEG3 <= seg1; 4'h2: SEG3 <= seg2; 4'h3: SEG3 <= seg3; 4'h4: SEG3 <= seg4; 4'h5: SEG3 <= seg5; 4'h6: SEG3 <= seg6; 4'h7: SEG3 <= seg7; 4'h8: SEG3 <= seg8; 4'h9: SEG3 <= seg9; 4'ha: SEG3 <= sega; 4'hb: SEG3 <= segb;4'hd: SEG3 <= segd;4'he: SEG3 <= sege;4'hf: SEG3 <= segf;default: ;endcaseend//...................用来实现显示功能..................... endmodule5、实验结果复位按键为0时:HEX3 HEX2 HEX1 HEX0 显示的为0000;复位按键为1时:HEX3 HEX2 HEX1 HEX0 显示的依次为:0000——FFFF。

7段数码管动态显示实验说明

7段数码管动态显示实验说明

#define printf
xil_printf /* Smalller foot-print printf */
const unsigned int
Display_Code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
const unsigned int Selected_Code[4]={0xEE,0xDD,0xBB,0x77};
}
xil_printf("Successfully ran 7segment leds Example\r\n"); return XST_SUCCESS; } //////////////////////////////////////////////////////////// //emerge 3 8bits bus into a 24bits bus ///////////////////////////////////////////////////////////// static int emerge_ledbus(int ledbus0,int ledbus1,int ledsel) { return ledbus0+(ledbus1<<8)+(ledsel<<16); }
/**************************** Type Definitions ******************************/
/***************** Macros (Inline Functions) Definitions *******************/
LED_BUS0 0X00 LED_BUS1 0X00 LED_SEL 0XFF

8255与多位LED数码管的显示

8255与多位LED数码管的显示

实验2 8255与多位LED数码管的显示实验一、实验目的掌握8255A的编程原理与多位LED数码管的显示方法。

二、实验设备MUT—Ⅲ型实验箱、8086CPU模块。

三、实验内容把待显示字符的LED代码组成一个七段代码表,存放在存储器中。

通过对8255编写程序在多位LED 数码管上显示输出。

1、设计出8255与8086接口对应硬件电路,并完成相应的连接2、设计出8255与LED数码管的对应硬件接口电路,并完成相应的连接3、编写程序,在数码管上显示相应字符或数字4、写出习题部分要求的程序四、实验原理介绍本实验用到两部分电路:8255可编程并口电路和LED数码管的显示电路。

实验箱数码管采用共阴极形式。

五、实验步骤1、实验接线CS0↔CS8255(输出)PA0~PA7↔ LED-A~LED-DP(段控)(输出)PB0~PB5↔ LED-1~LED-6(位控)2、编程并全速或单步运行。

3、全速运行时观察数码管的变化。

六、实验提示1.8255A是比较常用的一种并行接口芯片,其特点在许多教科书中均有介绍。

本实验中用到8255A的A口和B口两个端口,A口和B口均作为输出口。

实验中,8255A工作于基本输入输出方式(方式0)。

2.用8255A端口B的PB0~PB5,控制LED的显示位,即8255A的端口B为LED数码显示器的位控制端口。

当B口中一位输出为“0”时,便在相应数码管的阴极加上了低电平,这个数码管就可以显示数据。

但具体显示什么数码,则由另一个端口,即段控制端口决定。

段控制端口由6个数码管共用,因此当CPU送出一个显示代码时,各数码管的阳极都收到了此代码。

但是,只有位控制码中低位对应的数码管才会导通而显示数字,其他管子并不发光。

3.对显示器采用动态扫描法控制显示。

所谓动态扫描,就是逐个接通6位LED,把端口A送出的代码送到相应的位上去显示。

此时,8255A的端口A送出的一个七段码,虽然各位LED都能接收到,但由于端口B只有一位输出低电平,所以只有一个LED的相应段导通显示数字,其他LED不亮。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微机实验报告书
学号:姓名:班级:
同组名单:实验日期: 2012.12.21
实验题目:七段数码管的静态显示
实验目标:掌握数码管显示数字的原理
(功能:键盘输入一位十进制数字(0~9),用七段数码管显示。


解题思路:
1.静态显示:按图 10(a)连接好电路,将8255的A口PA0-PA6分别与七段
数码管的断码驱动输入端a-g项链,位码驱动输入端S1接+5V,S0、dp
接地。

编程从键盘输入一位十进制数字,在七段数码管上显示出来。

2.动态显示:按图10(b)连接好电路,七段数码管段码连接不变,位码驱
动输入端S1,S0接8255C口的PC1,PC0。

编程在两个数码管上显示“56”。

程序框图:静态显示见图11(a),动态显示见图11(b)。

关键问题分析(静态显示):
1、按键判断和程序结束判断
按键来说,由于程序中必须输入数字,所以没有必要对是否按键进行判断,只需要判断按键是否在0-9之间即可。

用以下程序即可:
cmp al,'0'
jl exit ; jl,条件转移指令,即在小于时转移
cmp al,'9'
jg exit ;jg, 条件转移指令,即在大于时转移程序中还要用到“cmp”即比较指令,用来比较输入数与0、9的大小关系。

程序结束:如若输入的数字小于0或者大于9,必须直接跳出程序,即结束指令必须单独占用一个程序段,这样,程序顺序执行完毕也可以顺利返回DOS。

2、七段码显示。

实验指导书中给出了七段码的字型代码。

这样一来,七段码的显示只需要用换码指令“XLAT”便可以轻松实现。

前提是必须将七段码字型编成数码表以字符串的形式写进程序中。

3、数字键ASCII码与数值间的转换。

因为0的ASCII码为30H,所以数字键ASCII码与数值间的转换时只需减去30H即可,可用下列语句实现:
sub al,30h
程序清单:
静态显示:
data segment
ioport equ 0c800h-0280h
io8255a equ ioport+288h
io8255b equ ioport+28bh
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
mesg1 db 0dh,0ah,'Input a num (0--9h):',0dh,0ah,'$'
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,io8255b ;使8255的A口为输出方式
mov al,80h ;10000000B,控制字PA以方式0输出
out dx,al
zby: mov dx,offset mesg1 ;显示提示信息
mov ah,09h
int 21h
mov ah,01 ;从键盘接收字符
int 21h
cmp al,'0' ;是否小于0
jl exit ;如若小于0,则跳转到exit退出程序
cmp al,'9' ;是否大于9
jg exit ; 如若大于9,则跳转到exit退出程序
sub al,30h ;将所得字符的ASCII码减30H,数字键ascii码同数值转换
mov bx,offset led ;bx为数码表的起始地址
xlat ;求出相应的段码
mov dx,io8255a ;从8255的A口输出
out dx,al
jmp zby ;转zby
exit: mov ah,4ch ;返回DOS
int 21h
code ends
end start
动态显示:
data segment
ioport equ 0c800h-0280h
io8255a equ ioport+28ah
io8255b equ ioport+28bh
io8255c equ ioport+288h
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码buffer1 db 5,6 ;存放要显示的个位和十位
bz dw ? ;位码
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,io8255b ;将8255设为A口输出
mov al,80h ;10000000B,控制字PA以方式0输出out dx,al
mov di,offset buffer1 ;设di为显示缓冲区
loop2: mov bh,02
zby: mov byte ptr bz,bh
push di
dec di
add di, bz
mov bl,[di] ;bl为要显示的数
pop di
mov al,0
mov dx,io8255a
out dx,al
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
mov cx,3000
delay: loop delay ;延时
mov bh,byte ptr bz
shr bh,1
jnz zby
mov dx,0ffh
mov ah,06
int 21h
je loop2 ;有键按下则退出
mov dx,io8255a
mov al,0 ;关掉数码管显示
out dx,al
mov ah,4ch ;返回
int 21h
code ends
end start
运行结果:
静态显示:在键盘上输入一个0-9的任意数字,会显示在数码管上。

动态显示:在程序中写入6,5,读取顺序是第一位是个位,第二位是十位,数码管上显示56.
问题与讨论:
1、键盘输入不符合要求如何处理?
如若键盘输入不符合要求,则立即跳到结束程序段,返回到DOS。

2、用8255的其他端口输出怎么处理?
由于其他端口输出并没有用到,控制字中写成0或者1都行,一般习惯上不用到填0即可。

3、在两位七段数码管间切换显示怎么处理?
通过硬件连线即可实现。

七段数码管连接和S1连接不变。

将S0不接地,接到+5V,并同时将S1和S0接到两个不同的逻辑开关。

程序LINK运行完毕。

当S1逻辑开关为高电平时(S0逻辑开关为低电平),在第一个数码管显示;当S0逻辑开关为高电平时(S1逻辑开关为低电平),在第二个数码管显示,这样便实现了在两位数码管间的切换。

小结(体会和收获)
静态显示是从键盘获取一个数值,然后通过程序比较得出键盘输入的数字量,由PA端口输出到数码管上。

而动态显示是将两个数字写入程序中,由程序读取数字然后按位输出到数码管上显示。

原理说得简单,但是程序本身个人感觉
还是相当复杂的,尤其动态显示,程序如何读取已输入的数字,以及读取数字的顺序都会影响到数码管的显示。

静态显示过程中,我们碰到数码管一直显示8的状态,这并不是预期的效果。

后来发现,由于在程序中用符号定义伪指令EQU将所要用到的算口地址用“io8255*”定义,但在写程序的过程中又写进去了十六进制实际地址,导致出现问题,经过很长时间的调试方才解决。

由于我们小组做了全部两个选做实验,所以这次将动态显示的报告和静态显示写在一起,由于将大部分精力放在静态显示,所以动态显示并未做充分的问题思考和讨论。

相关文档
最新文档