最近要写一个万年历 小白文科生 跨专业学的 网上找了好几天的资源 发现用的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) //串行数据输入