📄 chumo1.c
字号:
//程序来源于 www.51hei.com
#include"hx8347.h" //自己编写的液晶屏头文件,此头文件只定义了一些基本变量,不涉及驱动相关函数
//定义引脚高低电平
#define ADS_DCLK_H() GPIO_SetBits(GPIOB,GPIO_Pin_6)//ADS7846时钟信号
#define ADS_DCLK_L() GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define ADS_CS_H() GPIO_SetBits(GPIOB,GPIO_Pin_7)//ADS7846片选信号
#define ADS_CS_L() GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define ADS_DIN_H() GPIO_SetBits(GPIOB,GPIO_Pin_8)
#define ADS_DIN_L() GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define ADS_DOUT GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)
#define ADS_PEN GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)////ADS7846响应信号
//初始化I/O口
void ADS_GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void ADS_Spi_Start()//初始信号
{
ADS_CS_H();
ADS_DCLK_H();
ADS_DIN_H();
}
void ADS_Write_Byte(u8 num)
{
u8 count=0;
ADS_DCLK_L();
for(count=0;count<8;count++)
{
if(num&0x80)
ADS_DIN_H();
else
ADS_DIN_L();
num<<=1;
ADS_DCLK_L();
ADS_DCLK_H(); //上升沿有效
}
}
u16 ADS_Readdata()
{
u16 num;
u8 count;
for(count=0;count<12;count++)
{
num<<=1;
ADS_DCLK_H();
ADS_DCLK_L();
if(ADS_DOUT)
num++;
}
return num;
}
#define CMD_RDX 0X90 //0B10010000即用差分方式读X坐标
#define CMD_RDY 0XD0 //0B11010000即用差分方式读Y坐标
u16 X=0,Y=0;//当前触控坐标
u8 Readonce()
{
ADS_Spi_Start();
ADS_CS_L();
ADS_Write_Byte(CMD_RDX);
ADS_DCLK_H();
delay_us(3);
ADS_DCLK_L();
delay_us(3);
Y=ADS_Readdata();
ADS_Write_Byte(CMD_RDY);
ADS_DCLK_H();
delay_us(1);
ADS_DCLK_L();
delay_us(1);
X=ADS_Readdata();
ADS_CS_H();
if(X>100&&Y>100&&X<3800&&Y<3800)return 1;//读取成功(范围限制)
else return 0;//读取失败
}
void drawbigpoint(u8 x,u16 y,u16 col)
{
if(x>220&&y<9)
{
LCD_DrawBlock(0,0,239,319,0x0000);//清屏
LCD_write_english_string(210,0,"CLR",0xFFE0,0x001F);//清屏按键区域
}
else
{
LCD_Set_Point(x,y,col);//中心点
LCD_Set_Point((x+1),y,col);
LCD_Set_Point(x,(y+1),col);
LCD_Set_Point((x+1),(y+1),col);
}
}
//读取ADS7846(画线)
void Read_Ads7846(void)
{
u8 t,t1,count=0;
u16 databuffer[2][10]={{5,7,9,3,2,6,4,0,3,1},{5,7,9,3,2,6,4,0,3,1}};//数据组
u16 temp=0;
//循环读数10次
do
{
t=ADS_PEN; //触摸屏被按下,PEN为L
if(Readonce()) //读数成功
{
databuffer[0][count]=X;
databuffer[1][count]=Y;
count++;
}
}
while(!t&&count<10);
if(count==10)//读10次数据有效
{
//X升序排列
do
{
t1=0;
for(t=0;t<count-1;t++)
{
if(databuffer[0][t]>databuffer[0][t+1])//升序排列
{
temp=databuffer[0][t+1];
databuffer[0][t+1]=databuffer[0][t];
databuffer[0][t]=temp;
t1=1;
}
}
}
while(t1);
do//Y升序排列
{
t1=0;
for(t=0;t<count-1;t++)
{
if(databuffer[1][t]>databuffer[1][t+1])//升序排列
{
temp=databuffer[1][t+1];
databuffer[1][t+1]=databuffer[1][t];
databuffer[1][t]=temp;
t1=1;
}
}
}
while(t1);
X=(databuffer[0][3]+databuffer[0][4]+databuffer[0][5])/3;
Y=(databuffer[1][3]+databuffer[1][4]+databuffer[1][5])/3;
//根据触摸屏的具体参数设置
if(X<=4000&&Y<=4000)
{
if(X>=240)
X-=240;
else X=0;
if(Y>=320)
Y-=320;
else Y=0;
drawbigpoint(X/15,Y/11+10,BLUE);
}
}
}
void EXTI1_IRQHandler(void)
{
u8 t=0;
//消除抖动
do
{
delay_us(10);
t=ADS_PEN;
Read_Ads7846();
}
while(t==0);
EXTI_ClearITPendingBit(EXTI_Line1);
}
//中断优先级管理/开启
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
//存储器映射
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//优先级分到第0组 总共5组
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQChannel; //使用外部中断1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//阶级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//外部中断初始化
void EXTI_Configuration(void)//配置外部中断
{
EXTI_InitTypeDef EXTI_InitStructure; //声明中断库函数结构体
EXTI_InitStructure.EXTI_Line = EXTI_Line1; //外部中断通道1
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10); //设置外部中断通道1到PB10
}
//END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -