📄 main_c.c
字号:
/*********************************************************************************************************
**
**
**
** (c) Copyright 2005-2007, gl
** All Rights Reserved
**
** V1.00.2
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: rfcode_pic.c(picc)
**创 建 人: gl
**最后修改日期: 2006年12月20日
**描 述: picc 8.05---16f57,4.0M,pt2248解码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: gl
** 版 本: V1.00.1
** 日 期: 2006年12月17日
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2006年12月20日
** 描 述: 更改一些bug,在硬件验证ok.
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <pic.h>
#include <pic16f5x.h>
#include "define.h"
#define NULL 0
__CONFIG(WDTDIS & XT & UNPROTECT);
__IDLOC(dddd);
/*********************************************************************************************************
** 函数名称: init
** 功能描述: 初始化
** 输 入: 无
** 输 出: ircode:12位的码值
** 全局变量:
** 调用模块:
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void init() //端口初始化
{
asm("clrwdt");
OPTION = 0x00; //Set WDT=1:2
TMR0 = 0;
TRISA = 0x02; //ir input
TRISB = 0x00;
TRISC = 0x00;
PORTA = 0;
PORTB = 0;
PORTC = 0;
flag0 = 0x00;
millisecond = 0;
second = 0;
timeminute = 0;
}
/*********************************************************************************************************
** 函数名称: RfKeyScan
** 功能描述: 红外按键解码(pt2248),
** 输 入: 无
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2006年12月20日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned char IRKeyScan()
{
unsigned char i = 0;
if(!IR_PIN)
{
irsignalstartcount = 0; //起始低电平计时,没有信号时为高电平
irbitcount = 0; //计接收数据的位数
// while(!IR_PIN) //检测起始低电平
// {
// irsignalstartcount++; //起如低电平计时
// }
// if(irsignalstartcount >= (_60A-3) && irsignalstartcount < (_60A+3)) //是否为起始位
{ //是起始位下面开始检测数据位
ircode = 0;
while(++irbitcount <= 12) //共有12位数据
{
asm("clrwdt");
hightcount = 0;
lowcount = 0;
while(!IR_PIN)
{
if(++lowcount > _3A) //低电平计时
{
break;
}
asm("nop");
}
while(IR_PIN)
{
if(++hightcount > _3A) //高电平计时
{
break;
}
asm("nop");
}
if(lowcount > _2A && lowcount < _4A && hightcount < _2A)
{
//valebit = 1; //数据位为1
ircode |= 0x0001;
}
else if(lowcount < _2A && hightcount > _2A && hightcount < _4A)
{
//valebit = 0; //数据位为0
ircode &= 0x1ffe;
}
ircode <<= 1; //16位左移,低12位有效
}
ircode >>= 1; //因为上面的程序左移进多移了一位
i = 0;
while(ircode != ircodetable[i])
{
//asm("clrwdt");
if(i >= 18)
{
break;
//出错处理
return 44;
}
i++;
}
have_count++;
return (i); //返回按键值
}
// else
// {
// return 45; //没有检测到起始位,ir信号无效(不读)
// }
}
return 44; //是干扰
}
/*********************************************************************************************************
** 函数名称: disp
** 功能描述: 两位数码管动态扫描显示函数,显示内容为按键值(数组下标)
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void disp()
{
ledsec++;
if(ledsec > 1)
{
ledsec = 0;
}
switch(ledsec)
{
case 0:
{
LEDIO = ledcodetable[key_word%10];//个位//
LEDSEC1 = 1;
LEDSEC2 = 0;
break;
}
case 1:
{
LEDIO = ledcodetable[key_word/10];//十位//
LEDSEC1 = 0;
LEDSEC2 = 1;
break;
}
}
}
/*********************************************************************************************************
** 函数名称: beep_cl
** 功能描述: 蜂鸣器驱动
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void beep_cl()
{
static volatile unsigned char beep_delay;
if(BEEPFLAG)
{
beep = 1;
beep_delay++;
if(beep_delay > 20)
{
BEEPFLAG = 0;
beep = 0;
beep_delay = 0;
}
}
}
/*********************************************************************************************************
** 函数名称: function1
** 功能描述: 功能处理,
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void function1()
{
}
/*********************************************************************************************************
** 函数名称: time
** 功能描述: 定时处理,定时时间为minute变量值
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void time() //定时
{
if(++millisecond >= 500)
{
millisecond = 0;
//PORTB ^= 0X3E; //用于测程序的运行
if(++second >= 60)
{
second=0;
if(++timeminute >= TIMEDEFINE)
{
POWERFLAG = 0;
timecount = 0;
timeminute = 0;
}
}
}
}
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主程序
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2006年12月20日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
main()
{
init();
BEEPFLAG=1; //上电蜂鸣器鸣叫一次
while(1)
{
asm("clrwdt");
while(TMR0 < 250) //500US
{
if(!IR_PIN)
{
key_word = IRKeyScan(); //得到外红键值
;
if(ircode & 0x0100)
{
DATACOUNT = 6; //continuous signal
}
else
{
DATACOUNT = 2; //single-shot signal
}
if(have_count >= DATACOUNT)
{
have_count = 0;
switch(key_word)
{
case 0:
{
PORTB ^= 0X02; //第1路继电器
break;
}
case 1:
{
PORTB ^= 0X04; //第2路继电器
break;
}
case 2:
{
PORTB ^= 0X08; //第3路继电器
break;
}
case 3:
{
PORTB ^= 0X10; //第4路继电器
break;
}
case 4:
{
PORTB ^= 0X20; //第5路继电器
break;
}
case 6:
{
PORTB = 0X00; //关掉所有继电器
break;
}
case 44:
{
break; //出错处理
}
default:
{
break;
}
}
}
}
}
TMR0 = TMR0-250; //可减少累计误差
//-------------------------------------------------------------------------------
if(++programtimecount > 3)
{
programtimecount = 0;
}
switch(programtimecount)
{
case 0:
{
disp();
break;
}
case 1:
{
beep_cl();
break;
}
case 2:
{
function1();
break;
}
case 3:
{
time();
break;
}
}
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -