下面是74LS49的VHDL描述,74LS49就是一个驱动共阴极数码管的译码器:
LIBRARY IEEE;
USE IEEEStd_logic_1164ALL;
ENTITY ls49 IS
PORT(bl_n:IN Std_logic;
bi:IN Std_logic_vector(3 DOWNTO 0);
a,b,c,d,e,f,g:OUT Std_logic);
END ls49;
ARCHITECTURE behave_49 OF ls49 IS
SIGNAL s:Std_logic_vector(6 DOWNTO 0);
BEGIN
PROCESS(bi,bl_n)
BEGIN
IF bl_n = ′0′ THEN
s ′0′);
ELSE
CASE bi IS
WHEN ″0000″ => s <= B″011_1111″;
WHEN ″0001″ => s <= B″000_0110″;
WHEN ″0010″ => s <= B″101_1011″;
WHEN ″0011″ => s <= B″100_1111″;
WHEN ″0100″ => s <= B″110_0110″;
WHEN ″0101″ => s <= B″110_1101″;
WHEN ″0110″ => s <= B″111_1101″;
WHEN ″0111″ => s <= B″010_0111″;
WHEN ″1000″ => s <= B″111_1111″;
WHEN ″1001″ => s <= B″110_1111″;
WHEN ″1010″ => s <= B″101_1000″;
WHEN ″1011″ => s <= B″100_1100″;
WHEN ″1100″ => s <= B″110_0010″;
WHEN ″1101″ => s <= B″111_1001″;
WHEN ″1110″ => s <= B″111_1000″;
WHEN ″1111″ => s <= B″000_0000″; -- 熄灭
WHENOTHERS=> s ′0′); -- 熄灭
END CASE;
END IF;
END PROCESS;
a <= s(0);
b <= s(1);
c <= s(2);
d <= s(3);
e <= s(4);
f <= s(5);
g <= s(6);
END behave_49;
Serial Port
你好:
键盘式电子密码锁我用51单片机和pic单片机做出来过,功能和你的要求大致相同,0~9组成的6位密码,有重新输入功能,输入完6位密码后自动判断正误。
具体的过程你可以到我的百度空间里看看,我把程序共享了的,还有设计方法。
希望我的回答能帮助到你。
//51单片机控制3位7段共阴数码管 p0口控制 abcdefg dp ,
//p20-p22控制123位,----注意:没有用P23。
//要使其间隔1S分别显示123,231,321,213无限循环
//下列程序,经过仿真,符合要求。
#include <reg52h>
#define uchar unsigned char
sbit bit1 = P2^0;
sbit bit2 = P2^1;
sbit bit3 = P2^2;
uchar code dulatab[] = //数字编码0-9
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
//----------------------------------------------------------------
void delay(uchar time)
{
uchar i, j;
for(i = 0; i < time; i++) for(j = 0; j < 110; j++);
}
//----------------------------------------------------------------
void disp_num(uchar a , b, c)
{
uchar i;
for(i = 1; i < 250; i++) {
P2 = 255; //关显示
P0 = dulatab[a];
bit1 = 0; delay(4);
P2 = 255; //关显示
P0 = dulatab[b];
bit2 = 0; delay(4);
P2 = 255; //关显示
P0 = dulatab[c];
bit3 = 0; delay(4);
}
}
//----------------------------------------------------------------
void main()
{
while(1) {
//要使其间隔1S分别显示123,231,321,213无限循环
disp_num(1, 2, 3);
disp_num(2, 3, 1);
disp_num(3, 2, 1);
disp_num(2 , 1, 3);
// disp_num( , , ); 还想显示内容,楼主可自行编写
// disp_num( , , );
}
}
//----------------------------------------------------------------
数码管显示什么数,不是由数码管本身决定的,而是由计数器电路决定的。所以,进位也与数码管无关,而是决计数器实现的。
如果是用单片机驱动的数码管显示,那就由程序来确定进位了。
所以,这要看你是用什么来控制的显示电路了。
修改如下:
#include<reg51h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit key1=P2^7;
sbit key2=P2^6;
sbit weiH=P3^0;
sbit weiM=P3^1;
sbit weiL=P3^2;
uint num=0,ge=0,shi=0,fen=0,k; //num用来计数,ge为各位显示,shi为十位显示,fen为分钟显示
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
uchar key1scan(void)
{if(key1==0)
{delayms(10);
if(key1==0)
{while(!key1);
return 1;
}
return 0;
}
uchar key2scan(void)
{if(key2==0)
{delayms(10);
if(key2==0)
{while(!key2);
return 1;
}
}
return 0;
}
void showtime() interrupt 1//时间显示
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num++;
num%=3;
switch(num)
{
case 0:
weiL=1; //显示秒的个位
P1=0xff;
P1=table[ge];
delayms(5);
weiL=0;
break;
case 1:
weiM=1; //显示秒的十位
P1=0xff;
P1=table[shi];
delayms(5);
weiM=0;
break;
case 2:
weiH=1; //显示分钟,只显示0-9
P1=0xff;
P1=table[fen];
delayms(5);
weiH=0;
break;
}
void main()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
num=0;
while(1)
{
if((key1scan()==1)&&(key2scan()!=1))break; //按键1按下,按键2未按下开始计时
}
while(1)
{
delay(1000);
ge++;
if(ge>9)
{
ge=0;
shi++
if(shi>5)
{
fen++;
if(fen>9)fen=0;
}
}
showtime();
}
}
以上就是关于用vhdl设计一个三位数码管动态显示控制电路 怎么做!!!全部的内容,包括:用vhdl设计一个三位数码管动态显示控制电路 怎么做!!!、基于51的用3位数码管 显示单片机控制电子密码锁的设计、51单片机控制3位7段共阴数码管等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)