#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char smgnumber[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //数码管
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint i,j;
uchar qian,bai,shi,ge ;
uint number ;
sbit AA=P2^2;
sbit BB=P2^3;
sbit CC=P2^4;
sbit DIN=P3^4; // 控制字 输入端口
sbit CS=P3^5; //xpt2046芯片使能端,低电平有效
sbit CLK=P3^6; //芯片时钟输入端,在时钟上升沿或下降沿进行数据输入或输出
sbit DOUT=P3^7; //芯片ad转换后 数字量输出口,串行输出
void delayms(uint);
void display(uint);
void SPI_write (uchar);
void SPI_read();
void main ()
{
while (1)
{
CLK=0;
CS=0;
SPI_write(0X94); //输入控制字 0X94
for(i=6;i>0;i--); // 延迟一丁点,等待转换结果
CLK=1;_nop_();_nop_(); //看时序图需延迟一个时钟周期
CLK=0;_nop_();_nop_();
SPI_read ();
CS=1;
display (number) ;
}
}
void delayms(uint t)
{
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
void display (uint number1)
{
qian= number1/1000;
bai=number1%1000/100;
shi=number1%100/10;
ge=number1%10;
CC=0,BB=0,AA=0; //数码管显示 ad转化后的数字量
P0=smgnumber[ge];
delayms(5);
P0=0;
CC=0,BB=0,AA=1;
P0=smgnumber[shi];
delayms(5);
P0=0;
CC=0,BB=1,AA=0;
P0=smgnumber[bai];
delayms(5);
P0=0;
CC=0,BB=1,AA=1;
P0=smgnumber[qian];
delayms(5);
P0=0;
}
void SPI_write (uchar controlword)
{
uchar m;
CLK=0;
for (m=0;m<8;m++)
{
DIN=controlword>>7; //控制位最高位赋给 DIN输入口
controlword = controlword<<1 ; //将控制字次高位变为最高位
CLK=0; //串行输入,时钟上升沿将控制字一位一位的输入到芯片。
CLK=1;
}
}
void SPI_read ()
{
uchar n;
CLK=0;
number=0; ////注意!!!!这点清零很重要,number是全局变量,如果不清0,
//下次再进行移位的时候运算的结果得不到我们想要的
for(n=0;n<12;n++)
{
number = number<<1; // number 定义的是全局变量,不赋初值的话全局变量默认初值为0
CLK=1; //时钟下降沿 把一位数据 从DOUT口 输出
CLK=0;
number = number | DOUT ; // number 和 DOUT这个串行输出口 进行或运算,实现DOUT端口的值赋给number
//十二个周期后,ad转换的12位数字量全部附给了number
n
}
}
|