溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

arm9 adc及觸摸屏怎么使用

發(fā)布時間:2021-12-20 10:47:22 來源:億速云 閱讀:144 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹“arm9 adc及觸摸屏怎么使用”,在日常操作中,相信很多人在arm9 adc及觸摸屏怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”arm9 adc及觸摸屏怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

2440 adc和觸摸屏接口框圖:

arm9 adc及觸摸屏怎么使用

adc共有一個轉(zhuǎn)換器, 8個通道. 其中 AIN[3:0] 只能作為普通的ad輸入通道, 而 AIN[4]/YM , AIN[5]/YP, AIN[6]/XM, AIN[7]/XP既可以作為普通的ad通道也可以當(dāng)做觸摸屏接口

一  普通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轉(zhuǎn)換值
 * 輸入?yún)?shù):
 *     ch: 模擬信號通道,取值為0~7     */
static int ReadAdc(int ch)
{
    ADCCON = PRESCALE_EN | PRSCVL(49) | ADC_INPUT(ch);// 選擇模擬通道,使能預(yù)分頻功能,設(shè)置A/D轉(zhuǎn)換器的時鐘 = PCLK/(49+1)

    ADCTSC &= ~(1<<2);                   // 清除位[2],設(shè)為普通轉(zhuǎn)換模式

    ADCCON |= ADC_START;                 // 設(shè)置位[0]為1,啟動A/D轉(zhuǎn)換

    while (ADCCON & ADC_START);          // 當(dāng)A/D轉(zhuǎn)換真正開始時,位[0]會自動清0

    while (!(ADCCON & ADC_ENDCVT));      // 檢測位[15],當(dāng)它為1時表示轉(zhuǎn)換結(jié)束

    return (ADCDAT0 & 0x3ff);            // 讀取數(shù)據(jù)    ADCDAT0存放普通adc結(jié)果 或x坐標(biāo), ADCDAT1存放y坐標(biāo)
}

二 觸摸屏接口(中斷法)

arm9 adc及觸摸屏怎么使用

// 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

/* 設(shè)置進(jìn)入等待中斷模式,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中斷
 */
/* 進(jìn)入"等待中斷模式",等待觸摸屏被按下 */
#define wait_down_int() { ADCTSC = DOWN_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ | YP_AIN | YM_GND | \
							XP_PST(WAIT_INT_MODE); }

/* 進(jìn)入"等待中斷模式",等待觸摸屏被松開 */
#define wait_up_int()   { ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ | YP_AIN | YM_GND | \
							XP_PST(WAIT_INT_MODE); }

/* 進(jìn)入自動(連續(xù)) X/Y軸坐標(biāo)轉(zhuǎn)換模式 */
#define mode_auto_xy()  { ADCTSC = CONVERT_AUTO | XP_PULL_UP_DIS | XP_PST(NOP_MODE); }

extern void (*isr_handle_array[50])(void);

/*
 * 使用查詢方式讀取A/D轉(zhuǎn)換值
 * 輸入?yún)?shù):
 *     ch: 模擬信號通道,取值為0~7
 */
static int ReadAdc(int ch)
{
    // 選擇模擬通道,使能預(yù)分頻功能,設(shè)置A/D轉(zhuǎn)換器的時鐘 = PCLK/(49+1)
    ADCCON = PRESCALE_EN | PRSCVL(49) | ADC_INPUT(ch);

    // 清除位[2],設(shè)為普通轉(zhuǎn)換模式
    ADCTSC &= ~(1<<2);

    // 設(shè)置位[0]為1,啟動A/D轉(zhuǎn)換
    ADCCON |= ADC_START;

    // 當(dāng)A/D轉(zhuǎn)換真正開始時,位[0]會自動清0
    while (ADCCON & ADC_START);

    // 檢測位[15],當(dāng)它為1時表示轉(zhuǎn)換結(jié)束
    while (!(ADCCON & ADC_ENDCVT));

    // 讀取數(shù)據(jù)    ADCDAT0存放普通adc結(jié)果或x坐標(biāo), ADCDAT1存放y坐標(biāo)
    return (ADCDAT0 & 0x3ff);
}

/*
 * INT_TC的中斷服務(wù)程序
 * 當(dāng)觸摸屏被按下時,進(jìn)入自動(連續(xù)) X/Y軸坐標(biāo)轉(zhuǎn)換模式;
 * 當(dāng)觸摸屏被松開時,進(jìn)入等待中斷模式,再次等待INT_TC中斷
 */
static void Isr_Tc(void)
{
    if (ADCDAT0 & 0x8000)
    {
        printf("Stylus Up!!\n\r");
        wait_down_int();    /* 進(jìn)入"等待中斷模式",等待觸摸屏被按下 */
    }
    else
    {
        printf("Stylus Down: ");

        mode_auto_xy();     /* 進(jìn)入自動(連續(xù)) X/Y軸坐標(biāo)轉(zhuǎn)換模式 */

        /* 設(shè)置位[0]為1,啟動A/D轉(zhuǎn)換
         * 注意:ADCDLY為50000,PCLK = 50MHz,
         *       要經(jīng)過(1/50MHz)*50000=1ms之后才開始轉(zhuǎn)換X坐標(biāo)
         *       再經(jīng)過1ms之后才開始轉(zhuǎn)換Y坐標(biāo)
         */
        ADCCON |= ADC_START;
    }

    // 清INT_TC中斷
    SUBSRCPND |= BIT_SUB_TC;
    SRCPND    |= BIT_ADC;
    INTPND    |= BIT_ADC;
}


/*
 * INT_ADC的中斷服務(wù)程序
 * A/D轉(zhuǎn)換結(jié)束時發(fā)生此中斷
 * 先讀取X、Y坐標(biāo)值,再進(jìn)入等待中斷模式
 */
static void Isr_Adc(void)
{
    // 打印X、Y坐標(biāo)值
    printf("xdata = %4d, ydata = %4d\r\n", (int)(ADCDAT0 & 0x3ff), (int)(ADCDAT1 & 0x3ff));

    /* 判斷是S3C2410還是S3C2440 */
    if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
    {   // S3C2410
        wait_down_int();    /* 進(jìn)入"等待中斷模式",等待觸摸屏被松開 */
    }
    else
    {   // S3C2440
        wait_up_int();      /* 進(jìn)入"等待中斷模式",等待觸摸屏被松開 */
    }

    // 清INT_ADC中斷
    SUBSRCPND |= BIT_SUB_ADC;
    SRCPND    |= BIT_ADC;
    INTPND    |= BIT_ADC;
}

/*
 * ADC、觸摸屏的中斷服務(wù)程序
 * 對于INT_TC、INT_ADC中斷,分別調(diào)用它們的處理程序
 */
void AdcTsIntHandle(void)
{
    if (SUBSRCPND & BIT_SUB_TC)
        Isr_Tc();

    if (SUBSRCPND & BIT_SUB_ADC)
        Isr_Adc();
}

/*
 * 測試觸摸屏,打印觸點坐標(biāo)
 */
void Test_Ts(void)
{
    isr_handle_array[ISR_ADC_OFT] = AdcTsIntHandle;    // 設(shè)置ADC中斷服務(wù)程序
    INTMSK &= ~BIT_ADC;          // 開啟ADC總中斷
    INTSUBMSK &= ~(BIT_SUB_TC);  // 開啟INT_TC中斷,即觸摸屏被按下或松開時產(chǎn)生中斷
    INTSUBMSK &= ~(BIT_SUB_ADC); // 開啟INT_ADC中斷,即A/D轉(zhuǎn)換結(jié)束時產(chǎn)生中斷

    // 使能預(yù)分頻功能,設(shè)置A/D轉(zhuǎn)換器的時鐘 = PCLK/(49+1)
    ADCCON = PRESCALE_EN | PRSCVL(49);

    /* 采樣延時時間 = (1/3.6864M)*50000 = 13.56ms
     * 即按下觸摸屏后,再過13.56ms才采樣
     */
    ADCDLY = 50000;

    wait_down_int();    /* 進(jìn)入"等待中斷模式",等待觸摸屏被按下 */

    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;
}

到此,關(guān)于“arm9 adc及觸摸屏怎么使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI