📄 w.c
字号:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^0; //数据\指令 选择
sbit rw=P2^1; //读/写 选择
sbit e=P2^2; //读/写 使能
sbit ds=P1^0; //18B20信号脚
uint temp;
float ftemp;
uchar code table[]="0123456789.CT:";
void writecom(uchar com); //写命令函数
void writedat(uchar dat); //写数据函数
void initinal(void);
void delay50us(uint t) //12MHZ晶振 延时50微秒
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void dsreset() //ds18b20初始化函数
{
uint i;
ds=0; //拉低总线开始复位
i=103;
while(i>0)i--;
ds=1; //释放总线
i=4;
while(i>0)i--; //省去了等待芯片返回应答的过程
}
bit readbit(void) //ds18b20读取一个二进制位,参照时序图
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++,i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread(void) //ds18b20读取一个字节的数据
{
uchar i,j,dat;
dat=0;
for(i=0;i<8;i++)
{
j=readbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tempwrite(uchar dat) //ds18b20写入字节数据
{
uint i;uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb==1) //写1
{
ds=0; //拉低总线以开始一个写时序
i++;i++;
ds=1; //释放总线
i=8;
while(i>0) i--;
}
else //写0
{
ds=0;
i=8;
while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempwendu(void) //转换温度
{
dsreset(); //ds18b20初始化函数
delay50us(20);
tempwrite(0xcc);
tempwrite(0x44);
}
uint gettemp() //获取温度
{
uchar a,b;
dsreset(); //ds18b20初始化函数
delay50us(2000); //延时100
tempwrite(0xcc);
tempwrite(0xbe);
delay50us(2);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
ftemp=temp*0.0625;
temp=ftemp*10+0.5;
ftemp=ftemp+0.05;
return temp;
}
/****************LCD检查忙位*******************/
void chkbusy()
{
rs=0;
rw=1;
e=1;
P0=0xff;
while((P0&0x80)==0x80);
e=0;
}
/*****************读LCD数据******************/
uchar read()
{
uchar shuju;
chkbusy();
P0=0xff;
rs=1;
rw=1;
e=0;
delay50us(1);
e=1;
shuju=P0;
e=0;
return(shuju);
}
/***********写命令**********/
void writecom(uchar com)
{
chkbusy();
rw=0;
rs=0;
delay50us(1);
P0=com;
e=1;
delay50us(10);
e=0;
delay50us(10);
}
/*************写数据****************/
void writedat(uchar dat)
{
chkbusy();
rw=0;
rs=1;
delay50us(1);
P0=dat;
e=1;
delay50us(10);
e=0;
delay50us(10);
}
/****************初始化12864*****************/
void initinal(void)
{
delay50us(1000);
writecom(0x30);
delay50us(4);
writecom(0x30);
delay50us(2);
writecom(0x0e);
delay50us(4);
writecom(0x01);
delay50us(400);
writecom(0x06);
delay50us(10);
}
/*************画点程序**************/
void DrawPoint(uchar X,uchar Y,uchar Color)
{
uchar Row,Tier,Tier_bit ;
uchar ReadOldH,ReadOldL ;
writecom(0x34); //扩充指令操作
writecom(0x36);
Tier=X>>4;
Tier_bit=X&0x0f;
if(Y<32)
{
Row=Y;
}
else
{
Row=Y-32;
Tier+=8;
}
writecom(Row+0x80);
writecom(Tier+0x80);
read();
ReadOldH=read();
ReadOldL=read();
writecom(Row+0x80);
writecom(Tier+0x80);
if(Tier_bit<8)
{
switch(Color)
{
case 0 :ReadOldH&=(~(0x01<<(7-Tier_bit))); break;
case 1 :ReadOldH|=(0x01<<(7-Tier_bit)); break;
case 2 :ReadOldH^=(0x01<<(7-Tier_bit)); break;
default : break;
}
writedat(ReadOldH);
writedat(ReadOldL);
}
else
{
switch(Color)
{
case 0 :ReadOldL&=(~(0x01<<(15-Tier_bit))); break;
case 1 :ReadOldL|=(0x01<<(15-Tier_bit)); break;
case 2 :ReadOldL^=(0x01<<(15-Tier_bit)); break;
default : break;
}
writedat(ReadOldH);
writedat(ReadOldL);
}
writecom(0x30); //基本指令操作
}
/***************清屏函数*****************/
void clrscreen()
{
writecom(0x01);
delay50us(10);
}
/************清整个GDRAM空间***************/
void clrgdram()
{
unsigned char x,y ;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
writecom(0x34);
writecom(y+0x80); //行地址
writecom(x+0x80); //列地址
writecom(0x30); //基本指令操作
writedat(0x00);
writedat(0x00);
}
}
/*************主函数********************/
void main()
{
uchar i=0,j,e,colour=1;
uint a;
rw=0; //写
initinal(); //初始化12864
clrgdram(); //清整个GDRAM空间
delay50us(2);
//writecom(0x34); //扩充指令操作
writecom(0x0c);
while(1)
{
uint a,b,c,d;
DrawPoint(17,6,colour);
DrawPoint(17,22,colour);
DrawPoint(17,38,colour);
DrawPoint(17,54,colour);
for(j=16;j<124;j++)
{
DrawPoint(16,j-16,colour);
DrawPoint(j,63,colour);
writecom(0x80);
writedat(table[6]);
writedat(table[7]);
writecom(0x90);
writedat(table[5]);
writedat(table[1]);
writecom(0x88);
writedat(table[3]);
writedat(table[5]);
writecom(0x98);
writedat(table[1]);
writedat(table[9]);
}
for(i=16;i<124;i++)
{
tempwendu(); //转换温度
a=gettemp(); //获取温度
e=73-a/10;
DrawPoint(i,e,colour);
delay50us(10000);
b=a/100;
c=a%100/10;
d=a%100%10;
writecom(0x82); //写地址
writedat(table[12]);
delay50us(1);
writedat(table[13]);
delay50us(1);
writecom(0x83); //写地址
writedat(table[b]);
delay50us(1);
writedat(table[c]);
delay50us(1);
writedat(table[10]);
delay50us(1);
writedat(table[d]);
delay50us(1);
writedat(table[11]);
delay50us(4);
}
clrgdram(); //清整个GDRAM空间
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -