电路图分析
开发板所使用的数码管为共阳数码管,所以数码管的码字一定要知道,不知道也要会推。
uchar code Nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管码字
共阳数码管0~F的码字如上代码所示
Y6C控制数码管的位选端
Y7C控制数码管的段选端
简易时钟代码 (代码中都给了注解 不过多解释)
sys.h
#ifndef __SYS_H__
#define __SYS_H__
//头文件包含
#include <STC15F2K60S2.H>
#include <intrins.h>
//管脚声明
//变量类型声明
typedef unsigned int uint;
typedef unsigned int u16;
typedef unsigned char uchar;
typedef unsigned char u8;
//外部变量声明
//函数声明
//sys.c
void ALL_Init();
void Operate_Delay(unsigned int ms);
void Timer0Init(void);
//nixie.c
void Nixie_Scan(void);
void Nixie_Show(void);
void Time_Deal(void);
#endif
nixie.c
#include "sys.h"
uchar code Nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管码字
uchar code Symbol[] = {0xff,0xbf}; //全灭,-
uchar NixieBuff[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //数码管显示缓冲区,初值0xff确保启动时都不亮
uchar smg1,smg2,smg3,smg4,smg5,smg6,smg7,smg8;
uchar sec,min,hour;
//数码管显示
void Nixie_Scan(void)
{
static uchar index = 0;
P2 = (P2 & 0x1f)|0xe0; //打开Y7C(段选)
P0 = 0xff; //数码管消影
P2 = (P2 & 0x1f)|0xc0; //打开Y6C(位选)
P0 = 0X01 << index; //选通一位数码管显示
P2 = (P2 & 0x1f)|0xe0; //打开Y7C(段选)
P0 = NixieBuff[index];
P2 &= 0x1f; //关闭所有译码器管脚
index++;
index &= 0x07; //当索引自加到8时 归0
}
//数码管显示
void Nixie_Show(void)
{
NixieBuff[0] = Nixie[smg1];
NixieBuff[1] = Nixie[smg2];
NixieBuff[2] = Symbol[smg3];
NixieBuff[3] = Nixie[smg4];
NixieBuff[4] = Nixie[smg5];
NixieBuff[5] = Symbol[smg6];
NixieBuff[6] = Nixie[smg7];
NixieBuff[7] = Nixie[smg8];
}
//时钟处理
void Time_Deal(void)
{
if(sec == 60)
{
min++;
sec = 0;
if(min == 60)
{
hour++;
min = 0;
if(hour == 24)
{
hour = 0;
}
}
}
smg1 = hour/10;
smg2 = hour%10;
smg4 = min/10;
smg5 = min%10;
smg7 = sec/10;
smg8 = sec%10;
if(smg8%2 == 0)
{
smg3 = 1;
smg6 = 1;
}else
{
smg3 = 0;
smg6 = 0;
}
}
sys.c
#include "sys.h"
extern uchar sec;
/**
*@brief 外设初始化
*@param[in] none
*@return none
**/
void ALL_Init()
{
P2 = (P2&0x1f)|0xa0; //打开Y5C
P0 = 0x00; //关闭蜂鸣器&继电器
P2 = (P2&0x1f)|0xe0; //打开Y7C
P0 = 0xff; //关闭数码管
P2 = (P2&0x1f)|0x80; //打开Y4C
P0 = 0xff; //关闭LED
P2 = P2&0x1f; //关闭所用使能
}
/**
*@brief 延时函数
*@param[in] 延时多少ms(0~65535)
*@return none
**/
void Operate_Delay(u16 ms)
{
u16 i;
for(ms;ms>0;ms--)
for(i=921;i>0;i--);
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void Timer0() interrupt 1
{
static uint t0 = 0;
t0++;
if(t0==1000)
{
t0 = 0;
sec++;
}
Time_Deal();
Nixie_Show();
Nixie_Scan();
}
main.c
#include "sys.h"
void main()
{
ALL_Init();
Timer0Init();
while(1);//让程序能一直不断执行
}