实验四 七段数码管显示实验报告
《静态显示学号》实验报告(可编程逻辑器件)

电子信息与自动化学院《可编程逻辑器件》实验报告学号:姓名:实验名称:静态显示学号一、实验原理LED七段数码管根据LED的接法不同分为共阴和共阳两类,是电子开发过程中常用的输出显示设备。
在本次实验中,使用的是四个共阳极型七段数码管。
每当送入一次字形码后,四个数码管同时显示同一数字,显示字形可一直保持,然后间隔1s再送入新的字形码,四个数码管同时显示下一个数字,以此类推,直到显示完四个数字再重头开始,轮流往复,便可实现四位学号的静态显示。
图1二、实验步骤1、编辑数码管静态显示的源程序执行“File”→“New”→“Verilog HDL File ”命令,进入Verilog HDL 文本编辑方式,按下列数码管静态显示的Verilog HDL 源代码输入源程序:module jiaoduxianshi (clk, rst, out0) ;input clk,rst;output reg[6:0] out0;reg [3:0] state;parameters0=4'd0,s1=4'd1, s2=4'd2, s3=4'd3, s4=4'd4,s5=4'd5, s6=4'd6, s7=4'd7;always@ (posedge clk or negedge rst)beginif(!rst) begin out0=7'b0111111;state=s0;endelsebegincase (state)//共阳s0: begin out0=7'b0010010;state<=s1;end//display 2s1: begin out0=7'b0000001;state<=s2;end//display 0s2: begin out0=7'b1001111;state<=s3;end //display 1s3: begin out0=7'b0001111;state<=s4;end //display 7s4: begin out0=7'b1000001;state<=s5;end //display 6s5: begin out0=7'b0001111;state<=s6;end //display 7 s6: begin out0=7'b0000110;state<=s7;end //display 3s7: begin out0=7'b1001111;state<=s0;end //display 1default:state<=0;endcaseendendendmodule图2 RTL viewer2、设计文件存盘和编译完成数码管静态显示的文本编辑后,以jingtaixianshi.v件名将设计文件保存在工程目录中,“.v”表示Verilog HDL 源程序文件。
实验四 LED数码管显示实验报告

实验名称 LED数码管显示实验指导教师曹丹华专业班级光电1202班姓名陈敬人学号联系电话一、任务要求实验目的:理解LED七段数码管的显示控制原理,掌握数码管与MCU的接口技术,能够编写数码管显示驱动程序;熟悉接口程序调试方法。
实验内容:1.基础部分:利用C8051F310单片机控制数码管显示器。
利用末位数码管循环显示数字0-F,显示切换频率为1Hz。
2.提高部分:在数码管上显示0→199计数,计数间隔为0.5秒。
二、设计思路1.基础部分C8051F310单片机片上晶振为24.5MHz,采用8分频后为3.0625MHz ,输入时钟信号为48个机器周期,T1采用定时器工作方式1,单次定时最长可达1.027s,可以实现1s定时要求。
定时采用软件查询工作方式,利用JNB TF0, HERE实现。
置P0.6和P0.7端口为0,位选信号选定末位数码管。
通过MOVC A, @A+DPTR指令,利用顺序查表法取出显示段码数据。
寄存器R0自增1,并赋给A以取出下一个显示段码数据。
为减短代码长度,利用CJNE指令实现循环结构。
当寄存器R0增至0FH后,跳转至开头,重新开始下一轮显示。
2.提高部分定时方式及查表方式同基础部分,由于要实现三个数码管同时显示,因此采用动态扫描显示法。
三、资源分配1.基础部分P0.6: 位选信号端口P0.7:位选信号端口P1:输出段码数据R0:存放显示数据DPTR:指向段码数据表首 2.提高部分P0.6:位选信号端口P0.7:位选信号端口R0:存放个位显示数据 R5:存放十位显示数据 R6:存放百位显示数据 P1:输出段码数据DPTR: 指向段码数据表首四、流程图1.基础部分2.提高部分五、源代码(含文件头说明、语句行注释)1.基础部分;******************基础部分源代码***************************;Filename: test.asm;Decription: 末位数码管循环显示数字0-F,显示切换频率为1Hz。
8255和LED数码管显示实验

实验四 8255和LED 数码管显示实验一、实验目的1.掌握并行接口8255A 的工作原理及使用方法。
2.了解七段数码管显示数字的原理。
3.掌握多位数码显示的接口技术。
二、实验电路实验电路如图2及图3所示。
三、实验内容1.静态显示:如图2所示,将8255A 的A 口PA0~PA6分别与七段数码管的段码驱动输入端a ~g 相连。
编程从键盘输入一位十进制数字(0~9),在七段数码管上显示出来,按其它键程序退出。
用Proteus 仿真软件搭建硬件电路,实现静态显示,完成系统的调试运行,并讲解搭建调试全过程。
用屏幕录像软件进行全过程录像,以MP4格式保存提交,提交仿真程序文件,完成实验报告的书写。
2.动态显示:按图3连接好电路,七段数码管段码连接不变,两个数码管的位码驱动输入端S1、S0分别接8255C 口的PC1、PC0。
编程在两个数码管上显示56,按任意键程序退出。
用Proteus 仿真软件搭建硬件电路,。
要求:在Proteus 仿真软件上搭建硬件系统,采用一个8255芯片实现两个数码管动态显示数字‘56’,完成系统的调试运行,并讲解搭建调试全过程。
用屏幕录像软件进行全过程录像,以MP4格式保存提交,提交仿真程序文件,完成实验报告的书写。
四、实验程序和结果<1>静态显示;************************************************ ;* 键盘输入数据(0-9)控制LED 数码管显示(静态显示) * ;************************************************ IO8255A EQU 288HP A 6P A 5P C 0 P A 4P A 3g f e d c b aS1 S0图3 动态态显示电路+5VP A 6P A 5P A 4C S P A 3g f e d c b a288H~ 28BH8255图2 静态显示电路 dp S3 S2 S1 S0IO8255CON EQU 28BHDATA SEGMENTLED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHMESG DB 0DH,0AH,'INPUT A NUM (0--9),OTHER KEY IS EXIT:',0DH,0AH,'$' DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DX,IO8255CON ;使8255的A口为输出方式MOV AX,80HOUT DX,ALSSS:MOV DX,OFFSET MESG ;显示提示信息MOV AH,09HINT 21HMOV AH,01 ;从键盘接收字符INT 21HCMP AL,'0' ;是否小于0JB EXIT ;若是则退出CMP AL,'9' ;是否大于9JA EXIT ;若是则退出SUB AL,30H ;将所得字符的ASCII码减30HMOV BX,OFFSET LED ;BX为数码表的起始地址XLAT ;求出相应的段码MOV DX,IO8255A ;从8255的A口输出OUT DX,ALJMP SSS ;转SSSEXIT: MOV AH,4CH ;返回DOSINT 21HCODE ENDSEND START<2>动态显示DATA SEGMENTINPORT EQU 2400H-280HIO8255A EQU INPORT+288HIO8255C EQU INPORT+28AHIO8255CTR EQU INPORT+28BHMESGL DB 0DH,0AH,’PRESS ANY KEY TO EXIT!’,0DH,0AH,’$’DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET MESGL ; 提示显示信息MOV AH,9INT 21HMOV DX,IO8255CTR ;将8255设为A口输出MOV AL,80HOUT DX,ALLOOP1:MOV DX,IO8255AMOV AL,6DHOUT DX,ALMOV DX,IO8255CMOV AL,2OUT DX,ALMOV CX,3000HDELAY:LOOP DELAY ;延时MOV DX,IO8255CMOV AL,0OUT DX,AL ; 关数码管MOV DX,IO8255AMOV AL,7DHOUT DX,ALMOV DX,IO8255CMOV AL,1OUT DX,ALMOV CX,3000HDELAY1:LOOP DELAY1 ;延时MOV AH,0BHINT 21HCMP AL,0JNZ EXIT ;按任意键退出JMP LOOP1EXIT:MOV DX,IO8255CMOV AL,0 ;关掉数码管显示OUT DX,ALMOV AX,4C00H ;返回DOSINT 21HCODE ENDSEND START。
十六进制7段数码显示译码器设计实验报告

