一.对定时器有一定的了解
二.对中断系统有一定的了解
三.相应代码
1.Key.C(独立按键代码)
#include <REGX52.H>
#include "Delay.h"
/**
* @brief 获取独立按键键码
* @param 无
* @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0
*/
unsigned char Key()
{
unsigned char KeyNumber=0;//令初始值为0
if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
return KeyNumber;
}
2.Key.h
#ifndef __KEY_H__
#define __KEY_H__
unsigned char Key();
#endif
3.Timer.c(定时器代码)
#include <REGX52.H>
/**
* @brief 定时器0初始化,1毫秒@12.000MHz
* @param 无
* @retval 无
*/
void Timer0Init(void)
{
// TMOD=0x01;//0000 0001此代码会刷新定时器1使其变成0000
TMOD &= 0xF0; //设置定时器模式(把TMOD的低四位清零,高四位保持不变 ) 1与上任何一个数等于任何一个数:1010 0011&1111 0000=1010 0000
TMOD |= 0x01; //设置定时器模式(把TMOD的低四位清零,高四位保持不变 ) 任何数或上一个0等于任何数:1010 0000|0000 0001=1010 0001
TL0 = 0x18; //设置定时初值(高位)
TH0 = 0xFC; //设置定时初值(低位)
TF0 = 0; //清除TF0标志 清零
TR0 = 1; //定时器0开始计时
ET0=1; //接通电路
EA=1; //接通电路
PT0=0; //接到低级自然优先级
}
/*定时器中断函数模板
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count>=1000) //如果计时大于1000
{
T0Count=0;//定时器清零(但是这里清零之后不为零 为TL0和TH0的初值)
}
}
*/
4.Timer.h
#ifndef __TIMER0_H__
#define __TIMER0_H__
void Timer0Init(void);
#endif
5.main.c
#include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
#include <INTRINS.H>
unsigned char KeyNum,LEDMode;
void main()
{
P2=0xFE; //最左边的灯先亮
Timer0Init();
while(1)
{
KeyNum=Key(); //获取独立按键键码
if(KeyNum) //如果按键按下
{
if(KeyNum==1) //如果K1按键按下
{
LEDMode++; //模式切换
if(LEDMode>=2)LEDMode=0;
}
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++; //T0Count计次,对中断频率进行分频
if(T0Count>=500)//分频500次,500ms
{
T0Count=0;
if(LEDMode==0) //模式判断
P2=_crol_(P2,1);//循环左移 LED输出
if(LEDMode==1)
P2=_cror_(P2,1);//循环右移
}
}