STM32F4 XPT2046觸摸屏 讀回來的值一直是0
主函數里面通過軟件模擬SPI進行了采樣,將值的顯示到LCD屏上
按壓屏幕就采樣賦值給K
然后循環顯示。
但是采樣值移植為0。
int main()
{
u16 k=5;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
LCD_Init();//內部有系統時鐘初始化
led_Init();//初始化LED
key_Init();//初始化LCD
My_RTC_Init(); //初始化RTC
uart_init(115200); //初始化串口波特率為115200
tp_dev.init(); //觸摸屏初始化
while(1)
{
if(PEN==0)
{
k=TP_Read_AD(0XD0);
}
if(key_Scan(0)==1)k=5;
LCD_ShowNum(100,100,k,4,24);
}
}
u8 TP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOB,C,F時鐘
//GPIOB1,2初始化設置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;//PB1/PB2 設置為上拉輸入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PB0設置為推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//PC13設置為推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//輸出模式
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PF11設置推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//輸出模式
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化
// TP_Read_XY(&tp_dev.x[0],&tp_dev.y[0]);//第一次讀取初始化
// if(TP_Get_Adjdata())return 0;//已經校準
// else //未校準?
// {
// LCD_Clear(WHITE);//清屏
// TP_Adjust(); //屏幕校準
// TP_Save_Adjdata();
// }
// TP_Get_Adjdata();
// return 1;
}
就進行了接口配置
//SPI讀數據
//從觸摸屏IC讀取adc值
//CMD:指令
//返回值:讀到的數據
u16 TP_Read_AD(u8 CMD)
{
u8 count=0;
u16 Num=0;
TCLK=0; //先拉低時鐘
TDIN=0; //拉低數據線
TCS=0; //選中觸摸屏IC
delay_us(1);
TP_Write_Byte(CMD);//發送命令字
delay_us(6);//ADS7846的轉換時間最長為6us
TCLK=0;
delay_us(1);
TCLK=1; //給1個時鐘,清除BUSY
delay_us(1);
TCLK=0;
for(count=0;count<16;count++)//讀出16位數據,只有高12位有效
{
Num<<=1;
TCLK=0; //下降沿有效
delay_us(1);
TCLK=1;
if(DOUT)Num++;
}
Num>>=4; //只有高12位有效.
TCS=1; //釋放片選
return(Num);
}
//SPI寫數據
//向觸摸屏IC寫入1byte數據
//num:要寫入的數據
void TP_Write_Byte(u8 num)
{
u8 count=0;
for(count=0;count<8;count++)
{
if(num&0x80)TDIN=1;
else TDIN=0;
num<<=1;
TCLK=0;
delay_us(1);
TCLK=1; //上升沿有效
}
}
看看也留個言,知識與我們同在。。。
求高手指教,有點崩潰。。。。
|