📄 sio.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 + -