十六进制7段数码显示译码器设计实验报告实验报告:十六进制7段数码显示译码器设计一、实验目的本实验的主要目的是设计一种用于将十六进制数码转化为七段显示的译码器电路。
通过这个实验,我们可以学习和了解数字电路的工作原理、数码管的控制方式以及七段数码的译码方法。
二、实验原理本实验所用到的数码管为共阳数码管,它由7个发光二极管组成,其中的每一个发光二极管称为一个段。
这七个段依次为a、b、c、d、e、f和g,它们分别对应数码管上的abcdefg七个引脚。
当一些引脚输出高电平时,相应的段就会被点亮,从而显示出特定的字符。
为了实现将十六进制数码转化为七段显示的功能,我们需要设计一个译码器电路。
译码器电路的输入为十六进制数码,输出为七段信号,用于控制数码管的每个段的亮灭情况。
为了简化设计,我们可以采用CMOS数字集成电路74LS47来实现译码器电路。
该集成电路内部集成了BCD转七段译码器,可以将二进制代码转化为七段数码显示所需要的信号。
它的输入为四个二进制输入端口A、B、C和D,输出为七个段芯片(a、b、c、d、e、f和g)的控制信号。
三、实验步骤1.首先,根据74LS47的真值表,确定译码器的输入和输出。
2.根据真值表,画出逻辑图,确定硬件电路的连接方式。
3.按照逻辑图和电路连接方式,进行硬件电路的布线。
4.按照实验仪器的操作说明,对电路进行调试和测试。
5.将输入端口连接至外部的十六进制信号源,观察输出端口的数据是否正确。
6.验证电路的正确性和稳定性,如果出现问题,进行排除和修复。
四、实验结果经过实验,我们成功地设计并实现了一个十六进制7段数码显示译码器电路。
当输入端口接收到一个十六进制信号时,通过电路的处理和转换,将其转化为了相应的七段信号,用于控制数码管的每个段的亮灭情况。
通过实验观察,我们发现电路的输出结果与预期一致,且工作稳定。
五、实验总结通过这个实验,我们对于数字电路的工作原理和数码管的控制方式有了更深的了解。
组合电路——7段数码管显示驱动电路设计报告

实验一、组合电路——7段数码管显示驱动电路设计一、实验目的了解EDA实验箱7位八段数码管显示模块的工作原理,设计标准扫描驱动电路模块,以备后面实验用。
二、硬件要求主芯片为Cyclone V E,型号为EP4CE22F17C8,7位八段数码管显示器,四位拨码开关。
三、实验内容用四位拨码开关产生8421BCD码,用CPLD分别产生7段数码管扫描驱动电路,然后进行仿真,观察波形,正确后编程下载实验测试。
四、实验原理1、72、动信号a,b,c,d,e,f,g。
通过调节四位拨码开关的状态,数码管应显示与之对应的字符。
五、实验连线输入:将芯片管角a0~a3分别接4个拨码开关;输出:将芯片管角led7s0~7分别接到数码管7段驱动信号a、b、c、d、e、f、g上。
六、实验源程序:decl7s.vhdlibrary ieee;use ieee.std_logic_1164.all;entity decl7s isport(a:in std_logic_vector(3 downto 0);led7s:out std_logic_vector(6 downto 0));end;architecture one of decl7s isbeginprocess(a)begincase a iswhen "0000" => led7s<="0111111"; when "0001" => led7s<="0000110"; when "0010" => led7s<="1011011"; when "0011" => led7s<="1001111"; when "0100" => led7s<="1100110"; when "0101" => led7s<="1101101"; when "0110" => led7s<="1111101"; when "0111" => led7s<="0000111"; when "1000" => led7s<="1111111"; when "1001" => led7s<="1101111"; when "1010" => led7s<="1110111"; when "1011" => led7s<="1111100"; when "1100" => led7s<="0111001"; when "1101" => led7s<="1011110"; when "1110" => led7s<="1111001"; when "1111" => led7s<="1110001"; when others => null;end case;end process;end;七、波形仿真结果。
数码管显示实验 实验报告

