前言
该项目使用HT-IDE3000开发,安装教程可参考HT-IDE3000使用手册。
规格书:
项目使用HT66F0185芯片,HT66F0185规格书。
看规格书是写项目很重要的一部分,建议大家多看 多配。
实现代码: 可以借鉴,别直接抄!!!
A B C D E F G H DP 8个段为数码管的段选,com1234四个位为数码管的位选。
原理图上就是这样的,我第一次看的时候就很懵,***为什么和我学的51上的原理图不一样 数码管的图呢,就很搞,刚学看不懂,然后我在网上找了张图
其实就是这样的,只是省略掉了那4个8.
数码管这边采用的是在头文件中直接进行数字的定义,一般都是采用数组定义,将10位数字定义到数组中,需要使用的时候直接取数组位。
数码管显示 首先定义一个显示数组time_table,接着定义一个时间变量timemode,并且在头文件中宏定义时间名对应123(这边定义写在了时间模块头文件中),当timemode为12小时制的时候显示数组time_table=time_12H,以此类推写出24小时制、年、月日、闹钟。
接下去就是位选,位选的话直接写一个循环 数码管是四位的 循环的最大值就是4,flash_location_flag这个变量为数码管闪烁位,因为在时间设置中需要选中位,选中了就需要闪烁,当flash_location_flag为0的时候数码管4位都闪烁,为1时后两位闪烁,为2时前两位闪烁,switch(i)就是正常显示的位选了,switch(time_table[i])为时间数组中对应位应该显示的数字。
下面的话就是数码管闪烁函数
location 表示数码管的位置,nixie_flash_flag表示闪烁标志位,初始值位0,nixie_flash_on_cnt表示闪烁亮灭时间计时器,nixie_flash_off_cnt为暗灭时间计时器,nixie_flash_state表示当前闪烁状态。
先判断闪烁为是否为0,是0的话就说明数码管是亮着的,接着将闪烁亮灭计时器减,然后判断计时器是不是0,该不该结束闪烁了,将闪烁标志位设置位0 这是闪烁暗灭计时器位1000 设置闪烁状态为0。最后根据当前的闪烁状态去决定是否让该函数数码管闪烁。
数码管头文件 nixie.h
#ifndef __NIXIE_H__
#define __NIXIE_H__
#define com1 _pc5
#define com2 _pa3
#define com3 _pb6
#define com4 _pb4
#define A _pa1
#define B _pb5
#define C _pa7
#define D _pa5
#define E _pd1
#define F _pa2
#define G _pb3
#define DP _pd2
#define H _pa0
#define num0 A=0;B=0;C=0;D=0;E=0;F=0;G=1;
#define num1 A=1;B=1;C=1;D=1;E=0;F=0;G=1;
#define num2 A=0;B=0;C=1;D=0;E=0;F=1;G=0;
#define num3 A=0;B=1;C=1;D=0;E=0;F=0;G=0;
#define num4 A=1;B=1;C=0;D=1;E=0;F=0;G=0;
#define num5 A=0;B=1;C=0;D=0;E=1;F=0;G=0;
#define num6 A=0;B=0;C=0;D=0;E=1;F=0;G=0;
#define num7 A=1;B=1;C=1;D=0;E=0;F=0;G=1;
#define num8 A=0;B=0;C=0;D=0;E=0;F=0;G=0;
#define num9 A=0;B=1;C=0;D=0;E=0;F=0;G=0;
#define nixie_close A=1;B=1;C=1;D=1;E=1;F=1;G=1;DP=1;
extern unsigned char alarmSelect;
void delay(unsigned long int ms);
void nixie_init();
void nixie_sht();
void nixie_show();
void nixie_shanshuo(unsigned char location);
void digdisplay();
#endif
数码管.c文件 nixie.c
#include <HT66F0185.H>
#include "time.h"
#include "key.h"
#include "nixie.h"
unsigned char nixie_table[] = {0,0,0,0}; //显示数组
/*
*延时函数
*/
void delay(unsigned long int ms)
{
while(ms--)
GCC_DELAY(2000);
}
/*
*初始化数码管寄存器
*/
void nixie_init()
{
_pcc5=0;
_pac3=0;
_pbc6=0;
_pbc4=0;
_pac1=0;
_pbc5=0;
_pac7=0;
_pac5=0;
_pdc1=0;
_pac2=0;
_pbc3=0;
_pdc2=0;
_pac0=0;
_pcc4=0;
_cos=1;
_csel=0;
}
/*
* 将显示数组按照对应的时间配置变量配置到对应的时间数组
*/
void nixie_sht()
{
if(timemode==0)
{
nixie_table[0]=20;
nixie_table[1]=20;
nixie_table[2]=20;
nixie_table[3]=20;
}
else if(timemode==_12H)