?? ch452w3.c
字號:
/* ***************************
Website: http://wch.cn
Email: tech@wch.cn
Author: W.ch 2005.4
CH452 的2線接口子程序
****************************
CH452的2線接口,不含按鍵中斷為2個I/O引腳,含按鍵中斷為3個I/O,兼容I2C/IIC時序
對于頻率低于24MHz的MCS51,為了節約傳輸時間,可以適當減少SCL/SDA之間的延時
*************************************************************************** */
#include "PIN.H" // 修改該文件以適應硬件環境/單片機型號等
#include "CH452CMD.H" // CH452常量定義
void CH452_I2c_Start(void) // 操作起始
{
DISABLE_KEY_INTERRUPT; //禁止鍵盤中斷,防止開始時被CH452中斷而進入中斷服務程序中的START
CH452_SDA_SET; /*發送起始條件的數據信號*/
CH452_SDA_D_OUT; /* 設置SDA為輸出方向 */
CH452_SCL_SET;
CH452_SCL_D_OUT; /* 設置SCL為輸出方向 */
DELAY_1US;
CH452_SDA_CLR; /*發送起始信號*/
DELAY_1US;
CH452_SCL_CLR; /*鉗住I2C總線,準備發送或接收數據 */
DELAY_1US;
}
void CH452_I2c_Stop(void) // 操作結束
{
CH452_SDA_CLR;
CH452_SDA_D_OUT; /* 設置SDA為輸出方向 */
DELAY_1US;
CH452_SCL_SET;
DELAY_1US;
CH452_SDA_SET; /*發送I2C總線結束信號*/
DELAY_1US;
CH452_SDA_D_IN; /* 設置SDA為輸入方向 */
DELAY_1US;
ENABLE_KEY_INTERRUPT;
}
void CH452_I2c_WrByte(unsigned char dat) //寫一個字節數據
{
unsigned char i;
CH452_SDA_D_OUT; /* 設置SDA為輸出方向 */
for(i=0;i!=8;i++) // 輸出8位數據
{
if(dat&0x80) {CH452_SDA_SET;}
else {CH452_SDA_CLR;}
DELAY_1US;
CH452_SCL_SET;
dat<<=1;
DELAY_1US;
DELAY_1US;
CH452_SCL_CLR;
DELAY_1US;
}
CH452_SDA_D_IN; /* 設置SDA為輸入方向 */
CH452_SDA_SET;
DELAY_1US;
CH452_SCL_SET; // 接收應答
DELAY_1US;
DELAY_1US;
CH452_SCL_CLR;
DELAY_1US;
}
unsigned char CH452_I2c_RdByte(void) //讀一個字節數據
{
unsigned char dat,i;
CH452_SDA_SET;
CH452_SDA_D_IN; /* 設置SDA為輸入方向 */
dat=0;
for(i=0;i!=8;i++) // 輸入8位數據
{
CH452_SCL_SET;
DELAY_1US;
DELAY_1US;
dat<<=1;
if(CH452_SDA_IN) dat++; // 輸入1位
CH452_SCL_CLR;
DELAY_1US;
// DELAY_1US;
}
CH452_SDA_SET;
DELAY_1US;
CH452_SCL_SET; // 發出無效應答
DELAY_1US;
DELAY_1US;
CH452_SCL_CLR;
DELAY_1US;
return(dat);
}
void CH452_Write(unsigned short cmd) //寫命令
{
CH452_I2c_Start(); /*啟動總線*/
#ifdef ENABLE_2_CH452 // 若有兩個CH452并連
CH452_I2c_WrByte((unsigned char)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR0); // CH452的ADDR=0時
#else
CH452_I2c_WrByte((unsigned char)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1); // CH452的ADDR=1時(默認)
#endif
CH452_I2c_WrByte((unsigned char)cmd); /*發送數據*/
CH452_I2c_Stop(); /*結束總線*/
}
unsigned char CH452_Read(void) //讀取按鍵
{
unsigned char keycode;
CH452_I2c_Start(); /*啟動總線*/
CH452_I2c_WrByte((unsigned char)(CH452_GET_KEY>>7)&CH452_I2C_MASK|0x01|CH452_I2C_ADDR1); // 若有兩個CH452并連,當ADDR=0時,需修改為CH452_I2C_ADDR0
keycode=CH452_I2c_RdByte(); /*讀取數據*/
CH452_I2c_Stop(); /*結束總線*/
return(keycode);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -