|
/引入头文件*********************************************************
#include "delay.h"
#include "delay.c"
#include <pic1684.h>
//时间常数***********************************************************
#define RcOsc 910 //脉冲总宽
//脚位定义***********************************************************
#define Led RA0 //指示输出
//数据输出***********************************************************
#define Out RA1 //数据输出
//按键数据***********************************************************
unsigned char value = 3; //按键的值
//*******************************************************************
//函数名称:port_init();
//输入参数:无
//输出参数:无
//功能描述:端口设置
//建造日期:2008.10.11
//*****************************************************************
void PortInit(void)
{
OPTION = 0x00; //允许上拉
PORTA = 0xfc; //
TRISA = 0xfc; //A 口设置
PORTB = 0xff; //
TRISB = 0xff; //B 口设置
}
//*******************************************************************
//函数名称:TxSycn();
//输入参数:无
//输出参数:无
//功能描述:发送同步头
//建造日期:2008.10.11
//*******************************************************************
void TxSycn(void)
{
Out = 1; //同步数据
DelayUs(RcOsc / 16 * 4);
Out = 0;
DelayMs(RcOsc / 16 * 124 / 1000);
}
//*******************************************************************
//函数名称:TxByte(data);
//输入参数:待发数据
//输出参数:无
//功能描述:发送一字节数据
//建造日期:2008.10.11
//*******************************************************************
void TxByte(unsigned char data)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
if (data & 0x01) //发送高位
{
Out = 1; //高位数据
DelayUs(RcOsc / 16 * 12);
Out = 0;
DelayUs(RcOsc / 16 * 4);
}
else //发送低位
{
Out = 1; //低位数据
DelayUs(RcOsc / 16 * 4);
Out = 0;
DelayUs(RcOsc / 16 * 12);
}
data >>= 1; //右移一位
}
}
//*******************************************************************
//函数名称:TxData(data);
//输入参数:按键数据
//输出参数:无
//功能描述:发送数据
//建造日期:2008.10.11
//*******************************************************************
void TxData(unsigned char data)
{
unsigned char buff[3] = {0xaa, 0x3c, 0x03};
unsigned char i, j;
buff[2] &= 0x0f; //清除按键
buff[2] |= data; //加载按键
for (j = 0; j < 4; j++) //每帆四次
{
TxSycn(); //送同步头
for (i = 0; i < 3; i++)
{
TxByte(buff[i]); //发送数据
}
}
}
//*******************************************************************
//函数名称:KeyRead();
//输入参数:无
//输出参数:无
//功能描述:读取按键
//建造日期:2008.10.11
//*******************************************************************
void KeyRead(void)
{
static unsigned char temp = 0; //临时记录
static unsigned char read = 0; //按键记录
static unsigned char sign = 0; //状态标志
static unsigned char time = 0; //防误记时
temp = PORTB & 0x03; //读取按键
if (sign == 0)
{
if (read == temp) //是否稳定
{
if (++time > 50) //防误处理
{
time = 0; //记时清零
sign = 1; //下个状态
value = read; //有效按键
}
}
else time = 0; //从新记时
}
else if (temp == 0x03) sign = 0; //等待弹起
read = temp; //更新记录
}
//*******************************************************************
//函数名称:KeyInt();
//输入参数:无
//输出参数:无
//功能描述:按键处理
//建造日期:2008.10.11
//*******************************************************************
void KeyInt(void)
{
if (value != 3) //是否有效
{
switch (value)
{
case 0B00000010: //1 号按键
{
Led = 1;
TxData(0x80);
Led = 0;
break;
}
case 0B00000001: //2 号按键
{
Led = 1;
TxData(0x40);
Led = 0;
break;
}
case 0B00000000: //复合按键
{
Led = 1;
TxData(0xc0);
Led = 0;
break;
}
default: //无效离开
{
break;
}
}
value = 3; //执行一次
}
}
//*******************************************************************
//函数名称:main();
//输入参数:无
//输出参数:无
//功能描述:主要程序
//建造日期:2008.10.11
//*******************************************************************
void main(void) //
{
PortInit(); //脚位设置
while (1)
{
DelayMs(1); //
KeyRead(); //读取按键
KeyInt(); //按键处理
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|