📄 ljcd.c
字号:
///////////////////////////////////////////////////////////////////////////////////////////////
//
// H.C.H
// NNU(南京师范大学通信工程)
// TLC0838驱动程序TLC0838_II.c
// uchar adc_tlc0838(uchar channel);
// 函数说明:channel为通道的选择:0……CH0 1……CH1 2……CH2 3……CH3
// 当error=0时,返回的值为有效值,当error=1时,返回值无效
///////////////////////////////////////////////////////////////////////////////////////////////
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define lcd_bus P1
sbit rs=P3^2;
sbit rw=P3^3;
sbit e=P3^4;
sbit CS=P2^3; //TLC0838---PIN18
sbit DI=P2^2; //TLC0838---PIN17
sbit CLK=P2^1; //TLC0838---PIN16
sbit DO=P2^0; //TLC0838---PIN14
//SE接成低电平
bit error=1;
uchar adc_tlc0838(uchar channel);
delay(uchar d)
{
while(--d);
}
/**********判断忙标志,返回的是一个位BF**********/
bit lcd_busy(void)
{
uchar bflag;
rs=0;
rw=1;
_nop_();
e=1;
_nop_();
lcd_bus=0xff;
bflag=lcd_bus;
e=0;
return(bit)(bflag&0x80); //BF=1 busy
}
/*********写命令,有两个参数,第一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1:判断;为 0:不判断****************/
void lcd_wrcmd(uchar cmd)
{
while(lcd_busy());
lcd_bus=cmd;
rs=0;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
/************向液晶片写数据***************/
void lcd_wrdata( uchar lcddata)
{
while(lcd_busy());
lcd_bus=lcddata;
rs=1;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
void lcd_ini(void)
{
lcd_wrcmd(0x38);
delay(100);
lcd_wrcmd(0x0c);
delay(100);
lcd_wrcmd(0x06);
delay(100);
lcd_wrcmd(0x01);
delay(100);
}
main()
{
uchar result,a[3];
lcd_ini();
while(1)
{
result=adc_tlc0838(7);
a[0]=result/100;
result=result%100;
a[1]=result/10;
result=result%10;
a[2]=result;
lcd_wrcmd(0x80);
lcd_wrdata(a[0]+48);
lcd_wrdata(a[1]+48);
lcd_wrdata(a[2]+48);
}
}
uchar adc_tlc0838(uchar channel)
{
uchar t,i;
uchar temp1,temp2=1;
if (channel==0) t=0;
else if(channel==1) t=1;
else if(channel==2) t=4;
else if(channel==3) t=5;
else if(channel==4) t=2;
else if(channel==5) t=3;
else if(channel==6) t=6;
else if(channel==7) t=7;
CS=1;
_nop_();_nop_();_nop_();_nop_();
CLK=0;
CS=0; //使AD通道打开
DI = 1; //Start bit=1
CLK = 1;
CLK=0;
CS=0;
DI = 1;
CLK = 1;
for(i=0;i<3;i++)
{
CLK = 0;
if(t&1)DI=1;
else DI=0;
t=t>>1;
CLK = 1;
}
CLK=0;
CLK=1;
for(i=0;i<=6;i++)
{
CLK = 0; //时钟为低电平
DO=1;
if(DO)
{ //如果采集到的位为1
Temp1=Temp1+1; //给临时存储Temp1加1
Temp1=Temp1<<1;
} //临时存储器左移一位
else
Temp1=Temp1<<1; //如果采集到的数位为0,临时存储器左移一位
_nop_();
_nop_();
_nop_();
_nop_();
CLK = 1;
} //时钟为高电平,完成一个时钟周期数据采集
CLK = 0;
if(DO) Temp1=Temp1+1;
if(DO) Temp2=0x80;
CLK = 1;
//采集数据校验
for(i=0;i<=6;i++)
{
CLK=0;
if(DO){
Temp2=Temp2>>1;
Temp2=Temp2+0x80; }
else
Temp2=Temp2>>1;
CLK = 1;
}
CS = 1;
return Temp1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -