📄 func.h
字号:
//*******************************************
//*函数名称:void Parallel_Check_Busy(void) *
//*函数功能:并行方式查忙 *
//*形式参数:无 *
//*形参说明:无 *
//*返回参数:无 *
//*使用说明:无 *
//*******************************************
void Parallel_Check_Busy(void)
{
bit temp;
P1 = 0xff; //输入前置1
RS = 0; //指令
RW = 1; //读模式
do
{
E = 1; //使能
temp = BUSY;
E = 0;
}
while(temp);//等待不忙
}
//************************************************************************************
//*函数名称:void Parallel_Write_LCD( bit b_Data_Command , unsigned char uc_Content ) *
//*函数功能:并行模式向LCD发送数据或指令 *
//*形式参数:bit b_Data_Command , unsigned char uc_Content *
//*形参说明:数据或指令的标志位,指令或数据的内容 *
//*返回参数:无 *
//*使用说明:无 *
//************************************************************************************
void Parallel_Write_LCD( bit b_Data_Command , unsigned char uc_Content )
{
Parallel_Check_Busy();
if(b_Data_Command)
{
RS = 1; //数据
RW = 0; //写模式
}
else
{
RS = 0; //指令
RW = 0; //写模式
}
P1=uc_Content;//数据放到P1口上
E = 1;
_nop_();//很重要
_nop_();
_nop_();
E = 0;
}
//*************************************************************
//*函数名称:void Parallel_DDRAM_Address_Set(uchar ucDDramAdd) *
//*函数功能:设定DDRAM(文本区)地址到地址计数器AC *
//*形式参数:uchar ucDDramAdd *
//*行参说明:具体地址 *
//*格式说明: *
//* RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 *
//* 0 0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 *
//*返回参数:无 *
//*使用说明: *
//* 第一行地址:80H~8FH *
//* 第二行地址:90H~9FH *
//* 第三行地址:A0H~AFH *
//* 第四行地址:B0H~BFH *
//*************************************************************
void Parallel_DDRAM_Address_Set(uchar ucDDramAdd)
{
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Parallel_Write_LCD(COMMAND,ucDDramAdd); //设定DDRAM地址到地址计数器AC
}
//*******************************************
//*函数名称:void Parallel_Init_LCD(void) *
//*函数功能:并行初始化LCD *
//*形式参数:无 *
//*形参说明:无 *
//*返回参数:无 *
//*使用说明:无 *
//*******************************************
void Parallel_Init_LCD(void)
{
RST = 1; //复位后拉高,停止复位
// PSB = 1; //选择并行传输模式
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令动作
Parallel_Write_LCD(COMMAND,CLEAR_SCREEN); //清屏,地址指针指向00H
Parallel_Write_LCD(COMMAND,0x06); //光标的移动方向
Parallel_Write_LCD(COMMAND,0x0c); //开显示,关游标
}
//********************************************************
//*函数名称:void Parallel_Clear_Ram(void) *
//*函数功能:并行清屏函数 *
//*形式参数:无 *
//*形参说明:无 *
//*返回参数:无 *
//*使用说明:DDRAM填满20H,并设定DDRAM AC到00H *
//*格式说明: *
//* RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 *
//* 0 0 0 0 0 0 0 0 0 1 *
//********************************************************
void Parallel_Clear_Ram(void)
{
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Parallel_Write_LCD(COMMAND,CLEAR_SCREEN); //清屏
}
void Parallel_DisplayStrings_WithAddress(uchar ucAdd,uchar code *p,uchar num1,uchar num2)
{
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令动作
Parallel_DDRAM_Address_Set(ucAdd);
Parallel_Write_LCD(DATA, *(p+num1/10));
Parallel_Write_LCD(DATA, *(p+num1%10));
Parallel_Write_LCD(DATA, *(p+15));
Parallel_Write_LCD(DATA, *(p+num2%10));
Parallel_Write_LCD(DATA, *(p+14));
Parallel_Write_LCD(DATA, *(p+16));
}
void Parallel_DisplayStrings_WithAddress_shidu(uchar ucAdd,uchar code *p,uchar num1)
{
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令动作
Parallel_DDRAM_Address_Set(ucAdd);
Parallel_Write_LCD(DATA, *(p+num1/10));
Parallel_Write_LCD(DATA, *(p+num1%10));
Parallel_Write_LCD(DATA, *(p+17));
Parallel_Write_LCD(DATA, *(p+18));
Parallel_Write_LCD(DATA, *(p+19));
}
void Parallel_DisplayStrings_WithAddress_hanzi(uchar ucAdd,uchar code *p)
{
uchar length;
length = strlen(p);
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令动作
Parallel_DDRAM_Address_Set(ucAdd);
for( ; length ; length -- )
Parallel_Write_LCD(DATA, *(p++));
}
/* 延时t毫秒 */
void delay(uint t)
{
uint i;
while(t--)
{
/* 对于12M时钟,约延时1ms */
for (i=0;i<125;i++)
{}
}
}
/* 产生复位脉冲初始化DS18B20 */
void TxReset(void)
{
uint i;
DQ = 0;
/* 拉低约900us */
i = 100;
while (i>0) i--;
DQ = 1; // 产生上升沿
i = 4;
while (i>0) i--;
}
/* 等待应答脉冲 */
void RxWait(void)
{
uint i;
while(DQ);
while(~DQ); // 检测到应答脉冲
i = 4;
while (i>0) i--;
}
/* 读取数据的一位,满足读时隙要求 */
bit RdBit(void)
{
uint i;
bit b;
DQ = 0;
i++;
DQ = 1;
i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b = DQ;
i = 8;
while(i>0) i--;
return (b);
}
/* 读取数据的一个字节 */
uchar RdByte(void)
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = RdBit();
b = (j<<7)|(b>>1);
}
return(b);
}
/* 写数据的一个字节,满足写1和写0的时隙要求 */
void WrByte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp)
{
/* 写1 */
DQ = 0;
i++;i++; // 延时,使得15us以内拉高
DQ = 1;
i = 8;
while(i>0) i--; // 整个写1时隙不低于60us
}
else
{
/* 写0 */
DQ = 0;
i = 8;
while(i>0) i--; // 保持低在60us到120us之间
DQ = 1;
i++;
i++;
}
}
}
/* 启动温度转换 */
void convert(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
delay(1); // 延时
WrByte(0xcc); // skip rom 命令
WrByte(0x44); // convert T 命令
}
/* 读取温度值 */
void RdTemp(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
delay(1); // 延时
WrByte(0xcc); // skip rom 命令
WrByte(0xbe); // read scratchpad 命令
tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
tpmsb = RdByte(); // 温度值高位字节(其中高5位为符号位)
}
void Clock0_Init()
{
TMOD = 0x15;
TCON = 0x01;
IE = 0x8a;
TR0=0;
TF0=0;
TH0=0xd8;
TL0=0xf0;
TR0=1;
}
/*频率计测量函数集*/
void GetFrequency()
{
BYTE th0,tl0;
if(++times==25)
{
times = 0;
TR0 = 0;
_nop_();
do{
th0 = TH0;
tl0 = TL0;
}while(th0!=TH0);
frequency = (th0*256+tl0)-55536;
TR0=1;
Clock0_Init();
}
}
/*频率转换相对湿度函数集*/
FrequencyToHumidity() //根据实际频率,需要修改公式
{
float fre;
fre =((float)frequency) /100.0 ;
RH = (BYTE)((28000.0 / fre) - 456.0);
return(RH);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -