/* ***************************
Website: http://wch.cn
Email: tech@wch.cn
Author: W.ch 2005.4
CH452的真正2线接口
****************************
CH452的真正2线接口,含低电平脉冲按键中断在内,只需要2个I/O引脚,兼容I2C/IIC时序
两线制方式SCL/SDA,按键中断由SDA产生,接单片机的脉冲/边沿中断引脚
对于频率低于24MHz的MCS51,为了节约传输时间,可以适当减少SCL/SDA之间的延时
*************************************************************************** */
#include "PIN.H" // 修改该文件以适应硬件环境/单片机型号等
#include "CH452CMD.H" // CH452常量定义
void CH452_I2c_Start_2(void) // 操作起始,两线制方式,SDA用做中断输出,使用以下两个函数
{
CH452_SDA_SET;
CH452_SDA_D_IN; /* 设置SDA为输入方向 */
CH452_SCL_CLR; //通知CH452,将要对其操作,此段时间不要再产生按键中断
CH452_SCL_D_OUT; /* 设置SCL为输出方向 */
do {
DELAY_1US; // 保留足够的时间给CH452产生中断
DELAY_1US;
} while ( CH452_SDA_IN == 0 ); // CH452正在请求中断?
DELAY_1US;
DISABLE_KEY_INTERRUPT; //禁止键盘中断,防止开始时被CH452中断而进入中断服务程序中的START
CH452_SDA_SET; /*发送起始条件的数据信号*/
CH452_SDA_D_OUT; /* 设置SDA为输出方向 */
CH452_SCL_SET;
DELAY_1US;
CH452_SDA_CLR; /*发送起始信号*/
DELAY_1US;
CH452_SCL_CLR; /*钳住I2C总线,准备发送或接收数据 */
DELAY_1US;
}
void CH452_I2c_Stop_2(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;
CLEAR_KEY_INTER_FLAG; // 清除中断标志,因为通过SDA输出数据所以会误中断
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_2(); /*启动总线*/
#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_2(); /*结束总线*/
}
unsigned char CH452_Read(void) //读取按键
{
unsigned char keycode;
CH452_I2c_Start_2(); /*启动总线*/
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_2(); /*结束总线*/
return(keycode);
}
![avatar](https://profile-avatar.csdnimg.cn/2f1b4985908b4734af9286f8e0222b09_mudh118.jpg!1)
![avatar-vip](https://csdnimg.cn/release/downloadcmsfe/public/img/user-vip.1c89f3c5.png)
DLR-SOFT
- 粉丝: 80
- 资源: 48
最新资源
- 制造业实战:如何用DeepSeek优化供应链预测(附设备维护案例).pdf
- 制造业实战:基于DeepSeek的智能质检模型私有化部署与产线数据训练指南.pdf
- 制造业极简指南:DeepSeek+传感器数据实现设备故障预警.pdf
- 证券行业:DeepSeek研报情绪分析模型的Prompt优化秘籍.pdf
- 制造业实战:DeepSeek智能质检模型部署与产线数据训练避坑手册.pdf
- 制造业私有化部署实战:DeepSeek低成本训练产线数据,实现智能质检方案落地.pdf
- 制造业效率革命:DeepSeek+工业数据分析实现故障预警90%准确率.pdf
- 制造业数字化转型:基于DeepSeek的自动化质检系统搭建全解析.pdf
- 制造业效率革命:基于DeepSeek-7B的工业质检模型训练指南(RTX3090显卡部署实录).pdf
- 制造业预测性维护:DeepSeek时序数据分析模型训练全流程.pdf
- 制造业预测性维护:DeepSeek时序数据分析实战,从传感器数据到设备寿命预测模型全链路解析.pdf
- 制造业知识库:用RAG技术构建设备维护问答系统.pdf
- 制造业知识库升级:三一重工工程师分享设备维修QA系统训练数据集构建.pdf
- 制造业知识图谱:DeepSeek在设备维修知识库中的迁移学习实践.pdf
- 制造业质量检测优化:DeepSeek视觉模型在缺陷识别中的迁移学习.pdf
- 制造业质量追溯:DeepSeek与PLC数据对接的异常检测模型构建.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)