📄 ch452w2.lst
字号:
C51 COMPILER V7.01 CH452W2 05/26/2009 13:59:49 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE CH452W2
OBJECT MODULE PLACED IN CH452W2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CH452W2.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /* ***************************
2 Website: http://wch.cn
3 Email: tech@wch.cn
4 Author: W.ch 2005.4
5 CH452的真正2线接口
6 ****************************
7 CH452的真正2线接口,含低电平脉冲按键中断在内,只需要2个I/O引脚,兼容I2C/IIC时序
8 两线制方式SCL/SDA,按键中断由SDA产生,接单片机的脉冲/边沿中断引脚
9 对于频率低于24MHz的MCS51,为了节约传输时间,可以适当减少SCL/SDA之间的延时
10 *************************************************************************** */
11 #include "PIN.H" // 修改该文件以适应硬件环境/单片机型号等
12 #include "CH452CMD.H" // CH452常量定义
13 void CH452_I2c_Start_2(void) // 操作起始,两线制方式,SDA用做中断输出,使用以下两个函数
14 {
15 1 CH452_SDA_SET;
16 1 CH452_SDA_D_IN; /* 设置SDA为输入方向 */
17 1 CH452_SCL_CLR; //通知CH452,将要对其操作,此段时间不要再产生按键中断
18 1 CH452_SCL_D_OUT; /* 设置SCL为输出方向 */
19 1 do {
20 2 DELAY_1US; // 保留足够的时间给CH452产生中断
21 2 DELAY_1US;
22 2 } while ( CH452_SDA_IN == 0 ); // CH452正在请求中断?
23 1 DELAY_1US;
24 1 DISABLE_KEY_INTERRUPT; //禁止键盘中断,防止开始时被CH452中断而进入中断服务程序中的START
25 1 CH452_SDA_SET; /*发送起始条件的数据信号*/
26 1 CH452_SDA_D_OUT; /* 设置SDA为输出方向 */
27 1 CH452_SCL_SET;
28 1 DELAY_1US;
29 1 CH452_SDA_CLR; /*发送起始信号*/
30 1 DELAY_1US;
31 1 CH452_SCL_CLR; /*钳住I2C总线,准备发送或接收数据 */
32 1 DELAY_1US;
33 1 }
34
35 void CH452_I2c_Stop_2(void) // 操作结束
36 {
37 1 CH452_SDA_CLR;
38 1 CH452_SDA_D_OUT; /* 设置SDA为输出方向 */
39 1 DELAY_1US;
40 1 CH452_SCL_SET;
41 1 DELAY_1US;
42 1 CH452_SDA_SET; /*发送I2C总线结束信号*/
43 1 DELAY_1US;
44 1 CH452_SDA_D_IN; /* 设置SDA为输入方向 */
45 1 DELAY_1US;
46 1 CLEAR_KEY_INTER_FLAG; // 清除中断标志,因为通过SDA输出数据所以会误中断
47 1 ENABLE_KEY_INTERRUPT;
48 1 }
49
50 void CH452_I2c_WrByte(unsigned char dat) //写一个字节数据
51 {
52 1 unsigned char i;
53 1 CH452_SDA_D_OUT; /* 设置SDA为输出方向 */
54 1 for(i=0;i!=8;i++) // 输出8位数据
55 1 {
C51 COMPILER V7.01 CH452W2 05/26/2009 13:59:49 PAGE 2
56 2 if(dat&0x80) {CH452_SDA_SET;}
57 2 else {CH452_SDA_CLR;}
58 2 DELAY_1US;
59 2 CH452_SCL_SET;
60 2 dat<<=1;
61 2 DELAY_1US;
62 2 DELAY_1US;
63 2 CH452_SCL_CLR;
64 2 DELAY_1US;
65 2 }
66 1 CH452_SDA_D_IN; /* 设置SDA为输入方向 */
67 1 CH452_SDA_SET;
68 1 DELAY_1US;
69 1 CH452_SCL_SET; // 接收应答
70 1 DELAY_1US;
71 1 DELAY_1US;
72 1 CH452_SCL_CLR;
73 1 DELAY_1US;
74 1 }
75
76 unsigned char CH452_I2c_RdByte(void) //读一个字节数据
77 {
78 1 unsigned char dat,i;
79 1 CH452_SDA_SET;
80 1 CH452_SDA_D_IN; /* 设置SDA为输入方向 */
81 1 dat=0;
82 1 for(i=0;i!=8;i++) // 输入8位数据
83 1 {
84 2 CH452_SCL_SET;
85 2 DELAY_1US;
86 2 DELAY_1US;
87 2 dat<<=1;
88 2 if(CH452_SDA_IN) dat++; // 输入1位
89 2 CH452_SCL_CLR;
90 2 DELAY_1US;
91 2 // DELAY_1US;
92 2 }
93 1 CH452_SDA_SET;
94 1 DELAY_1US;
95 1 CH452_SCL_SET; // 发出无效应答
96 1 DELAY_1US;
97 1 DELAY_1US;
98 1 CH452_SCL_CLR;
99 1 DELAY_1US;
100 1 return(dat);
101 1 }
102
103 void CH452_Write(unsigned short cmd) //写命令
104 {
105 1 CH452_I2c_Start_2(); /*启动总线*/
106 1 #ifdef ENABLE_2_CH452 // 若有两个CH452并连
CH452_I2c_WrByte((unsigned char)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1); // CH452的ADDR=0时
#else
109 1 CH452_I2c_WrByte((unsigned char)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR0); // CH452的ADDR=1时(默认)
110 1 #endif
111 1 CH452_I2c_WrByte((unsigned char)cmd); /*发送数据*/
112 1 CH452_I2c_Stop_2(); /*结束总线*/
113 1 }
114
115 unsigned char CH452_Read(void) //读取按键
116 {
117 1 unsigned char keycode;
C51 COMPILER V7.01 CH452W2 05/26/2009 13:59:49 PAGE 3
118 1 CH452_I2c_Start_2(); /*启动总线*/
119 1 #ifdef ENABLE_2_CH452 // 若有两个CH452并连
CH452_I2c_WrByte((unsigned char)(CH452_GET_KEY>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1|0x01); // CH452的AD
-DR=0时
#else
122 1 CH452_I2c_WrByte((unsigned char)(CH452_GET_KEY>>7)&CH452_I2C_MASK|CH452_I2C_ADDR0|0x01); // CH452的AD
-DR=1时(默认)
123 1 #endif
124 1
125 1 keycode=CH452_I2c_RdByte(); /*读取数据*/
126 1 CH452_I2c_Stop_2(); /*结束总线*/
127 1 return(keycode);
128 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 191 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -