max7219秒表程序(一键控制三个状态)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <reg51.h>
#include "type.h"
#include "max7219.h"
/********************************************************************
控制按键定义
***********************************************************************/ sbit Key = P3^0;
/********************************************************************
变量定义
***********************************************************************/
uint16 Ms = 0;
uint16 Sec = 0;
uint8 k;
uint8 Count = 0;
/************************************************************************
函数声明
*************************************************************************/
void Start_Stop();
void Init_Timer0();
void Delay();
void Display();
void Key_In();
void Reset();
/************************************************************************
main()主函数
*************************************************************************/
void main()
{
Init_Max7219();
Init_Timer0();
while(1)
{
Key_In();
switch(k)
{
case 0 : Reset();break;
case 1 : Display();break;
case 2 : TR0 = 0;break;
}
}
}
/************************************************************************
定时器0中断函数
*************************************************************************/
void Interrupt_Timer0() interrupt 1
{
TH0 = 0xee;
TL0 = 0x00;
Count++;
if(Count >= 2)
{
Count = 0;
Ms++;
if(Ms >= 99) //100次为1s
{
Ms = 0; //秒数最大显示为99,之后从头开始计时
Sec++;
}
if(Sec >= 99)
Sec = 0; //秒加到99,重新计数
}
}
/************************************************************************
Reset()清零函数
*************************************************************************/
void Reset()
{
Init_Max7219();
Init_Timer0();
Ms = 0;
Sec = 0;
}
/************************************************************************
Display()函数
*************************************************************************/
void Display()
{
Write_Max7219(DIG_8,Ms%10);
Write_Max7219(DIG_7,Ms/10);
Write_Max7219(DIG_6,(Sec%10 | 0x80));
Write_Max7219(DIG_5,Sec/10);
}
/***********************************************************************
延时函数(约7毫秒)
************************************************************************/
void Delay(uint16 x)
{
char i;
while(x--)
{
for(i=0;i<125;i++);
}
}
/************************************************************************
定时器0初始化
*************************************************************************/
void Init_Timer0()
{
TMOD |= 0x11; //初始化两个定时器
TH0 = 0x33; //只用到定时器0,赋初值,中断一次5ms
TL0 = 0x00;
TR0 = 1; //启用定时器0
ET0 = 1; //允许定时器中断
EA = 1; //将总中断打开
}
/************************************************************************
按键控制
*************************************************************************/ void Key_In()
{
if(!Key)
{
Delay(19);
if(!Key)
{
k++;
if(k>2)
{
k = 0;
}
while(!Key);
}
}
}
max7219.h
#ifndef _MAX7219_H_
#define _MAX7219_H_
/*********************************************************
引脚位定义
**********************************************************/
sbit LOAD=P1^2; //MAX7219 Load-Data Input: rising edge pin 12 sbit DIN=P1^1; //MAX7219 Serial-Data Input: rising edge pin 1 sbit CLK=P1^0; //MAX7219
/****************************************************
MAX7219 宏定义
*****************************************************/
#define REG_NO_OP 0x00 // 定义空操作
#define DIG_1 0x01 // 定义数码管1
#define DIG_2 0x02 // 定义数码管2
#define DIG_3 0x03 // 定义数码管3
#define DIG_4 0x04 // 定义数码管4
#define DIG_5 0x05 // 定义数码管5
#define DIG_6 0x06 // 定义数码管6
#define DIG_7 0x07 // 定义数码管7
#define DIG_8 0x08 // 定义数码管8
#define DECODE_MODE 0x09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUT_DOWN 0x0C
#define DISPLAY_TEST 0x0F
/***********************************************************
MAX7210函数声明
************************************************************/
void Write_Max7219_byte(uint8 temp);//write max7219 a byte
void Write_Max7219(uint8 address,uint8 dat);//write max7219 command and data void Init_Max7219(void);//Initize max7219
/************************************************************
MAX7219地址、数据写入函数子程序
*************************************************************/
void Write_Max7219_byte(uint8 temp)
{
uint8 i;
for (i=0;i<8;i++)
{
CLK = 0;
DIN = (bit)(temp&0x80);
temp <<= 1;
CLK = 1;
}
}
/*************************************************************
MAX7219地址、数据写入
**************************************************************/
void Write_Max7219(uint8 address,uint8 dat)
{
LOAD = 0;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
LOAD = 1;
}
/**************************************************************
MAX7219初始化
***************************************************************/
void Init_Max7219(void)
{
Write_Max7219(SHUT_DOWN, 0x01);
Write_Max7219(DISPLAY_TEST, 0x00);
Write_Max7219(DECODE_MODE, 0xff);
Write_Max7219(SCAN_LIMIT, 0x07); //SCAN LIMIT 0~7 0xX0~0xX7 Write_Max7219(INTENSITY, 0x04);
Write_Max7219(DIG_7,0x00);
Write_Max7219(DIG_5,0x00);
Write_Max7219(DIG_6,0x80);
Write_Max7219(DIG_8,0x00);
}
#endif
type.h
#ifndef _TYPE_H_
#define _TYPE_H_
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
typedef char int8;
typedef int int16;
typedef long int32;
#endif。