下面是74LS49的VHDL描述,74LS49就是一个驱动共阴极数码管的译码器:\x0d\x0aLIBRARY IEEE;\x0d\x0aUSE IEEE.Std_logic_1164.ALL;\x0d\x0aENTITY ls49 IS\x0d\x0a PORT(bl_n:IN Std_logic;\x0
HighCLK是扫描时钟设一个较高的时钟就行,我一般是设定为2000 HZ,VIEW 接你要显示的信号,Y 控制第几个数码管显示,比如你要第一个数码管显示8就把第一条改成:WHEN 0 => Y<="000"; VIEW<="1000"; Q<= 1;
PROCESS (HighCLK) --动态数码管控制显示部分\x0d\x0aBEGIN\x0d\x0a IF HighCLK 'EVENT AND HighCLK ='1THEN\x0d\x0a CASE Q IS\x0d\x0a WHEN 0 => Y Y Y Y Y Y Y Y Q Y<="000";
input clk,rst; //20MHz input [3:0] freq_sign;output [7:0] dataout; //8bit位选 reg [7:0] dataout;output [7:0] led_bit; //段码 reg [7:0] led_bit;//timer frequency = 64Hz*8 r
请教:能帮我用VHDL编写一个八位七段数码管动态显示电路吗!真的感谢你!
数码管显示方式为动态扫描方式,当P0口送第一个数0的码型到锁存器时,P2送位选地址01H,即Y0=0,只有第一个数码管亮,显示0,其他数码管不显示。当P0口送第二个数1的码型到锁存器时,P2送位选地址02H,即Y1=0,
使用汇编语言编程实现AT89C51八位数码管动态显示?
3个数码管咋能同时显示0~8,我就纳闷了,直接用个8位共阴数码管,就可以用动态显示,同时显示0~7或者1~8,驱动的话,位选可以用NPN三极管,,段选能直接接单片机吧 下面是显示1~8的动态显示,以前应付考试写的。段选
AT89C51单片机60.00到00.00倒计时程序 4位数码管显示 C语ncludereg52.h> define uchar unsigned char define uint unsigned int uchar num,t;sbit dula=P2^6; //段选跟位选 sbit wela=P2^7;uchar code tabl
define uchar unsigned char;uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f uchar number,nn=0;uchar dat[]={2,0,1,2,1,
AT89C51数码管动态显示,用8位一体共阳数码管。仿真图和效果如下 程序如下 include
51单片机:数码管的动态显示 51单片机,用三个7段共阴极数码管动态显示0~99,每隔0.5s刷新一次数字。用keil与Proteus联合仿真 硬件设计 以AT89C51单片机为核心,包括74HC573锁存器,三个7段共阴极数码管。1.74HC573锁存器:
AT89C51数码管动态显示
八个灯接在单片机的P1口(P0,P2,P3,P4都一样)while(1){ delay(你想要延时的时间);P1=0xff;delay(你想要延时的时间);P1=0;} 注意led最好加驱动,不然单片机会坏的。
/* 准备第二个数据 */ uiDataOne = uiDataOne << 1;} /* 输入第二个数据:uiDataTwo */ for (i = 0; i < 8; i++){ /* 给出脉冲信号,首先将CLK置为0 */ HC595CLK = 0;if (0 != (uiDataTwo
include
//0xfe = 1111 1110,//说明连接在P3.0端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P0=dofly_table[2];LED1=0;break;//调用表中的第三个//元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P
跪求!!!STC89C52单片机,用八个按键控制分别控制八个LED灯的代码(C语言)
display(1,2,3,4);//主程序始终调用数码管显示子程序 } } void display(uchar a,uchar b,uchar c,uchar d){ P2=0xef;P0=table[a];//给第一个数码管送"a"delay(1);//延时1ms P2=0xdf;P0=table[b];//
74ls160计数器,并不能直接与数码管连接,需要加一片译码器才行,还要看是共阳的还是共阴数码管。1、下图是共阳数码管的接法:2、下图是共阴数码管的接法:
看上面原理图知道数码管里的发光二极管是共阳极的,COM端是公共端,要上拉高电平,IO口输出低电平二极管发光,1234就是每个LED的COM端介入IO口。要哪个LED灯亮就把哪路COM端IO置高。语言表达的不好,希望能看懂!
图1 这是一个7段两位带小数点 10引脚的LED数码管图2 引脚定义每一笔划都是对应一个字母表示 DP是小数点。透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。每位元数码管的点亮时间为
如图所示,在CL 脚输入连续的脉冲就能1和5交替显示。
这是单片机数码管显示线路图!1:这是一个4位的数码管。(有共阴极和共阳极二种)2;一个8字有7个发光二级管,加一个点。需要八条线路控制。(叫做段码)3;每一个8需要Q1-Q4,四条线路来控制。(叫做位选)4;745
而共阳极就是将八个LED的阳极连在一起。其原理图如下。其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。一个八段数码管称为一位,多个数码管并列在一起可构成多位
数码管显示电路原理图
数码显示器第7位接通电源工作 while(1) //无限循环 { for(i=0;i<10;i++){ P0=Tab[i]; //让P0口输出数字的段码92H delay(); //调用延时函数 } } } 另外,站长团上有产品团购,便宜有保证
P2口送位控制,P0口送显示数据(P1.0——P1.6对应数码管abcdefg),用于共阳数码管,ORG 0000H;跳过中断入口 LJMP START;ORG 0030H;主程序开始 START:MOV SP,#60;初始化堆栈 MOV DPTR,#TAB;显示数据表格首址
数码管的8段,对应一个字节的8位, a对应最低位, dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111 , 即Ox3f;共阳数码管的字符编码为11000000,即Oxco。可以看出两个编码的各位正好相反。
proteus8位数码管和51芯片接的方法:1、首先,确定您使用的是通用型I/O口驱动的8位数码管,该数码管需要连续的8个I/O口来控制。例如,可以使用P2口(P2、0~P2、7)来控制。2、将数码管的8个引脚分别连接到51单片机的
这是8位动态显示电路,不叫静态显示。仿真图如下;
8位数码管静态显示的Proteus电路如图所示,其中P0口用于给数码管送显示
proteus8位数码管用不好是因为连接方式不对。8位数码管的动态扫描显示,主要是程序的思想和给做其他的模块提供帮助的,Proteus里面的连接比较直接。
1.你这种接法,要求数码管是共阳的,是CA型,你用对了吗?2.这是关键,用了总线,那个粗线,但总线上的导线却没加网络标号。还是把总线删掉,每一个三极管的发射极与数码的位控脚直接连接。3.如果保留总线,每个三极管
abcdefg从低位到高位一一对应,4个连在一起是一个意思,就是用位选来控制,进行扫描刷新就可以了!
proteus8位数码管和51芯片接的方法:1、首先,确定您使用的是通用型I/O口驱动的8位数码管,该数码管需要连续的8个I/O口来控制。例如,可以使用P2口(P2、0~P2、7)来控制。2、将数码管的8个引脚分别连接到51单片机的
1、打开proteus软件。2、这里用到74HC573锁存器,直接用P0口连接锁存器。3、可以实现位选,也可以位选,大大节省了IO,这里记得加上上拉电阻,否则不显示。4、选用6位共阴数码管。5、把位选和段选的线连接对应好。6、
最简单的仿真图如下,用的是8位一体的共阴数码管。数码管的名称见下图中的元件列表。
proteus中八位数码管的动态显示仿真图该怎么连接
这事用ARM7做的,如果你要单片机得就更这一样!仿真图对元件的要求就是要选有仿真的,不要选没有仿真的元件,有没有仿真在你选元件的时候的右上角 ,出现NO simulator model 就没有仿真!!P0口最好加上拉电阻
p0.0 接 a p0.1 接 b p0.2 接 c p0.3 接 d p0.4 接 e p0.5 接 f p0.6 接 g p0.7 接 p table_disp: db 090h ;0 db 09fh ;1 db 058h ;2 db 01ch ;3 db 017h ;4 db 034h ;5 db 030h ;6 db 096h ;7 db 010h ;8 db 014h ;9 db 07fh ;- db 0ffh ;全灭 db 000h ;全亮
//单只数码管循环显示0-9 // //说明:主程序中的循环语句反复将0-9的段码送PC口,形成数字0-9的循环显示 // // #include #include #define INT8U unsigned char #define INT16U unsigned int //0-9的共阴数码管段码 const INT8U SEG_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // //主程序 // int main() { INT8U i=0; DDRC=0xff; //PC端口设为输出 while(1) { PORTC=SEG_CODE[i]; //发送数字段码 i=(i+1)%10; //数字在0-9以内循环 _delay_ms(200); } }
没查你这数码管是共阳极还是攻阴极的,我画了一个共阳极的电路图,看能用不,(若是共阴极的要麻烦些) P0口要加10K的电阻做上拉。
问题没有,可以使用,倒有些不妥之处,比如595电源的二极管有什么用,OE和MR端为何要接电阻?直接接电源和地即可。段码用这个芯片也完全没问题,C语言和汇编也都可,只不过汇编更面向硬件,容易计算时间,如果你选用8位单片机,位选就不太好办了,而且一般移位寄存器也是8位的,或许你也可以自己搭一个9位的移位寄存器。排阻的话要看数码管的发光二极管的额定电流了。 竟没想到译码,惭愧啊,我现在的一块板子是用P1口分时用作段码和位选,因而编程时使用移位指令,所以思想就被束缚在这了,译码对于8位以上来说是个非常好的选择。
电路(图)不合适 1、P0口应该用于输出,你可以接LED,且负极接管脚,正极接VCC. 2、按键任意接P1~P3 仅告诉这些!!
/******************************************************* * 程序名称:hc595.c * 程序功能:595的应用文件 * 程序作者:吴鉴鹰 * 创建时间:2014-3-10 * 修改时间: * 程序版本:V0.1 ******************************************************/ /* * 包含头文件 */ #include "inc/hc595.h" #include "reg51.h" /* * 定义引脚 */ /* 时钟信号线引脚定义 */ sbit HC595CLK = P0^5; /* 片选信号线引脚定义 */ sbit HC595RCK = P0^6; /* 数据输入引脚定义 */ sbit HC595DATA = P0^7; /****************************************************** * 函数名称:SendData * 函数功能:74HC595数据的发送 * 入口参数:unsigned int uiDataOne, unsigned int uiDataTwo * 出口参数:void *******************************************************/ void SendData(unsigned int uiDataOne, unsigned int uiDataTwo) { unsigned int i = 0; /* 将片选信号置为低电平 */ HC595RCK = 0; /* 输入第一个数据:uiDataOne */ for (i = 0; i < 8; i++) { /* 给出脉冲信号,首先将CLK置为0 */ HC595CLK = 0; if (0 != (uiDataOne & 0x80)) { HC595DATA = 1; } else { HC595DATA = 0; } /* 给出脉冲信号,首先将CLK置为1 */ HC595CLK = 1; /* 准备第二个数据 */ uiDataOne = uiDataOne << 1; } /* 输入第二个数据:uiDataTwo */ for (i = 0; i < 8; i++) { /* 给出脉冲信号,首先将CLK置为0 */ HC595CLK = 0; if (0 != (uiDataTwo & 0x80)) { HC595DATA = 1; } else { HC595DATA = 0; } /* 给出脉冲信号,首先将CLK置为1 */ HC595CLK = 1; /* 准备第二个数据 */ uiDataTwo = uiDataTwo << 1; } /* 将片选信号置为高电平 */ HC595RCK = 1; }
#include "reg51.h" #define uchar unsigned char uchar display_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar time[8]={2,0,1,2,1,1,4,5}; //uchar time[3]={0,0,0}; void delay(void) { uchar i; for(i=250;i>0;i--); } void display() { P2=0x80; P0=display_code[time[0]]; delay(); P2=0x00; P2=0x40; P0=display_code[time[1]]; delay(); P2=0x00; P2=0x20; P0=display_code[time[2]]; delay(); P2=0x00; P2=0x10; P0=display_code[time[3]]; delay(); P2=0x00; P2=0x08; P0=display_code[time[4]]; delay(); P2=0x00; P2=0x04; P0=display_code[time[5]]; delay(); P2=0x00; P2=0x02; P0=display_code[time[6]]; delay(); P2=0x00; P2=0x01; P0=display_code[time[7]]; delay(); P2=0x00; } void main(void) { uchar i; while(1) { for(i=0;i<100;i++) { display(); } } }
TIM EQU 30H CNTA EQU 31H CNTB EQU 32H ORG 00H LJMP START ORG 0BH LJMP T0X ORG 30H START: MOV TIM,#00H MOV CNTA,#00H MOV CNTB,#00H MOV TMOD,#01H MOV TH0,#(65536-4000)/256 MOV TL0,#(65536-4000) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $ T0X: MOV TH0,#(65536-4000)/256 MOV TL0,#(65536-4000) MOD 256 MOV DPTR,#TAB MOV A,CNTA MOVC A,@A+DPTR MOV P3,A MOV DPTR,#DIGIT MOV A,CNTB MOV B,#8 MUL AB ADD A,CNTA MOVC A,@A+DPTR MOV P1,A INC CNTA MOV A,CNTA CJNE A,#8,NEXT MOV CNTA,#00H NEXT: INC TIM MOV A,TIM CJNE A,#250,NEX MOV TIM,#00H INC CNTB MOV A,CNTB CJNE A,#10,NEX MOV CNTB,#00H NEX: RETI TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH DIGIT: DB 00H,00H,3EH,41H,41H,41H,3EH,00H DB 00H,00H,00H,00H,21H,7FH,01H,00H DB 00H,00H,27H,45H,45H,45H,39H,00H DB 00H,00H,22H,49H,49H,49H,36H,00H DB 00H,00H,0CH,14H,24H,7FH,04H,00H DB 00H,00H,72H,51H,51H,51H,4EH,00H DB 00H,00H,3EH,49H,49H,49H,26H,00H DB 00H,00H,40H,40H,40H,4FH,70H,00H DB 00H,00H,36H,49H,49H,49H,36H,00H DB 00H,00H,32H,49H,49H,49H,3EH,00H END
PROCESS (HighCLK) --动态数码管控制显示部分 BEGIN IF HighCLK 'EVENT AND HighCLK ='1' THEN CASE Q IS WHEN 0 => Y<="000"; VIEW<=h(7 DOWNTO 4); Q<= 1; WHEN 1 => Y<="001"; VIEW<=h(3 DOWNTO 0); Q<= 2; WHEN 2 => Y<="010"; VIEW<=c(7 DOWNTO 4); Q<= 3; WHEN 3 => Y<="011"; VIEW<=c(3 DOWNTO 0); Q<= 4; WHEN 4 => Y<="100"; VIEW<=s(7 DOWNTO 4); Q<= 5; WHEN 5 => Y<="101"; VIEW<=s(3 DOWNTO 0); Q<= 6; WHEN 6 => Y<="110"; VIEW<="0000"; Q<= 7; WHEN 7 => Y<="111"; VIEW<="0000"; Q<= 0; WHEN OTHERS => Q <= 0; END CASE; ELSE NULL; END IF; END PROCESS; 给分吧 HighCLK是扫描时钟设一个较高的时钟就行,我一般是设定为2000 HZ,VIEW 接你要显示的信号,Y 控制第几个数码管显示,比如你要第一个数码管显示8就把第一条改成: WHEN 0 => Y<="000"; VIEW<="1000"; Q<= 1;
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity dynamic is Port ( clk : in std_logic; reset: in std_logic; din1 : in std_logic_vector(6 downto 0); --译码后的数据信号1 din2 : in std_logic_vector(6 downto 0); --译码后的数据信号2 din3 : in std_logic_vector(6 downto 0); --译码后的数据信号3 din4 : in std_logic_vector(6 downto 0); --译码后的数据信号4 shift: out std_logic_vector(3 downto 0); --位选信号 bus4 : out std_logic_vector(6 downto 0)); --数据信号 end dynamic; architecture Behavioral of dynamic is signal scan_clk:std_logic_vector(1 downto 0); begin process(clk,scan_clk,reset) --分频进程 variable scan:std_logic_vector(17 downto 0); begin if reset='1' then scan:="000000000000000000"; scan_clk<="00"; elsif clk'event and clk='1'then scan:=scan+1; end if; scan_clk<=scan(17 downto 16); end process; process(scan_clk,din1,din2,din3,din4) --扫描进程 begin case scan_clk is when "00"=> bus4<=din1; shift<="0001"; when "01"=> bus4<=din2; shift<="0010"; when "10"=> bus4<=din3; shift<="0100"; when "11"=> bus4<=din4; shift<="1000"; when others=> bus4<="0000000";shift<="0000"; end case; end process; end Behavioral;