📄 tlc2543.c
字号:
#include "type.h"
#include "Tlc2543.h"
#include "intrins.h"
#include "stdio.h"
/*********InitTlc2543()*****************
CS由低变高开始第一次I/O周期
EOC为高、输入数据寄存器全零、输出寄存器随机
第一次转化结果忽略
****************************************/
void InitTlc2543(void){
CS_2543=FLASE;
ibase1=0x0000;
ibase2=0x0000;
CLK_2543=FLASE;
D_2543=TRUE;
CS_2543=TRUE;
_nop_();
CS_2543=FLASE;
}
/**************GetBit()********************
说明:按照tag标示获得当前value变量
的最高位或最低位
**************************************/
BOOL GetBit(uint value,BOOL tag){
ibase1=value;
if(tag==1){
return MSB;
}
else{
return LSB;
}
}
/***************ShiftBit()*******************
说明:按照tag标示设置全局变量ibase2的MSB位或LSB位
设置位后向左或向右一一位。
**************************************/
void ShiftBit(BOOL value,BOOL tag) {
if(tag){
tempLSB=value;
ibase2<<=1;
}
else{
tempMSB=value;
ibase2>>=1;
}
}
/*********tlc2543()*********************
说明:mode中的D3、D2位决定位长。
00或10时为12位;11时为16位,01时为8位
D1位是前导控制位、D0是极性位,强制为0
返回的数据是上一次时钟周期的采样值、转换
由CS_2543控制。
OEC忽略,功能用延时代替。
*******************************************/
uint Tlc2543RW(uchar addr,uchar mode)
{
uchar clock_count; // 时钟计数器
uint PutOut=0x0000; //读取数据缓冲区
uint PutIn;
cbase=mode;
{
uchar temp;
temp=mode;
temp>>=2;
clock_count=(temp==0)?12:((temp+1)*4);//计算时钟个数
}
PutIn=(uint)addr;
PutIn<<=8; //移到第二个字节
mode<<=4; //本身字段互换
PutIn+=mode;
PutIn<<=4; //合成后移到最高位
//I/o周期时序
CS_2543=true;
while(clock_count--)
{
A_2543=GetBit(PutIn,port1); //数据加入输入信号线
CLK_2543=TRUE;
CLK_2543=FLASE; //启动一个时钟周期
ShiftBit(D_2543,port1); //获得输出信号线上数据
if(port1){
PutIn<<=1; //MSB前导
}
else{
PutIn>>=1; //LSB前导
}
}
CS_2543=flase;
return PutOut;
}
/* void tlc2543()
{
unsigned int putout=0x0000;//数据缓冲
char clock_count,address_index=1;//时钟计数器和通道地址计数器
EA=0;
CS_2543=flase;
CLK_2543=0;
A_2543=1;
D_2543=1;
for(address_index=1;address_index<MAX_C;address_index=address_index++)
//每个模拟通道读数据
{
B=address_index;
clock_count=12;
putout=0x0000;
cs=true;
B=B<<4; //4位地址周期,MSB导前
while(clock_count) //12个时钟周期
{
putout=putout<<1;
A_2543=ACC_7;//地址最高位送入数据输入端口
B=B<<1;
AC=D_2543; //前一个转换周期后的数值最高位移到缓冲位AC
if (AC)
putout=putout | 0x0001;
else
putout=putout & 0xfffe;
clock_count--;
clock=1;
clock=0;
}
cs=flase;
if (address_index==1)
ad[3]=putout;
else
ad[address_index-2]=putout;
}
EA=1;
}
*/
/*
void main(void)
{
uchar i,j;
uint out;
SCON = 0x5a; //按1200 波特率初始化串行口,晶振频率为6MHZ)
TMOD = 0x20;
TCON = 0x69;
TH1 = 0xfd;
EA = 1;
InitTlc2543();
while(1)
{
printf("请输入两个值\n");
scanf("%C,%C",&i,&j);
out=Tlc2543RW(i-0x30,j-0x30);
printf("\n返回值为: %d\n\n",out);
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -