#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};//共阴极段码
uchar b[4];//存放4位要显示的数
sbit CLOCK=P2^7; /*2543时钟*/
sbit D_IN=P2^6; /*2543输入*/
sbit D_OUT=P2^4; /*2543输出*/
sbit _CS=P2^5; /*2543片选*/
void mdelay(uint z)//1ms延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay(uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
_nop_();
}
}
/**************************************
名称:read2543
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/
uint read2543(uchar port)
{
uint ad=0,i;
CLOCK=0;
_CS=0;
port<<=4;//通道号左移4位
for(i=0;i<12;i++)//没有设置控制字,默认输出数据为12位,高位先送出,输出数据的格式为2进制
{
if(D_OUT) ad|=0x01;//转换后的值高位先送出
D_IN=(bit)(port&0x80);//通道值高位先送出
CLOCK=1;
delay(3);
CLOCK=0;
delay(3);
port<<=1;
ad<<=1;
}
_CS=1;
ad>>=1;//循环中多左移了一位
return ad;
}
void show(void)//数码管显示子程序
{
uint i;
uchar c=0x01;
for(i=0;i<4;i++)
{
P1=(c<<i);
P3=b[i];
if(i==2)//显示小数点
P3=P3|0x80;
mdelay(1);
}
}
void main(void)
{
uint ad=0;
while(1)
{
ad=read2543(0);//从通道0输入
ad=ad*1.0/4096*500;//注意这一步不能写成 ad=ad*500/4096
b[0]=a[ad%10];//个位
b[1]=a[ad%100/10];//十位
b[2]=a[ad/100];//百位
b[3]=a[ad/1000];//最高位始终为0
show();
}
}
评论0