|
下面的程序,短按轉(zhuǎn)換燈的工作模式同時(shí)響一聲蜂鳴器是實(shí)現(xiàn)了,但想實(shí)現(xiàn)長(zhǎng)按開(kāi)和關(guān)的時(shí)候也響一聲。是不是我放的位置的不對(duì)還是怎的,還是長(zhǎng)按時(shí)按鍵有抖動(dòng),引起不正常?
單片機(jī)源程序如下:
#include "stc15w.h"
#include <intrins.H>
#define uint unsigned int
#define uchar unsigned char
#define MAIN_Fosc 11059200L
#define key_S 80 //短按(約20ms)
#define key_L key_S*100 //長(zhǎng)按(約2s)
/*pin_mode*/
sbit key = P2^4; //按鍵
sbit led = P5^5; //指示燈 0亮
sbit buzzer=P1^0; //無(wú)源蜂鳴器
uint Cnt250us=0;Cnt1s;
bit ON=0;//開(kāi)關(guān)機(jī)
bit keyn=0; //蜂鳴器。睍r(shí)響
uchar n=0; //燈模式
uint tt=0; //響計(jì)時(shí)
uint t=0;
/*pin_mode*/
void port_mode()
{
P2M0 = 0x00;
P2M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
led=1;//燈不亮
}
void readkey(void)
{
static uint count=0;
if(!key)
{
count++;
if(count==key_L) //長(zhǎng)按開(kāi)機(jī),ON=1
ON=~ON;
//keyn=1;//沒(méi)加這個(gè)可以實(shí)現(xiàn)短按蜂鳴器響一聲,但想實(shí)現(xiàn)長(zhǎng)按開(kāi)、機(jī)也響一聲。
if(count>key_L)
count=key_L+1;
}
else
{
if(count>key_S && count<key_L) //短按切換燈模式
{
if(ON==1)
n++;
n%=3;
keyn=1; //短按置1蜂鳴器響
}
count=0;
}
}
void Timer0Init() //250微秒@11.0592MHz
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x33;
TH0 = 0xF5;
TF0 = 0;
TR0 = 1;
}
void LED_M50() //燈模式三
{
if(TF0==0)
t++;
{
if(t>=500)
{
led=~led;
t=0;
}
}
}
void LED_M75() //燈模式二
{
if(TF0==0)
t++;
{
if(t<=2000)
{
led=1;
}
if(t>2000)
{
led=0;
if(t>=8000)
{
t=0;
}
}
}
}
/*
P1.1輸出PWM驅(qū)動(dòng)無(wú)源蜂鳴器
*/
void initPWM1()//響一聲
{
if(keyn==1)
{
tt++;
PCA_PWM1 = 0x00; //開(kāi)PWM
CMOD=0x80;
CCAPM1=0x42; // 設(shè)置PCA模塊為PWM輸出方式。PCA0
CR=1;
CCAP1H=0x80;
if(tt>=200)
{
PCA_PWM1 = 0x03; //關(guān)PWM
CR=0;
tt=0;
keyn=0;
}
}
}
void main()
{
port_mode();
Timer0Init();
while(1)
{
if(TF0==1)
{
TF0=0;
readkey();
initPWM1();//蜂鳴器
if(ON==1)
{
Cnt250us++;
if(Cnt250us>=4000)
{
Cnt250us=0;
Cnt1s++;
if(Cnt1s>=1200) //定時(shí)功能
{
Cnt1s =0;
ON=0;
led=1;
}
}
switch(n)
{
case 0 :led=0;break; //燈常亮
case 1 :LED_M75();break;//燈模式二
case 2 :LED_M50();break;//燈模式三
}
}
else //關(guān)機(jī)
{
Cnt250us=0;
Cnt1s= 0;
led=1;
ON=0;
}
}
}
}
|
|