BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / circuit / #17701同步于 2011/7/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖

PIC单片机和AD7843 求助!!![求助]

wy3434000
2011/7/4镜像同步8 回复
最近要把单片机和触摸屏连接,用AD7843做,由于自己不是很懂,就边看别人的边学习的情况下写了这些, 但是对其中涉及的端口使用不是很懂,希望懂的大大指点。貌似里面还有错误,也请帮忙修改下,多谢了哈。 /* **touch.h ** */ #include<p32xxxx.h> #define SPI_DAT_LOW {PORTB&=0X07F;} //数据低电平 #define SPI_DAT_HIGHT {PORTC|=0X80;} //数据高电平 #define SPI_CLK_LOW {PORTB&=0X0DF;} //时钟低电平 #define SPI_CLK_HIGHT {PORTC|=0X20;} //时钟高电平 unsigned int ave_x; //全局变量ave_x unsigned int ave_y; //全局变量ave_y int num; //全局变量num void spi_write(char data); unsigned spi_read(void); unsigned int ad7843_x(void);//获得x值 unsigned int ad7843_y(void);//获取y值 unsigned int average(unsigned int value[10]);//进行数值校正 void final_data(void);//取得x、y校正后的数值 int input_num(int x,int y) ;//由x、y值大小判定输入数值 void process_input(int intput);//输入数值响应 void process(void);//输入数值分支 /* **touch.c ** */ #include<p32xxxx.h> #include"touch.h" void spi_write(char data) { int i = 7; unsigned int mask[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; for(; i >= 0; i--) { SPI_CLK_LOW; if( ((data & mask[i]) >> i) == 1) SPI_DAT_HIGHT else SPI_DAT_LOW; delay_ms(10); //等待数据稳定 SPI_CLK_HIGHT; delay_ms (10); } } unsigned spi_read(void) { char i; char j; unsigned int temp = 0; for(i=0;i<12;i++) { temp = temp<<1; SPI_CLK_HIGHT; SPI_CLK_LOW; j = DOUT; if(j) { temp++; } } return temp; } unsigned int ad7843_x(void) //获得x值 { spi_write(0x90); //将S标志位置1,表示使能传输 return spi_read(); } unsigned int ad7843_y(void) //获取y值 { spi_write (0x0d0); //将S标志位置1,表示使能传输 return spi_read(); } unsigned int average(unsigned int value[10]) //进行数值校正 { unsigned int max,min,i,ave=0,sum=0; max = value[0]; min = value[0]; for(i=0;i<10;i++) //比较法 确定最大值和最小值 { if(max<value[i]) max=value[i]; if(min>value[i]) min=value[i]; sum+=value[i]; } ave=(sum-min-max)/8; //求平均值 return ave; } void final_data(void) //取得x、y校正后的数值 { unsigned int x[10]={0}; unsigned int y[10]={0}; int i; for(i = 0;i<10;i++) { x[i] = ad7843_x(); y[i] = ad7843_y(); } unsigned int ave_x = average(x[10]); unsigned int ave_y = average(y[10]); } int input_num(int x,int y) //由x、y值大小判定输入数值 { int num; if( (x>=5 && x<=55) && (y>=5 && y<=55) ) num = 1; if( (x>=65 && x<=115) && (y>=5 && y<=45) ) num = 2; if( (x>=125 && x<=175) && (y>=5 && y<=45) ) num = 3; return num; } void process_input(int intput) //输入数值响应 { } void process(void) //输入数值分支 { switch(num) { case 1: process_input(1); break; case 2: process_input(2); break; case 3: process_input(3); break; case 4: process_input(4); break; case 5: process_input(5); break; case 6: process_input(6); break; case 7: process_input(7); break; case 8: process_input(8); break; case 9: process_input(9); break; case 0: process_input(0); break; default: break; } }
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
sdupig机器人#1 · 2011/7/4
好像只有宏定义中有涉及到管脚呀?没钱买触摸屏只能做液晶屏的飘过
w30215机器人#2 · 2011/7/4
lzid不错
wy3434000机器人#3 · 2011/7/5
【 在 sdupig 的大作中提到: 】 : 好像只有宏定义中有涉及到管脚呀?没钱买触摸屏只能做液晶屏的飘过 是啊 宏定义那看的不是很明白。。。求指点。。。呃 只是买那一张屏 同穷人。。。
wy3434000机器人#4 · 2011/7/5
【 在 w30215 的大作中提到: 】 : lzid不错 咕~~(╯﹏╰)b
shouwang机器人#5 · 2011/7/5
lz加油啊,希望在你身上啊!!
wy3434000机器人#6 · 2011/7/5
【 在 shouwang 的大作中提到: 】 : lz加油啊,希望在你身上啊!! 你个贱人。。。
sdupig机器人#7 · 2011/7/5
你用的PIC32虽然内核是32的但管脚只有16位有效,把PI_DAT_LOW {PORTB&=0X07F} 0x07F就是0000 0111 1111(12位前边缺4位自动补0),也就是把PORTB那组的管脚电压与0000 0111 1111相与后定义为PI_DAT_LOW...菜鸟的理解请轻拍。 【 在 wy3434000 的大作中提到: 】 : : 好像只有宏定义中有涉及到管脚呀?没钱买触摸屏只能做液晶屏的飘过 : 是啊 宏定义那看的不是很明白。。。求指点。。。呃 只是买那一张屏 同穷人。。。 : -- : ...................
wy3434000机器人#8 · 2011/7/5
【 在 sdupig 的大作中提到: 】 : 你用的PIC32虽然内核是32的但管脚只有16位有效,把PI_DAT_LOW {PORTB&=0X07F} : 0x07F就是0000 0111 1111(12位前边缺4位自动补0),也就是把PORTB那组的管脚电压与0000 0111 1111相与后定义为PI_DAT_LOW...菜鸟的理解请轻拍。 这个确实是,不过我的问题不在这里 。不过多谢哈 我不懂的地方是定义那个PORTB和PORTC是为什么 还有就是后面用到的DOUT该如何定义。同彩笔~