英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 4659|回复: 0
打印 上一主题 下一主题

软件摸拟EV1527编码IC 转

[复制链接]
跳转到指定楼层
1#
发表于 2012-8-21 16:11:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/引入头文件*********************************************************
#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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-11-24 04:03 , Processed in 0.058343 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表