arm9 adc及触摸屏怎么使用
发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇文章主要介绍"arm9 adc及触摸屏怎么使用",在日常操作中,相信很多人在arm9 adc及触摸屏怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"arm9
千家信息网最后更新 2025年01月24日arm9 adc及触摸屏怎么使用
这篇文章主要介绍"arm9 adc及触摸屏怎么使用",在日常操作中,相信很多人在arm9 adc及触摸屏怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"arm9 adc及触摸屏怎么使用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
2440 adc和触摸屏接口框图:
adc共有一个转换器, 8个通道. 其中 AIN[3:0] 只能作为普通的ad输入通道, 而 AIN[4]/YM , AIN[5]/YP, AIN[6]/XM, AIN[7]/XP既可以作为普通的ad通道也可以当做触摸屏接口
一 普通ADC功能(查询法)
#define PRESCALE_EN (1 << 14)#define PRSCVL(x) ((x) << 6)#define ADC_INPUT(x) ((x) << 3)#define ADC_START (1 << 0)#define ADC_ENDCVT (1 << 15)/* 使用查询方式读取A/D转换值 * 输入参数: * ch: 模拟信号通道,取值为0~7 */static int ReadAdc(int ch){ ADCCON = PRESCALE_EN | PRSCVL(49) | ADC_INPUT(ch);// 选择模拟通道,使能预分频功能,设置A/D转换器的时钟 = PCLK/(49+1) ADCTSC &= ~(1<<2); // 清除位[2],设为普通转换模式 ADCCON |= ADC_START; // 设置位[0]为1,启动A/D转换 while (ADCCON & ADC_START); // 当A/D转换真正开始时,位[0]会自动清0 while (!(ADCCON & ADC_ENDCVT)); // 检测位[15],当它为1时表示转换结束 return (ADCDAT0 & 0x3ff); // 读取数据 ADCDAT0存放普通adc结果 或x坐标, ADCDAT1存放y坐标}
二 触摸屏接口(中断法)
// ADCTSC寄存器#define UD_SEN (1 << 8)#define DOWN_INT (UD_SEN*0)#define UP_INT (UD_SEN*1)#define YM_SEN (1 << 7)#define YM_HIZ (YM_SEN*0)#define YM_GND (YM_SEN*1)#define YP_SEN (1 << 6)#define YP_EXTVLT (YP_SEN*0)#define YP_AIN (YP_SEN*1)#define XM_SEN (1 << 5)#define XM_HIZ (XM_SEN*0)#define XM_GND (XM_SEN*1)#define XP_SEN (1 << 4)#define XP_EXTVLT (XP_SEN*0)#define XP_AIN (XP_SEN*1)#define XP_PULL_UP (1 << 3)#define XP_PULL_UP_EN (XP_PULL_UP*0)#define XP_PULL_UP_DIS (XP_PULL_UP*1)#define AUTO_PST (1 << 2)#define CONVERT_MAN (AUTO_PST*0)#define CONVERT_AUTO (AUTO_PST*1)#define XP_PST(x) (x << 0)#define NOP_MODE 0#define X_AXIS_MODE 1#define Y_AXIS_MODE 2#define WAIT_INT_MODE 3/* 设置进入等待中断模式,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En * (1)对于S3C2410,位[8]只能为0,所以只能使用下面的wait_down_int, * 它既等待Pen Down中断,也等待Pen Up中断 * (2)对于S3C2440,位[8]为0、1时分别表示等待Pen Down中断或Pen Up中断 *//* 进入"等待中断模式",等待触摸屏被按下 */#define wait_down_int() { ADCTSC = DOWN_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ | YP_AIN | YM_GND | \ XP_PST(WAIT_INT_MODE); }/* 进入"等待中断模式",等待触摸屏被松开 */#define wait_up_int() { ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ | YP_AIN | YM_GND | \ XP_PST(WAIT_INT_MODE); }/* 进入自动(连续) X/Y轴坐标转换模式 */#define mode_auto_xy() { ADCTSC = CONVERT_AUTO | XP_PULL_UP_DIS | XP_PST(NOP_MODE); }extern void (*isr_handle_array[50])(void);/* * 使用查询方式读取A/D转换值 * 输入参数: * ch: 模拟信号通道,取值为0~7 */static int ReadAdc(int ch){ // 选择模拟通道,使能预分频功能,设置A/D转换器的时钟 = PCLK/(49+1) ADCCON = PRESCALE_EN | PRSCVL(49) | ADC_INPUT(ch); // 清除位[2],设为普通转换模式 ADCTSC &= ~(1<<2); // 设置位[0]为1,启动A/D转换 ADCCON |= ADC_START; // 当A/D转换真正开始时,位[0]会自动清0 while (ADCCON & ADC_START); // 检测位[15],当它为1时表示转换结束 while (!(ADCCON & ADC_ENDCVT)); // 读取数据 ADCDAT0存放普通adc结果或x坐标, ADCDAT1存放y坐标 return (ADCDAT0 & 0x3ff);}/* * INT_TC的中断服务程序 * 当触摸屏被按下时,进入自动(连续) X/Y轴坐标转换模式; * 当触摸屏被松开时,进入等待中断模式,再次等待INT_TC中断 */static void Isr_Tc(void){ if (ADCDAT0 & 0x8000) { printf("Stylus Up!!\n\r"); wait_down_int(); /* 进入"等待中断模式",等待触摸屏被按下 */ } else { printf("Stylus Down: "); mode_auto_xy(); /* 进入自动(连续) X/Y轴坐标转换模式 */ /* 设置位[0]为1,启动A/D转换 * 注意:ADCDLY为50000,PCLK = 50MHz, * 要经过(1/50MHz)*50000=1ms之后才开始转换X坐标 * 再经过1ms之后才开始转换Y坐标 */ ADCCON |= ADC_START; } // 清INT_TC中断 SUBSRCPND |= BIT_SUB_TC; SRCPND |= BIT_ADC; INTPND |= BIT_ADC;}/* * INT_ADC的中断服务程序 * A/D转换结束时发生此中断 * 先读取X、Y坐标值,再进入等待中断模式 */static void Isr_Adc(void){ // 打印X、Y坐标值 printf("xdata = %4d, ydata = %4d\r\n", (int)(ADCDAT0 & 0x3ff), (int)(ADCDAT1 & 0x3ff)); /* 判断是S3C2410还是S3C2440 */ if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002)) { // S3C2410 wait_down_int(); /* 进入"等待中断模式",等待触摸屏被松开 */ } else { // S3C2440 wait_up_int(); /* 进入"等待中断模式",等待触摸屏被松开 */ } // 清INT_ADC中断 SUBSRCPND |= BIT_SUB_ADC; SRCPND |= BIT_ADC; INTPND |= BIT_ADC;}/* * ADC、触摸屏的中断服务程序 * 对于INT_TC、INT_ADC中断,分别调用它们的处理程序 */void AdcTsIntHandle(void){ if (SUBSRCPND & BIT_SUB_TC) Isr_Tc(); if (SUBSRCPND & BIT_SUB_ADC) Isr_Adc();}/* * 测试触摸屏,打印触点坐标 */void Test_Ts(void){ isr_handle_array[ISR_ADC_OFT] = AdcTsIntHandle; // 设置ADC中断服务程序 INTMSK &= ~BIT_ADC; // 开启ADC总中断 INTSUBMSK &= ~(BIT_SUB_TC); // 开启INT_TC中断,即触摸屏被按下或松开时产生中断 INTSUBMSK &= ~(BIT_SUB_ADC); // 开启INT_ADC中断,即A/D转换结束时产生中断 // 使能预分频功能,设置A/D转换器的时钟 = PCLK/(49+1) ADCCON = PRESCALE_EN | PRSCVL(49); /* 采样延时时间 = (1/3.6864M)*50000 = 13.56ms * 即按下触摸屏后,再过13.56ms才采样 */ ADCDLY = 50000; wait_down_int(); /* 进入"等待中断模式",等待触摸屏被按下 */ printf("Touch the screem to test, press any key to exit\n\r"); getc(); // 屏蔽ADC中断 INTSUBMSK |= BIT_SUB_TC; INTSUBMSK |= BIT_SUB_ADC; INTMSK |= BIT_ADC;}
到此,关于"arm9 adc及触摸屏怎么使用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
触摸屏
模式
坐标
普通
通道
程序
功能
转换器
学习
服务
接口
时钟
查询
输入
信号
参数
数据
方式
更多
标值
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库中的隐式转换
泰兴多功能网络技术多少钱
福州讯晟软件开发公司
软件开发费用开票
网络安全法宣传条例
整体厨房设计软件开发
网络安全即安全数据安全
为什么要建立后台数据库
宁夏政务软件开发公司排行榜
绝地求生香港服务器用什么加速器
软件开发公司哪个比较靠谱
服务器授权模式尚未配置
博乐出入库管理软件开发
服务器检查上一次请求时间
关于互联网的科技创新
软件开发如何写公司简介范文
网络安全产品市场推广计划
创建数据库的语法错误
古剑奇谭服务器1和2
网络安全袁航
合肥浦发银行软件开发工程师
杭州搜房软件开发基地招标
软件开发原型模型
博乐出入库管理软件开发
web页如何实时监测数据库变化
提子服务器报价
数据库会自动保存回车吗
柳州bim软件开发工程
湖湘杯网络安全大赛初赛试题
sip服务器开源