基于EDA的8位数码管显示
- 格式:doc
- 大小:1.08 MB
- 文档页数:8
八位数码管动态显示程序这个是51hei 开发板专区里转来的一个程序,注释很详细,运行也没有问题,原文地址:51hei/bbs/dispbbs.asp?boardid=10id=4140/*动态数显的设计思路,首先是我们要先知道怎样才能使哪个位亮,显示的段是什么数值,接下来就是中断时间的问题了,设计步骤如下,如果要让八个数码管静态显示1 到8,我们可以修改中断时间,如把50000 改成100 或更低*/#includereg52.h #includeintrins.h#define uint unsigned int#define uchar unsigned charsbit duan=P2;sbit wei=P2;uchar a,numw,numd;uchar code tabled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /*第二步骤,创建段显数值的对码表0~9 数值.如果要显示1~8 数值,最好多加前后两位数0 跟9,因为后面++移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数码显示电路图*/ uchar code tablew[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //第二步骤,创建位显,就是显示的位置,这个码表相对简单,用二进制表示11111110~01111111,是0 的为八位数显管的位置void main(){a=0; //定义个时间函数numw=0; //附位显初值为0 位numd=0; //附段显初值为0 位TMOD=0X01;//第四步骤,附中断暂存器初值TH0=(65535-50000)/256; //附中断请求时间初值,高8 位TL0=(65536-50000)%256; //附中断请求时间初值,低8 位EA=1; //开启总中断ET0=1; //开启定时中断TR0=1; //启动定时中断while(1){ if(a==10) //第三步骤,执行速度,如果等20 差不多是1 秒,则往下执行,相当于单位数值亮的时间{a=0; //重新附值初值0 numd++; //段显值++ if(numd==9) //如果段值在对码表第9 位则转下执行numd=1; /*重新附值段显值对应对码表第1 位,因为++所以0位并不在数码管中显示. 如果要显示,也会因为++而在第二轮中显示出*/ duan=1;//开启段显端P0=tabled[numd];//附段显P0 值对应段显值对码表duan=0; //锁存wei=1; //开启位显端P0=tablew[numw];//附位显P0 值对应位显值对码表wei=0; //锁存numw++; //相当于位显移位if(numw==8) //如果位显值到对应位显对码表第八位则转下执行numw=0; //重新附值位显值对应对码表第0 位起/*下面是简单的单个数码管显示例证第一骤, 修改后在第三步骤内#include”reg52.h”#include”intrins.h”sbit duan=P2;//段显端口sbit wei=P2;//位显端口void main(){//P0=0xff; 数码管不显示任何信号,默认情况下通电本身就不显示, 可以不写duan=1; //开启段显端口P0=0x06; //附值段显数值为1,可以查阅数码管电路图相对应显示的对码表duan=0; //锁存,保持上一步段显状态,硬件说明请查阅74HC573 功能wei=1; //开启位显端口P0=0xfe; //附值位显位置,01111111,左边第一位,为0 的显示wei=0; //锁存,保持上一步位显状态,硬件说明请查阅74HC573 功能}*/ } } }void timer0() interrupt 1 /*第四步骤,中断时间函数这个相当于移位数显的速度, 速度够快,人眼就会有余辉效应, 感觉8 位数显一直在亮着,相当于正在播放的电影胶卷*/{TH0=(65536-50000)/256;TL0=(65536-50000)%256;a++;}/*以上有什么地方还需要改进的还请老师明示*/tips:感谢大家的阅读,本文由我司收集整编。
8位8段LED数码管动态扫描显示
项目名称:8位8段LED数码管动态扫描显示班级:09电二姓名:解健学号:09020313
一.实验目的
1.掌握数码管动态扫描显示原理及实现方法。
2.掌握动态扫描显示电路驱动程序的编写方法。
二.实验电路
第一步:先在Proteu软件中设计仿真电路原理图。
第四步:最后观察设计的电路图是否能得到预想的效果,若不能,进行检查,找到毛病且纠正。
流程图
开始灭显示器I=0延时Counter=0Counter=0选择段选择段点亮所有位按数值点亮位延时延时
Counter++YCounter<8NI++YNNCounter++YCounter<8N停止Y结束I<30
实验现象:
显示器点亮所有段,持续约1,然后灭显示器,持续2,最后显示“hello-93”,保持。
附:程序
#include#include#defineTRUE1#definedataPortP0#defineledConPortP 2
{unignedchari,counter=0;
for(i=0;i<30;i++){
voiddelay_5u(void){_nop_();_nop_();}
voiddelay_50u(void){unignedchari;for(i=0;i<4;i++){delay_5u() ;}}
voiddelay_100u(void){delay_50u();delay_50u();}
for(j=0;j<10;j++)delay_100u();ucM--;}}。
南昌大学实验报告学生姓名:王崇伙学号:6103413026 专业班级:生医131实验类型:□验证□综合 设计□创新实验日期:2015/10/9 实验成绩:实验二、8个数码管动态显示1~8一、实验目的1、掌握汇编查表法实现动态数码管显示。
2、熟练使用proteus仿真工具。
二、实验工具1、PC机2、keil程序编辑工具3、proteus仿真工具三、实验原理八路七段数码管动态显示原理其实和一个数码管显示0~F原理相同,不同在于显示数字的数码管有一个一次变成八个显示0~8,P0控制段选,P1控制位选,由本次实验使用八路共阴极数码管(如下图),当P0=0x7F (8)时,位码P1=0xfe既选通第八个数码管其余位选高电平不导通,结果就为第八个数码管显示8,依次P0段选‘1’时P1位选第一个数码管结果就为第一个数码管显示‘1’,延时0.2s再依次循环输入1~8位选依次选一~八达到八位数码管循环显示1~8。
四、实验程序框图五、实验程序#include<stc15.h>#include<intrins.h>#include<gpio.h>#define uchar unsigned charsbit P_HC595_SER=P0^0;sbit P_HC595_RCLK=P2^4;sbit P_HC595_SRCLK=P0^3;uchar code SEG7[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0 X39,0X5E,0X79,0X71,0x00};uchar code Scon_bit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar data Dis_buf[]={16,16,16,16,16,16,16,0};void Delay1ms(){unsigned char i,j;_nop_();_nop_();_nop_();i=11;j=190;do{while(--j);}while(--i);}void F_Send_595(uchar x){uchar i;for(i=0;i<8;i++){x=x<<1;P_HC595_SER=CY;P_HC595_SRCLK=1;P_HC595_SRCLK=0;}}void display(void){uchar i;for(i=0;i<8;i++){F_Send_595(Scon_bit[i]);F_Send_595(SEG7[Dis_buf[i]]);P_HC595_RCLK=1;P_HC595_RCLK=0;Delay1ms();}}六、实验结果六、实验总结通过本次实验让我加深了对数码管显示功能的理解,并进一步也掌握了使用proteus 仿真。
基于FPGA的8位数码管扫描显⽰电路设计8位数码管扫描显⽰电路设计⼀、实验⽬的1、学习8位数码管扫描显⽰电路设计2、继续学习元件例化语句的使⽤3、继续学习VHDL的CASE语句应⽤及多层次设计⽅法⼆、实验原理图中所⽰的是8位数码扫描电路,其中每个数码管的8个段:h、g、f、e、d、c、b、a(h是⼩数点)都分别连在⼀起,8个数码管分别由8个选通信号k1、k2、…k8来选择。
被选通的数码管显⽰数据,其余关闭。
如在某⼀时刻,k3为⾼电平,这是仅k3对应的数码管显⽰来⾃段信号端的数据,⽽其他7个数码管呈现关闭状态。
根据这种电路状态,如果希望在8个数码管显⽰的数据,就必须通过选通信号k1、k2、…k8分别单独选通,并在此同时,在段信号输⼊⼝加上希望在该对应数码管上显⽰的数据,于是选通信号的扫变,就能实现扫描显⽰的⽬的。
实验内容⼀中clk是扫描时钟:SG为7段控制信号,由⾼位⾄低位分别接g、f、e、d、c、b、a7个段:BT是位选控制信号,接上图中的8个选通信号:k1、k2、 (8)程序中cnt8是⼀个3位计数器,作为扫描计数信号,由进程P2⽣成;进程P3是7段译码查表输出程序;进程P1是对8个数码管选通的扫描程序,例如当cnt8等于“001”时,K2对应的数码管被选通,同时,A被赋值3,再由进程P3译码输出“1001111”,显⽰在数码管上即为“3”;当cnt8扫变时,将能在8个数码管上显⽰数据:13579bdf.三、实验内容1、设计8位数码管扫描显⽰电路并进⾏仿真和下载验证;(1)实验程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SCAN_LED ISPORT(CLK:IN STD_LOGIC;A1,A2,A3:IN STD_LOGIC_VECTOR(3 DOWNTO 0);SG:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);BT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END;ARCHITECTURE one OF SCAN_LED ISSIGNAL CNT4:STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINP1:PROCESS(CNT4)BEGINCASE CNT4 ISWHEN "000"=>BT<="00000001";A<=1;WHEN "001"=>BT<="00000010";A<=3;WHEN "010"=>BT<="00000100";A<=5;WHEN "011"=>BT<="00001000";A<=7;WHEN "100"=>BT<="00010000";A<=9;WHEN "101"=>BT<="00100000";A<=11;WHEN "110"=>BT<="01000000";A<=13;WHEN "111"=>BT<="10000000";A<=15;WHEN OTHERS=>NULL;END CASE;END PROCESS P1;P2:PROCESS(CLK)BEGINIF CLK' EVENT AND CLK='1' THEN CNT4<=CNT4+1;END IF;END PROCESS P2;P3:PROCESS(A)BEGINCASE A ISWHEN "0000"=>SG<="0111111";WHEN "0001"=>SG<="0000110"; WHEN "0010"=>SG<="1011011";WHEN "0011"=>SG<="1001111"; WHEN "0100"=>SG<="1100110";WHEN "0101"=>SG<="1101101"; WHEN "0110"=>SG<="1111101";WHEN "0111"=>SG<="0000111"; WHEN "1000"=>SG<="1111111";WHEN "1001"=>SG<="1101111"; WHEN OTHERS=>NULL;END CASE;END PROCESS P3;END;(2)模式5电路图(3)引脚锁定与⽂件下载(4)实验结果2、设计⼀个1000进制计数器,把计数器和数码管扫描显⽰电路进⾏连接,显⽰计数值。
EDA实验5数码管(LED)驱动显示设计实验六数码管(LED)驱动显示设计一、实验目的1.学习7段数码显示译码器设计;2.学习硬件扫描显示电路的设计。
二、实验原理1、7段数码显示译码器原理通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示(数码管可以显示0~F),最方便的方法就是利用译码程序在FPGA/CPLD中来实现。
EL-EDA-Ⅲ实验系统的显示采用8位八段共阴极数码管(高电平有效),所对应的接口序号为:8段驱动接口:a、b、c、d、e、f、g、Dp;例6-1作为7段译码器,输入为需要显示的数,输出信号LED7S 的7位分别接如图1数码管的7个段,高位在左,低位在右。
例如当LED7S输出为“1101101”时,数码管的7个段:g、f、e、d、c、b、a分别接1、1、0、1、1、0、1;接有高电平的段发亮,于是数码管显示“5”。
注意:这里没有考虑表示小数点的发光管,如果要考虑,需要增加段h,例6-1参考程序中的output [6:0] LED7S 应改为output [7:0] LED7S。
图6-1共阴数码管及其电路【例6-1】module DECL7S (A, LED7S);input [3:0] A;output [6:0] LED7S;reg [6:0] LED7S;always @(A)begincase(A)4'b0000 : LED7S<=7'b0111111;//从此句可以看出LED7S[7]应该接到数码管的//g段上4'b0001: LED7S <= 7'b0000110 ;4'b0010: LED7S <= 7'b1011011;4'b0011: LED7S <= 7'b1001111;4'b0100: LED7S <= 7'b1100110 ;4'b0101: LED7S <= 7'b1101101;4'b0110: LED7S <= 7'b1111101 ;4'b0111: LED7S <= 7'b0000111 ;4'b1000: LED7S <= 7'b1111111 ;4'b1001: LED7S <= 7'b1101111 ;4'b1010: LED7S <= 7'b1110111 ;4'b1011: LED7S <= 7'b1111100 ;4'b1100: LED7S <= 7'b0111001 ;4'b1101: LED7S <= 7'b1011110 ;4'b1110: LED7S <= 7'b1111001 ;4'b1111: LED7S <= 7'b1110001 ;endcaseendendmodule2、8位数码扫描显示原理四位拨码开关产生8421BCD码,经译码电路后成为7段数码管(不包括小数点段位)的字形显示驱动信号(a…g)。
编写程序使实验板上八段数码管循环显示0 到9 字符1.八段数码管嵌入式系统中,经常使用八段数码管来显示数字或符号,由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。
结构八段数码管由八个发光二极管组成,其中七个长条形的发光管排列成“日”字形,右下角一个点形的发光管作为显示小数点用,八段数码管能显示所有数字及部份英文字母。
见图1。
图1 八段数码管的结构类型八段数码管有两种不同的形式:一种是八个发光二极管的阳极都连在一起的,称之为共阳极八段数码管;另一种是八个发光二极管的阴极都连在一起的,称之为共阴极八段数码管。
工作原理以共阳极八段数码管为例,当控制某段发光二极管的信号为低电平时,对应的发光二极管点亮,当需要显示某字符时,就将该字符对应的所有二极管点亮;共阴极二极管则相反,控制信号为高电平时点亮。
电平信号按照dp,g,e…a 的顺序组合形成的数据字称为该字符对应的段码,常用字符的段码表如下:表1 常用字符的段码表显示方式八段数码管的显示方式有两种,分别是静态显示和动态显示。
静态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管控制信号一直保持有效。
动态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管是轮流点亮的,即控制信号按一定周期有效,在轮流点亮的过程中,点亮时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二极管的余辉效应,数码管的显示依然是非常稳定的。
基础知识地址0x10000004为数码管的数据寄存器,控制数码管的段码输出.数码管扫描控制地址为0x10000006,8位访问Bit0 –控制数码管0 –低电平有效Bit1 –控制数码管1 –低电平有效Bit2 –控制数码管2 –低电平有效Bit3 –控制数码管3 –低电平有效Bit4 –控制数码管4 –低电平有效Bit5 –控制数码管5 –低电平有效实验说明1、制作LED字符与码段对应表unsigned char seg7table[16] = {/* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };2、扫描控制*((U8*) 0x02000006) = 0x3E; /* 使能第一个数码管 */段码输出*((U8*) 0x02000004) = seg7table[0]; /* 输出数据 0 */思考:简述LED的显示原理以及LED的显示办法静态显示和动态显示各有什么优缺点设计"HELLO"的码表,编写程序循环显示"HELLO"。
硬件实验四 八段数码管显示一、实验要求利用实验箱提供的显示电路,动态显示一行数据.二、实验目的1. 了解数码管动态显示的原理。
2. 了解用总线方式控制数码管显示。
三、实验线路及连线四、实验说明1.本实验箱提供了6 位8段码LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,用动态方式显示。
8位段码、6位位码是由两片74LS374输出。
位码经MC1413或ULN2003倒相驱动后,选择相应显示位。
本实验箱中8位段码输出地址为0X004H ,位码输出地址为0X002H 。
此处X 是由KEY/LED CS 决定,参见地址译码。
做键盘和LED 实验时,需将KEY/LED CS 接到相应的地址译码上。
以便用相应的地址来访问。
例如,将KEY/LED CS 接到CS0上,则段码地址为08004H ,位码地址为08002H 。
连线 连接孔1连接孔2 1KEY/LED_CS CS0 位选通信号 (0x002H) 段码输出(0x004H) 数据总线七段数码管的字型代码表如下表:五、程序参考程序、框图OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口data segmentLEDBuf db 6 dup(?) ; 显示缓冲Num db 1 dup(?) ; 显示的数据DelayT db 1 dup(?)LEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h data endscode segmentassume cs:code, ds:dataDelay proc nearpush ax ; 延时子程序push cxmov al, 0mov cx,axloop $pop cxpop axretDelay endpDisplayLED proc nearmov bx, offset LEDBufmov cl, 6 ; 共6个八段管mov ah, 00100000b ; 从左边开始显示DLoop:mov dx, OUTBITmov al, 0out dx,al ; 关所有八段管mov al, [bx]mov dx, OUTSEGout dx,almov dx, OUTBITmov al, ahout dx, al ; 显示一位八段管push axmov ah, 1call Delaypop axshr ah, 1inc bxdec cljnz DLoopmov dx, OUTBITmov al, 0out dx,al ; 关所有八段管retDisplayLED endpStart proc nearmov ax, datamov ds, axmov Num, 0MLoop:inc Nummov ch,Nummov ah,0mov cl,6mov bx,offset LEDBufFillBuf:mov si, offset LEDMapmov al,chand al,0fhadd ax,simov si,axmov al,[si] ; 数据转换成显示码 mov [bx], al ; 显示码存入显示缓冲 inc bxinc chdec cljnz FillBufmov DelayT,20DispAgain:call DisplayLED ; 显示dec DelayTjnz DispAgainjmp MLoopStart endpcode endsend start六、实验步骤(1) 在实验箱断电的情况下连好线。
八段数码管显示实验报告一.设计目的1.掌握数码管动态显示的原理;2.学会用总线方式控制数码管显示;3.熟悉利用单片机驱动数码管的电路及编程原理。
二.设计内容利用实验箱提供的显示电路,设计一个能够动态显示一行数据的系统。
实验箱一般提供了6位8段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,用动态方式显示。
能够正常显示数据之后,请改变一下数字的变化速度或者LED显示的方向。
三.实验原理1.原理:当用总线方式驱动八段显示管时,请将八段的驱动方式选择开关拨到“内驱”位置;当用I/O方式驱动八段显示管时,请将开关拨到“外驱”位置。
本实验仪提供了6 位8段码LED显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,用动态方式显示。
8位段码、6位位码是由两片74LS374输出。
位码经MC1413或ULN2003倒相驱动后,选择相应显示位。
本实验仪中 8位段码输出地址为0X004H,位码输出地址为 0X002H。
此处X 是由KEY/LED CS 决定,参见地址译码。
做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。
以便用相应的地址来访问。
例如,将KEY/LED CS 接到CS0上,则段码地址为08004H,位码地址为08002H。
七段数码管的字型代码表如下表:2. 3.程序OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #01call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管 retStart:mov sp, #40hmov Num, #0MLoop:inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ; 数字转换成显示码mov @r0,a ; 显示在码填入显示缓冲inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#30DispAgain:call DisplayLED ; 显示djnz DelayT,DispAgainljmp MLoopend四.设计步骤1.根据任务书中的系统性能要求,设计实验流程框图;2.学习课程设计相关的原理知识,特别是数码管动态显示的原理;3.对设计出的流程框图,使用汇编语言完成源代码的编写;4.在实验箱配套软件上完成汇编程序的初步调试;5.连接实验箱,完成系统功能性测试;6.完成课程设计报告,报告内容包括:a、程序设计流程框图;b、说明设计的依据;c、记录程序测试的过程;d、说明实验过程中遇到的问题和解决的方法。
河南科技
8位数码管显示电路设计
2012——20113学年第五学期
EDA技术课程考试
专业班级: 电气106
姓 名: 耀
学 号:
考核老师:
1 引言
EDA技术是当前数字系统设计领域比较火热的一种工具,他可以大大缩短设计需要的时
间,降低成本的同时也提高了系统的稳定性。使用VHDL语言描述硬件系统使得EDA技术有
了更为广阔的空间。本设计使用了基于Altera公司的开发软件工具Quartus II,使用
Verilog HDL语言设计了一款很实用的八位共阴数码管显示驱动电路,由Quartus II生成
的RTL图如下:
2.1 设计思路
设计总框图如下:
2.2 总体原理图
开始
加载显
示数据
二进制
转十进
数码管显示
加载移位
数据
移位数据控制
数码管位选
驱动数码管显示
图1 总体原理图
2.3 总体功能介绍
由总体原理图可知,原理图中共有五个输入和两个输出。CLK为时钟输入端,DATA为
预显示数据的加载端,在实际应用中可用通信总线代替27位并行总线输入数据,将并口改
为串口来简化电路。LOAD为数据加载端DATA的使能端。D为移位寄存器的数据加载端,MD
为数据加载端D的使能端。输出端口LED为数码管显示数据输出端,端口K为数码管位选数
据输出端。
总体功能介绍:由CLK输入时钟控制信号,DATA加载待显示的数据。先将LOAD置0,
使加载端DATA的数据被存入内部寄存器。然后,随着时钟信号的输出,转制电路将内部寄
存器中的数据按十进制,依次在输出端口DOUT输出低位到高位。输出端口COUT为8位移位
寄存器的时钟控制端,当寄存器DOUT中被存入数据时,COUT端被置1,使的移位寄存器的
时钟输入信号变的有效。D为移位寄存器的数据加载端,在D端输入FE,通过移位寄存器控
制共阴数码管的位选。MD为数据加载端D的使能端,先将MD置1,使D端口的数据存入移
位寄存器中,在数据存入后,将MD置0阻止D端口的数据存入。输出端口K接数码管的位
选端1~8,以控制数码管的动态显示。
3 各个模块的实现
3.1二进制转十进制
二进制转十进制是通过将待显示的数据用内部的寄存器存储,然后对其除以10取整数
部分和对其除以10取余数来实现二进制转十进制。在这以27位的并行总线来传入数据,在
实际电路中,可选用一种总线协议来代替27位的并行总线,将并口改为串口。如:在单片
机中用此电路时,可用IIC总线代替并口,实现并口转串口传输数据。
图2 进制转换电路
功能介绍:包括三个输入CLK、 DATA、LOAD和两个输出COUT、 DOUT。由CLK输入一
个时钟脉冲,DATA为待输入显示的数据的加载端,LOAD为待加载输入数据的控制端。当时
LOAD=0时,在时钟信号的上升沿将端口DATA的数据载入内部寄存器Q1。输出端口COUT为
移位寄存器shft2的时钟控制端,通过与时钟信号的与作为移位寄存器的时钟。输出端口
DOUT是将输入的数据按十进制取出的各位的输出端,将其与数码管显示电路输入端口A连
结。
3.2数码管显示
这里的数码管使用的是八位一体共阴数码管显示。
图3 数码管显示电路
功能介绍:端口A为显示数据输入端,内部电路将要显示的0~9的二进制数据转换成
可有共阴数码管显示的十六进制数。输出端口LED,为8位并行输出。在实际应用时由高位
到底位直接接数码管的端口a,b,c,d,e,f,g,dp。八位一体共阴数码管的位选端口1~8接移
位寄存器shft2的八位并行输出端口K。通过移位寄存器输出数据随输入时钟信号的移位,
来实现数码管的动态显示。
3.3 8位移位寄存器
图4 8移位寄存器电路
功能介绍:移位寄存器包括三个输入CLK、D、MD和一个输出K。移位寄存器的时钟信
号CLK由转制电路上总的时钟信号CLK和其输出端口COUT的与来控制,使的转制电路中
LOAD=1时,端口DATA输入的数据不被加载,此时输出端口COUT被置一,使得总的时钟信
号CLK在移位寄存器的信号输入端有效。输入端D为数据加载端,在端口D输入FE后存入
内部寄存器REG中,通过移位寄存器对其随时钟信号移位来控制共阴数码管的动态显示。输
入MD为加载数据控制端。
4 波形仿真
在Quartus II软件输入上述代码,再通过编译和时序仿真,可得到如图5的仿真波形。
时钟端CLK输入时钟信号,8位移位的数据加载端D输入FE,如图5,移位寄存器的数据输
入使能端MD在前两个时钟信号时置1,使D端的输入数据有效。在二进制转十进制的电路
输入端输入最大的8位十进制数99999999,显示数据加载使能端LOAD在第一个时钟信号时
置0,使输入的显示数据有效,在第一个时钟信号后使能端LOAD置1,阻止显示数据的加载。
共阴八位一体数码管的位选输出端K的输出如图5所示,这里以二进制比较直观的显示了移
位寄存器内部数据的移动。在第二个时钟信号的输入后,数据被加载入移位寄存器,以后在
每一时钟信号的上升沿,移位寄存器的输出数据被移位。共阴数码管的显示字符对应如下表:
0 1 2 3 4 5 6 7 8 9
3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH
如图5所示,输出端LED在每个时钟信号下对应显示一个9(6F),在图5中以16进制
比较直观显示。
图5 顶层文件仿真图
附录
二进制转十进制:
module CNT10(CLK,COUT,DOUT,DATA,LOAD); input CLK,LOAD; input [26:0]DATA; output [3:0]DOUT; output COUT; reg [3:0]i=1; reg COUT=0;reg [26:0]Q1; reg [3:0]DOUT; always @(posedge CLK ) begin if(!LOAD) Q1=DATA; else begin case(i) 1:begin DOUT<=Q1%10;i=i+1;end 2:begin DOUT<=Q1%10;i=i+1;end 3:begin DOUT<=Q1%10;i=i+1;end 4:begin DOUT<=Q1%10;i=i+1;end 5:begin DOUT<=Q1%10;i=i+1;end 6:begin DOUT<=Q1%10;i=i+1;end 7:begin DOUT<=Q1%10;i=i+1;end 8:begin DOUT<=Q1%10;i=i+1;end default:begin DOUT<=0;end endcase Q1=Q1/10; COUT=1; end end endmodule 8位移位寄存器: module shft2(CLK,D,MD,K); output [7:0]K; input CLK,MD; input [7:0]D; reg [7:0] REG; always @(posedge CLK) case(MD) 0:begin REG[7:1]<=REG[6:0];REG[0]<=REG[7]; end 1:begin REG<=D; end default:begin REG<=REG;end endcase assign K=REG; endmodule
共阴数码管显示:
module DECL7S (A,LED7S);
input [3:0]A;
output [7:0] LED7S;
reg [7:0] LED7S;
always @(A)
begin
case(A)
0:LED7S=8'b00111111;
1:LED7S=8'b00000110;
2:LED7S=8'b01011011;
3:LED7S=8'b01001111;
4:LED7S=8'b01100110;
5:LED7S=8'b01101101;
6:LED7S=8'b01111101;
7:LED7S=8'b00000111;
8:LED7S=8'b01111111;
9:LED7S=8'b01101111;
default:LED7S=8'b00111111;
endcase
end
endmodule