S3C2440-触摸屏

程序仍在调试中

#include "2440addr.h" #include "Font_Libs.h" //垂直同步信号的脉宽、后肩和前肩 #define VSPW 15 #define VBPD 3 #define VFPD 5 //水平同步信号的脉宽、后肩和前肩 #define HSPW 8 #define HBPD 58 #define HFPD 15 #define CLKVAL 10 #define HOZVAL 319 #define LINEVAL 239 #define PWREN 1 #define MMODE 0 #define PNRMODE 3 #define BPPMODE 13 #define INVVCLK 0 #define INVVD 0 #define INVVDEN 0 #define U32 unsigned int #define M5D(n) ((n) & 0x1fffff) #define PAGEWIDTH 320 #define OFFSIZE 0 #define LCD_XSIZE 320 #define LCD_YSIZE 240 #define SCR_XSIZE 320 #define SCR_YSIZE 240 #define INVVLINE 1 #define INVVFRAME 1 #define BPP24BL 0 #define BSWP 0 #define HWSWP 0 #define U32 unsigned int #define U8 unsigned char unsigned char iic_buffer[8]; U32 length, A, B, C, D, E, F, K, FlagTc, xx , yy, i; U32 x[3], y[3]; unsigned char add, word; int cmd, flag, count, command, fuck, fucker; volatile U32 LCD_BUFFER[240][320]; volatile int xdata, ydata; void delay(int a) { int k; for(k=0;k<a;k++) ; } void Paint_background(U32 c){ unsigned int i, j; for(j = 0; j < LCD_YSIZE; j++) for(i = 0; i < LCD_XSIZE; i++) LCD_BUFFER[j][i] = c; } void DrawCircle(U32 x, U32 y, U32 r, U32 c){ int i, j; for(j = 0; j < LCD_YSIZE; j++) for(i = 0; i < LCD_XSIZE; i++){ if(((i-x)*(i-x)+(j-y)*(j-y))< r*r) LCD_BUFFER[j][i] = c; } } void __irq ADC_ISR(void){ //rADCDLY = 500000; if(rSUBSRCPND&(0x1<<9)){ if(rADCDAT0 & 0x8000){ DrawCircle(200, 200, 5, 0xFF0000); rADCTSC = 0xd3; } else{ //Paint_background(0xff0000); DrawCircle(100, 100, 5, 0xFF0000); FlagTc = 1; rADCTSC &= 0xf0; rADCTSC |= (0x1<<3)|(0x1<<2); //设置自动转换模式,上拉禁止,无操作模式 rADCDLY = 500000; rADCCON |= 0x1; } } else if(rSUBSRCPND&(0x1<<10)){ DrawCircle(150, 150, 5, 0x0); fuck = 1; xdata = rADCDAT0&0x3ff; ydata = rADCDAT1&0x3ff; rADCTSC = 0xd3; rADCTSC |= 0x1<<8; } rSUBSRCPND |= 0x1<<9; rSUBSRCPND |= 0x1<<10; rINTSUBMSK &= ~((0x1<<9)|(0x1<<10)); rINTPND |= 0x1<<31; rSRCPND |= 0x1<<31; rINTMSK &= ~(0x1<<31); } void __irq IIC_ISR(void){ rSRCPND |= 0x1<<27; rINTPND |= 0x1<<27; flag = 0; } void wrat24c02(unsigned char add,unsigned char word, U32 length){ int i; flag = 1; Paint_background(0xff0000); rIICDS = 0xa0; //dev add rIICCON &= ~(0x1<<4); //清中断 rIICSTAT = 0xf0; //主发送模式,写开始信号输出,IIC Rx/Tx使能 //等待ACK,接收器在接受到8位数据后,在第9个时钟周期,拉低SDA电平,然后会产生中断 while(flag == 1) delay(100); flag = 1; rIICDS = word; //word add 发送要写入的数据的内存其实地址 rIICCON &= ~(0x1<<4); while(flag) delay(100); //注意要有delay for(i = 0; i < length; i++){ flag = 1; rIICDS = iic_buffer[i]; rIICCON &= ~(0x1<<4); while(flag) delay(100); } rIICCON = 0xe0; //IIC应答有效,IICCLK=fpclk/512,IIC接受发送中断使能位 rIICSTAT = 0xd0; //主发送模式,rIICCON和rIICSTAT配置好,方便下次使用 } void rdat24c02(unsigned char add, unsigned char word, U32 length){ int i; char temp; flag = 1; rIICDS = add; //dev add rIICCON &= ~(0x1<<4); rIICSTAT = 0xf0; while(flag) delay(100); flag = 1; rIICDS = word; //word add rIICCON &= ~(0x1<<4); while(flag) delay(100); flag = 1; //这里的IIC的随机读操作,根据IIC的随机读时序,先发启动,要读取的设备地址和写的内存地址,方向是写,即0,重启IIC, //发要读取的设备地址,这次方向是读,然后接到ACK,从机向主机发data,主机相应ACK,直到最后一个data,主机不相应ACK, //发送停止信号 rIICDS = add; //dev add rIICSTAT = 0xb0; //改变方向为主接收 rIICCON &= ~(0x1<<4); while(flag) delay(100); flag = 1; temp = rIICDS; rIICCON &= ~(0x1<<4); while(flag) delay(100); for(i = 0; i < length; i++){ flag = 1; if(i == (length - 1)){ rIICCON &= ~(0x1<<7); } iic_buffer[i] = rIICDS; rIICCON &= ~(0x1<<4); while(flag) delay(100); } rIICCON = 0xd0; rIICSTAT = 0x90; delay(200); } void Init_LCD(){ rLCDCON1=(CLKVAL<<8)|(MMODE<<7)|(PNRMODE<<5)|(BPPMODE<<1)|0; //设置CLKVAL,VCLK=HCLK/[(CLKVAL+1)*2],决定VM的触发方式,选择显示模式和BPP模式,暂时不要开启LCD,因为还没有设置好 rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW); //rLCDCON2,rLCDCON3和rLCDCON4主要设置时序 rLCDCON3=(HBPD<<19)|(HOZVAL<<8)|(HFPD); rLCDCON4=(HSPW); rLCDCON5 = (BPP24BL<<12) | (INVVCLK<<10) | (INVVLINE<<9) | (INVVFRAME<<8) | (0<<7) | (INVVDEN<<6) | (PWREN<<3) |(BSWP<<1) | (HWSWP); //INVVLINE和INVVFRAME需要进行翻转,因为CPU发出的是正脉冲,LCD使用的是负脉冲,所以要改变极性,PWREN使能电源信号 rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1); rLCDSADDR2=M5D(((U32)LCD_BUFFER+(SCR_XSIZE*SCR_YSIZE*4))>>1 ); rLCDSADDR3=PAGEWIDTH*32/16; rLCDINTMSK|=(3); rTCONSEL = 0; rGPCUP = 0x0; rGPDCON = 0xaaaaaaaa; rGPCCON = 0xaaaa02a9; rGPDUP = 0x0; rGPGUP=rGPGUP&(~(1<<4))|(1<<4); rGPGCON=rGPGCON&(~(3<<8))|(3<<8); rLCDCON1 |= 1; //使能数据输出和LCD控制信号 } void DrawCross(U32 x, U32 y, U32 c){ int i; for(i = x - 15; i < x + 16; i++) LCD_BUFFER[i][y] = c; for(i = y - 15; i < y + 16; i++) LCD_BUFFER[x][i] = c; } void Paint_Ascii(U32 x, U32 y, U32 color, unsigned char ch[]){ int i, j, test; for(i = 0; i < 16; i++){ test = 0x80; for(j = 0; j < 8; j++){ if(test & ch[i]) LCD_BUFFER[x+i][y+j] = color; test >>= 1; } } } void WtIic(U32 data, U32 wordadd){ iic_buffer[0] = (U8)(data&0xff); iic_buffer[1] = (U8)((data>>8)&0xff); iic_buffer[2] = (U8)((data>>16)&0xff); iic_buffer[3] = (U8)((data>>24)&0xff); wrat24c02(0xa0,wordadd,4); } U32 rdIic(U32 wordadd){ U32 data; rdat24c02(0xa0,wordadd,4); data = iic_buffer[0]|(iic_buffer[1]<<8)|(iic_buffer[2]<<16)|(iic_buffer[3]<<24); return data; } void revise(){ int i; DrawCross(24,32,0xFF00FF); Paint_Ascii(32, 40, 0xFF00FF, &__ASCII['1'*16]); DrawCross(210,160,0xFF00FF); Paint_Ascii(218, 168, 0xFF00FF, &__ASCII['2'*16]); DrawCross(120,288,0xFF00FF); Paint_Ascii(128, 296, 0xFF00FF, &__ASCII['3'*16]); for(i = 0; i < 3; i++){ while(FlagTc == 0) delay(500); //Paint_background(0xff0000); x[i] = xdata; y[i] = ydata; FlagTc = 0; //if(i == 0)Paint_background(0xff0000); //if(i == 2)Paint_background(0x0); } //Paint_background(0xff0000); /*K = (x[0]-x[2])*(y[1]-y[2])-(x[1]-x[2])*(y[0]-y[2]); A = (24-120)*(y[1]-y[2])-(210-120)*(y[0]-y[2]); B = (x[0]-x[2])*(210-120)-(24-120)*(x[1]-x[2]); C = y[0]*(x[2]*210-x[1]*120)+y[1]*(x[0]*120-x[2]*24)+y[2]*(x[1]*24-x[0]*210); D = (32-288)*(y[1]-y[2])-(160-288)*(y[0]-y[2]); E = (x[0]-x[2])*(160-288)-(32-288)*(x[1]-x[2]); F = y[0]*(x[2]*160-x[1]*288)+y[1]*(x[0]*288-x[2]*32)+y[2]*(x[1]*32-x[0]*160);*/ K=(x[0]-x[2])*(y[1]-y[2])-(x[1]-x[2])*(y[0]-y[2]); A=(32-288)*(y[1]-y[2])-(160-288)*(y[0]-y[2]); B=(x[0]-x[2])*(160-288)-(32-288)*(x[1]-x[2]); C=y[0]*(x[2]*160-x[1]*288)+y[1]*(x[0]*288-x[2]*32)+y[2]*(x[1]*32-x[0]*160); D=(24-120)*(y[1]-y[2])-(210-120)*(y[0]-y[2]); E=(x[0]-x[2])*(210-120)-(24-120)*(x[1]-x[2]); F=y[0]*(x[2]*210-x[1]*120)+y[1]*(x[0]*120-x[2]*24)+y[2]*(x[1]*24-x[0]*210); // } int Main(){ count = 0; fuck = 0; Init_LCD(); rSRCPND |= (0x1<<31)|(0x1<<27); rINTPND |= (0x1<<31)|(0x1<<27); rINTMSK &= ~((0x1<<31)|(0x1<<27)); rSUBSRCPND |= (0x1<<9)|(0x1<<10); rINTSUBMSK &= ~((0x1<<9)|(0x1<<10)); rADCTSC = 0xd3; rADCDLY = 50000; rADCCON = (1<<14)|(10<<9); rGPECON = 0xa0000000; rGPEUP = 0xc000; rIICCON = 0xe0; rIICSTAT = 0x10; pISR_ADC = (U32)ADC_ISR; pISR_IIC = (U32)IIC_ISR; Paint_background(0xffffff); for(i = 0; i < 8; i++) iic_buffer[i] = 0xff; revise(); /*rdat24c02(0xa0,0x0,1); //revise(); if(iic_buffer[0] != 0xc7){ revise(); //Paint_background(0x0); //Paint_background(0xff0000); iic_buffer[0] = 0xc7; wrat24c02(0xa0,0x0,1); Paint_background(0xff0000); WtIic(A,0x10); delay(500); WtIic(B,0x20); delay(500); WtIic(C,0x30); delay(500); WtIic(D,0x40); delay(500); WtIic(E,0x50); delay(500); WtIic(F,0x60); delay(500); } else{ A = rdIic(0x10); delay(500); B = rdIic(0x20); delay(500); C = rdIic(0x30); delay(500); D = rdIic(0x40); delay(500); E = rdIic(0x50); delay(500); F = rdIic(0x60); delay(500); }*/ //Paint_background(0x0); delay(9999); Paint_background(0xffffff); while(1){ if(FlagTc == 1){ //delay(10000); xx = (A * xdata + B * ydata + C) / K; yy = (D * xdata + E * ydata + F) / K; DrawCircle(xx, yy, 5, 0xFF0000); FlagTc = 0; } delay(100000); } /* while(1){ if(FlagTc == 1){ xx = (A * xdata + B * ydata + C) / K; yy = (D * xdata + E * ydata + F) / K; DrawCircle(xx, yy, 5, 0xFF0000); FlagTc = 0; } delay(1000000); }*/ //while(1); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值