📄 touch.c
字号:
#include <iom128.h>
#include <stdio.h>
#include <macros.h>
#include "touch.h"
#include "lcd.h"
#define DELAY_TOUCH 200
struct Touch cursor;
unsigned int x=0;
unsigned char y=0;
/*
mega128单片机驱动ADS7846/ADS7843芯片
ADS7846/7843芯片 适合用在4线制触摸屏,它通过标准SPI协议和CPU通信,操作简单,精度高当
触摸屏被按下时(即有触摸事件发生)则ADS7846向CPU发中断请求,CPU接到请求后,
应延时一下再响应其请求,目的是为了消除抖动使得采样更准确。如果一次采样不准确。
ADS7846 触摸屏中断 外部中断6(INT6)
DCLK PE7
TCS PB0
DIN PB1
DOUT PB2
*/
void Init_Touch(void)
{
PORTB |= 0x01; //TCS片选信号置高
DDRE |= 0x80;
DDRB |=0x03;
//DCLK TCS DIN 为输出;
DDRB &=~0x04; //DOUT为输入;
PORTB &=~ 0x01;
}
/**********************************************************************
延时程序
**********************************************************************/
void delay(unsigned int i)
{
while(i--);
}
//======================================================================
void Delay(unsigned char n)
{
unsigned char i;
unsigned int j;
for(i=0;i<n;i++)
{
for (j=0;j<65535;j++)
{};
}
}
//==================================================================
void WriteCharTo7843(unsigned char num) //SPI写数据
{
unsigned char count=0;
DCLK_0;
delay(DELAY_TOUCH);
for(count=0;count<8;count++)
{
if(num&0x80)
{
DIN_1;
}
else
{
DIN_0;
}
num<<=1;
delay(DELAY_TOUCH);
DCLK_1;
delay(DELAY_TOUCH); //上升沿有效
DCLK_0;
delay(DELAY_TOUCH);
}
DIN_0;
}
//==================================================================
unsigned int ReadFromCharFrom7843(void) //SPI 读数据
{
unsigned char count=0;
unsigned int Num=0;
for(count=0;count<8;count++)
{
Num<<=1;
DCLK_0;
delay(DELAY_TOUCH); //下降沿有效
DCLK_1;
delay(DELAY_TOUCH);
if(DOUT) Num++;
}
return(Num);
}
//==================================================================
#pragma interrupt_handler Touch:8
void Touch(void)//外部中断0 用来接受键盘发来的数据
{
unsigned long temp;
unsigned char i;
unsigned int m=0,n=0;
CLI();//关中断
// Clear_Lcd(YELLOW);
//DDRE |= 0x20;//BELL位输出
//PORTE &=~ 0x20;//BELL输出为低,蜂鸣器响
//x=cursor.x;
// y=cursor.y;
// cursor.old_x = cursor.x;
// cursor.old_y = cursor.y;
PORTB &=~0x01; //TCS片选信号为低
delay(DELAY_TOUCH);
WriteCharTo7843(0x90); //送控制字 10010000 即用差分方式读Y坐标 详细请见有关资料
delay(DELAY_TOUCH);
DCLK_1;
delay(DELAY_TOUCH);
DCLK_0;
delay(DELAY_TOUCH);
cursor.y=ReadFromCharFrom7843();
WriteCharTo7843(0xD0); //送控制字 11010000 即用差分方式读X坐标 详细请见有关资料
DCLK_1;
delay(DELAY_TOUCH);
DCLK_0;
delay(DELAY_TOUCH);
cursor.x=ReadFromCharFrom7843();
y=cursor.y;
x=cursor.x;
PORTB |= 0x01; //TCS片选信号置高
delay(DELAY_TOUCH);
if(cursor.x>=15)
{
temp = cursor.x-15;
}
else
{
temp = 0;
}
cursor.x = temp*320/224;
if(cursor.x>320)
{
cursor.x = 320;
}
if(cursor.y>= 15)
{
temp = cursor.y-15;
}
else
{
temp = 0;
}
cursor.y = temp*240/221;
if(cursor.y > 240)
{
cursor.y = 240;
}
cursor.flag = 1;
//PORTE |= 0x20;//BELL输出为高,蜂鸣器关
for(i=0;i<6;i++)
{
delay(65535);
}
EIFR |= 0x40;
SEI();//开中断
}
/***********************************************************************
触摸屏校准程序
************************************************************************/
void touch_calibration(void)
{
//unsigned char i,j;
Dis_Rect(200,200,4,4,BLACK);
if(cursor.flag==1)
{
if((cursor.x>=200)&&(cursor.x<=204)&&(cursor.y>=200)&&(cursor.y<=204))
{Display(40,40,"OK",BIG,BLACK,WHITE);}
}
}
/****************************************************************************
*******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -