精华内容
下载资源
问答
  • VERILOG实现四位七段数码管显示

    万次阅读 多人点赞 2016-03-02 09:50:48
    // //filename: dyp.v //author: lyq //Date: 2016.3.2 9:36 ...//4位七段带小数点数码管显示控制模块 // //clk: 50M //d1~d4, d[7]-dp, d[6:0]-ASCII or digit //sel[3:0]: 位选 //seg[7:0]: 段码 a~g, dp
    //
    //filename:	dyp.v
    //author:	lyq
    //Date: 	2016.3.2 9:36
    //
    //Lattice XP2-17 DEMO BOARD
    //4位七段带小数点数码管显示控制模块
    //
    //clk: 50M
    //d1~d4, d[7]-dp, d[6:0]-ASCII or digit
    //sel[3:0]: 位选
    //seg[7:0]: 段码 a~g, dp
    //
    module dpy_mod(clk, d1, d2, d3, d4, sel, seg);
    input clk;
    input [7:0] d1, d2, d3, d4; //d[7]-dp, d[6:0]-ASCII
    output reg [3:0] sel;
    output reg [7:0] seg;	//a~g,dp
    
    //扫描频率:50Hz
    parameter update_interval = 50000000 / 200 - 1;
    
    reg [7:0] dat;
    
    reg [1:0] cursel;
    integer selcnt;
    
    //扫描计数,选择位
    always @(posedge clk)
    begin
    	selcnt <= selcnt + 1;
    		
    	if (selcnt == update_interval)
    	begin
    		selcnt <= 0;
    		cursel <= cursel + 1;
    	end
    end
    
    //切换扫描位选线和数据
    always @(*)
    begin
    	sel = 4'b0000;
    	case (cursel)
    		2'b00: begin dat = d1; sel = 4'b1000; end
    		2'b01: begin dat = d2; sel = 4'b0100; end
    		2'b10: begin dat = d3; sel = 4'b0010; end
    		2'b11: begin dat = d4; sel = 4'b0001; end
    	endcase
    end
    
    //更新段码
    always @(*)
    begin
    	seg[0] <= ~dat[7]; //dp
    	case (dat[6:0])
    		7'h00 	: seg[7:1] <= 7'b0000001;	//0
    		7'h01 	: seg[7:1] <= 7'b1001111;	//1
    		7'h02 	: seg[7:1] <= 7'b0010010;	//2
    		7'h03 	: seg[7:1] <= 7'b0000110;	//3
    		7'h04 	: seg[7:1] <= 7'b1001100;	//4
    		7'h05 	: seg[7:1] <= 7'b0100100;	//5
    		7'h06 	: seg[7:1] <= 7'b0100000;	//6
    		7'h07 	: seg[7:1] <= 7'b0001111;	//7
    		7'h08 	: seg[7:1] <= 7'b0000000;	//8
    		7'h09 	: seg[7:1] <= 7'b0000100;	//9
    		7'h30 	: seg[7:1] <= 7'b0000001;	//'0'
    		7'h31 	: seg[7:1] <= 7'b1001111;	//'1'
    		7'h32 	: seg[7:1] <= 7'b0010010;	//'2'
    		7'h33 	: seg[7:1] <= 7'b0000110;	//'3'
    		7'h34 	: seg[7:1] <= 7'b1001100;	//'4'
    		7'h35 	: seg[7:1] <= 7'b0100100;	//'5'
    		7'h36 	: seg[7:1] <= 7'b0100000;	//'6'
    		7'h37 	: seg[7:1] <= 7'b0001111;	//'7'
    		7'h38 	: seg[7:1] <= 7'b0000000;	//'8'
    		7'h39 	: seg[7:1] <= 7'b0000100;	//'9'
    		default : seg[7:1] <= 7'b0110000; 	//E-rror
    	endcase
    end
    	
    endmodule
    

    展开全文
  • 数码管在现在的自动控制中的显示应用极为广泛,由于使用时间的问题会导致缺画的现象发生,为了便于大家更好找到合适的数码管进行更换,特给大家详细介绍
  • 原理: 时分复用(轮流控制八位数码管显示) 共阳连接(这样另一端为0的时候,会显示,为1的时候,不显示) ...output reg [ 3:0] node, //4个数码管选 output reg [ 7:0] segment);
    原理:
    时分复用(轮流控制八位数码管的显示)
    共阳连接(这样另一端为0的时候,会显示,为1的时候,不显示)

    module display(
    input wire        clk,
    input wire [15:0] digit,//显示的数据
    output reg [ 3:0] node, //4个数码管的位选
    output reg [ 7:0] segment);//七段+小数点
    reg [3:0]  code  =  4'b0;
    reg [15:0] count = 15'b0;
    always @(posedge clk) begin
        case (count[15:14])
       //不同时间段显示不同的位。
            2'b00 : begin
                node <= 4'b1110; 
                code <= digit[3:0];
                end
            2'b01 : begin
                node <= 4'b1101;
                code <= digit[7:4];
                end
            2'b10 : begin
                node <= 4'b1011;
                code <= digit[11:8];
                end
            2'b11 : begin
                node <= 4'b0111;
                code <= digit[15:12];
                end
        endcase
        case (code)//十六进制的显示,这是共阳连接,当信号为低电平时,显示。
            4'b0000: segment <= 8'b11000000;
            4'b0001: segment <= 8'b11111001;
            4'b0010: segment <= 8'b10100100;
            4'b0011: segment <= 8'b10110000;
            4'b0100: segment <= 8'b10011001;
            4'b0101: segment <= 8'b10010010;
            4'b0110: segment <= 8'b10000010;
            4'b0111: segment <= 8'b11111000;
            4'b1000: segment <= 8'b10000000;
            4'b1001: segment <= 8'b10010000;
            4'b1010: segment <= 8'b10001000;
            4'b1011: segment <= 8'b10000011;
            4'b1100: segment <= 8'b11000110;
            4'b1101: segment <= 8'b10100001;
            4'b1110: segment <= 8'b10000110;
            4'b1111: segment <= 8'b10001110;
            default: segment <= 8'b00000000;
        endcase
        count <= count + 1;
    end
    endmodule


    展开全文
  • 当设计文件加载到目标器件后,将数字信号源模块的 时钟选择为 1KHZ,拨动四位拨动开关,使其为一个数值,则八个数码管显示拨动 开关所表示的十六进制的值。
  • 七段数码管显示屏需要显示数字的话需要知道段码(具体显示的数值)和码(第 1——8 ) ②单片机传输信息告诉显示屏码和段码是多少是通过74HC595芯片实现,使用此芯片的好处是能使用更少的引脚控制更多的...

    参考链接:
    51单片机七段数码管显示时钟加按键控制—③—74HC595版
    51单片机七段数码管显示时钟加按键控制—②—74HC595版

    一、实验内容:

    1.使用七段数码管显示一个时钟
    2.编写程序让接在P0口的数码管显示时分秒,秒数每秒加一
    3.要求1秒时间间隔使用定时器中断实现
    4.七段数码管的位选和段选通过74HC595控制

    二、实验分析:

    ①七段数码管显示屏需要显示数字的话需要知道段码(具体显示的数值)和位码(第 1——8 位)

    ②单片机传输信息告诉显示屏位码和段码是多少是通过74HC595芯片实现,使用此芯片的好处是能使用更少的引脚控制更多的位(原本需要单片机上8个引脚控制位码,8个引脚控制段值,现在只需要3根引脚即可“无限”扩展)

    ③单片机是怎么告诉显示器位码和段码是多少的呢,如果是使用8位+8位的话,那么直接就可以通过将配置引脚输出不同的值即可选中段码和位码 。示例
    而使用74HC595的话则通过51芯片先发送八位位码,再送八位段码。一个比特一个比特传输,共两个字节,调用两次SendTo595(char byteData)函数。
    因为51单片机是8位的不能一次送16位进去,所以分两次执行
    在这里插入图片描述

    8+8位控制举例:例如我拿出P0_0—P0_7 八引脚控制段值P2_0—P2_7八引脚控制位码。如果我要做第1位显示数字5,那么我只需要在P0八口输出0x6D——0110 1101, P2八口输出0x7F——0111 1111

    位码选择:
    位码选择:
    *注:此处使用的是CC共阴数码管

    选择段值 :
    在这里插入图片描述

    七段数码管引脚定义:
    在这里插入图片描述
    (这里的编码显示的是共阳的,共阴没找到相应的图,知道怎么对应就行。)

    在这里插入图片描述

    三、仿真图:

    在这里插入图片描述

    四、源代码:

    (注释我感觉写的挺详细的,要看懂的话要先了解74HC595的工作方式)

    #include "reg52.h"
    #include "intrins.h"
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    //定义P0口的三个引脚,赋予不同的涵义
    sbit SER = P0^1;    //p0.1脚控制串行数据输入
    sbit SCK = P0^0;    //串行输入时钟
    sbit RCK = P0^2;    //存储寄存器时钟
    
    u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
    					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
    char duanMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//选择1-8哪个数码管段
    char duanZhi[8]={0,0,0x40,0,0,0x40,0,0};	 	//保存8个数码管的中每个数码管段的数值 0x40:显示横杠
    
    //num1:秒初始值 num2:分初始值 num3:时初始值
    u16 num1=55,num2=59,num3=23;
    
    static int i = 0;	//给中断计数使用
    
    //函数声明
    void SendTo595(char byteData);
    
    /***********************************************************
    *函数名		:display
    *功能		:对传如的时分秒进行处理计算,转化为七段数码管要显示的值
    *参数		:num1 秒	num2 分	  num3 时
    ************************************************************/
    void display(u16 num1,u16 num2,u16 num3)
    {
    
    	//先发送8位位码,后发送8位段码
    	//8位数码管需要发送8次
    	char i=0;	//给单片机for循环使用,由于Keil4 把 变量定义放for里会报错,只能放函数体前面
    
    	//分离每个数字的个位和十位/
    	static char shi1,ge1,shi2,ge2,shi3,ge3;
    	shi1=(char)num1/10;
    	ge1=(char)num1%10;
    
    	shi2=(char)num2/10;
    	ge2=(char)num2%10;
    
    	shi3=(char)num3/10;
    	ge3=(char)num3%10;
    	///=======
    
    	//保存段值/
    	duanZhi[0]=smgduan[shi1];
    	duanZhi[1]=smgduan[ge1];
    	duanZhi[3]=smgduan[shi2];
    	duanZhi[4]=smgduan[ge2];
    	duanZhi[6]=smgduan[shi3];
    	duanZhi[7]=smgduan[ge3];	
    	///=======
    
    	i=0;
    	for(;i<8;i++)	
    	{
    		SendTo595(~duanMa[i]); 		//送段码
    		SendTo595(duanZhi[i]);		//送位码
    		
    		/*位移寄存器数据准备完毕,转移到存储寄存器*/
    	   RCK = 0;         
    	   _nop_();
    	   _nop_();
    	   RCK = 1; 	   //检测到上升沿,让存储寄存器时钟变为高电平
    	}
    		
    }
    
    
    /*******************************************************************************
    * 函 数 名         : TimerInit
    * 函数功能		   : 定时器0初始化
    * 参数			   :无
    *******************************************************************************/
    void TimerInit()
    {
    	TMOD|=0X01;	//选择为定时器0模式,工作方式1,仅用TR0打开启动。
    	TH0=0X4C;	//给定时器赋初值,定时50ms 		3CB0
    	TL0=0X00;	//0X3CB0的十进制是15536 从15536计数到65536计数50000次 即50000us=50ms	
    	ET0=1;		//打开定时器0中断允许
    	EA=1;		//打开总中断
    	TR0=1;		//打开定时器	
    
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 参数			 :无
    *******************************************************************************/	
    void main()
    {	
    	TimerInit();
    	
    	while(1)
    	{	
    	 	if(i==20)//20个50毫秒即一秒
    		{
    			i=0;
    			num1++;
    			if(num1==60)
    			{
    				num1=0;
    				num2++;
    				if(num2==60)//定时一小时自动清零
    				{
    					num2=0;
    					num3++;
    					if(num3==24)
    					{
    						num3=0;
    					}
    				}	
    			}
    		}
    		display(num3,num2,num1); 	
    	}
    }
    
    
    /***********************************************************
    *函数名		:SendTo595
    *功能		:串行发送8个比特(一个字节)的数据给595,再并行输出
    *参数		:byteData 
    ************************************************************/
    void SendTo595(char byteData)
    {
       char i=0;
        for(;i<8;i++)
       {
            SER = byteData>>7; 		//取出最高位(第8位)       
            byteData= byteData<<1;  //将第7位移动到最高位    
    
            SCK = 0;        //变为低电平,为下次准备  ,并延时2个时钟周期 
            _nop_();
            _nop_();
    
            SCK = 1;         //上升沿,让串行输入时钟变为高电平,
       }  
    }
    
    
    /*******************************************************************************
    * 函 数 名         : Timer0()
    * 函数功能		   : 定时器0中断函数
    * 参数			   :无
    *******************************************************************************/		
    void Timer0() interrupt 1
    {
    	 TH0=0x4C;
    	 TL0=0x00;
    	 i++;		
    }
    

    最后也来个动图演示吧
    在这里插入图片描述

    展开全文
  • 1.使用七段数码管显示一个时钟 2.编写程序让接在P0口的数码管显示时分秒,秒数每秒加一 3.要求1秒时间间隔使用定时器中断实现 4.七段数码管的选和段选通过74HC595控制 5.要求可以通过按键设置时间值以及切换日期...

    参考链接:
    51单片机七段数码管显示时钟无按键控制—①—74HC595版
    51单片机七段数码管显示时钟加按键控制—③—74HC595版
    51单片机七段数码管显示时钟加按键控制—④—74HC595最终版版

    一、实验内容

    1.使用七段数码管显示一个时钟
    2.编写程序让接在P0口的数码管显示时分秒,秒数每秒加一
    3.要求1秒时间间隔使用定时器中断实现
    4.七段数码管的位选和段选通过74HC595控制
    5.要求可以通过按键设置时间值以及切换日期显示
    6.不添加按键的代码相比更好理解,请移步 无按键控制版

    二、按键功能介绍

    这里一共有四个按键:分别命名为button1,button2,button3,button4 对应的功能分别为:
    button1:进入设置状态
    button2:时间值(时/分/秒)加一
    button3:时间值(时/分/秒)减一
    button4:切换 查看日期/时间

    三、遇到的问题

    这个实验在上一次的基础上加了按键控制,这一过程遇到的问题主要是
    ①由于按键不松开处于一直等待状态,导致的时间停止计数。原因:中断计数值 i 超过了20 导致i值未归零,一直往上加直到溢出。
    ②时间的年月日显示位置错误,日在最开始,年在最后,加一时为年加一
    原因:显示时传入的参数传反了

    四、尚未添加的功能

    ①在进入设置状态时我本意想让对应设置为处于闪烁状态,从而让人更好判断需要设置的是哪一位,目前暂未实现。

    五、仿真图

    在这里插入图片描述

    六、源代码

    #include "reg52.h"
    #include "intrins.h"
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    //定义P0口的三个引脚,赋予不同的涵义
    sbit SER = P0^1;    //p0.1脚控制串行数据输入
    sbit SCK = P0^0;    //串行输入时钟
    sbit RCK = P0^2;    //存储寄存器时钟
    
    sbit button1 = P2^0; 	//设置/确认按键
    sbit button2 = P2^1;	//加按键
    sbit button3 = P2^2;	//减按键
    sbit button4 = P2^3;	//查看日期按键	暂时没有实现
    
    //定义按键按下的次数,不同次数选择不同设置
    static char button_num1 = 0; 	//判断选则时分秒
    static char button_num2 = 0;	//判断切换时间/日期		//还没有处理日期设置和月天数判断
    
    
    u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
    					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
    char duanMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//选择1-8哪个数码管段
    char duanZhi[8]={0,0,0x40,0,0,0x40,0,0};	 	//保存8个数码管的中每个数码管段的数值 0x40:显示横杠
    
    //num1:秒初始值 num2:分初始值 num3:时初始值
    u16 num1=55,num2=59,num3=23;
    
    u16 year=20,month=1,day=29; 
    u8 day_flag = 0;	//一个月多少天的标志 flag=0 30一个月 flag=1 31一个月
    
    static int i = 0;	//给中断计数使用
    
    //函数声明
    void SendTo595(char byteData);
    
    
    /***********************************************************
    *函数名		:delay_us
    *功能		:延时
    *参数		:i 延时的us数
    ************************************************************/
    void delay_us(int i)
    {
    	while(i--);
    }
    
    /***********************************************************
    *函数名		:display
    *功能		:对传如的时分秒进行处理计算,转化为七段数码管要显示的值
    *参数		:num1 秒	num2 分	  num3 时
    ************************************************************/
    void display(u16 num3,u16 num2,u16 num1,u16 year,u16 month,u16 day)
    {
    
    	//先发送8位位码,后发送8位段码
    	//8位数码管需要发送8次
    	char i=0;	//给单片机for循环使用,由于Keil4 把 变量定义放for里会报错,只能放函数体前面
    
    	static char shi1,ge1,shi2,ge2,shi3,ge3;
    	//分离每个时间数字的个位和十位/
    	if(button_num2 == 0)
    	{
    		shi1=(char)num3/10;
    		ge1=(char)num3%10;
    	
    		shi2=(char)num2/10;
    		ge2=(char)num2%10;
    	
    		shi3=(char)num1/10;
    		ge3=(char)num1%10;	
    	}
    	//分离每个日期数字的个位和十位/
    	else if(button_num2 == 1)
    	{
    		shi1=(char)year/10;
    		ge1=(char)year%10;
    	
    		shi2=(char)month/10;
    		ge2=(char)month%10;
    	
    		shi3=(char)day/10;
    		ge3=(char)day%10;	
    	}
    	=======/
    
    	//保存段值/
    	duanZhi[0]=smgduan[shi1];
    	duanZhi[1]=smgduan[ge1];
    	duanZhi[3]=smgduan[shi2];
    	duanZhi[4]=smgduan[ge2];
    	duanZhi[6]=smgduan[shi3];
    	duanZhi[7]=smgduan[ge3];	
    	///=======
    
    
    
    	i=0;
    	for(;i<8;i++)	
    	{
    		SendTo595(~duanMa[i]); 		//送段码
    		SendTo595(duanZhi[i]);		//送位码
    		
    		/*位移寄存器数据准备完毕,转移到存储寄存器*/
    	   RCK = 0;         
    	   _nop_();
    	   _nop_();
    	   RCK = 1; 	   //检测到上升沿,让存储寄存器时钟变为高电平
    	}		
    }
    
    
    /*******************************************************************************
    * 函 数 名         : TimerInit
    * 函数功能		   : 定时器0初始化
    * 参数			   :无
    *******************************************************************************/
    void TimerInit()
    {
    	TMOD|=0X01;	//选择为定时器0模式,工作方式1,仅用TR0打开启动。
    	TH0=0X3C;	//给定时器赋初值,定时50ms 		3CB0
    	TL0=0XB0;	//0X3CB0的十进制是15536 从15536计数到65536计数50000次 即50000us=50ms	
    	ET0=1;		//打开定时器0中断允许
    	EA=1;		//打开总中断
    	TR0=1;		//打开定时器	
    }
    
    
    /*******************************************************************************
    * 函 数 名         : button_setting
    * 函数功能		   : 实现按键设置/确认功能,按四下设置完毕 重新开始计数
    * 参数			   :无
    *******************************************************************************/
    void button_setting()
    {	
    	if(button1 == 0) 
    	{
    		delay_us(10);
    		while(!button1);	//直到松开才向下执行
    
    		button_num1++;	//选择设置不同位(时 分 秒)
    		if(button_num1 == 4)
    		{
    			button_num1 = 0;
    			EA = 1;		//开中断
    		}
    		else
    		{
    			EA=0;	//关闭总中断,停止计时
    		}	
    	}
    }
    
    /*******************************************************************************
    * 函 数 名         : button_data
    * 函数功能		   : 时间/日期 切换显示按钮实现
    * 参数			   :无
    *******************************************************************************/
    void button_data()
    {
    	if(button4 == 0)
    	{
    		delay_us(10);
    		while(!button4);
    		button_num2++;
    		if(button_num2 == 2)	
    		{
    			button_num2=0;
    			//显示时间
    		}
    	}
    }
    
    /*******************************************************************************
    * 函 数 名         : button_up_down
    * 函数功能		   : 时间加/减 按键逻辑处理
    * 参数			   :无
    *******************************************************************************/
    void button_up_down()
    {
    	if(button2 == 0)
    	{
    		switch(button_num1)
    		{
    			case 0:	break;
    			case 1:	delay_us(10); while(~button2); num3++;  break; 		//等待按键释放	时加一
    			case 2:	delay_us(10); while(~button2); num2++;	break;		//等待按键释放	分加一
    			case 3:	delay_us(10); while(~button2); num1++;	break;		//等待按键释放	秒加一
    			default: break;	
    		}
    		if(num3 == 24) num3 = 0;	//超出归零
    		if(num2 == 60) num2 = 0;
    		if(num1 == 60) num1 = 0;	
    	}
    
    	if(button3 == 0)
    	{
    		switch(button_num1)
    		{
    			case 0:		break;
    			case 1:	delay_us(10);  num3--; while(~button3); break;	//时减一
    			case 2:	delay_us(10);  num2--; while(~button3);	break;	//分减一
    			case 3:	delay_us(10);  num1--; while(~button3);	break;	//秒减一
    			default: break;
    		}
    		if(num3 == -1) num3 = 23;	//超出归零
    		if(num2 == -1) num2 = 59;
    		if(num1 == -1) num1 = 59;
    	}
    }
    
    /*******************************************************************************
    * 函 数 名       : data_deal
    * 函数功能		 : 日期处理函数,计算日期的当前的日期值
    * 参数			 :无
    *******************************************************************************/
    void data_deal()
    {
    
    	if(day>=30)
    	{
    		if(day_flag==0)
    		{
    			month++;
    			day=1;
    		}
    		if(day_flag==1&&day>=31)
    		{
    			month++;
    			day=1;
    		}
    
    		if(month>=13)
    		{
    			month = 0;
    			year++;
    			if(year>=100)
    			{
    				year = 0;
    			}
    		}
    			
    	}
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 参数			 :无
    *******************************************************************************/	
    void main()
    {	
    	TimerInit();
    	
    	while(1)
    	{		
    		button_setting();
    		button_data();
    		button_up_down();
    		display(num3,num2,num1,year,month,day); 
    			
    	}
    }
    
    
    /***********************************************************
    *函数名		:SendTo595
    *功能		:串行发送8个比特(一个字节)的数据给595,再并行输出
    *参数		:byteData 
    ************************************************************/
    void SendTo595(char byteData)
    {
       char i=0;
        for(;i<8;i++)
       {
            SER = byteData>>7; 		//取出最高位(第8位)       
            byteData= byteData<<1;  //将第7位移动到最高位    
    
            SCK = 0;        //变为低电平,为下次准备  ,并延时2个时钟周期 
            _nop_();
            _nop_();
    
            SCK = 1;         //上升沿,让串行输入时钟变为高电平,
       }  
    }
    
    
    /*******************************************************************************
    * 函 数 名         : Timer0()
    * 函数功能		   : 定时器0中断函数
    * 参数			   :无
    *******************************************************************************/		
    void Timer0() interrupt 1
    {
    	 TH0=0x3C;
    	 TL0=0xB0;
    	 i++;	 
    	 //之前没有加入按键的时候我是在主函数中检测时间加一的,
    	 //但是我后来发现如果我按住按键不松开的话时间计数会暂停
    	 //其次我把所有判断都从if(==)替换为if(>=) 
    	 //因为按键按住不松开,计数i的值会超过20,从而无法归零,导致时间计数停止,而i最终将会溢出
    
    	 //说明:中断函数里是不适宜放过多语句的,这也是一开始我没有将时间加一处理放在中断的原因
    	 if(i>=20)//20个50毫秒即一秒
    		{
    			i=0;
    			num1++;
    			if(num1>=60)
    			{
    				num1=0;
    				num2++;
    				if(num2>=60)//定时一小时自动清零
    				{
    					num2=0;
    					num3++;
    					if(num3>=24)
    					{
    						num3=0;
    						day++;
    						//日期处理
    						data_deal();				
    					}
    				}	
    			}
    		}		
    }
    

    七、动态演示

    在这里插入图片描述

    八、完整项目下载地址(keil过程+仿真文件)

    下载地址

    展开全文
  • 51单片机七段数码管显示时钟无按键控制—①—74HC595版 51单片机七段数码管显示时钟加按键控制—②—74HC595版 文章目录一、简要说明:二、遇到的问题:三、尚未实现的问题:、仿真图:五、源代码: 一、简要说明...
  • 有两个按键,一个按一下数码管显示+1,一个按下数码管显示-1,数码管为四位数码管,低位冯十进一,包含proteus工程源文件,单片机C语言程序。proteus8.6可正常打开,仿真。
  • LED四位数码管显示

    2009-09-12 23:26:56
    利用单片机控制的四位共阴数码管,用74HC373锁存选位,循环显示0~16 。有助于对七段数码管显示以及位码段码循环显示的认识
  • 八位七段数码管——学习笔记3

    千次阅读 2019-04-11 21:07:47
    思路: 我们要做一个八位的七段数码管选八位(每16个数即2的4次方,位数,数码管是八位,则需要输入的数据4*8=32),段选七。 首先,八位的数码管显示,采用1ms的扫描则第一个模块需要一个分频时钟。...
  • 七段LED数码管显示译码器设计

    千次阅读 2018-10-26 19:56:00
    包含按键输入并显示模块,输入为四位16进制信号,同步在led数码管显示,如果没有输入,则自动脉冲计数 module led(comscan,clr,k,kon,kc,o,comscanout); input clr,kon; input [3:0]k; input [3:0]kc; input ...
  • 在板子上的七段数码管上的八个数字分别显示:计时器(两)、按照拨码开关的输入(两)、班级(两)、学号(两) 其中计时器为从10到到0,当倒计时为0时,从10重新开始计数;当按下开关s0,立即变化为10重新...
  • 51单片机-8段四位数码管8段数码管工作原理8段四位数码管工作方式下面是本人自写的四位数码管模板程序模板程序应用方法 8段数码管工作原理         我们最常用的是七段式和...
  • Arduino—四位七段显示

    千次阅读 热门讨论 2020-07-12 16:57:49
    四位数码管引脚分布如下图所示,其中1,2,3,4表示对应位数码管的公共极。 2.实验步骤 1.按照下图进行接线: 2.新建sketch,拷贝如下代码替换自动生成的代码并进行保存。 SevSeg数码管驱动库的安
  • 以下代码只实现了在屏幕上显示,我不知道把8255怎么加进去才能在七段数码管显示。求对代码进行修改,使其可以显示在数码管上。(解答出来我会付钱,c币最少买100个,我觉得没必要,写出来支付宝转账20元) ;*****...
  • 七段十引脚数码管,引脚为abcdefg、dp、c、gnd,七段数码管通过给某个引脚置高电平,即可实现该段的二极管点亮,从而显示0–9及A—F。 数码管可分为单体数码管或者多体数码管,多体数码管是由众多...
  • 数字挂钟现在越来越受欢迎,它们比模拟时钟更好,因为它提供了小时、分钟和秒的准确时间,...在本文中,主要介绍通过使用Arduino UNO和四位数码制作数字时钟,并以HH:MM格式显示时间。 需要的组件 ● 4位7数码...
  • Ø功能:模块就是循环的将四位七段数码数据,组合一个十六位的输出数据; 4.5 74HC595驱动功能模块 图13. 74HC595驱动功能模块 Ø输入:十六位的位选段选数据。 1)duan_wei_data[13:0]分别对应: 2)[ X,X,H+,H-,DIG4,...
  • 【基于STM32】Stduino拓展学习(一)四位数码管 ...数码管七段显示器)能够显示 0〜9 十个字符,生活中进场在一些只需要显示数字的地方出现,例如电子秤,食堂刷卡终端,电梯楼层显示等等。数码管有多种型号,其中
  • VHDL数码管程序

    2013-05-25 11:17:00
    HDL程 通过扫描的方式 动态显示四位七段数码管
  • 本文中使用外设:7SEG-MPX4-CA*2(四位七段共阴极led数码管),74HC573*2(带使能端8线锁存器),RESPACK-8(10k排阻), #include <reg52.h>typedef unsigned char uchar;typedef unsigned int uint;sbit seg_...
  • 通过这个过程学习熟悉键盘控制和七段数码管的使用,掌握步进电机的角度控制和角度显示方法。 在设计时,要求我们达到以下要求,实现这些功能: 1.在显示器上显示任意四位十进制数; 2.将8个键定义键值为0~7,按...
  • 比如:一枚8数码管 这是一个很常见的数码管 ,现在要考虑一个问题,写入数据的就三个接口 SCLK RCLK DIO 那么问题是,怎么让第0号灯管显示一个字符呢?而答案就是编码,我们在一个十周周期,会从SCLK发一...
  • 2. 理解LED七段数码管的显示控制原理,掌握数码管与MCU的接口技术. 3. 学习编写数码管显示驱动程序; 4. 熟悉接口程序调试方法。 二、实验设备(仪器) PC 微机一台 三、实验内容 P0端口接动态数码管的字形码笔段,...
  • 数码管由于发光亮度强,指示效果好,非常适合于电梯楼层等数值显示应用中。对于一位数码管,可以采用...笔者此处以四位一体共阳数码管显示为例讲解其大概的硬件设计。 微控制器的IO口均不能流过过大的电流,LED点亮时
  • Q0~Q7:8并行数据输出,可以直接控制8个LED,或者是七段数码管的8个引脚。 Q7′:级联输出端,与下一个74HC595的DS相连,实现多个芯片之间的级联。 74HC595同控制相关的引脚一共有个:SH_CP:移位寄存器的时钟...
  • 秒表输出的值显示范围为00.00~99.99,高位在前,低位在后,数码管显示需要经过BCD-七段数码管编译(实际程序编写的是八段的数码管——即加上)。上电后,显示0000,利用两个按钮S1、S2控制计时。程序是经过老师的...
  • 可变量程的直流电压表

    千次阅读 2013-06-13 14:23:28
    可变量程的直流电压表 一、 实习内容、要求及指标 设计一个可变量程的直流电压表,要求及设计指标如下: ...4.显示:用四位七段数码管显示电压读数。 二、 方案分析及论证 1. 自动换档(模
  • Verilog实现四位加法器

    千次阅读 2019-11-07 17:44:05
    实验器件: 1. 软件:Vivado 2. 硬件:NEXYS 4 DDR开发版 实验要求 实现一个4-bit加法器,要求如下: ...用1个七段数码管显示和(Sum)的值。 仿真文件: testbench文件如下: module FA4bit_tb(); reg ...
  • 环境: 1.笔记本 2.软件:Vivado 3.硬件:NEXYS 4 DDR开发版 ...用4个七段数码管分别显示乘数、被乘数和积。 实验原理与内容 (一)原理:乘法器原理 1、 通过位移和加法实现:竖式。 2、 例如4...

空空如也

空空如也

1 2 3 4
收藏数 72
精华内容 28
关键字:

四位七段数码管显示