用ARM驱动触摸屏,中断方式<br />打印到串口终端的信息如下:<br /><br />Test Touch Screen...<br />HandlerIRQ...<br />Select IRQ function...<br />HandlerTC...<br />Auto xy mode...<br /> 鎬<br /><br />显示已经跳转到HandlerTC子函数,也进入了自动xy模式.<br />可是怎么就死了呢?<br /><br />有时候多按几下复位键,又能够读出xy坐标:<br />Test Touch Screen...<br />HandlerIRQ...<br />Select IRQ function...<br />HandlerTC...<br />Auto xy mode...<br />HandlerADC...<br />X=0287 Y=0316 <br /><br />很奇怪,不知道是哪里出错了<br />贴上自己的程序:<br /><br />#define ISR_ADC_OFT 31<br /><br />void HandlerTC(void)<br />{<br /> //Disable TC intrrupt<br /> rSUBSRCPND |= (1<<9);<br /> rSRCPND |= (0x8000);<br /> rINTPND |= (0x8000);<br /> <br /> UartSendString("HandlerTC...");<br /><br /> if(rADCDAT0 & 0x8000)<br /> {<br /> rADCTSC = (1<<7) | (1<<6) | (1<<4) | (3);<br /> UartSendString("wait intrrupt mode...");<br /> }<br /> else<br /> {<br /> //AUTO_PST = 1, PULL_UP = 1,XY_PST = 0<br /> rADCTSC = (1<<3) | (1<<2);<br /> UartSendString("Auto xy mode...");<br /> rADCCON |= 1;//ADC start<br /> }<br />}<br /><br />void HandlerADC(void)<br />{ <br /> //Disable ADC intrrupt<br /> rSUBSRCPND |= (1<<10);<br /> rSRCPND |= (0x8000);<br /> rINTPND |= (0x8000);<br /> <br /> UartSendString("HandlerADC...");<br /> SEND_XY_VALUE;<br /><br /> rADCTSC = (1<<7) | (1<<6) | (1<<4) | (3);<br />}<br /><br />void TouchScrIntHandle(void)<br />{ <br /> UartSendString("Select IRQ function...");<br /> <br /> if(rSUBSRCPND & (1<<9))<br /> HandlerTC();<br /> else if(rSUBSRCPND & (1<<10))<br /> HandlerADC();<br /> else<br /> UartSendString("other interrupt occur...");<br />}<br /><br />void SysClkSet(void)<br />{<br /> //Fin = 12MHz, FCLK = 400MHz, FCLK:HCLK:PCLK = 1:4:4<br /> //FCLK = 400MHz,HCLK = 100MHz, PCLK = 100MHz;<br /> rMPLLCON = (42<<12) | (1<<4);//FCLK = 400MHz<br /> rCLKDIVN = (2<<1);//FCLK:HCLK:PCLK = 1:4:4<br />}<br /><br />void ADC_Init(void)<br />{<br /> isr_handle_array[ISR_ADC_OFT] = TouchScrIntHandle;<br /> rINTMSK &= ~(1<<31);//Enable ADC interrupt<br /> rINTSUBMSK &= ~(1<<9);//Enable INT_TC interrupt<br /> rINTSUBMSK &= ~(1<<10);//Enable INT_ADC_S interrupt<br /> //PRSCVL = 99, A/D CLK = PCLK / (PRSCVL + 1)= 1MHz<br /> rADCCON = (1<<14) | (99<<6);<br /> rADCDLY = 50000;<br /> <br /> //UD_SEN = 0, PULL_UP = 0, XP_SEN = 1, XM_SEN = 0<br /> //YP_SEN = 1, YM_SEN = 1, XY_PST = 3.<br /> rADCTSC = (1<<7) | (1<<6) | (1<<4) | (3);<br /><br /> //AUTO_PST = 1,<br /> //rADCTSC |= (1<<2);<br /><br /> //AUTO_PST = 1,<br /> //rADCDAT0 |= (1<<14);<br /> //rADCDAT1 |= (1<<14);<br />}<br /><br /><br />void LCD_Init(void)<br />{<br /> //I/O port Init,<br /> rGPCUP = 0xffffffff;// Disable pullup<br /> rGPCCON = 0xaaaaaaaa;// GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND <br /> rGPDUP = 0xffffffff;// Disable pullup<br /> rGPDCON = 0xaaaaaaaa;// GPIO管脚用于VD[23:8]<br /> rGPGUP = 0xffffffff;<br /> rGPGCON = (3<<8);//GPG4:LCD_PWREN<br /> <br /> //CLKVAL = 4, VCLK = HCLK / [(CLKVAL + 1) * 2] = 50MHz<br /> //PNRMODE = 0b11, TFT LCD<br /> //BPPMODE = 0b1100, 16BPP<br /> rLCDCON1 = (4<<8) | (3<<5) | (12<<1);<br /><br /> //VBPD = 1, LINEVAL = 320-1, VFPD = 5, VSPW = 1<br /> rLCDCON2 = (1<<24) | (319<<14) | (5<<6) | (1);<br /> <br /> //HBPD = 36, HOZVAL = 240-1, HPFD = 19,<br /> rLCDCON3 = (36<<19) | (239<<8) | (19);<br /><br /> //HSPW = 5,<br /> rLCDCON4 = 5;<br /><br /> //FRM565 = 1, INVVLINE = 1, INVVFRAME = 1, BSWP = 1<br /> rLCDCON5 = (1<<11) | (1<<9) | (1<<8) | (1<<1);<br /><br /> rLCDSADDR1 = ((LCDBUFFER>>22)<<21) | (0x1FFFFF & (LCDBUFFER>>1));<br /> rLCDSADDR2 = (0x1FFFFF) & ((LCDBUFFER + 240*320*2)>>1);<br /> rLCDSADDR3 = 120;<br />}<br /><br />void HandlerIRQ(void)<br />{<br /> unsigned long oft = rINTOFFSET;<br /><br /> UartSendString("HandlerIRQ...");<br /> <br /> //清中断<br /> if (oft == 4)<br /> rEINTPEND = 1<<7;<br /> rSRCPND = 1<<oft; <br /> rINTPND = rINTPND;<br /><br /> isr_handle_array[oft]();<br />}<br /><br />void Isr_Init(void)<br />{<br /> rINTMOD=0x0; // All=IRQ mode<br /> rINTMSK=BIT_ALLMSK; // All interrupt is masked.<br /><br /> pISR_IRQ = (int)HandlerIRQ;<br />}<br /><br /><br />int Main(void)<br />{<br /> unsigned int ADDR;<br /> SysClkSet();<br /> Isr_Init();<br /> UartInit();<br /> ADC_Init();<br /> LCD_Init();<br /> <br /> rTPAL |= (0xff);<br /> rTPAL |= (1<<24);<br /><br /> UartSendString("Test Touch Screen...");<br /><br /> for(;;)<br /> {<br /> ;<br /> }<br />}<br /> |
|