#include "delay.h"
#include "delay.c"
#include
//腳位定義***********************************************************
#define key RA3 //按鍵輸入
#define led RB0 //輸出指示
//開關標志***********************************************************
persistent bit Sign; //開關標志
//占空比數據*********************************************************
persistent unsigned char data; //占空表值
const unsigned char PwmDat[10] = {0x19, 0x32, 0x4b, 0x64, 0x7d,
0x96, 0xaf, 0xc8, 0xe1, 0xfa};
//*******************************************************************
//函數名稱:PortInit();
//輸入參數:無
//輸出參數:無
//功能描述:端口設置
//建造日期:2008.06.06
//*****************************************************************
void PortInit(void)
{
PORTA = 0xfd; //
TRISA = 0xfd; //A 口設置
PORTB = 0x00; //
TRISB = 0x00; //B 口設置
}
//*******************************************************************
//函數名稱:KeyInt();
//輸入參數:無
//輸出參數:無
//功能描述:按鍵處理函數
//建造日期:2008.06.06
//*******************************************************************
void KeyInt(void)
{
static unsigned char count = 0; //長按計數
static bit valid = 0; //有效標志
static bit reach = 0; //長按標志
if (valid == 1)
{
if (key == 0) //按鍵有效
{
count++; //增加計數
if (count == 50)
{
count = 25; //長按加速
reach = 1; //長按置位
data++; //查表增加
if (data > 9) data = 0; //循環查表
}
}
else
{
if (reach == 0) Sign = !Sign; //取反狀態
count = 0; //計數清零
valid = 0; //有效清零
reach = 0; //長按清零
}
}
else
{
if (key == 0) valid = 1; //有效置位
}
}
//*******************************************************************
//函數名稱:LedPwm();
//輸入參數:無
//輸出參數:無
//功能描述:led 脈沖調寬輸出
//建造日期:2008.06.06
//*******************************************************************
void LedPwm(void)
{
unsigned char PwmH, PwmL;
unsigned char i,Pwm;
Pwm = PwmDat[data]; //占空查表
if(Sign == 1) //是否開機
{
for (i = 0; i < 20; i++)
{
PwmH = Pwm; //脈沖高位
PwmL = 250 - PwmH; //脈沖低位
led = 1; //
while (PwmH--); //高位輸出
led = 0; //
while (PwmL--); //低位輸出
}
}
else
{
DelayMs(20); //關機延時
}
}
//*******************************************************************
//函數名稱:main();
//輸入參數:無
//輸出參數:無
//功能描述:主要程序
//建造日期:2008.06.06
//*******************************************************************
void main(void) //
{
PortInit(); //腳位設置
if (data > 9) data = 0; //是否越階
while (1)
{
KeyInt(); //按鍵處理
LedPwm(); //脈沖輸出
}
}
可以實現短按開關機(按鍵 < 1S),長按凋光(按鍵 >1S),以10%占空比步進.占空比為 10% -100% (在關機時長按無效)
