ADC触摸屏编程

ADC硬件原理

根据图示,我们可知以后程序需要做的事:

  • 设置8:1MUX,选择要测量哪个引脚(需要看原理图)
  • 设置工作时钟
  • 启动
  • 读状态,判断ADC成功
  • 读数据

在这里插入图片描述

ADC编程

本节中做的事情是:
a. 初始化ADC
b. 读数据
c. 在串口上显示出来

根据芯片手册创建adc.c并添加如下内容:

#include "../s3c2440_soc.h"

void adc_init(void)
{
	/* [15] : ECFLG,  1 = End of A/D conversion
	 * [14] : PRSCEN, 1 = A/D converter prescaler enable
	 * [13:6]: PRSCVL, adc clk = PCLK / (PRSCVL + 1)
	 * [5:3] : SEL_MUX, 000 = AIN 0
	 * [2]   : STDBM
	 * [0]   : 1 = A/D conversion starts and this bit is cleared after the startup.
	 */
	ADCCON = (1<<14) | (49<<6) | (0<<3);

	ADCDLY = 0xff;	
}

int adc_read_ain0(void)
{
	/* 启动ADC */
	ADCCON |= (1<<0);

	while (!(ADCCON & (1<<15)));  /* 等待ADC结束 */

	return ADCDAT0 & 0x3ff;
}

添加ADC测试函数:

#include "adc.h"

void adc_test(void)
{
	int val;
	double vol;
	int m; /* 整数部分 */
	int n; /* 小数部分 */
	
	adc_init();

	while (1)
	{
		val = adc_read_ain0();
		vol = (double)val/1023*3.3;   /* 1023----3.3v */
		m = (int)vol;   /* 3.01, m = 3 */
		vol = vol - m;  /* 小数部分: 0.01 */
		n = vol * 1000;  /* 10 */

		/* 在串口上打印 */
		printf("vol: %d.%03dv\r", m, n);  /* 3.010v */

		/* 在LCD上打印 */
		//fb_print_string();
	}
}

电阻触摸屏硬件原理

LCD与触摸屏是两个设备,是两个完全不相同的东西。

触摸屏是由两层膜组成的,他们靠的非常的近,如下图所示。
在这里插入图片描述
假设我们用手指将两层膜触摸在了一起,那么我们怎么去算出触点的x,y坐标呢?

测量触点X坐标:

  • 让Xp接上3.3V,Xm接地,Yp,Ym不接。
  • 测Yp的电压
  • 即可测试X坐标

测量触点X坐标:

  • 让Yp接上3.3V,Ym接地,Xp,Xm不接。
  • 测Xp的电压
  • 即可测试Y坐标

使用触摸屏的流程:

  • 按下触摸屏,产生触摸屏中断
  • 在触摸屏中断中 启动ADC,目的是获得x,y坐标
  • ADC完成,产生中断
  • 在ADC中断中,读取x,y坐标
  • 启动定时器
  • 定时器中断发生,判断触摸屏是否仍被按下
  • 松开结束一个流程

处理等待中断模式下的等效电路图:
在这里插入图片描述

读取X坐标时的等效电路:
在这里插入图片描述

读取y坐标时的等效电路:
在这里插入图片描述

S3C2440触摸屏接口

触摸屏中断有按下中断和松开中断。
ADC中断和TS中断没有使能,一定会发给中断控制器,由中断控制器判断是否要发给CPU。

ADC中断和TS中断用同一个中断,所以一定会有寄存器去查询是哪一个中断。

罗列出与中断相关的寄存器:

  • SRCPND/INTMOD/INTMSK/INTPND:bit31
  • SUBSRCPND:[10]:ADC,[9]:TouchScreen 可读状态
  • INTSUBMSK可屏蔽中断

具体流程如下图所示:
在这里插入图片描述

那么我们怎么写程序呢?

  • 初始化ADC/TS
  • 设置TS处于等待中断模式
  • 设置中断(INTSUBMSK使能中断、INTMSK使能INT_ADC让它能发给CPU)
  • 按下:进入TS中断,然后进入自动采集模式 启动ADC
  • ADC中断:在里面读数据然后再次进入等待中断模式,等待触摸笔被松开,当然我们还可以启动定时器处理长按。
  • 定时器中断:若松开则结束,若按下则重新启动ADC。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值