⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sio.c

📁 智能充电参考程序 可以控制整个充电过程希望对大家有帮助
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                              智 能 充 电 器 开 发 小 组
**                                     OurAVR 论坛
**                                   QQ 群: 26052247 
**
**                               http://www.ouravr.com/bbs
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: SIO.c
**创   建   人: Trinove
**最后修改日期: 2008年01月13日
**描        述: 按键的底层函数  FOR AVR MCU / Mega16
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: Trinove
** 版  本: v0.01
** 日 期: 2008年01月13日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: mowin , martin7wind
** 日 期: 2008年02月03日
** 描 述: For 智能充电器
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 吕海安
** 日 期: 2008年03月02日
** 描 述: 修改格式,归档
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 村长 aleyn.wu
** 日 期: 2008年3月3日
** 描 述: 修改了一些BUG,使本项目能在CVAVR下编译通过
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "SIO.h"


/***************************************************
 74HC166并入串出

 连线如下
 KEY_SDO   = PB0
 KEY_CLK   = PB1
 KEY_SLOAD = PB2

 KEY_1 = A (UP)     62 
 KEY_2 = B (DOWN)   61
 KEY_3 = C (LEFT)   59
 KEY_4 = D (RIGHT)  55
 KEY_5 = E (ENTER)  47
 KEY_6 = F (CANCEL) 31
***************************************************/

#define KEY_ADR  10

#define KEY_DDR  DDRB
#define KEY_PORT PORTB
#define KEY_PIN  PINB

#define SDO      PB0
#define SCK      PB1
#define SLOAD    PB2

#define _BV(a)          (1 << a)
#define SCK_high()      (KEY_PORT |= _BV(SCK))
#define SLOAD_high()    (KEY_PORT |= _BV(SLOAD))

#define SCK_low()       (KEY_PORT &=~ _BV(SCK))
#define SLOAD_low()     (KEY_PORT &=~ _BV(SLOAD))
#define read_SDO()      (KEY_PIN & _BV(SDO))


/*******************************************************************************************************
** 函数名称: KEY_init
** 功能描述: 74HC166 通信端口设置
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void KEY_init(void)
{
    // SLOAD SCK 输出,SDO 输入
    KEY_DDR |= _BV(SLOAD)|_BV(SCK);
    KEY_DDR &=~ _BV(SDO);
    
    // SLOAD = 1
    // SCK = 0
    // SDO上拉电阻启用
    SLOAD_high();
    SCK_low();
    KEY_PORT |= _BV(SDO);
}

/*******************************************************************************************************
** 函数名称: SCK_low_to_high
** 功能描述: 时钟产生
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void SCK_low_to_high(void)
{
    SCK_low();
    SCK_high();
    SCK_low();
}

/*******************************************************************************************************
** 函数名称: read_keycode
** 功能描述: 键值读取函数
** 输入参数: 无
** 输出参数: 键值
********************************************************************************************************/
INT8U read_keycode(void)
{
    INT8U key_code = 0,i;
    
    SLOAD_high();
    SLOAD_low();        // 允许并行数据 <----> Parallel enable input (active LOW)
    
    SCK_low_to_high();  // 时钟信号,上升沿锁存数据并移出最高位 BIT7,非常重要
    
    SLOAD_high();       // 并行锁存结束,非常重要
    
    // 先读取 BIT7,非常重要
    for(i = 8; i > 0; i--)
    {
        if(read_SDO())
        {
            key_code |= _BV(i-1);
        }
        
        //产生下一个时钟信号 
        SCK_low_to_high();
    }
    
    //返回键值,六个按键,只要低六位,高两位未用
    return (key_code & 0x3f);                                               
}


/*******************************************************************************************************
** 函数名称: read_keycode
** 功能描述:  连接并接收键盘信号,并进行持续按键判断
**            键盘按键值和持续按键标志 均直接写入内存数据表
**            键盘内存分配一个单元 INT8U
**            前2位代表状态,后6位对应每一个按键
**            最多存储三个按键状态,多余将被忽略
**            状态: 1 1 --- 前两次结果未处理,等待
**                  1 0 --- 上次按键结果未处理,等待
**                  0 1 --- 正常按下,等待处理 
**                  0 0 --- 空闲 忽略,不处理
**            普通按键位1代表正常,0代表按下
** 输入参数: 无
** 输出参数: 键值
********************************************************************************************************/
void s_keyboard(void)
{ 
    INT8U i;
    i = read_keycode();
    if(i != NO_KEY)
    {
        lcd_locate(14,0);  
        lcd_print_number(i,2,0); 
    }    


}


/**********************************************************************************************************
**                                 END OF FILE
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -