?? 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 + -