免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
飛凌 2440ok實(shí)驗(yàn)板裸機(jī)實(shí)驗(yàn):觸摸屏和lcd
飛凌 2440ok實(shí)驗(yàn)板裸機(jī)實(shí)驗(yàn):觸摸屏和lcd
2011-08-10 16:17

        照著別人的程序,修來該去,搞了三天,終于ok啦。把main.c文件貼出來分享。該文件比較獨(dú)立,只需再加入串口打印程序,就可以運(yùn)行啦。這里用的320*240的lcd屏。

        程序運(yùn)行后會(huì)在屏幕上顯示5個(gè)“+”,讓你去一次點(diǎn)擊用于標(biāo)定觸摸屏的坐標(biāo)和lcd坐標(biāo)的關(guān)系。標(biāo)定成功后程序會(huì)清屏(青)。然后點(diǎn)擊屏幕任意地方,該地方會(huì)顯示一個(gè)20*20的藍(lán)方塊。點(diǎn)擊左下角菜單,會(huì)再次清屏。

#include "2440addr.h"
#include "def.h"

#define _ISR_STARTADDRESS  0x33ffff00    
#define adc_frequency 2000000
 
 #define SCR_XSIZE  (320)
 #define SCR_YSIZE  (240)
 
 #define CLKVAL (5)  //VCLK=HCLK÷[(CLKVAL+1)×2]
 #define PNRMODE (3)  //TFT LCD panel
 #define BPPMODE (12) //16 bpp for TFT
 #define ENVID (1)  //輸出和控制 有效

 #define VBPD (3)  //垂直同步信號(hào)后肩
 #define LINEVAL (240-1) //垂直尺寸
 #define VFPD (5)  //垂直同步信號(hào)前肩
 #define VSPW (15)  //垂直同步信號(hào)脈寬

 #define HBPD (58)  //水平同步信號(hào)后肩
 #define HOZVAL (320-1) //水平尺寸
 #define HFPD (15)  //水平同步信號(hào)前肩

 #define HSPW (8)  //水平同步信號(hào)脈寬

 #define FRM565 (1)  //565格式
 #define PWREN (1)  //GPG供電使能(用于掉電模式)
 #define BSWP (1)     //字節(jié)不交換:
 //#define HWSWP (1)     //半字交換 16位用不到

 #define OFFSIZE (0)  //若不用虛擬屏幕,則為0
 #define PAGEWIDTH 320//虛擬屏幕的寬 單位半字 若不用虛擬屏幕,則和實(shí)際一致

 
U32 PCLK=50000000;
U16 x_tsc,y_tsc;
volatile U16 pixel[240][320];
volatile short demarcated=0;
float  kx,bx,ky,by;


void  tsc_int_init(void);
void   TSC_ISR(void) __irq ;
void tsc_init(void);
void tsc_get(void);
void lcd_init(void);
void zhengfangxing(short x, short y,U32 color);
void Delay(unsigned int x); 
void LcdClearScr(U16 c); 
void menu(void);
int demarcate(void);

