图一
main()
#include <REGX52.H>
#include <INTRINS.H>
#include "timer0.h"
unsigned char key();
/**
* @brief 流水灯半秒流动;按下K1,流水灯变向
* @param
* @retval
*/
unsigned char KeyNum,LEDMode;
main(){
P2=0xFE;
Timer0Init();//中断初始化
while(1){
KeyNum=key();
if(KeyNum){ //检测K1键是否按下;
if(KeyNum==1) {
LEDMode++;
if(LEDMode>=2) LEDMode=0;
}
}
}
}
/**
* @brief 定时器0中断程序;
* @param
* @retval
*/
void Timer0_Routine() interrupt 1{
static unsigned int T0Count;
TL0=0x18;//设置定时初始值
TH0=0xFC;
T0Count++;
if(T0Count>=500){
T0Count=0;
if(LEDMode==0)
P2=_crol_(P2,1);//每次左移一位
if(LEDMode==1)
P2=_cror_(P2,1);//每次右移一位
}
}
time0.h(测试头文件和声明的作用相同)
#ifndef __TIME0_H__
#define __TIME0_H__
void Timer0Init();
#endif
#include <REGX52.H>
/**
* @brief 定时器初始化
* @param 无
* @retval 无
程序中的变量在<REGX52.H>已有定义
*/
void Timer0Init(){
//*1 TMOD=0x01;//0000 0001;设置定时器0,16位定时器模式;
//*2 TMOD=TMOD&0XF0; //TMOD低四位清零,高四位不变;
// TMOD=TMOD|0X01; //TMOD的最后一位置零;
//*3
TMOD&=0XF0;
TMOD|=0X01;
//设置TCON
TF0=0;
TR0=1;
TH0=64535/256;//定时器寄存器高八位;定时1000ms;溢出为65535
TL0=64535%256;//定时器寄存器低八位
ET0=1;//允许中断
EA=1;//打开全局中断
PT0=0;
//这三个变量的意义查看图1的下部分的中断系统电路
}
unsigned char key();
#include <REGX52.H>
void Delayms(unsigned int time);
/**
* @brief 扫描按键是否按下,并返回按键值
* @param
* @retval 按下则返回按键值,否则返回0;
*/
unsigned char key(){
unsigned char KeyNumber=0;
if(P3_1==0){Delayms(20);while(P3_1==0);Delayms(20);KeyNumber=1;}
if(P3_0==0){Delayms(20);while(P3_0==0);Delayms(20);KeyNumber=2;}
if(P3_2==0){Delayms(20);while(P3_2==0);Delayms(20);KeyNumber=3;}
if(P3_3==0){Delayms(20);while(P3_3==0);Delayms(20);KeyNumber=4;}
return KeyNumber;
}
void Delayms(unsigned int time);
/**
* @brief 延时 ms
* @param unsigned int time:延时的时间
* @retval
*/
void Delayms(unsigned int time){
unsigned char i,j;
while(time--){
i=2;
j=239;
do{
while(--j);
}
while(--i);
}
}