📄 tlc25431.c
字号:
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLOCK=P2^7; /*2543时钟*/
sbit D_IN=P2^6; /*2543输入*/
sbit D_OUT=P2^4; /*2543输出*/
sbit _CS=P2^5; /*2543片选*/
sbit E=P3^4; /*使能端 高电平有效*/
sbit RS=P3^5; /*'1'为数据 '0'为命令*/
sbit RW=P3^6; /*'1'为读取 '0'为写入*/
const uchar NoDisp=0;
const uchar NoCur=1;
const uchar CurNoFlash=2;
const uchar CurFlash=3;
void mdelay(uint z) /*1ms延时子程序*/
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay(uchar n) /*2543中的延时子程序*/
{
uchar i;
for(i=0;i<n;i++)
{
_nop_();
}
}
//~~~~~~~~~~~~~~~~~~~液晶显示驱动~~~~~~~~~~~~~~~~~~~~
void WaitIdle()
{
RS=0;
RW=1;
_nop_();
E=1;
mdelay(5);
while((P0&0x80)==0x80)//控制字最高位为'1' 才能允许读写操作
{
E=0; //这两句protues仿真必须加;仿真器仿真也通过。
E=1;
};
E=0;
}
void LcdWcn(uchar c) //无忙时检测 向液晶写入命令
{
RS=0;
RW=0;
P0=c;
mdelay(5);
E=1;
mdelay(5);
E=0;
}
void LcdWc(uchar c) //有忙时检测 向液晶写入命令
{
WaitIdle();
LcdWcn(c);
}
void LcdWd(uchar c) //有忙时检测 向液晶写入数据
{
WaitIdle();
RS=1;
RW=0;
P0=c;
mdelay(5);
E=1;
mdelay(5);
mdelay(5);
E=0;
}
void ClrLcd() //显示清屏
{
LcdWc(0x01);
}
void RstLcd() //初始化
{
E=0;
LcdWc(0x38); //显示模式设置 16*2
LcdWc(0x0f); //开显示 开光标 光标闪烁
LcdWc(0x06); //读或写一个字节侯 光标加1 指针加1
LcdWc(0x01); //显示清屏
}
void SetCur(uchar Para)
{
mdelay(2);
switch(Para)
{ //光标模式设置
case 0:LcdWc(0x08);break; // NoDisp
case 1:LcdWc(0x0c);break; // NoCur
case 2:LcdWc(0x0e);break; // CurNoFlash
case 3:LcdWc(0x0f);break; // CurFlash
default:break;
}
}
void LcdPos(uchar xPos,uchar yPos)
{
uchar tmp;
xPos&=0x0f; //列定位 最大为16列
yPos&=0x01; //行定位 最大为2行
if(yPos==0)
tmp=xPos;
else
tmp=xPos+0x40; //第二行第一列的地址为 0x80+0x40
tmp|=0x80; //第一行第一列的地址为 0x80
LcdWc(tmp);
}
void WriteChar(uchar c,uchar xPos,uchar yPos)
{ //在指定位置写入一个字符
LcdPos(xPos,yPos);
LcdWd(c);
}
void WriteString(uchar *s,uchar xPos,uchar yPos)
{ //在指定位置写入一个字符串
uchar i;
if(*s==0)
return;
for(i=0;;i++)
{
if(*(s+i)==0)
break;
WriteChar(*(s+i),xPos,yPos);
xPos++;
if(xPos>=15)
break;
}
}
/**************************************
名称: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;
}
*/
uint read2543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
{
uchar mRetADHi,mRetADLo; //返回的测量值的高4位、低8位
uchar mTemp;
CLOCK=0;
_CS=0;
mRetADHi=0;
mRetADLo=0;
//把通道号(4位)打入2543 **代码虽然麻烦,但编译后的执行速度很快**
D_IN=(bit)(port&0x08);
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<3;
CLOCK=0;
D_IN=(bit)(port&0x04);
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<2;
CLOCK=0;
D_IN=(bit)(port&0x02);
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<1;
CLOCK=0;
D_IN=(bit)(port&0x01);
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp;
CLOCK=0;
//参数设定开始
//注意:参数的设定只对下一周期的测量有效,对本次取样没有作用
D_IN=0;
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<7;
CLOCK=0; //选择12位的数据长度
D_IN=0;
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<6;
CLOCK=0;
D_IN=0;
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<5;
CLOCK=0; //高位在前输出
D_IN=0;
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<4;
CLOCK=0; //单极性输出
//参数设定结束
CLOCK=1; //填充4个任意位
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<3;
CLOCK=0;
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<2;
CLOCK=0;
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<1;
CLOCK=0;
CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp;
CLOCK=0;
_CS=1;
return (uint)(mRetADHi*256+mRetADLo);
}
void main()
{
uint ad0=0;
uchar xPos0,yPos0,xPos1,yPos1;
uchar A1,A2,A3;
uchar * s0;
RstLcd();
ClrLcd();
SetCur(NoCur);
xPos0=0;yPos0=0; //显示模拟通道'0'转化数据
s0="channel0:";
WriteString(s0,xPos0,yPos0);
xPos1=10;yPos1=0; //显示小数点
WriteChar('.',xPos1,yPos1);
xPos1=13;yPos1=0; //显示'V'
WriteChar('V',xPos1,yPos1);
xPos0=0;yPos0=1;
s0="channel1:";
WriteString(s0,xPos0,yPos0);
xPos1=10;yPos1=1;
WriteChar(0x2e,xPos1,yPos1);
xPos1=13;yPos1=1;
WriteChar('V',xPos1,yPos1);
while(1)
{
ad0=read2543(0); //0通道
ad0=ad0*1.0/4096*500;//注意这一步不能写成 ad=ad*500/4096
ad0=ad0*2; // 0通道扩展量程0~10V
A1=ad0/100; //百位
A2=ad0%100/10; //十位
A3=ad0%10; //个位
xPos1=9;yPos1=0;
WriteChar(0x30+A1,xPos1,yPos1);
xPos1=11;yPos1=0;
WriteChar(0x30+A2,xPos1,yPos1);
xPos1=12;yPos1=0;
WriteChar(0x30+A3,xPos1,yPos1);
ad0=read2543(1); //1通道
ad0=ad0*1.0/4096*500;//注意这一步不能写成 ad=ad*500/4096
A1=ad0/100;//百位
A2=ad0%100/10;//十位
A3=ad0%10;//个位
xPos1=9;yPos1=1;
WriteChar(0x30+A1,xPos1,yPos1);
xPos1=11;yPos1=1;
WriteChar(0x30+A2,xPos1,yPos1);
xPos1=12;yPos1=1;
WriteChar(0x30+A3,xPos1,yPos1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -