返回信息流最近要把单片机和触摸屏连接,用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;
}
}
这是一条镜像帖。来源:北邮人论坛 / circuit / #17701同步于 2011/7/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
PIC单片机和AD7843 求助!!![求助]
wy3434000
2011/7/4镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
【 在 sdupig 的大作中提到: 】
: 好像只有宏定义中有涉及到管脚呀?没钱买触摸屏只能做液晶屏的飘过
是啊 宏定义那看的不是很明白。。。求指点。。。呃 只是买那一张屏 同穷人。。。
你用的PIC32虽然内核是32的但管脚只有16位有效,把PI_DAT_LOW {PORTB&=0X07F}
0x07F就是0000 0111 1111(12位前边缺4位自动补0),也就是把PORTB那组的管脚电压与0000 0111 1111相与后定义为PI_DAT_LOW...菜鸟的理解请轻拍。
【 在 wy3434000 的大作中提到: 】
: : 好像只有宏定义中有涉及到管脚呀?没钱买触摸屏只能做液晶屏的飘过
: 是啊 宏定义那看的不是很明白。。。求指点。。。呃 只是买那一张屏 同穷人。。。
: --
: ...................
【 在 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该如何定义。同彩笔~