int main(void)
{     
 int i=0;
 demarcated=0;
  
 Delay(10);
 Uart_Printf("\n觸摸屏和LCD綜合實(shí)驗(yàn)\n");
 Delay(10);
 Uart_Printf("\n標(biāo)定后,觸摸處將顯一個(gè)方塊\n");

 tsc_int_init();    //觸摸屏中斷初始化
 tsc_init();     //觸摸屏初始化
 lcd_init();     //LCD初始化
 LcdClearScr( 0x1f00);//清屏:綠
 
 for(i=-8;i<9;i++)  //設(shè)置標(biāo)定屏幕的5個(gè)取樣點(diǎn);以“+”號(hào)在屏上顯示出來;
 {
   pixel[10+i][10]  =  0xffff;
   pixel[230+i][10] =  0xffff;
   pixel[230+i][310] = 0xffff;
   pixel[10+i][310] =  0xffff;
   pixel[120+i][160] = 0xffff;
  }
  for (i=-8;i<9;i++)
  {
   pixel[10][10+i]  =0xffff;
   pixel[230][10+i] =0xffff;
   pixel[230][310+i]=0xffff;
   pixel[10][310+i] =0xffff;
    pixel[120][160+i]=0xffff;
  }
 while(demarcated==0);//主意 :demarcated若不定義成volatile型,demarcated變成1后此處也檢測不出來。
        //空循環(huán)直至標(biāo)定成功;
 LcdClearScr( 0x1f00  )  ; //清屏:綠
 menu();    //左下角和右下角顯示兩個(gè)紅方塊做菜單。左下角表示清屏,右下角未使用。

        //循環(huán),若點(diǎn)擊到“清屏”菜單,則清楚之前顯示的藍(lán)方塊(有下面的if句完成);
 while(1)     // 若未點(diǎn)擊到菜單,則在點(diǎn)擊處顯示一個(gè)藍(lán)方塊(在中斷函數(shù)里完成);
  if((kx*x_tsc+bx-10)<10&&(ky*y_tsc+by-230)<10&&(-10)<(kx*x_tsc+bx-10)&&-10<(ky*y_tsc+by-230))
  {  x_tsc=320;//跳出if句。
   LcdClearScr( 0x1f00  )  ; //清屏:綠
    menu();
   } 
}
//顯示兩個(gè)方塊做菜單用****************************************************
void menu(void)
{
  zhengfangxing(10,230,0x8888);
  zhengfangxing(310,230,0x8888); 
}
//標(biāo)定函數(shù),用于程序剛開始建立觸摸屏坐標(biāo)與顯示屏坐標(biāo)之間的轉(zhuǎn)換關(guān)系**********
int demarcate()
{
 static float x[6],y[6];//(x0和y0未用)  x1  x2  x3  x4 x5
 static int j=1;

 if(j<6)  //此行可略去;
 {  Uart_Printf("\n取樣第%4d個(gè)點(diǎn):x=%d,y=%d\n",j,x_tsc,y_tsc);
  x[j]=x_tsc;
  y[j]=y_tsc;
 }
 
 if(j++<5)return;
 if((x[1]-x[4])==0|(y[1]-y[2])==0|(x[2]-x[3])==0|(y[4]-y[3])==0)
 {
  j=1;
  Uart_Printf("\n除數(shù)為零!標(biāo)定失敗,請重新標(biāo)定!\n");
  return;
 }
 /*觸摸屏坐標(biāo)和顯示屏坐標(biāo)的成線性關(guān)系(y=kx+b);本實(shí)驗(yàn)所用的屏的
 觸摸屏的x方向和lcd屏的x方向在一個(gè)方向,觸摸屏的y和lcd屏的y在一個(gè)
 方向:前4個(gè)點(diǎn)用于標(biāo)定k,b的值;第五個(gè)點(diǎn)用來檢驗(yàn)標(biāo)定誤差,誤差太大
 會(huì)提示重新標(biāo)定。所用的五個(gè)點(diǎn)一次為(320*240lcd坐標(biāo)):(10,10)、
 (10,230)、(310,230)、(310,10)(130,120)*/
 
 kx=(10-310)/(x[1]-x[4]);        //標(biāo)定x方向的kx,bx
 bx=10-(10-310)/(x[1]-x[4])*x[1];//bx=10-kx*x[1];
 kx=( (10-310)/(x[2]-x[3])+kx )/2;//再次標(biāo)定并取平均值
 bx=(10-(10-310)/(x[2]-x[3])*x[2] +bx)/2;
 
 ky=(10-230)/(y[1]-y[2]);  //標(biāo)定y方向的ky,by
 by=10-(10-230)/(y[1]-y[2])*y[1];
 ky=( (10-230)/(y[4]-y[3])+ky )/2;
 by=( 10-(10-230)/(y[4]-y[3])*y[4] +by)/2;
 
       //拿第五個(gè)點(diǎn)來檢查標(biāo)定后的誤差是否在正負(fù)10個(gè)像素內(nèi);
 if (-10<(kx*x[5]+bx-160) && (-10)<(kx*x[5]+bx-160)&&(-10)<(ky*y[5]+by-120) && (ky*y[5]+by-120)<10 )
 { 
  Uart_Printf("\n標(biāo)定成功\n");
  demarcated=1;
  return;
 }
 else
 {
  j=1;
  Uart_Printf("\n標(biāo)定失敗,請重新標(biāo)定!\n");
 }  
}
 
//**********************************************************************
void  tsc_int_init(void)  //觸摸屏中斷初始化
{
 rSUBSRCPND |= 1<<9;     //INT_TC清0

 rSRCPND |= 1<<31;     //INT_ADC清0
 rINTPND |= 1<<31;     //INT_ADC清0
 
 pISR_ADC = (U32)TSC_ISR;   //申請中斷向量
 
 rINTMSK = rINTMSK & ~(1<<31);  //禁止ADC的屏蔽
 
 rINTSUBMSK = rINTSUBMSK & ~(1<<9); //禁止TSC的屏蔽
 
 rADCTSC = 0x0d3 ;     //等待中斷模式的特定設(shè)置
}

//*********************************************************************
void   TSC_ISR(void) __irq    //觸摸屏中斷例程
{
 static int i=1;

 rINTMSK |= 1<<31;     //ADC中斷的屏蔽
 rINTSUBMSK |=  1<<9 | 1<<10;  //TSC和ADC_S中斷屏蔽
 
 tsc_get();       //得到觸點(diǎn)坐標(biāo)
 
 if(demarcated==1)
 {
  Uart_Printf("第%4d個(gè)點(diǎn):x=%d,y=%d\n",i++,x_tsc,y_tsc);
  zhengfangxing(kx*x_tsc+bx,ky*y_tsc+by,12345);
 }
 else
  demarcate();
  
 Delay(200);   //防止起筆時(shí)抖動(dòng)
 rSUBSRCPND |= 1<<9;    //INT_TC清0
 rSRCPND |= 1<<31;     //INT_ADC清0
 rINTPND |= 1<<31;     //INT_ADC清0
 
 rINTMSK = rINTMSK & ~(1<<31);  //禁止ADC的屏蔽
 rINTSUBMSK = rINTSUBMSK & ~(1<<9); //禁止TSC的屏蔽
 rINTSUBMSK = rINTSUBMSK & ~(1<<10); //禁止ADC_S的屏蔽

}

//******************************************************************
void tsc_init(void)      //觸摸屏初始化
{
 rADCDLY= 0x9000;//必須要延時(shí)
 rADCCON = (PCLK/adc_frequency - 1)<<6 | 1<<14;//設(shè)置ADC頻率,預(yù)分頻有效
}

