标题:
单片机按键控制数码管秒表视频+源程序
[打印本页]
作者:
Zidone
时间:
2019-1-20 23:22
标题:
单片机按键控制数码管秒表视频+源程序
按键控制数码管秒表
从上到下四个按键分别为 启动/继续运行按键 暂停按键 复位清零按键 熄屏睡眠按键
实际效果见视频:
http://v.youku.com/v_show/id_XNDAyMjU4ODMyOA==.html?x&sharefrom=android&sharekey=0b9b9d0de363b830ab2c00b3d0679bb69&qq-pf-to=pcqq.c2c
其余内容见附件:
单片机源码:
/* 包含头文件 -------------------------------------------------------------*/
#include "STC8.h"
#include "intrins.h"
#include "bsp_key.h"
#include "bsp_led.h"
#include "bsp_smg.h"
/*常量声明-----------------------------------------------------------------*/
unsigned char KeySta[4]={//按键当前状态
1,1,1,1
};
/*变量声明 ----------------------------------------------------------------*/
unsigned char sec=0;//秒时间初值
unsigned char flag1s=0;//秒表运行刷新标志
bit RunningFlag=0;//秒表运行标志
bit ResetFlag=1;//秒表复位标志(注:锁死定时器,避免多走,为启动做准备)
bit PauseFlag=0;//秒表暂停标志
/*函数声明 -------------------------------------------------------------- */
void ConfigTimer0(unsigned int ms); //定时器0配置函数声明
void KeyScan(void); //按键扫描函数声明
void KeyDriver(void); //按键驱动函数
void StopwatchAction(void);//Stopwatch启动函数声明
void StopwatchReset(void);//Stopwatch复位函数声明
void StopwatchPause(void);//Stopwatch暂停函数声明
void main(void)
{
EA=1;//开总中断
ConfigTimer0(2);//配置T0定时2ms
while(1)
{
KeyDriver();
if(flag1s&&RunningFlag)//运行状态
{
flag1s=0;
if(!PauseFlag)//如果暂停键没有按下(暂停状态)
{
sec++;
}
SMGBuff[0]=SMGChar[sec%10];
SMGBuff[1]=SMGChar[sec/10%10];
if(sec==100)//因为我总共就只有两位数码管,所以满100清0
{
sec=0;
}
}
else if(ResetFlag)//复位状态
{
SMGBuff[0]=SMGChar[sec%10];
SMGBuff[1]=SMGChar[sec/10%10];
}
}
}
/*
函数名称:Stopwatch启动函数
功 能:/
*/
void StopwatchAction(void)
{
RunningFlag=1;//运行标志置1
ResetFlag=0;//复位标志置0
PauseFlag=0;//暂停标志置0
}
/*
函数名称:Stopwatch复位函数
功 能:/
*/
void StopwatchReset(void)
{
ResetFlag=1;//复位标志置1
RunningFlag=0;//运行标志置0
PauseFlag=0;//暂停标志置0
sec=0;//清零计数值
}
/*
函数名称:Stopwatch暂停函数
功 能:/
*/
void StopwatchPause(void)
{
PauseFlag=1;//暂停标志置0
ResetFlag=0;//复位标志置1
RunningFlag=0;//运行标志置0
}
/*
函数名称:按键驱动程序
功 能:检测按键动作,调度相应动作函数
*/
void KeyDriver(void)
{
unsigned char i;
static unsigned char backup[4]={
1,1,1,1
};
for(i=0;i<4;i++)//循环检测四个按键
{
if(backup[i]!=KeySta[i])//检测按键动作
{
if(backup[i]!=0)//按键按下时执行动作
{
if(i==0)
StopwatchAction();
else if(i==1)
StopwatchPause();
else if(i==2)
StopwatchReset();
else if(i==3)
_nop_();
}
backup[i]=KeySta[i];//刷新前一次备份的值
}
}
}
/*
函数名称:按键扫描程序
功 能:按键扫描函数,须在定时器中断中调用
*/
void KeyScan(void)
{
unsigned char i;
static unsigned char keybuf[4]={
0xFF,0xFF,0xFF,0xFF
};
//按键值移入缓冲区
keybuf[0]=(keybuf[0]<<1)|KEY2;
keybuf[1]=(keybuf[1]<<1)|KEY3;
keybuf[2]=(keybuf[2]<<1)|KEY4;
keybuf[3]=(keybuf[3]<<1)|KEY5;
for(i=0;i<4;i++)
{
if(keybuf[i]==0x00)
{//连续8次扫描值为0,即16ms内都是按下状态时,可认为按键已稳定的按下
KeySta[i]=0;
}
else if(keybuf[i]==0xFF)
{//连续8次扫描值为1,即16ms内都是弹起状态,可认为按键已稳定的弹起
KeySta[i]=1;
}
}
}
/*
函数名称:定时器0初始化程序
功 能:定时器0方式1 16位自动重载 12分频
*/
void ConfigTimer0(unsigned int ms) //@24.000MHz
{
unsigned char T0RH=0;
unsigned char T0RL=0;
unsigned long tmp;
tmp=24000000/12;//定时器计数频率
tmp=(tmp*ms)/1000;//计算所需的计数值
tmp=65536-tmp;//计算定时器重载值
T0RH=(unsigned char)(tmp>>8);//定时器重载值拆分为高低字节
T0RL=(unsigned char)tmp;
TMOD &=0xF0;//清零T0的控制位
TMOD |=0x00;//配置T0为模式0
TH0=T0RH;//加载T0重载值
TL0=T0RL;
ET0=1;//使能T0中断
TR0=1;//启动T0
}
/*
函数名称:定时器0中断服务程序
功 能:2ms进入中断一次
*/
void TM0_Rountine(void) interrupt 1
{
static unsigned char i=0;//动态扫描的索引
static unsigned int cnt=0;//记录T0中断次数
KeyScan();
if(ResetFlag)//如果暂停键按下,计数清零
cnt=0;
else if(!PauseFlag)//如果暂停键没有按下
cnt++;
if(cnt>=500)
{
cnt=0;
flag1s=1;
}
switch(i)
{
case 0:SMG1_EN=1;SMG2_EN=0;i++;SMG=SMGBuff[0];break;
case 1:SMG1_EN=0;SMG2_EN=1;i=0;SMG=SMGBuff[1];break;
default:break;
}
}
复制代码
全部资料51hei下载地址:
Template.zip
(66.23 KB, 下载次数: 24)
2019-1-20 23:21 上传
点击文件名下载附件
按键控制数码管秒表
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1