基于STC系列单片机实现定时器扫描数码管显示,带数码管开机显示的功能

javascript 复制代码
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define NixieTubeSegmentCode P0//自定义数码管段码为单片机P0组引脚
#define NixieTubeBitCode P2//自定义数码管位码为单片机P2组引脚
sbit LED P1^0;//位定义LED灯为单片机P1.0脚
uchar Code NixieTubeBitCodeArray = [0xfe,0xfd,0xfb,0xf7];//定义数码管位码数组变量
uchar NixieTubeDisplayDataArray[0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00];//定义共阳数码管显示0~F数据及符号"---"及熄灭数组变量
uchar NixieTubeCacheDataArray[] = [22,22,22,22];//定义数码管缓存数据数组变量
uchar NixieTubeBootTimerFlag = 1;//定义数码管开机时间标志位变量
uint KeyPressNumber;//声明按键按下数值变量
uint NixieTubeBootTimer = 0;//定义数码管开机时间变量
void NixieTubeBootDisplay();//数码管开机显示函数
void NixieTubeDisplayDataSplit();//数码管显示数据分解函数
void NixieTubeDisplayData();//数码管显示数据函数
void Timer0Init(void);//定时器0初始化函数
  void main(void)//主函数
{
   Timer0Init();//定时器0初始化函数 
   NixieTubeBootDisplay();//数码管开机显示函数
   while(1)//主循环
  {
    NixieTubeDisplayDataSplit();//数码管显示数据分解函数
   }
  }
  void NixieTubeBootDisplay();//数码管开机显示函数
 {
   do
  {
    if(NixieTubeBootTimer = 500 )//如果数码管开机时间等于1s
    LED = ~ LED;//LED灯亮灭更新
   }while(NixieTubeBootTimer < 2500);//当数码管开机时间小于5s
   NixieTubeBootTimerFlag = 0;//数码管开机时间标志位清0
   LED = 1;//LED灯熄灭
  }
  void NixieTubeDisplayDataSplit()//数码管显示数据分解函数
 {
   NixieTubeCacheDataArray[0] = KeyPressNumber / 1000;//数码管千位数据显示
   NixieTubeCacheDataArray[1] = KeyPressNumber / 100 % 10;//数码管百位数据显示
   NixieTubeCacheDataArray[2] = KeyPressNumber / 10 % 10;//数码管十位数据显示
   NixieTubeCacheDataArray[3] = KeyPressNumber % 10;//数码管个位数据显示
  }
  void NixieTubeDisplayData()//数码管显示数据函数  
 {  
   static uchar i = 0;//定义静态数码管管位变化变量
   switch(i)//数码管管位变化筛选
  {
    case 0 ://数码管千位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[0]];//数码管千位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[0];//数码管千位码显示
            i++;//数码管管位变化自加1
            break;//跳出
    case 1 ://数码管百位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[1]];//数码管百位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[1];//数码管百位码显示
            i++;//数码管管位变化自加1
            break;//跳出 
    case 2 ://数码管十位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[2]];//数码管十位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[2];//数码管十位码显示
            i++;//数码管管位变化自加1
            break;//跳出
    case 3 ://数码管个位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[3]];//数码管个位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[3];//数码管个位码显示
            i = 0;//数码管管位变化清0
            break;//跳出
    default:break;//跳出
   }
  }
  void Timer0Init(void) interrupt 1//定时器定时2ms初始化函数 晶振为12MHz
 {
   TMOD &= 0xf0;//设定定时器
   TMOD |= 0x01;//设定定时器为定时器0
   TH0 = 0xf8;//设定定时器0高8位初值
   TL0 = 0x30;//设定定时器0低8位初值
   TF0 = 0;//定时器0溢出中断标志位清0
   ET0 = 1;//打开定时器中断开关
   EA = 1;//打开定时器中断总开关
   TR0 = 1//打开定时器0开关
  } 
  void Timer0(void) interrupt 1//定时器定时2ms中断函数 晶振为12MHz
 {
   TR0 = 0;//关定时器0开关
   if(NixieTubeBootTimerFlag == 1)//数码管开机时间标志位置1
  {
    NixieTubeBootTimer++;//数码管开机时间自加
   }
   NixieTubeDisplayData();//数码管显示数据函数
   TH0 = 0xf8;//设定定时器0高8位初值
   TL0 = 0x30;//设定定时器0低8位初值
   TR0 = 1;//开定时器0开关
  }
相关推荐
clear sky .2 小时前
内存8字节对齐是什么?
c语言·stm32·嵌入式硬件
辰域电子2 小时前
STM32项目开源:智能安防与燃气监测系统(代码+原理图+仿真)
stm32·单片机·嵌入式硬件·开源·毕业设计·proteus
无忧.芙桃2 小时前
C++内存管理
c语言·开发语言·c++·青少年编程
服务器硬件项目经理2 小时前
第14篇_服务器主板上MOSFET的三大应用
运维·服务器·人工智能·单片机·硬件工程·硬件
SamChan902 小时前
Python批量处理PDF踩坑实录:中文编码、字体内嵌、多栏排版与内存占用
python·单片机·ai·pdf·机器翻译
zyeyeye3 小时前
C++入门:从HelloWorld到命名空间揭秘
c语言·开发语言·c++·算法
zcmodeltech3 小时前
能源电力沙盘模型控制系统设计——基于STM32与Modbus RTU的“发—输—变—配—用”全链条动态展示方案
数据库·stm32·单片机·嵌入式硬件·能源
高斯的手稿08013 小时前
丽萨单片机固件升级,裁剪hex文件
单片机·嵌入式硬件
昌原的儿子LEO3 小时前
【单片机入门】UART 串行异步通信核心考点梳理
linux·单片机·51单片机
沐欣工作室_lvyiyi3 小时前
基于单片机的汽车防碰撞刹车系统的设计与实现(论文+源码)
单片机·嵌入式硬件·汽车·单片机智能小车