//讀取觸摸屏坐標(biāo)函數(shù)**************************************************
void tsc_get(void)
{
 U16 i,temporary;
 
 rADCCON = rADCCON & ~(7<<3) | 7<<3 ;     //選擇XP通道
 rADCTSC = (0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|1 ; //X測量模式:YM=Z, YP=AIN[5] ,XM=GND, XP=V, PULL_UP=DISABLE, NORMAL, X-position (ENABLE=GND/V)
 temporary=0;
 for(i=0;i<10;i++)
 {
  rADCCON|=0x1;               //啟動(dòng)ADC
  while(rADCCON & 0x1);           //等待啟動(dòng)
  while(!(rADCCON & 0x8000));         //等待是否轉(zhuǎn)換完畢
  temporary += rADCDAT0&0x3FF ;
 } 
 x_tsc=temporary/10;      //讀取十次,取平均值
         
 
 rADCCON = rADCCON & ~(7<<3) | 5<<3 ;     //選擇YP通道
 rADCTSC = (1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|2 ; //Y測量模式:YM=GND, YP=V ,XM=Z, XP=AIN[7], PULL_UP=DISENBLE, NORMAL, Y-position (DISABLE=AIN/Z)
 
 temporary=0;
 for(i=0;i<10;i++)
 {
  rADCCON|=0x1;             //啟動(dòng)ADC
  while(rADCCON & 0x1);         //等待啟動(dòng)
  while(!(rADCCON & 0x8000));        //等待是否轉(zhuǎn)換完畢
  temporary+=rADCDAT1&0X3FF;
 }
 y_tsc=temporary/10;     //得到轉(zhuǎn)換結(jié)果
 
 tsc_int_init();      //觸摸屏中斷初始化
 Delay(10);
 
 while(!((rADCDAT0 & 0X8000) & (rADCDAT1 & 0X8000) ));//等待筆尖抬起
}

//*********************************************************************
void lcd_init(void)
{
 rGPCUP=0XFFFFFFFF;
 rGPDUP  = 0xffffffff;
 rGPCCON = 0xAAAAAAAA;         //LCD功能
 rGPDCON = 0xAAAAAAAA;         //LCD功能
 rGPGCON = rGPGCON & ~(3<<8) | 3<<8 ;     //LCD電源功能
 
 rLCDCON1 =0;
 rLCDCON1 = rLCDCON1 & ~(0x3ff<<8) | CLKVAL<<8 ;   //LCD頻率
 rLCDCON1 = rLCDCON1 & ~(0x3<<5) | PNRMODE<<5 ;   //顯示模式
 rLCDCON1 = rLCDCON1 & ~(0xc<<1) | BPPMODE<<1 ;   //BPP模式(每個(gè)像素用幾位表示)
 rLCDCON1 = rLCDCON1 & ~(1) | 0 ;     //關(guān)閉輸出
 
 rLCDCON2 = rLCDCON2 & ~(0xff<<24) | VBPD<<24 ;   //與LCD屬性一致
 rLCDCON2 = rLCDCON2 & ~(0x3ff<<14) | (LINEVAL)<<14 ; //垂直尺寸
 rLCDCON2 = rLCDCON2 & ~(0xff<<6) | VFPD<<6 ;   //與LCD屬性一致
 rLCDCON2 = rLCDCON2 & ~(0x3f) | VSPW ;     //與LCD屬性一致
 
 rLCDCON3 = rLCDCON3 & ~(0x7f<<19) | HBPD<<19 ;   //與LCD屬性一致
 rLCDCON3 = rLCDCON3 & ~(0x7ff<<8) | (HOZVAL)<<8 ;  //水平尺寸
 rLCDCON3 = rLCDCON3 & ~(0xff) | HFPD ;     //與LCD屬性一致
 
 rLCDCON4 = rLCDCON4 & ~(0xff00) |(13<<8) ;
 rLCDCON4 = rLCDCON4 & ~(0xff) | HSPW ;     //與LCD屬性一致
 
 rLCDCON5 = rLCDCON5 & ~(1<<11) | FRM565<<11 ;   //模式:565或5551
 rLCDCON5 = rLCDCON5 |(1<<8) ;
 rLCDCON5 = rLCDCON5 & ~(1<<3) | PWREN<<3 ;    //供電引腳使能 ( GPG4 )
 rLCDCON5 = rLCDCON5 & ~(1<<1) | BSWP ;     //字節(jié)是否交換


 rLCDSADDR1 = rLCDSADDR1 & ~(0x1ff<<21) | ( ( (U32)pixel>>22 )&0x1ff )<<21 ;       //緩存區(qū)首地址高位[30:22]->rLCDSADDR1[29:21]
 rLCDSADDR1 = rLCDSADDR1 & ~(0x1fffff) | ( (U32)pixel>>1 )&0x1fffff ;        //緩存區(qū)首地址低位[21:1]->rLCDSADDR1[20:0]
 
 rLCDSADDR2 = rLCDSADDR2 & ~(0x1fffff) | ( ((U32)pixel+(LINEVAL+1)*(HOZVAL+1)*2)>>1 )&0x1fffff ;    //緩存區(qū)(尾地址+1)低位[21:1]->rLCDSADDR2[20:0]
 
 rLCDSADDR3 = rLCDSADDR3 & ~(0x7ff<<11) |OFFSIZE<<11 ;            //虛擬屏幕偏移長度
 rLCDSADDR3 = rLCDSADDR3 & ~(0x7ff) | PAGEWIDTH ;             //虛擬屏幕寬度

 rLCDCON1 = rLCDCON1 & ~(1) | ENVID ;                //開啟輸出,這個(gè)要最后做,不然有問題
}


 
 void LcdClearScr(U16 c)//lcd 清屏函數(shù)
{
 unsigned int x,y;
 for (y=0;y<SCR_YSIZE;y++)
 {
  for(x=0;x<SCR_XSIZE;x++)
   pixel[y][x]=c;
 }
}
/*未用到************************************************************
U8 make_pixel(U16 x,U16 y,U32 color)
{
 if(x<SCR_XSIZE && y<SCR_YSIZE)
 {
  pixel[y][x] = color;
  return 1;
 }
 else return 0;
}
*/
//*矩形填充*********************************************************
void rectangle(U16 x1,U16 x2,U16 y1,U16 y2,U32 color)
{
 U16 x;
 for(;y1<=y2;y1++)
    for(x=x1;x<=x2;x++)
     if(x>=0&&x<SCR_XSIZE&&y1>=0&&y1<SCR_YSIZE)
         pixel[y1][x] = color;
}
//此函數(shù)只是簡單的調(diào)用了另一個(gè)函數(shù),有存在的必要嗎********************
void zhengfangxing(short x,short y,U32 color)
{
 if(x<0|y<0)
 {
  Uart_Printf("\nx=%d;y=%d\n",x,y);
  return;
 }
 rectangle(x-10,x+10,y-10,y+10,color);
}

//*******************************************************************
 void Delay(unsigned int x)       
{
  unsigned int i,j,k;
  for(i=0;i<=x;i++)
    for(j=0;j<0xff;j++)
      for(k=0;k<0xff;k++);
}

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
s3c2440 LCD及觸摸屏的學(xué)習(xí)筆記(2)
FL2440無操作系統(tǒng)應(yīng)用程序編寫測試010——TFTLCD
stm32 UCGUI 完美移植-Changing's Blog
觸摸屏
移植ucgui到s3c2410十大步
稱重計(jì)程序
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服