数码管显示实验实验报告一、实验目的本次数码管显示实验的主要目的是深入了解数码管的工作原理和显示控制方式,通过实际操作掌握数码管与微控制器的接口技术,并能够编写相应的程序实现各种数字和字符的显示。
二、实验原理数码管是一种由多个发光二极管组成的显示器件,常见的有共阴数码管和共阳数码管两种类型。
共阴数码管是将所有发光二极管的阴极连接在一起,当阳极接高电平时,相应的二极管发光;共阳数码管则是将所有发光二极管的阳极连接在一起,当阴极接低电平时,相应的二极管发光。
在控制数码管显示时,通常采用动态扫描的方式,即依次快速地给每个数码管的段选端送入相应的字形码,同时使位选端选通对应的数码管,利用人眼的视觉暂留效应,使人看起来好像所有数码管同时在显示。
三、实验设备与材料1、实验开发板2、数码管模块3、杜邦线若干4、电脑5、编程软件四、实验步骤1、硬件连接将数码管模块与实验开发板进行连接,确定好段选和位选引脚的连接。
检查连接是否牢固,确保电路无短路或断路现象。
2、软件编程打开编程软件,选择相应的开发板型号和编程语言。
定义数码管的段选和位选引脚。
编写控制程序,实现数字 0 到 9 的循环显示。
3、编译与下载对编写好的程序进行编译,检查是否有语法错误。
将编译成功的程序下载到实验开发板上。
4、观察实验现象接通实验开发板的电源,观察数码管的显示情况。
检查显示的数字是否正确,显示的亮度和稳定性是否符合要求。
五、实验结果与分析1、实验结果数码管能够正常显示数字 0 到 9,并且能够按照设定的频率循环显示。
显示的数字清晰、稳定,没有出现闪烁或模糊的现象。
2、结果分析程序编写正确,能够准确地控制数码管的段选和位选信号,实现数字的显示。
动态扫描的频率设置合理,既保证了显示的稳定性,又不会出现明显的闪烁。
六、实验中遇到的问题及解决方法1、问题数码管显示出现闪烁现象。
解决方法调整动态扫描的频率,增加扫描的速度,减少每个数码管的点亮时间,从而减轻闪烁现象。
实验四 七段数码管显示实验报告

