📄 tchscr.c
字号:
#include "../inc/drivers.h"
#include "../inc/lib.h"
#include "../inc/gpio.h"
#include "../inc/spi.h"
#include <stdio.h>
#define DPRINTF(...) //printfNULL
#define ADS7843_PIN_PEN (GPIO_MODE_IN | GPIO_PULLUP_EN | GPIO_F5)
#define ADS7843_PIN_CS (GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_G12)
/*the Control Bits in the Control Byte.*/
#define ADS7843_CTRL_START 0x80
#define ADS7843_GET_X 0x50
#define ADS7843_GET_Y 0x10
#define ADS7843_CTRL_12MODE 0x0
#define ADS7843_CTRL_8MODE 0x8
#define ADS7843_CTRL_SER 0x4
#define ADS7843_CTRL_DFR 0x0
#define ADS7843_CTRL_DISPWD 0x3 // Disable power down
#define ADS7843_CTRL_ENPWD 0x0 // enable power down
#define ADS7843_CMD_X (ADS7843_CTRL_START|ADS7843_GET_X|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
#define ADS7843_CMD_Y (ADS7843_CTRL_START|ADS7843_GET_Y|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
#define enable_7843() write_gpio_bit(ADS7843_PIN_CS, 0)
#define disable_7843() write_gpio_bit(ADS7843_PIN_CS, 1)
#define ADS7843_SPI_CHANNEL 0
//#define GPFCON (*(volatile unsigned *)0x56000050)
//#define GPFUP (*(volatile unsigned *)0x56000058)
#define LCDWIDTH 640
#define LCDHEIGHT 480
int TchScr_Xmin=138,TchScr_Xmax=842,
TchScr_Ymin=251,TchScr_Ymax=841;
void TchScr_init()
{ /*端口G12配成输出、关闭上拉模式*/
set_gpio_ctrl(ADS7843_PIN_CS);
/*端口G12输出1即使能ADS7843的片选*/
write_gpio_bit(ADS7843_PIN_CS, 1);
/*配置SPI总线、使用通道0*/
SPI_initIO(ADS7843_SPI_CHANNEL);
/*询检模式、使能SCK、主模式、format A、设置波特率*/
Set_SIO_mode(ADS7843_SPI_CHANNEL, SPCON_SMOD_POLL |
SPCON_ENSCK | SPCON_MSTR |SPCON_CPOL_HIGH |
SPCON_CPHA_FMTA, 33, 2, NULL, NULL, NULL);
/*配置GPF5为输入*/
//GPFCON=GPFCON&0xf3ff;
/*GPF5上拉使能*/
//GPFUP=GPFUP&0xdf;
set_gpio_ctrl(ADS7843_PIN_PEN);//功能同上面注释的两句即配置GPF5为输入、GPF5上拉使能
}
#define CLOCK_DELAY() do{int i; for(i=0; i<10; i++);}while(0)
/**************************************************************
*功能:采集触摸点的x、y坐标,并进行坐标变换,x、y坐标分
* 别采样四次取平均值,坐标变换公式
* x=(x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
* y=(y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
* TchScr_Xmin:触摸屏X轴方向最小值
* TchScr_Xmax:触摸屏X轴方向最大值
* TchScr_Ymin:触摸屏Y轴方向最小值
* TchScr_Ymax:触摸屏Y轴方向最大值
* LCDWIDTH:lcd宽
* LCDHEIGHT:lcd高
*参数:*x,*y-输出的x、y坐标
***************************************************************/
//每发一次读命令等待8个时钟(发一个数据位0的数据)便读取12位数据,在第读取低5位数据的时候,同时发送了下一次的读命令。
void TchScr_GetScrXY(int *x, int *y)
{
unsigned int temp;
enable_7843();//使能ADS7843片选
SPISend (ADS7843_CMD_X, ADS7843_SPI_CHANNEL);//发送控制命令,详见ADS7843第8页
temp=SendReadData(0, ADS7843_SPI_CHANNEL);//发一个数据0,意在等待8个时钟,同时返回读取的数据
temp<<=5;//数据高七位
temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);//高七位|数据低五位,发下一次的数据的控制命令
*x=temp;//x轴的12位数据
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL) >>3);
*x+=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_X, ADS7843_SPI_CHANNEL)>>3);
*x+=temp;
temp=SendReadData(0,ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL)>>3);
*x+=temp;
*x>>=4; //x=x/4/4; change to 10bit
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL) >>3);
*y=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL) >>3);
*y+=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(ADS7843_CMD_Y, ADS7843_SPI_CHANNEL) >>3);
*y+=temp;
temp=SendReadData(0, ADS7843_SPI_CHANNEL);
temp<<=5;
temp|= (SendReadData(0, ADS7843_SPI_CHANNEL)>>3);
*y+=temp;
*y>>=4; //y=y/4/4;
/*坐标变换*/
*x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
*y=(*y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
disable_7843();//关闭ADS7843片选
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -