单片机小白学习之路(三十八)---AD转换电位器编码

目标:点位器的检测


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
#include


#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

你可能感兴趣的:(单片机小白学习之路(三十八)---AD转换电位器编码)