实验四七段数码管显示实验一、实验目的掌握数码管显示数字的原理。
二、实验内容1.静态显示:数码管为共阴极,通过BCD码译码驱动器CD4511驱动,其输入端A~D输入4位BCD码,位码输入低电平选中。
按图4-1连接好电路,将8255的A口PA0~PA3与七段数码管LED1的BCD码驱动输入端A1~D1相连,8255的A口PA4~PA7与七段数码管LED2的BCD码驱动输入端A2~D2相连,8255的B口PB0~PB3与七段数码管LED3的BCD码驱动输入端A3~D3相连,8255的B口PB4~PB7与七段数码管LED4的BCD码驱动输入端A4~D4相连,8255的C口PC0~PC3分别与七段数码管LED4~LED4的位驱动输入端DG1~DG4相连。
编程从键盘上每输入4个0~9数字,在七段数码管LED4~LED4上依次显示出来。
图4-12.动态显示:数码管为共阴极,段码采用相同驱动,输入端加高电平,选中的数码管对应段点亮,位码采用同相驱动,位码输入端低电平选中,按图4-2连接好电路,图中只画了2个数码管,实际是8个数码管,将8255的A口PA0~PA7分别与七段数码管的段码驱动输入端a~g相连(32TCI0模块上的J1连32LED8模块J2),8255的C口的PC0~PC7接七段数码管的段码驱动输入(32TCI0模块上的J3连32LED8模块J1),跳线器K1连2和3。
编程在8个数码管上显示“12345678”。
按任意键推出运行。
图4-2三、编程提示1.由于DVCC卡使用PCI总线,所以分配的IO地址每台微机可能都不用,编程时需要了解当前的微机使用那段IO地址并进行处理。
2.对实验内容1,七段数码管字型代码与输入的关系如下表:四、参考流程图1.实验内容一的参考流程图图4-3 2.实验内容二的参考流程图图4-4五、参考程序1.内容一的参考程序源程序清单如下:data segmentioport equ 0c400h-0280hio8255a equ ioport+288hio8255b equ ioport+289hio8255c equ ioport+28ahio8255k equ ioport+28bhled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhmesg1 db 0dh,0ah,'Input a num (0--9),other key is exit:',0dh,0ah,'$'bz db ?cz db 04hdata endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8255k ;使8255的A口为输出方式mov ax,80hout dx,alsss0: mov si,offset bzmov cx,04hsss1: mov dx,offset mesg1 ;显示提示信息mov ah,09hint 21hmov ah,01 ;从键盘接收字符int 21hcmp al,'0' ;是否小于0jl exit ;若是则退出cmp al,'9' ;是否大于9jg exit ;若是则退出sub al,30h ;将所得字符的ASCII码减30Hmov [si],al ;存入显示缓冲区inc si ;显示缓冲区指针加1dec cx ;判断输入满4个数字吗?jnz sss1 ;不满继续mov si,offset bz ;从显示缓冲区取第一个数字的BCD 码mov al,[si]and al,0fh ;屏蔽高四位暂存ALinc si ;显示缓冲区指针加1mov ah,[si] ;取第二个数字的BCD码到AHsal ah,4h ;右移4次到高四位add al,ah ;两个BCD码合并成一个字节mov bl,al ;暂存入BLinc simov al,[si] ;取第三个数字的BCD码and al,0fhinc simov ah,[si] ;取第四个数字的BCD码到AHsal ah,4hadd ah,almov al,ahmov dx,io8255a ;从8255的A口输出(后两个数字)out dx,almov al,blmov dx,io8255b ;从8255的B口输出(前两个数字)out dx,almov al,0f0hmov dx,io8255c ;从8255的C口输出位码out dx,almov dl,0ffhmov ah,06int 21hje sss0 ;有键按下则退出exit: mov ah,4ch ;返回int 21hcode endsend start2.内容二的参考程序源程序清单如下:data segmentioport equ 0C400h-0280hio8255c equ ioport+28ahio8255k equ ioport+28bhio8255a equ ioport+288hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码buffer1 db 01h,02h,03h,04h,05h,06h,07h,08h ;存放要显示的十位和个位con db ? ;位码data endscode segmentassume cs:code, ds:datastart: mov ax,datamov ds,axmov dx,io8255k ;将8255设为A口C口输出mov al,80hout dx,alloop2: mov al,08h ;设置数码管位计数器初值到CON mov byte ptr con,almov si,offset buffer1 ;置显示缓冲器指针SImov ah,7fh ;置位码初值disp0: mov cx,0ffffhmov bl,ds:[si] ;取显示缓冲区显示值存BXmov bh,0hpush simov dx,io8255c ;位码从C口输出mov al,ahout dx,almov dx,io8255amov si,offset led ;置led数码表偏移地址为SIadd si,bx ;求出对应的led数码mov al,byte ptr [si]out dx,al ;段码从A口输出disp1: loop disp1 ;延时mov cx,0ffffhdisp2: loop disp2ror ah,01h ;位码右移1位pop siinc si ;显示缓冲区指针加1mov al,byte ptr condec almov byte ptr con,aljnz disp0 ;数码管位计数器减1为0吗?,不为0继续mov dx,io8255a ;为0,关数码管显示mov al,0out dx,almov dl,0ffhmov ah,06int 21hje loop2 ;有键按下则退出mov ah,4ch ;返回int 21hcode endsend start实验总结:通过这次试验,我了解到自定义数据类型可以根据自己的需要方便设定,有很大的灵活性。
单片机数码管动态显示实验报告

单片机数码管动态显示实验报告单片机数码管动态显示实验程序(汇编)单片机数码管动态显示实验程序org 00hajmp headorg 0030hhead:mov sp,#0070hnum equ p0 ;p0口连接数码管reset:mov dptr ,#tabmov r0,#4sh:acall show_tabcall dptr_adddjnz r0,shmov r0 ,#4sjmp resetdptr_add:inc dptrinc dptrinc dptrinc dptrrettab :db0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;;;;;;;;;;;;;;;;;;;;; 函数的功能是用来动态显示dptr上的四个数据 ;;;;;;;;;;;;;;;;;;;;;; show_tab:clr amov r2,#0mov r3,#148mov p2,#238loop:movc a,@a+dptrmov num ,aacall delay_5msinc r2mov a,r2;调用片选函数前注意A的变化acall select_movcjne r2,#4,loopmov r2,#0clr adjnz R3,loopret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;select_mov:;p2的初值238push 0e0hmov a,p2rl amov p2,apop 0e0hretdelay_5ms:mov r6,#5signed_5ms:call delay_1msdjnz r6,signed_5msret篇二:单片机动态数码显示设计实验报告微机原理与接口技术实验报告实验题目:指导老师:班级:计算机科学与技术系姓名:动态数码显示设计2014年 12月3日实验十三动态数码显示设计一、实验目的1.掌握动态数码显示技术的设计方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四七段数码管显示实验
一、实验目的
掌握数码管显示数字的原理。
二、实验内容
1.静态显示:数码管为共阴极,通过BCD码译码驱动器CD4511驱动,其输入端A~D输入4位BCD码,位码输入低电平选中。
按图4-1连接好电路,将8255的A口PA0~PA3与七段数码管LED1的BCD码驱动输入端A1~D1相连,8255的A口PA4~PA7与七段数码管LED2的BCD码驱动输入端A2~D2相连,8255的B口PB0~PB3与七段数码管LED3的BCD码驱动输入端A3~D3相连,8255的B口PB4~PB7与七段数码管LED4的BCD码驱动输入端A4~D4相连,8255的C口PC0~PC3分别与七段数码管LED4~LED4的位驱动输入端DG1~DG4相连。
编程从键盘上每输入4个0~9数字,在七段数码管LED4~LED4上依次显示出来。
图4-1
2.动态显示:数码管为共阴极,段码采用相同驱动,输入端加高电平,选中的数码管对应段点亮,位码采用同相驱动,位码输入端低电平选中,按图4-2连接好电路,图中只画了2个数码管,实际是8个数码管,将8255的A口PA0~PA7分别与七段数码管的段码驱动输入端a~g相连(32TCI0模块上的J1连32LED8模块J2),8255的C口的PC0~PC7接七段数码管的段码驱动输入(32TCI0模块上的J3连32LED8模块J1),跳线器K1连2和3。
编程在8个数码管上显示“12345678”。
按任意键推出运行。
图4-2
三、编程提示
1.由于DVCC卡使用PCI总线,所以分配的IO地址每台微机可能都不用,编程时需要了解当前的微机使用那段IO地址并进行处理。
2.对实验内容1,七段数码管字型代码与输入的关系如下
表:
四、参考流程图
1.实验内容一的参考流程图
图4-3 2.实验内容二的参考流程图
图4-4
五、参考程序
1.内容一的参考程序
源程序清单如下:
data segment
ioport equ 0c400h-0280h
io8255a equ ioport+288h
io8255b equ ioport+289h
io8255c equ ioport+28ah
io8255k equ ioport+28bh
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
mesg1 db 0dh,0ah,'Input a num (0--9),other key is exit:',0dh,0ah,'$'
bz db ?
cz db 04h
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,io8255k ;使8255的A口为输出方式
mov ax,80h
out dx,al
sss0: mov si,offset bz
mov cx,04h
sss1: mov dx,offset mesg1 ;显示提示信息
mov ah,09h
int 21h
mov ah,01 ;从键盘接收字符
int 21h
cmp al,'0' ;是否小于0
jl exit ;若是则退出
cmp al,'9' ;是否大于9
jg exit ;若是则退出
sub al,30h ;将所得字符的ASCII码减30H
mov [si],al ;存入显示缓冲区
inc si ;显示缓冲区指针加1
dec cx ;判断输入满4个数字吗?
jnz sss1 ;不满继续
mov si,offset bz ;从显示缓冲区取第一个数字的BCD 码
mov al,[si]
and al,0fh ;屏蔽高四位暂存AL
inc si ;显示缓冲区指针加1
mov ah,[si] ;取第二个数字的BCD码到AH
sal ah,4h ;右移4次到高四位
add al,ah ;两个BCD码合并成一个字节
mov bl,al ;暂存入BL
inc si
mov al,[si] ;取第三个数字的BCD码
and al,0fh
inc si
mov ah,[si] ;取第四个数字的BCD码到AH
sal ah,4h
add ah,al
mov al,ah
mov dx,io8255a ;从8255的A口输出(后两个数字)out dx,al
mov al,bl
mov dx,io8255b ;从8255的B口输出(前两个数字)out dx,al
mov al,0f0h
mov dx,io8255c ;从8255的C口输出位码
out dx,al
mov dl,0ffh
mov ah,06
int 21h
je sss0 ;有键按下则退出
exit: mov ah,4ch ;返回
int 21h
code ends
end start
2.内容二的参考程序
源程序清单如下:
data segment
ioport equ 0C400h-0280h
io8255c equ ioport+28ah
io8255k equ ioport+28bh
io8255a equ ioport+288h
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码buffer1 db 01h,02h,03h,04h,05h,06h,07h,08h ;存放要显示的十位和个位
con db ? ;位码
data ends
code segment
assume cs:code, ds:data
start: mov ax,data
mov ds,ax
mov dx,io8255k ;将8255设为A口C口输出mov al,80h
out dx,al
loop2: mov al,08h ;设置数码管位计数器初值到CON mov byte ptr con,al
mov si,offset buffer1 ;置显示缓冲器指针SI
mov ah,7fh ;置位码初值
disp0: mov cx,0ffffh
mov bl,ds:[si] ;取显示缓冲区显示值存BX
mov bh,0h
push si
mov dx,io8255c ;位码从C口输出
mov al,ah
out dx,al
mov dx,io8255a
mov si,offset led ;置led数码表偏移地址为SI
add si,bx ;求出对应的led数码
mov al,byte ptr [si]
out dx,al ;段码从A口输出
disp1: loop disp1 ;延时
mov cx,0ffffh
disp2: loop disp2
ror ah,01h ;位码右移1位
pop si
inc si ;显示缓冲区指针加1
mov al,byte ptr con
dec al
mov byte ptr con,al
jnz disp0 ;数码管位计数器减1为0吗?,不为0继续
mov dx,io8255a ;为0,关数码管显示
mov al,0
out dx,al
mov dl,0ffh
mov ah,06
int 21h
je loop2 ;有键按下则退出
mov ah,4ch ;返回
int 21h
code ends
end start
实验总结:
通过这次试验,我了解到自定义数据类型可以根据自己的需要方便设定,有很大的灵活性。
而在程序的编写过程中,我们应该首先分析各个端口的优先级顺序,然后进行判断,分析设计。