S3C6410裸機(jī)電阻屏驅(qū)動(dòng)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
使用的是RVDS4.0編譯的
大家主要是看看如何配置模式的
我之前一直使用自動(dòng)X,Y采樣,但是讀取的都不準(zhǔn),最后采樣分離的,才可以,需要注意的是使能ADC讀開(kāi)始后需要先讀轉(zhuǎn)換結(jié)果寄存器,但是此時(shí)讀取的是上一次的轉(zhuǎn)換結(jié)果,如果是連續(xù)讀取需要等待轉(zhuǎn)換完成,否則轉(zhuǎn)換結(jié)果不準(zhǔn).
adc.c
/*************************************************************************************************************
*文件名:ADC.c
*功能:S3C6410ADC底層驅(qū)動(dòng)函數(shù)
*作者:cp1300@139.com
*創(chuàng)建時(shí)間:2012年3月12日21:05
*最后修改時(shí)間:2012年3月12日
*詳細(xì):觸摸屏驅(qū)動(dòng)以及相關(guān)ADC驅(qū)動(dòng)
*問(wèn)題:一直以來(lái)存在一個(gè)誤區(qū),一直以為使用了啟動(dòng)開(kāi)始讀操作,每次讀DAT寄存器后就可以讀取到轉(zhuǎn)換后的數(shù)據(jù),最終發(fā)現(xiàn)使用這個(gè)后讀到的是上一次的數(shù)據(jù),
*還是需要等到轉(zhuǎn)換完成,否則連續(xù)轉(zhuǎn)換的時(shí)候數(shù)據(jù)會(huì)非常亂.
*現(xiàn)在使用的是手動(dòng)控制轉(zhuǎn)換開(kāi)始
*************************************************************************************************************/
#include"system.h"
#include"ADC.h"
//ADC的控制寄存器ADCCON
#defineADCCON_RESSEL_12BIT(1<<16)//12bit模式
#defineADCCON_ECFLG(0<<15)//A/D轉(zhuǎn)換結(jié)束標(biāo)志只讀;
#defineADCCON_PRSCEN(1<<14)//A/D轉(zhuǎn)換器預(yù)分頻器使能
#defineADCCON_PRSCVL(32<<6)//預(yù)分頻值,1-255,分頻值+1,至少為PCLK的1/5,此時(shí)PCLK=66MHZ,在2.5MHZ時(shí)鐘下轉(zhuǎn)換最快
#defineADCCON_SEL_MUX(0<<3)//默認(rèn)選擇通道0
#defineADCCON_STDBM(0<<2)//正常模式
#defineADCCON_READ_START(0<<1)//關(guān)閉啟動(dòng)開(kāi)始讀操作
#defineADCCON_ENABLE_START(0<<0)//如果READ_START啟用,這個(gè)值是無(wú)效的。
//ADCDLY
#defineADCDLY_DELAY500//自動(dòng)采樣延時(shí)時(shí)間,
/*************************************************************************************************************************
*函數(shù):voidSetADC_Channel(u8ch)
*功能:設(shè)置ADC輸入通道
*參數(shù):ch:通道號(hào),0-7
*返回:無(wú)
*依賴:底層宏定義
*作者:cp1300@139.com
*時(shí)間:20120513
*最后修改時(shí)間:20120513
*說(shuō)明:ADC輸入通道選擇
*************************************************************************************************************************/
voidSetADC_Channel(u8ch)
{
ADC->CON&=~(7<<3);//清除通道
ADC->CON|=ch&(0x07);//設(shè)置通道號(hào)
}
/*************************************************************************************************************************
*函數(shù):voidADC_Init(void)
*功能:ADC初始始化
*參數(shù):無(wú)
*返回:無(wú)
*依賴:底層宏定義
*作者:cp1300@139.com
*時(shí)間:20120312
*最后修改時(shí)間:20120313
*說(shuō)明:ADC初始始化
*************************************************************************************************************************/
voidADC_Init(void)
{
//ADC的控制寄存器配置;12BIT模式
ADC->CON=ADCCON_RESSEL_12BIT+ADCCON_ECFLG+ADCCON_PRSCEN+ADCCON_PRSCVL+ADCCON_SEL_MUX+ADCCON_STDBM+ADCCON_READ_START+ADCCON_ENABLE_START;
ADC->DLY=ADCDLY_DELAY;//設(shè)置自動(dòng)間隔采樣時(shí)間
}
/*************************************************************************************************************************
*函數(shù):voidADC_SetMode(u8Mode)
*功能:設(shè)置ADC模式
*參數(shù):無(wú)
*返回:無(wú)
*依賴:底層宏定義
*作者:cp1300@139.com
*時(shí)間:20120313
*最后修改時(shí)間:20120313
*說(shuō)明:設(shè)置ADC模式
*************************************************************************************************************************/
voidADC_SetMode(u8Mode)
{
ADC->TSC&=(1<<8);//清除原先設(shè)置
ADC->CON&=~BIT2;//退出待機(jī)模式
XP_UP_DISABLE();//XP上拉禁止
Normal_ADC_Mode();//普通ADC模式
switch(Mode)
{
caseCOMMON_AD_MODER://普通ADC模式
Normal_ADC_Mode();break;
caseASUNDER_X_MODER://分離的X掃描模式
{
ADCTSC_XP_VDD();
ADCTSC_XM_GND();
ADCTSC_YP_HZ();
ADCTSC_YM_HZ();
X_PosMode();
}break;//XP=外部電源,XM=GND,YP=AIN5,YM=高阻
caseASUNDER_Y_MODER://分離的Y掃描模式
{
ADCTSC_X