📄 touchpad.lst
字号:
C51 COMPILER V7.10 TOUCHPAD 04/14/2009 23:28:41 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE TOUCHPAD
OBJECT MODULE PLACED IN .\TouchPad.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\SourceFile\TouchPad.c BROWSE DEBUG OBJECTEXTEND PRINT(.\TouchPad.lst) OB
-JECT(.\TouchPad.obj)
line level source
1
2
3 /***************************************************************************************
4 ****************************************************************************************
5 * FILE : TouchPad.c
6 * Description :
7 *
8 * Copyright (c) 2003~2008 by 创易电子(Design Easy). All Rights Reserved.
9 *
10 * History:
11 * Version Name Date Description
12 1.0 Wang Shaowei 2008/12/17 Initial Version (For DesignEasy LCM MCU board)
13 1.1 Liu Ying 2008/12/22 Comments
14 1.2 Wang Shaowei 2009/03/06 240x320 LCM
15
16 ****************************************************************************************
17 ****************************************************************************************/
18
19
20 #include "touchpad.h"
21
22
23 /*************************************************************************/
24 //以下部分非常重要,需要根据各自系统硬件连接配置
25 //请相应调整
26
27 sbit TP_nCS = P1^2;
28 sbit TP_DCLK = P1^3;
29 sbit TP_DIN = P1^4;
30 sbit TP_nBUSY = P1^5;
31 sbit TP_DOUT = P1^6;
32
33
34
35 /*************************************************************************/
36 //该部分宏,参看触摸屏控制电路芯片文档中命令时序格式的介绍
37
38 #define TOUCH_PANEL_START_BIT 0x80
39
40 #define TOUCH_PANEL_TEMP0 0x00
41 #define TOUCH_PANEL_X_PLUS 0x10
42 #define TOUCH_PANEL_VBAT 0x20
43 #define TOUCH_PANEL_Z1_POS 0x30
44 #define TOUCH_PANEL_Z2_POS 0x40
45 #define TOUCH_PANEL_Y_PLUS 0x50
46 #define TOUCH_PANEL_TEMP1 0x70
47
48 #define TOUCH_PANEL_ADC3 0x20
49 #define TOUCH_PANEL_ADC4 0x60
50
51 #define TOUCH_PANEL_12BIT_SAMPLE 0x0
52 #define TOUCH_PANEL_8BIT_SAMPLE 0x8
53
54 #define TOUCH_PANEL_DIFF_MODE 0x0
C51 COMPILER V7.10 TOUCHPAD 04/14/2009 23:28:41 PAGE 2
55 #define TOUCH_PANEL_SINGLE_MODE 0x4
56
57 #define TOUCH_PANEL_PWD_ENBLE 0x0
58 #define TOUCH_PANEL_IRQ_DISABLE 0x1
59 #define TOUCH_PANEL_PWD_DISABLE 0x3
60 #define TOUCH_PANEL_PWD_RESET 0x2
61
62
63
64 /*
65 考虑到非校准情况下的触摸屏,通常都是写字、画画等连续的,
66 在我们的系统中,对于触摸功能是这样处理的:
67 首次触摸是由中断检测得到,之后响应中断进行处理;
68 处理完后开启一个5ms定时器,
69 定时器到时处理时主动读取触摸坐标,
70 若是有效坐标则处理,处理完后同样开启一个5ms定时器
71 若是无效坐标则表示没有触摸,此时再清除中断标记、
72 重新打开中断响应,等待下一次触摸中断
73 注意不要太早打开中断,一则因为系统中断不宜太频繁,二者避免误触发
74
75 bTP_INT用于标记该次处理是否由中断触发,
76 true: 是中断触发,
77 false: 是定时器主动读取
78 */
79 bool bTP_INT = FALSE;
80
81 /*
82 bTP_Cali用于标记是否处于校准界面,
83 true: 处于校准界面
84 false: 非校准界面
85 */
86 bool bTP_Cali = FALSE;
87
88 /*
89 最近一次得到的触摸坐标,
90 包括中断响应中或者定时器中得到的两种情况,
91 都记录在这里
92 */
93 U16 TP_X = 0, TP_Y = 0;
94
95 typedef struct
96 {
97 U16 X;
98 U16 Y;
99 }TP_POS;
100
101 /*记录在两次校准中得到的触摸坐标*/
102 TP_POS TPposA, TPposB;
103
104
105 typedef struct
106 {
107 S16 K;
108 S16 A;
109 }TP_ARG;
110
111 /*坐标转化参数,从触摸获得的数值到LCD的坐标之间需要进行映射转换*/
112 TP_ARG TPargX, TPargY;
113
114
115 /*
116 校准算法说明:
C51 COMPILER V7.10 TOUCHPAD 04/14/2009 23:28:41 PAGE 3
117 Xt = Kx * Xl + Ax
118 Yt = Ky * Yl + Ay
119
120 Xt: TP ADC 触摸获得的坐标
121 Kx: X arg
122 Xl: LCD pos lcd的坐标
123 Ax: X offset
124
125 Yt: TP ADC 触摸获得的坐标
126 Ky: Y arg
127 Yl: LCD pos lcd的坐标
128 Ay: Y offset
129
130 lcd和触摸屏的坐标之间的转换就是上面这两个公式,
131 用于校准,(从两组Xl Yl Xt Yt求出Kx Ky Ax Ay)
132 也用于转化得到lcd的坐标(从Xt Yt Kx Ky Ax Ay求出Xl Yl )
133 */
134
135
136
137 /*
138 关于TP_nCS何时置1何时置0的说明:
139 因为对触摸屏控制电路的控制,都是先写命令、然后读数据的,
140 所以下面的serial_write_data、serial_read_data总是成对出现,
141 我们总是在serial_write_data开始时将TP_nCS置0,
142 在serial_read_data结束时将TP_nCS置1,
143 这部分请看触摸控制电路芯片时序图
144 */
145
146 /*==================================================================
147 * Function : serial_write_bit_high
148 * Description : 写bit1,TP_nCS 之前已经拉低
149 * Input Para : void
150 * Output Para : void
151 * Return Value: void
152 ==================================================================*/
153 void serial_write_bit_high(void)
154 {
155 1
156 1 TP_DIN = 1;
157 1
158 1 TP_DCLK = 0;
159 1 TP_DCLK = 1;
160 1 TP_DCLK = 0;
161 1 }
162
163 /*==================================================================
164 * Function : serial_write_bit_low
165 * Description : 写bit0,TP_nCS 之前已经拉低
166 * Input Para : void
167 * Output Para : void
168 * Return Value: void
169 ==================================================================*/
170 void serial_write_bit_low(void)
171 {
172 1 TP_DIN = 0;
173 1
174 1 TP_DCLK = 0;
175 1 TP_DCLK = 1;
176 1 TP_DCLK = 0;
177 1 }
178
C51 COMPILER V7.10 TOUCHPAD 04/14/2009 23:28:41 PAGE 4
179 /*==================================================================
180 * Function : serial_write_bit_low
181 * Description : 写8bit字节,开始将TP_nCS置0
182 * Input Para : U8 SendData
183 * Output Para : void
184 * Return Value: void
185 ==================================================================*/
186 void serial_write_data(U8 SendData)
187 {
188 1 S8 i;
189 1
190 1 TP_DCLK = 0;
191 1 TP_nCS = 0;
192 1
193 1 for (i=7; i>=0; i--)
194 1 { /* data bit 7~0 */
195 2 if (SendData & (1<<i))
196 2 {
197 3 serial_write_bit_high();
198 3 }
199 2 else
200 2 {
201 3 serial_write_bit_low();
202 3 }
203 2 }
204 1
205 1 TP_DIN = 0;
206 1
207 1 }
208
209 /*==================================================================
210 * Function : serial_read_data
211 * Description : 读12bit数据,TP_nCS 之前已经置零,结束时需将TP_nCS置1
212 * Input Para : void
213 * Output Para : void
214 * Return Value: U16 读到的数据,只有12bit有效
215 ==================================================================*/
216 U16 serial_read_data(void)
217 {
218 1 S8 i;
219 1 U16 RcvData=0;
220 1 U32 retry=0;
221 1
222 1 TP_DCLK = 0;
223 1 TP_DCLK = 1;
224 1
225 1 /*等待一段时间*/
226 1 while(TP_nBUSY)
227 1 {
228 2
229 2 TP_DCLK = 0;
230 2 TP_DCLK = 1;
231 2 retry++;
232 2 if(retry>100000)
233 2 {
234 3 return 0;
235 3 }
236 2 };
237 1
238 1 for(i=11; i>=0; i--)
239 1 {
240 2 TP_DCLK = 1;
C51 COMPILER V7.10 TOUCHPAD 04/14/2009 23:28:41 PAGE 5
241 2 if(TP_DOUT)
242 2 {
243 3 RcvData |= (1<<i);
244 3 }
245 2 TP_DCLK = 0;
246 2 }
247 1 TP_nCS = 1;
248 1 return(RcvData);
249 1 }
250
251
252 /*==================================================================
253 * Function : tp_init
254 * Description : 初始化tp
255 * Input Para : void
256 * Output Para : void
257 * Return Value: void
258 ==================================================================*/
259 /*
260 AX=0B 86 AY=0A FE BX=04 9E BY=04 44
261 XK=00 14 XA=01 2E YK=00 0F YA=01 0B
262 */
263 void tp_init(void)
264 {
265 1 U8 cmd = 0;
266 1
267 1 /*在校准之前也可以使用触摸屏,用这一组默认参数。
268 1 校准之后用校准得到的参数*/
269 1 TPargX.K = 0xF;
270 1 TPargX.A = 0x9A;
271 1
272 1 TPargY.K = 0x0B;
273 1 TPargY.A = 0x90;
274 1
275 1 /*送初始化命令*/
276 1 cmd=TOUCH_PANEL_START_BIT|TOUCH_PANEL_Y_PLUS|TOUCH_PANEL_12BIT_SAMPLE| TOUCH_PANEL_DIFF_MODE;
277 1 serial_write_data(cmd);
278 1 serial_read_data();
279 1
280 1 }
281
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -