触摸屏和LCD接口.docx
- 文档编号:14545138
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:17
- 大小:20.33KB
触摸屏和LCD接口.docx
《触摸屏和LCD接口.docx》由会员分享,可在线阅读,更多相关《触摸屏和LCD接口.docx(17页珍藏版)》请在冰点文库上搜索。
触摸屏和LCD接口
实验三触摸屏和LCD接口
1、实验目的:
1、了解ARM处理器LCD驱动控制器的处理机制,掌握在S3C2440A平台下进行LCD应用编程。
2、了解ARM处理器触摸屏的处理机制,掌握在S3C2440A平台下进行触摸屏应用编程。
二、实验任务:
A部分:
LCD实验,实现LCD的显示和简单的画图功能;
(实验板采用的LCD显示屏为480×800的真彩色显示屏。
可以理解为一幅图片分为480×800个点,每个点有自己的颜色,通过填充每个点的颜色构成一幅完整的图片,所以程序中对图片的操作都是通过对每个像素的操作进行的)
B部分:
触摸屏实验。
三、实验过程:
A部分:
LCD实验
1、以下是本实验的部分程序源代码:
①端口、寄存器初始化
voidLcd_Tft_LQ080V3DG1_Init(void)
{
Lcd_Init();
LcdBkLtSet(70);
Lcd_PowerEnable(0,1);
Lcd_EnvidOnOff
(1);//turnonvedio
Lcd_ClearScr(0xffff);//fillallscreenwithsomecolor
#defineLCD_BLANK12
#defineC_UP(LCD_XSIZE_TFT_800480-LCD_BLANK*2)
#defineC_RIGHT(LCD_XSIZE_TFT_800480-LCD_BLANK*2)
#defineV_BLACK((LCD_YSIZE_TFT_800480-LCD_BLANK*4)/6)
Glib_FilledRectangle((LCD_BLANK*2),(LCD_BLANK*2+V_BLACK*5),(C_RIGHT),(LCD_BLANK*2+V_BLACK*6),0x07ff);//fillaRectanglewithsomecolor
Glib_Line(LCD_BLANK,LCD_BLANK,(LCD_XSIZE_TFT_800480-LCD_BLANK),(LCD_YSIZE_TFT_800480-LCD_BLANK),0x0000);
Glib_Line(LCD_BLANK,(LCD_YSIZE_TFT_800480-LCD_BLANK),LCD_XSIZE_TFT_800480-LCD_BLANK),LCD_BLANK,0x0000);
}
voidLcd_Tft_LQ080V3DG1_Test(void)
{
charc;
inti;
Lcd_ClearScr((0x00<<11)|(0x00<<5)|(0x00));//clearscreen
Uart_Printf("LCDclearscreenisfinished!
pressanykeytocontinue!
\n");
Uart_Getch();//waituartinput
Lcd_ClearScr(0xffff);//fillallscreenwithsomecolor
#defineLCD_BLANK12
#defineC_UP(LCD_XSIZE_TFT_800480-LCD_BLANK*2)
#defineC_RIGHT(LCD_XSIZE_TFT_800480-LCD_BLANK*2)
#defineV_BLACK((LCD_YSIZE_TFT_800480-LCD_BLANK*4)/6)
Glib_FilledRectangle(LCD_BLANK,LCD_BLANK,(LCD_XSIZE_TFT_800480-LCD_BLANK),(LCD_YSIZE_TFT_800480-LCD_BLANK),0x0000);//fillaRectanglewithsomecolor
Glib_FilledRectangle((LCD_BLANK*2),(LCD_BLANK*2+V_BLACK*0),(C_RIGHT),(LCD_BLANK*2+V_BLACK*1),0x001f);//fillaRectanglewithsomecolor
Glib_Line(LCD_BLANK,LCD_BLANK,(LCD_XSIZE_TFT_800480-LCD_BLANK),(LCD_YSIZE_TFT_800480-LCD_BLANK),0x0000);
Glib_Line(LCD_BLANK,(LCD_YSIZE_TFT_800480-LCD_BLANK),LCD_XSIZE_TFT_800480-LCD_BLANK),LCD_BLANK,0x0000);
Uart_Printf("AnyKeyToNext!
\n");Uart_Getch();//AnyKeyToNext
while
(1)
{
for(i=0;i<4;i++)
{
Paint_Bmp(0,0,800,480,SinosysProduction[i]);//paintabmp
Uart_Printf("pressEnterKeyexit,pressotherkeystocontinue!
\n");
c=Uart_Getch();//waituartinput
if(c==0x0d)//'\r'
{
Uart_Printf("Thankyou!
WelcomtoSinoSys!
\n");
Uart_Printf("\n======LCDTestEnd======\n");
return;
}
}
}
}
②四张图片,申请已存储空间存储图片,在程序中将LCD_BUFER的地址赋予LCDSADDRES1和LCDSADDRESS2,在程序执行过程中禁止对这两个寄存器进行修改。
externunsignedcharSinosysProduction1[];extern表示在外部已经定义,下同
externunsignedcharSinosysProduction2[];
externunsignedcharSinosysProduction3[];
externunsignedcharSinosysProduction4[];
unsignedchar*SinosysProduction[4]=
{SinosysProduction1,
SinosysProduction2,
SinosysProduction3,
SinosysProduction4,
};//宽640,高480
volatilestaticunsignedshortLCD_BUFER[SCR_YSIZE_TFT_800480][SCR_XSIZE_TFT_800480];
staticvoidLcd_Init(void)
{
rGPCUP=0xffffffff;//DisablePull-upregister
rGPCCON=0xaaaa56a9;//InitializeVD[7:
0],LCDVF[2:
0],VM,VFRAME,VLINE,VCLK,LEND
rGPDUP=0xffffffff;//DisablePull-upregister
rGPDCON=0xaaaaaaaa;//InitializeVD[15:
8]
rLCDCON1=(CLKVAL_TFT_800480<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
rLCDCON2=(VBPD_800480<<24)|(LINEVAL_TFT_800480<<14)|(VFPD_800480<<6)|(VSPW_800480);
rLCDCON3=(HBPD_800480<<19)|(HOZVAL_TFT_800480<<8)|(HFPD_800480);
rLCDCON4=(MVAL<<8)|(HSPW_800480);
rLCDCON5=(1<<11)|(0<<9)|(0<<8)|(0<<6)|(BSWP<<1)|(HWSWP);//FRM5:
6:
5,HSYNCandVSYNCareinverted
//LCDSADDR1高11位LCDBANCK是用来存储图片所在的BANK的起始地址,LCDSADDR1的低21位是图片在某段内的起始地址,LCDSADDR2的低21位是图片在某段内的结束地址。
rLCDSADDR1=(((U32)LCD_BUFER>>22)<<21)|M5D((U32)LCD_BUFER>>1);
rLCDSADDR2=M5D(((U32)LCD_BUFER+(SCR_XSIZE_TFT_800480*LCD_YSIZE_TFT_800480*2))>>1);
rLCDSADDR3=(((SCR_XSIZE_TFT_800480-LCD_XSIZE_TFT_800480)/1)<<11)|(LCD_XSIZE_TFT_800480/1);
//屏蔽LCD中断和
rLCDINTMSK|=(3);//MASKLCDSubInterrupt
//disablelcc3600和lpc3600是两个时钟控制单元
rTCONSEL&=~((1<<4)|1);
rTPAL=0;//DisableTempPalette
}
staticvoidLcd_EnvidOnOff(intonoff)
{
//LCDCON1的最低位是使能LCD的控制信号
if(onoff==1)
rLCDCON1|=1;//ENVID=ON
else
rLCDCON1=rLCDCON1&0x3fffe;//ENVIDOff
}
staticvoidLcd_PowerEnable(intinvpwren,intpwren)
{
rGPGUP=rGPGUP&(~(1<<4))|(1<<4);//Pull-updisable
rGPGCON=rGPGCON&(~(3<<8))|(3<<8);//GPG4=LCD_PWREN
rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3);//PWREN
rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5);//INVPWREN
}
③实现图片的翻转功能(左右对换,上下对换,对角对换等等)。
staticvoidLcd_MoveViewPort(intvx,intvy)
{
U32addr;
//clr_if()关中断
SET_IF();
#if(LCD_XSIZE_TFT_800480<32)
while((rLCDCON1>>18)<=1);//ifx<32
#else
while((rLCDCON1>>18)==0);//ifx>32
#endif
addr=(U32)LCD_BUFER+(vx*2)+vy*(SCR_XSIZE_TFT_800480*2);
//改变存储起始地址和结束地址,不改变bank地址,从而图片实现变换
rLCDSADDR1=((addr>>22)<<21)|M5D(addr>>1);
rLCDSADDR2=5D(((addr+(SCR_XSIZE_TFT_800480*LCD_YSIZE_TFT_800480*2))>>1));
CLR_IF();
}
④刷屏并填充成某种颜色。
staticvoidLcd_ClearScr(U32c)
{
unsignedintx,y;
for(y=0;y { for(x=0;x { LCD_BUFER[y][x]=c; } } } ⑤设置单个像素。 staticvoidPutPixel(U32x,U32y,U32c) { if((x LCD_BUFER[(y)][(x)]=c; } ⑥实验画线功能。 staticvoidGlib_Line(intx1,inty1,intx2,inty2,intcolor) { intdx,dy,e; dx=x2-x1; dy=y2-y1; if(dx>=0) //分成四种大情况考虑,dx>0,dy>0;dx>0,dy<0;dx<0,dy>0;dx<0,dy<0; { if(dy>=0)//dy>=0 { if(dx>=dy)//1/8octant { e=dy-dx/2; while(x1<=x2) { PutPixel(x1,y1,color); if(e>0){y1+=1;e-=dx;} x1+=1; e+=dy; } } else//2/8octant { e=dx-dy/2; while(y1<=y2) { PutPixel(x1,y1,color); if(e>0){x1+=1;e-=dy;} y1+=1; e+=dx; } } } else//dy<0 { dy=-dy;//dy=abs(dy) if(dx>=dy)//8/8octant { e=dy-dx/2; while(x1<=x2) { PutPixel(x1,y1,color); if(e>0){y1-=1;e-=dx;} x1+=1; e+=dy; } } else//7/8octant { e=dx-dy/2; while(y1>=y2) { PutPixel(x1,y1,color); if(e>0){x1+=1;e-=dy;} y1-=1; e+=dx; } } } } else//dx<0 { dx=-dx;//dx=abs(dx) if(dy>=0)//dy>=0 { if(dx>=dy)//4/8octant { e=dy-dx/2; while(x1>=x2) { PutPixel(x1,y1,color); if(e>0){y1+=1;e-=dx;} x1-=1; e+=dy; } } else//3/8octant { e=dx-dy/2; while(y1<=y2) { PutPixel(x1,y1,color); if(e>0){x1-=1;e-=dy;} y1+=1; e+=dx; } } } else//dy<0 { dy=-dy;//dy=abs(dy) if(dx>=dy)//5/8octant { e=dy-dx/2; while(x1>=x2) { PutPixel(x1,y1,color); if(e>0){y1-=1;e-=dx;} x1-=1; e+=dy; } } else//6/8octant { e=dx-dy/2; while(y1>=y2) { PutPixel(x1,y1,color); if(e>0){x1-=1;e-=dy;} y1-=1; e+=dx; } } } } } ⑦画一个矩形并用颜色填充。 staticvoidGlib_Rectangle(intx1,inty1,intx2,inty2,intcolor) { Glib_Line(x1,y1,x2,y1,color); Glib_Line(x2,y1,x2,y2,color); Glib_Line(x1,y2,x2,y2,color); Glib_Line(x1,y1,x1,y2,color); }//画一个矩形 staticvoidGlib_FilledRectangle(intx1,inty1,intx2,inty2,intcolor) { inti; for(i=y1;i<=y2;i++) Glib_Line(x1,i,x2,i,color); }//用颜色填充矩形 2、调试与运行 当所有的函数都实现以后,通过ADS1.2进行编译,生成可执行文件。 在工程文件夹下,可以看到LCD_test.bin可执行文件。 然后建立实验环境,连接好SinoSys-EA2440a的电源线,用附带的串口线将SinoSys-EA2440a串口和开发PC机的COM1连接好,用附带的USB线将SinoSys-EA2440a的方形USB口和开发PC机的USB口相连。 再下载程序运行,打开DNW软件,将串口设置为COM1,比特率设置为115200,USB下载地址设为0x30000000。 将SinoSys-EA2440a设置为Nor-Flash启动,打开SinoSys-EA2440a电源开关,使用DNW将前面生成的可执行文件下载到内存中去运行。 用以上程序一一实现画图、翻转、填色、画线、画矩形等功能。 3、实验中的注意点(主要针对程序) ①在申请已存储空间存储图片的时候,在程序中要将LCD_BUFER的地址赋给LCDSADDRES1和LCDSADDRESS2,在程序执行过程中禁止对这两个寄存器进行修改。 ②实现图片翻转的时候,要执行clr_if()关中断。 因为在范围LCD控制寄存器的[27: 18]时,如果不关中断,在读取数值后恰巧发生中断,执行中断后回来会根据中断前的数值执行程序,所以要先关中断。 ③LCDSADDR1高11位LCDBANCK是用来存储图片所在的BANK的起始地址,在运行过程中这个LCDBANK是不能改变的,所以要求图片的大小要小于一个BANK的大小(4MB),LCDSADDR1的低21位是图片在某段内的起始地址,LCDSADDR2的低21位是图片在某段内的结束地址,从SinosysProduction1.c中可以看出每一个像素是用两个数组的元素来表示的,所以下面的地址先向右边移动22后向左边移动后得到的才是bank的起始地址。 B部分: 触摸屏实验 1、以下是本实验的部分程序源代码: ①主程序(注意程序中对各个寄存器进行配置,通过程序使得每次只有在笔放下和拿起的时候读出坐标) voidTest_Touchpanel(void) { //#defineLCD_BLANK12 //#defineC_UP(LCD_XSIZE_TFT_800480-LCD_BLANK*2) //#defineC_RIGHT(LCD_XSIZE_TFT_800480-LCD_BLANK*2) //#defineV_BLACK((LCD_YSIZE_TFT_800480-LCD_BLANK*4)/6) rADCDLY=50000;//Normalconversionmodedelayabout(1/3.6864M)*50000=13.56ms rADCCON=(1<<14)+(ADCPRS<<6);//ADCPRSEn,ADCPRSValue Uart_Printf("ADCtouchscreentest\n"); rADCTSC=0xd3;//Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En pISR_ADC=(int)AdcTsAuto;//中断函数的入口地址 rINTMSK=~BIT_ADC;//ADCTouchScreenMaskbitclear rINTSUBMSK=~(BIT_SUB_TC);//使能触摸屏澹(AD)中断 Uart_Printf("\nTypeanykeytoexit! ! ! \n"); Uart_Printf("\nStylusDown,please......\n"); Uart_Getch(); //开中断,等待触摸屏的中断信号 rINTSUBMSK|=BIT_SUB_TC; rINTMSK|=BIT_ADC; Uart_Printf("TouchScreenTestisFinished! ! ! \n"); } ②中断服务子程序 void__irqAdcTsAuto(void) { inti; U32saveAdcdly; if(rADCDAT0&0x8000) { rADCTSC&=0xff; //Setstylusdowninterruptbit } rADCTSC=(1<<3)|(1<<2);//Pull-updisable,Seq.X,Ypostionmeasure. saveAdcdly=rADCDLY; rADCDLY=40000;//Normalconversionmodedelayabout(1/50M)*40000=0.8ms rADCCON|=0x1;//startADC while(rADCCON&0x1);//checkifEnable_startislow while(! (rADCCON&0x8000));//checkifEC(EndofConversion)flagishigh,Thislineisnecessary~! ! while(! (rSRCPND&(BIT_ADC)));//checkifADCisfinis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 触摸屏 LCD 接口
![提示](https://static.bingdoc.com/images/bang_tan.gif)