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