www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]觸摸屏是通過中斷來實現(xiàn)的。我的程序是在sdram中運行的,要想正確的實現(xiàn)中斷跳轉(zhuǎn),就要使MMU工作,實現(xiàn)物理地址與虛擬地址的映射,把虛擬地址0x00000000映射到物理地址0x30000000(sdram的首地址)。MMU相應(yīng)的函數(shù)在24

觸摸屏是通過中斷來實現(xiàn)的。我的程序是在sdram中運行的,要想正確的實現(xiàn)中斷跳轉(zhuǎn),就要使MMU工作,實現(xiàn)物理地址與虛擬地址的映射,把虛擬地址0x00000000映射到物理地址0x30000000(sdram的首地址)。MMU相應(yīng)的函數(shù)在2440slib.s中。

觸摸屏可分為矢量壓力傳感式、電阻式、電容式、紅外式和表面聲波式等,我用的是最普遍的-四線電阻式。


s3c2440集成了4線制電阻式的觸摸屏接口,觸點坐標的檢測是通過A/D轉(zhuǎn)換來實現(xiàn)的。s3c2440提供8路A/D模擬輸入,其中有4路是與觸摸屏復(fù)用的,s3c2440比s3c2410改進的地方是片內(nèi)部加入了開關(guān)用的MOS管,在設(shè)計電路時,直接將4路觸摸屏引出外加一路基準電壓(3.3v)就可以了。
  s3c2440一共有4種觸摸屏接口模式,其中,自動(連續(xù))XY坐標轉(zhuǎn)換模式和等待中斷模式應(yīng)用地比較常見。在此,為實現(xiàn)觸摸屏的功能,先是設(shè)置為等待中斷模式,在產(chǎn)生中斷后,再設(shè)置為自動(連續(xù))XY坐標轉(zhuǎn)換模式,依次讀取觸點的坐標值。

  還有就是觸摸屏的校準, 校準就是實現(xiàn)觸摸屏上的x、y坐標和LCD的像素坐標對應(yīng)起來。比較常見的校正方法是三點校正法(網(wǎng)上找的),即 LCD上每個點PD的坐標為[XD,YD],觸摸屏上每個點PT的坐標為[XT,YT]。要實現(xiàn)觸摸屏上的坐標轉(zhuǎn)換為LCD上的坐標,需要下列公式進行轉(zhuǎn)換:

XD=A×XT+B×YT+C

YD=D×XT+E×YT+F

其中有ABCDEF六個參數(shù), 分別解ABC和DEF,需要3組數(shù)據(jù),那就需要采集3個校準點:
     XD0=A×XT0+B×YT0+C  YD0=D×XT0+E×YT0+F
XD1=A×XT1+B×YT1+C YD1=D×XT1+E×YT1+F
XD2=A×XT2+B×YT2+CYD2=D×XT2+E×YT2+F
可以用矩陣方面的知識解這三元一次函數(shù)得:
D0=(XT0-XT2)×(YT1-YT2)-(XT1-XT2)×(YT0-YT2);
D1=(XD0-XD2)×(YT1-YT2)-(XD1-XD2)×(YT0-YT2);
D2=(XT0-XT2)×(XD1-XD2)-(XD0-XD2)×(XT1-XT2);
D3=YT0×(XT2×XD1-XT1×XD2)+YT1×(XT0×XD2-XT2×XD0)+YT2×(XT1×XD0-XT0×XD1);
D4=(YD0-XD2)×(YT1-YT2)-(YD1-XD2)×(YT0-YT2);
D5=(XT0-XT2)×(YD1-YD2)-(YD0-YD2)×(XT1-XT2);
D6=YT0×(XT2×YD1-XT1×YD2)+YT1×(XT0×YD2-XT2×YD0)+YT2×(XT1×YD0-XT0×YD1);
A=D1/D0;B=D2/D0;C=D3/D0;D=D4/D0;F=D5/D0;A=D6/D0;

程序要實現(xiàn)的功能是:程序一開始,界面上會出現(xiàn)3個十字的取樣點,分別標有1、2、3,然后用觸筆依次的點擊,完成后,會進入第二個界面,用觸筆隨機的點擊屏幕,會以觸點繪制出邊長為4的小正方形。


簡單的程序?qū)崿F(xiàn):

#include"def.h"
#include"option.h"
#include"2440addr.h"
#include"2440lib.h"
#include"2440slib.h"
#include"mmu.h"
//================================

externchar__ENTRY[];
//voidMMU_SetMTT(intvaddrStart,intvaddrEnd,intpaddrStart,intattr);
//voidMMU_Init(void);

//LCD*****************************************************
#defineM5D(n)((n)&0x1fffff)//用于設(shè)置顯示緩存區(qū)時,取低21位地址

#defineLCD_WIDTH240//屏幕的寬
#defineLCD_HEIGHT320//屏幕的高

//垂直同步信號的脈寬、后肩和前肩-----這些值是根據(jù)TopPoly-TD035STED4.pdf文件中的13頁的表
#defineVSPW1//(3-1)
#defineVBPD1//(15-1)
#defineVFPD1//(12-1)

//水平同步信號的脈寬、后肩和前肩-----這些值是根據(jù)TopPoly-TD035STED4.pdf文件中的13頁的表
#defineHSPW(10-1)
#defineHBPD(20-1)
#defineHFPD(10-1)

//顯示尺寸
#defineLINEVAL(LCD_HEIGHT-1)
#defineHOZVAL(LCD_WIDTH-1)

//forLCDCON1
#defineCLKVAL_TFT4//設(shè)置時鐘信號
#defineMVAL_USED0//
#definePNRMODE_TFT3//TFT型LCD
#defineBPPMODE_TFT13//24位TFT型LCD

//forLCDCON5
#defineBPP24BL0//32位數(shù)據(jù)表示24位顏色值時,低位數(shù)據(jù)有效,高8位無效
#defineINVVCLK0//像素值在VCLK下降沿有效
#defineINVVLINE1//翻轉(zhuǎn)HSYNC信號
#defineINVVFRAME1//翻轉(zhuǎn)VSYNC信號
#defineINVVD0//正常VD信號極性
#defineINVVDEN0//正常VDEN信號極性
#definePWREN1//使能PWREN信號
#defineBSWP0//顏色數(shù)據(jù)字節(jié)不交換
#defineHWSWP0//顏色數(shù)據(jù)半字不交換

//定義顯示緩存區(qū)
volatileunsignedintLCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];

intA,B,C,D,E,F,K;
volatileintxdata,ydata;
intflagIIC;//IIC標志
intflagTS;//觸摸屏標志
//lCD******************************************************
//LCD顯示函數(shù)//////////////////////////////////////////////////
//延時程序
voiddelay(inta)
{
intk;
for(k=0;k}

//繪制屏幕背景顏色,顏色為c
voidBrush_Background(unsignedintc)
{
intx,y;
for(y=0;y{
for(x=0;x{
LCD_BUFFER[y][x]=c;
}
}
}

//繪制“十”字型
voiddrawCross(unsignedintx,unsignedinty,unsignedintcolor)
{
inti;
for(i=x-10;iLCD_BUFFER[y][i]=color;
for(i=y-10;iLCD_BUFFER[i][x]=color;
}

//繪制正方形
voiddrawsquare(unsignedintx,unsignedinty,unsignedintcolor)
{
inti,j;
intx1=x-2;
inty1=y-2;
for(i=y1;i{
for(j=x1;jLCD_BUFFER[i][j]=color;
}
}

//繪制大小為8×16的ASCII碼
voidDraw_ASCII(unsignedintx,unsignedinty,unsignedintcolor,constunsignedchar*ch)
{
unsignedshortinti,j;
unsignedcharmask,buffer;

for(i=0;i<16;i++)
{
mask=0x80;
buffer=ch[i];
for(j=0;j<8;j++)
{
if(buffer&mask)
{
LCD_BUFFER[y+i][x+j]=color;
}
mask=mask>>1;
}
}
}

voidinit_port_lcd()//初始化
{
rGPCCON=0xaaaaaaaa;
rGPCUP=0xffff;//ThepullupfunctionisdisabledGPC[15:0]

//***PORTDGROUP
//Ports:GPD15GPD14GPD13GPD12GPD11GPD10GPD9GPD8GPD7GPD6GPD5GPD4GPD3GPD2GPD1GPD0
//Signal:VD23VD22VD21VD20VD19VD18VD17VD16VD15VD14VD13VD12VD11VD10VD9VD8
//Binary:1010,1010,1010,1010,1010,1010,1010,1010
rGPDCON=0xaaaaaaaa;
rGPDUP=0xffff;

rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE_TFT<<5)|(BPPMODE_TFT<<1)|0;
rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);
rLCDCON3=(HBPD<<19)|(HOZVAL<<8)|(HFPD);
rLCDCON4=(HSPW);//
//rLCDCON4=(5<<0);
rLCDCON5=(BPP24BL<<12)|(INVVCLK<<10)|(INVVLINE<<9)|(INVVFRAME<<8)|(0<<7)|(INVVDEN<<6)|(PWREN<<3)|(BSWP<<1)|(HWSWP);

rLCDSADDR1=(((unsignedint)LCD_BUFFER>>22)<<21)|M5D((unsignedint)LCD_BUFFER>>1);
rLCDSADDR2=M5D((M5D((unsignedint)LCD_BUFFER>>1)+((LCD_WIDTH*32/16+0)*320)));//LCD_WIDTH*LCD_HEIGHT*4
rLCDSADDR3=(LCD_WIDTH*32/16)&0x7ff;//參考s3c2440的手冊
rLCDINTMSK|=(3);//屏蔽LCD中斷
//rTCONSEL=0;//無效LPC3480
rTCONSEL&=(~7);


rTPAL=0x0;
rTCONSEL&=~((1<<4)|1);

rGPGUP=rGPGUP&(~(1<<4))|(1<<4);//GPG4上拉電阻無效
rGPGCON=rGPGCON&(~(3<<8))|(3<<8);//設(shè)置GPG4為LCD_PWREN
rGPGDAT=rGPGDAT|(1<<4);//GPG4置1

rLCDCON5=rLCDCON5&(~(1<<3))|(1<<3);//有效PWREN信號
rLCDCON5=rLCDCON5&(~(1<<5))|(0<<5);//PWREN信號極性不翻轉(zhuǎn)

rLCDCON1|=1;//LCD開啟
}
//LCD顯示函數(shù)//////////////////////////////////////////////////


void__irqADCTs(void)
{
rADCTSC=(1<<3)|(1<<2);//上拉電阻無效,自動連續(xù)XY坐標轉(zhuǎn)換模式開啟
rADCDLY=40000;//延時

rADCCON|=0x1;//開始A/D轉(zhuǎn)換

while(rADCCON&0x1);//檢查A/D轉(zhuǎn)換是否開始

while(!(rADCCON&0x8000));//等待A/D轉(zhuǎn)換的結(jié)束

while(!(rSRCPND&((unsignedint)0x1<<31)));//判斷A/D中斷的懸掛位

xdata=(rADCDAT0&0x3ff);//讀取X軸坐標
ydata=(rADCDAT1&0x3ff);//讀取Y軸坐標

flagTS=1;//置標志

rSUBSRCPND|=0x1<<9;
rSRCPND=0x1<<31;
rINTPND=0x1<<31;
rINTSUBMSK=~(0x1<<9);
rINTMSK=~(0x1<<31);//清A/D中斷,開啟A/D中斷屏蔽

rADCTSC=0xd3;//再次設(shè)置等待中斷模式,這一次是判斷觸筆的抬起

rADCTSC=rADCTSC|(1<<8);//設(shè)置觸筆抬起中斷

while(1)//等待觸筆的抬起
{
if(rSUBSRCPND&(0x1<<9))//檢查A/D觸摸屏中斷懸掛
{
break;//如果觸筆抬起,則跳出該循環(huán)
}
}

rADCDLY=50000;
rSUBSRCPND|=0x1<<9;//寫1清除標志
rINTSUBMSK=~(0x1<<9);//清0中斷使能,ADC的子中斷
rSRCPND=0x1<<31;//寫1清除標志
rINTPND=0x1<<31;//再次清A/D中斷,開啟A/D中斷屏蔽
rADCTSC=0xd3;//設(shè)置等待光標按下中斷模式,為下一次觸筆的落下做準備
//011010011--//XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En.
}

constunsignedcharone[]={0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00};
constunsignedchartwo[]={0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00};
constunsignedcharthree[]=
{0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00};
//用PCtoLCD2002字符生成軟件

//觸摸屏校正
voidTSCal(void)
{
inti=0;
intxt[3],yt[3];
Brush_Background(0xFFFFFF);
drawCross(24,32,0xFF0000);
Draw_ASCII(28,36,0xFF0000,one);//----
drawCross(216,160,0xFF0000);
Draw_ASCII(220,164,0xFF0000,two);//----
drawCross(120,288,0xFF0000);
Draw_ASCII(124,292,0xFF0000,three);//----

//依次讀取三個采樣點的坐標值
for(i=0;i<3;i++)
{
while(flagTS==0)
delay(500);
xt[i]=xdata;
yt[i]=ydata;
flagTS=0;
}

//計算參數(shù)
K=(xt[0]-xt[2])*(yt[1]-yt[2])-(xt[1]-xt[2])*(yt[0]-yt[2]);
D=(32-288)*(yt[1]-yt[2])-(160-288)*(yt[0]-yt[2]);
E=(xt[0]-xt[2])*(160-288)-(32-288)*(xt[1]-xt[2]);
F=yt[0]*(xt[2]*160-xt[1]*288)+yt[1]*(xt[0]*288-xt[2]*32)+yt[2]*(xt[1]*32-xt[0]*160);
A=(24-120)*(yt[1]-yt[2])-(216-120)*(yt[0]-yt[2]);
B=(xt[0]-xt[2])*(216-120)-(24-120)*(xt[1]-xt[2]);
C=yt[0]*(xt[2]*216-xt[1]*120)+yt[1]*(xt[0]*120-xt[2]*24)+yt[2]*(xt[1]*24-xt[0]*216);
}

intMain(intargc,char**argv)
{
inti;
unsignedcharkey;
unsignedintmpll_val=0;
intdata;

intxLcd,yLcd;

mpll_val=(92<<12)|(1<<4)|(1);

//initFCLK=400M,sochangeMPLLfirst
ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>>4)&0x3f,mpll_val&3);
ChangeClockDivider(key,12);

rINTMOD=0x0;//All=IRQmode
rINTMSK=BIT_ALLMSK;//Allinterruptismasked.

MMU_Init();

init_port_lcd();

//*********************
rADCDLY=50000;//設(shè)置延時
rADCCON=(1<<14)+(9<<6);//設(shè)置A/D預(yù)分頻
rADCTSC=0xd3;//設(shè)置cm屏為等待中斷模式。
pISR_ADC=(int)ADCTs;
rINTMSK=~(0x1<<31);//開啟中斷
rINTSUBMSK=~(BIT_SUB_TC);

flagTS=0;
//*********************

TSCal();//校正
delay(200000);

Brush_Background(0xFFFFFF);

while(1)
{
if(flagTS)
{
flagTS=0;
xLcd=(A*xdata+B*ydata+C)/K;//計算Y軸坐標
yLcd=(D*xdata+E*ydata+F)/K;//計算X軸坐標
drawsquare(xLcd,yLcd,0xFF0000);//繪制正方形
}
delay(1000000);
}
return0;
}

//-------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------
voidMMU_Init(void)//配置MMU
{
inti,j;
MMU_DisableDCache();
MMU_DisableICache();

for(i=0;i<64;i++)
for(j=0;j<8;j++)
MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5));


MMU_InvalidateICache();
MMU_DisableMMU();
MMU_InvalidateTLB();

MMU_SetMTT(0x00000000,0x03f00000,0x30000000,RW_CB);//bank0__ENTRY的地址就是0x30000000
MMU_SetMTT(0x04000000,0x07f00000,0,RW_NCNB);//bank0
MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,RW_CNB);//bank1
MMU_SetMTT(0x10000000,0x17f00000,0x10000000,RW_NCNB);//bank2
MMU_SetMTT(0x18000000,0x1ff00000,0x18000000,RW_NCNB);//bank3
//MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CB);//bank4
MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CNB);//bank4forSTRATAFlash
MMU_SetMTT(0x28000000,0x2ff00000,0x28000000,RW_NCNB);//bank5
//30f00000->30100000,31000000->30200000
MMU_SetMTT(0x30000000,0x30100000,0x30000000,RW_CB);//bank6-1
MMU_SetMTT(0x30200000,0x33e00000,0x30200000,RW_NCNB);//bank6-2
//
MMU_SetMTT(0x33f00000,0x33f00000,0x33f00000,RW_CB);//bank6-3
MMU_SetMTT(0x38000000,0x3ff00000,0x38000000,RW_NCNB);//bank7

MMU_SetMTT(0x40000000,0x47f00000,0x40000000,RW_NCNB);//SFR
MMU_SetMTT(0x48000000,0x5af00000,0x48000000,RW_NCNB);//SFR
MMU_SetMTT(0x5b000000,0x5b000000,0x5b000000,RW_NCNB);//SFR
MMU_SetMTT(0x5b100000,0xfff00000,0x5b100000,RW_FAULT);//notused


MMU_SetTTBase(_MMUTT_STARTADDRESS);//寫轉(zhuǎn)換表基地址到C2
MMU_SetDomain(0x55555550|DOMAIN1_ATTR|DOMAIN0_ATTR);//寫域訪問控制位到C3
//DOMAIN1:no_access,DOMAIN0,2~15=client(APischecked)
MMU_SetProcessId(0x0);
MMU_EnableAlignFault();

MMU_EnableMMU();//使能MMU
MMU_EnableICache();//使能ICache
MMU_EnableDCache();//DCache必須要打開,當(dāng)MMU打開時.DCacheshouldbeturnedonafterMMUisturnedon.

}

//vaddrStart:虛擬起始地址
//vaddrEnd:虛擬結(jié)束地址
//paddrStart:物理起始地址
//attr:訪問屬性
voidMMU_SetMTT(intvaddrStart,intvaddrEnd,intpaddrStart,intattr)
{
volatileunsignedint*pTT;//定義了頁表的指針
volatileinti,nSec;
pTT=(unsignedint*)_MMUTT_STARTADDRESS+(vaddrStart>>20);//由于內(nèi)存塊是1M的,寫頁表的基地址
nSec=(vaddrEnd>>20)-(vaddrStart>>20);//計數(shù)有多少個段(每個段為1M)
for(i=0;i<=nSec;i++)
*pTT++=attr|(((paddrStart>>20)+i)<<20);
//頁表存儲訪問信息和存儲塊的基地址
//(((paddrStart>>20)+i)<<20):對應(yīng)的物理內(nèi)存頁的地址
//attr:訪問權(quán)限和緩沖屬性
}

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