STM32+74HC595驱动17位数码管+万年历

最近要写一个万年历 小白文科生 跨专业学的 网上找了好几天的资源 发现用的74CH595驱动的都是LED数码管类型的  或者51单片机版本的  都不适用  理论什么的反正我是看不懂 自己琢磨写了点 要用的改下端口就好了 下面是STM32驱动17位数码管部分代码: smg.c代码

#include "smg.h"


unsigned char table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x02,0x00};//0-9 -数模										

 uchar csec=0;					//秒
 uchar cmin=0;					//分
 uchar chour=0;				//小时
 uchar cyear=0;				//年
 uchar cmon=0;					//月
 uchar cday=0;					//日
 uchar check = 1;
/*******************************************************************************
* 函 数 名         : SMG_Init
* 函数功能		   : 数码管初始化函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void SMG_Init()
{
	  GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(SMG_PORT_RCC,ENABLE);
    
		GPIO_InitStructure.GPIO_Pin = SMG_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	   
    GPIO_Init(SMG_PORT,&GPIO_InitStructure);   // 初始化 SHCP 引脚	  
    GPIO_SetBits(SMG_PORT,SMG_PIN);      // 引脚初始状态为高,便于产生上升沿
}
void delayms(unsigned int xms){
	unsigned int i,j;
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}

int main()
{
	u8 i=0;
	//delay_init();
	
	//uart_init(9600);
	SMG_Init();
	//KEY_Init();
	smgdisplay(2018,8,14,12,30,12);
}
//计算第几周
unsigned char CaculateWeekDay(unsigned int y,unsigned char m, unsigned char d)
{
		unsigned char  iWeek;
    if(m==1||m==2) {
        m+=12;
        y--;
    }
    iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
		return iWeek;
}
//串行数据输入
void HC595SendData(unsigned char SendVal)
{  
  unsigned char z;
	for(z = 0; z < 8; z++)  
	{ _SHCP = 0;        
		_DATA = SendVal & 0x01;            
		_SHCP = 1;                    
		SendVal >>= 1;                
	}
}
/***********************************************************/
/*             显示方法                                    */
/*  参数 year 年 mon 月 day 日期                          */
/*  参数hour 小时 min 分 sec秒  ——state 显示状态 */
/***********************************************************/
void smgdisplay(uint year,uchar mon,uchar day,uchar hour ,uchar min, uchar sec)   
{  	//显示模式选择
	uchar z,line,week1,week,sta1;
	uchar hour1,hour2,min1,min2,sec1,sec2,year1,year2,year3,year4,mon1,mon2,day1,day2;
		
		week =CaculateWeekDay(year,mon,day)+1;
		 hour1 = table[hour/10];			//小时的十位
		 hour2 = table[hour%10];			//小时的个位
		 min1 = table[min/10];
		 min2 = table[min%10];
		 sec1 = table[sec/10];
		 sec2 = table[sec%10];
		 year1 = table[year/1000];
		 year2 = table[year/100%10];
		 year3 = table[year/10%10];	
		 year4 = table[year%10];
		 mon1 = table[mon/10];
		 mon2 = table[mon%10];
		 day1 = table[day/10];
		 day2 = table[day%10];
		//如果是周日 显示8 表面星期日
	
		if(week == 7)
				week = 8;
		week1 = table[week];

	  line = table[10];								//横线
				//亮灯状态											// 卫星  
		HC595SendData(sta1);
		HC595SendData(week1);
		HC595SendData(day2);
		HC595SendData(day1);			
		HC595SendData(line);			

		HC595SendData(mon2);
		HC595SendData(mon1);
		line = table[10];
		HC595SendData(line);
		HC595SendData(year4);
		HC595SendData(year3);
		HC595SendData(year2);	
		HC595SendData(year1);

		HC595SendData(sec2);
		HC595SendData(sec1);

		HC595SendData(min2);
		HC595SendData(min1);

		HC595SendData(hour2);
		HC595SendData(hour1);

		_STCP = 0;     
		_STCP = 1;					
}

头文件smg.h

#ifndef _smg_H
#define _smg_H

#include "system.h"


/*  数码管时钟端口、引脚定义 */
#define SMG_PIN     (GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12)
#define SMG_PORT 		GPIOC   
#define SMG_PORT_RCC		RCC_APB2Periph_GPIOC

#define _STCP  PCout(12)	//打入信号————上升沿有效
#define  _SHCP PCout(11)	//时钟脉冲信号——上升沿有效
#define _DATA  PCout(10) 		//串行数据输入

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值