目标:点位器的检测
xpt2046.c
#include "xpt2046.h"
void SPI_Write(uchar dat) //使用SPI写入数据
{
uchar i;
CLK = 0;
for(i=0;i<8;i++){
DIN = dat>>7; //放置最高位
dat <<=1;
CLK = 0; //上升沿放置数据
CLK = 1;
}
}
//写入数据通常是再一个for循环里先写入再移位
uint SPI_Read()
{
uint i,dat=0;
CLK = 0;
for(i=0;i<12;i++){
dat <<=1;
CLK = 1;
CLK = 0;
dat |= DOUT;
}
return dat;
}
//读数据通常是在一个for循环里先移位再传入数据(符号是”|=“)
uint Read_AD_Data(uchar cmd)
{
uchar i; //循环用
uint AD_Value; //接受数据
CLK = 0;
CS = 0; //片选开始
SPI_Write(cmd); //往芯片里写入通道地址选择是哪种传感器,即控制命令
for(i=6;i>0;i--); //发送一个时钟周期,清除BUSY
CLK = 1;
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_(); //以上到for都是延时是给芯片转换时间
AD_Value = SPI_Read(); //得到芯片xpt2046输出的数字信号
CS = 1; //关闭片选
return AD_Value;
}
main.c
#include "reg52.h"
#include "xpt2046.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA = P3^0;
sbit LSB = P3^1;
sbit LSC = P3^3; //数码管的位选
u8 disp[4]; //用于保存数据的数组
u8 code smgduan[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u16 i) //延时函数
{
while(i--);
}
void datapros()
{
u16 temp;
static u8 i;
if(i==50){
i=0;
temp = Read_AD_Data(0x94);
}
i++; //用于延时防止读错
disp[0] = smgduan[temp/1000]; //千位
disp[1] = smgduan[temp%1000/100]; //百位
disp[2] = smgduan[temp%1000%100/10]; //十位
disp[3] = smgduan[temp%1000%100%10]; //个位
}
void DigDisplay()
{
u8 i; //用于for循环
for(i=0;i<4;i++){
switch(i){
case(0):LSA=0;LSB=0;LSC=0;break;
case(1):LSA=1;LSB=0;LSC=0;break;
case(2):LSA=0;LSB=1;LSC=0;break;
case(3):LSA=1;LSB=1;LSC=0;break;
}
P0 = disp[i]; //发送数据
delay(100); //间隔一段时间扫描
P0 = 0x00; //消隐
}
}
void main()
{
while(1){
datapros(); //数据处理函数
DigDisplay(); //数码管显示函数
}
}
cpt2046.h
#ifndef _xpt2046_h_
#define _xpt2046_h_
#include<reg52.h>
#include<intrins.h>
#ifndef uint
#define uint unsigned int
#endif
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef ulong
#define ulong unsigned long
#endif
sbit DOUT = P3^7; //数据输出端口
sbit CLK = P3^6; // 时钟
sbit DIN = P3^4; //数据输入端
sbit CS = P3^5; //片选
uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);
#endif