您好,登錄后才能下訂單哦!
這篇文章主要介紹“arm9 adc及觸摸屏怎么使用”,在日常操作中,相信很多人在arm9 adc及觸摸屏怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”arm9 adc及觸摸屏怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
2440 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) }
二 觸摸屏接口(中斷法)
// 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>
免責(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)容。