#include "iocc2530.h"
#define D7 P1_0 //LED
#define D8 P1_1
#define D9 P1_4
#define SW P0_6 //开关
unsigned char count = 0; //定时器计数器
unsigned char TimerStartFlag = 0; //定时器启动标志
unsigned char key_count = 0; //按键计数
//延时
void delay(unsigned int time){
while(time--);
}
void gpio_init(){
P1SEL &=~0x13; //LED通用IO
P1DIR |=0x13; //输出
//P1 &= ~0x1B;
P0SEL &=~0x40; //开关通用IO
P0DIR &=~0x40; //输入
P0INP &=~0x40; //上拉
P2INP &=~0x20;
}
void timer1_init(){
//设置最大计数值0x30d4
T1CC0L = 0xD4; //1101 0100
T1CC0H = 0x30; //0011 0000
//开启比较模式
T1CCTL0 |=0x04;
T1IE =1;//定时器1中断使能
EA=1; //使能总中断
//启动定时器
T1CTL = 0x0E; //0000 1110
}
//中断服务函数
#pragma vector = T1_VECTOR
__interrupt void timer1_service(){
if(TimerStartFlag==1){
count++;
}
}
//扫描按键
void Scan_Key(){
if(SW==0){ //当按键按下
delay(30); //消抖
if(SW==0){ //消抖后检测按键按下
while(SW==0); //等待松手
TimerStartFlag = 1; //定时器 启动
//根据按键按下的次数来执行不同操作
if(key_count==0){
key_count = 1;
D8=0;
}
else if(key_count==1){
key_count = 2;
D9 = 0;
}
}
}
}
//LED运行
void LED_runing(){
switch(key_count){ //判断按键按下的次数
case 1: //按键按下一次
if(count==10){ //等待10个0.1秒
D7=0; //D7点亮
}
else if(count==20){ //等待10个0.1秒
D9=0; //D9点亮
}
else if(count==30){ //等待10个0.1秒
D7=1; //三个LED灭
D8=1;
D9=1;
count =0; //停止定时器,清零定时器计数器
TimerStartFlag =0;
}
break;
case 2:
if(count==10){
D7=0;
}
else if(count==20){
D8=0;
}
else if(count==30){
D7=1;
D8=1;
D9=1;
count =0;
TimerStartFlag =0;
key_count=0;
}
break;
default:
break;
}
}
int main(){
gpio_init();
timer1_init();
while(1){
Scan_Key();
LED_runing();
}
}
Zigbee实验3
于 2024-10-08 20:24:49 首次发布