实验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
  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*”定义,但在写程序的过程中又写进去了十六进制实际地址,导致出现问题,经过很长时间的调试方才解决。

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

相关文档
最新文档