请哪位大虾帮我看下 我是不程序哪有问题 为何液晶屏...
时间:10-02
整理:3721RD
点击:
单片机是C8051F310 液晶屏是LCM406谢谢了
#include <c8051F310.h>
#include <INTRINS.H>
sbit FAN_CON=P0^1;
sbit DQ=P1^0;
sbit WDI=P1^1;
sbit LED_CON=P1^2;
sbit LCD_DA=P1^4;
sbit LCD_WR=P1^5;
sbit LCD_RD=P1^6;
sbit LCD_CS=P1^7;
bit FLG_DS18B20_RET;
bit Temper_Flag=1;
float Temperature=0.0;
unsigned char lcd_dat_1;
unsigned char lcd_dat_2;
//*************************************************************************************
//函数名称;Delay_1us()
//函数功能:执行 12*cnt+1 条单指令,对于C8051F221晶振频率为12M的情况下,延时1us乘以cnt
//输入参数;unsigned char cnt
//返回参数:无
//*************************************************************************************
void Delay_1us(unsigned char cnt)
{
unsigned char i;
for (i = cnt; i > 0; i--)
{
_nop_();
_nop_();
_nop_();
}
}
//************************************************************************************
//函数名称;Delay_4ms()
//函数功能:执行 4000*cnt+1 条单指令,对于C8051F221晶振频率为12M的情况下,延时4ms乘以cnt
//输入参数;unsigned char cnt
//返回参数:无
//************************************************************************************
void Delay_4ms(unsigned char cnt)
{//(5k+4)j+9
unsigned char i,j,k;
for(i=cnt;i>0;i--)
{
for(j=224;j>0;j--)
{
for(k=42;k>0;k--)
WDI=~WDI;
_nop_();
_nop_();
}
}
}
/**************************************************************************************
函数名称;C8051F310_Init()
函数功能:寄存器及端口初始化
输入参数;无
返回参数:无
**************************************************************************************/
void C8051F310_Init(void)
{
int i = 0;
//看门狗
PCA0MD &= ~0x40; // disable watchdog timer
P0MDIN=0xFF;//p012口全部设置为数字输入
P1MDIN=0xFF;
P2MDIN=0xFF;
P0MDOUT=0x02;//p0.1设置为推挽输出(风扇控制设置为推挽输出)
P1MDOUT=0xB6;//其余为漏极开路
P2MDOUT=0x00;
XBR1=0x40;//端口弱上拉使能,交叉开关使能
//XBR0=0x00;//
OSCXCN |= 0x27; // Use external Crystal,SYSCLK-12M
CLKSEL |= 0x01;
OSCICN &= 0x7F; //关闭内部振荡
}
/**************************************************************************************
函数名称;DS18B20_Init()
函数功能:DS18B20初始化
输入参数;无
返回参数:无
全局变量:FLG_DS18B20_RET 为1初始化失败,为0初始化成功
**************************************************************************************/
void DS18B20_Init(void)
{
DQ = 0; // 单片机将DQ拉低
Delay_1us(250); // 精确延时大于480us,小于960us
Delay_1us(250);
DQ = 1; // 释放总线
Delay_1us(30); // DS18B20检测到高后,等待15-60us将总线拉低,保持60-240us
FLG_DS18B20_RET=DQ; // 稍做延时后 如果FLG_DS18B20_RET=0则初始化成功,否则初始化失败
Delay_1us(250); // 精确延时 大于 240us
}
/**************************************************************************************
函数名称;LCD_WrCom()
函数功能:向LCD写入命令--LCM046
输入参数;unsigned char command
返回参数:无
全局变量:无
**************************************************************************************/
void LCD_WrCom(unsigned char command)
{
unsigned char i,tmp;
tmp = command;
LCD_CS=0;
Delay_1us(30);
LCD_WR=0; //写入"100"
LCD_DA=1;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
LCD_WR=0;
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
LCD_WR=0;
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
CY=0;
for(i=9;i>0;i--)//写入命令
{
LCD_WR=0;
if(tmp&0x80)
LCD_DA=1;
else
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
tmp=tmp<<1;
}
LCD_DA=1;
LCD_WR=1;
LCD_CS=1;
Delay_1us(60);
}
/**************************************************************************************
函数名称;LCD_Add_Dat()
函数功能:向LCD写入地址、数据
输入参数;unsigned char command
返回参数:无
全局变量:无
备注: 格式;101 0 A4 A3 A2 A1 A0 D0 D1 D2 D3
**************************************************************************************/
void LCD_Add_Dat(unsigned char add,unsigned char dat)
{
unsigned char i,j,tmp1,tmp2;
tmp1=add;
tmp2=dat;
LCD_CS=0;
Delay_1us(15);
LCD_WR=0; //写入"101"
LCD_DA=1;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
LCD_WR=0;
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
LCD_WR=0;
LCD_DA=1;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
for(i=6;i>0;i--) //写入5位地址
{
LCD_WR=0;
if(tmp1&0x20)
LCD_DA=1;
else
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
tmp1=tmp1<<1;
}
Delay_1us(6);
for(j=4;j>0;j--) //写入4位数据
{
LCD_WR=0;
if(tmp2&0x01)
LCD_DA=1;
else
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
tmp2=tmp2>>1;
}
LCD_DA=1;
LCD_WR=1;
LCD_CS=1;
Delay_1us(60);
}
//LCD初始化
/**************************************************************************************
函数名称;LCD_Init()
函数功能:LCD初始化
输入参数;无
返回参数:无
全局变量:无
**************************************************************************************/
void LCD_Init(void)
{
LCD_CS=1;
LCD_WR=1;
LCD_RD=1;
Delay_1us(250);
Delay_1us(20);
Delay_1us(20);
LCD_WrCom(0x29); //初始化命令
LCD_WrCom(0x18); //内部RC
LCD_WrCom(0x01); //开振荡器
LCD_WrCom(0x03); //开显示器
}
/**************************************************************************************
函数名称;Lcd_Hex()
函数功能:将要显示的数值转换为LCD输入的十六进制
输入参数;unsigned char lcd_dat
返回参数:无
全局变量:lcd_dat_1; lcd_dat_2
**************************************************************************************/
void Lcd_Hex(unsigned char lcd_dat)
{
switch(lcd_dat)
{
case 1:
lcd_dat_1=0x00;
lcd_dat_2=0x05;
break;
case 2:
lcd_dat_1=0x05;
lcd_dat_2=0x0b;
break;
case 3:
lcd_dat_1=0x01;
lcd_dat_2=0x0f;
break;
case 4:
lcd_dat_1=0x02;
lcd_dat_2=0x07;
break;
case 5:
lcd_dat_1=0x03;
lcd_dat_2=0x0e;
break;
case 6:
lcd_dat_1=0x07;
lcd_dat_2=0x0e;
break;
case 7:
lcd_dat_1=0x01;
lcd_dat_2=0x05;
break;
case 8:
lcd_dat_1=0x07;
lcd_dat_2=0x0f;
break;
case 9:
lcd_dat_1=0x03;
lcd_dat_2=0x0f;
break;
case 0:
lcd_dat_1=0x07;
lcd_dat_2=0x0d;
break;
}
}
/**************************************************************************************
函数名称;Temper_showed()
函数功能:LCD显示温度值
输入参数;无
返回参数:无
全局变量:lcd_dat_1; lcd_dat_2; Temperature; Temper_Flag
**************************************************************************************/
void Temper_showed(void)
{
unsigned int tmp;
unsigned char lcd_dat_tmp;
tmp=(int)(Temperature*10); //将要显示的数变为整数取出
if(Temperature<100)
{
if(!Temper_Flag)
{
LCD_Add_Dat(0x00,0x00); //显示负号
LCD_Add_Dat(0x01,0x02);
}
else
{
LCD_Add_Dat(0x00,0x00); //不显示
LCD_Add_Dat(0x01,0x00);
}
lcd_dat_tmp=tmp/100; //取出十位数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x02,lcd_dat_1); //显示十位
LCD_Add_Dat(0x03,lcd_dat_2);
lcd_dat_tmp=(tmp%100)/10; //取出个位数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x04,lcd_dat_1); //显示个位
LCD_Add_Dat(0x05,lcd_dat_2);
lcd_dat_tmp=tmp%10; //取出小数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x06,lcd_dat_1|0x08);//显示小数和小数点
LCD_Add_Dat(0x07,lcd_dat_2);
}
else
{
lcd_dat_tmp=tmp/1000; //取出百位数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x00,lcd_dat_1); //显示百位
LCD_Add_Dat(0x01,lcd_dat_2);
lcd_dat_tmp=(tmp%1000)/100; //取出十位数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x02,lcd_dat_1); //显示十位
LCD_Add_Dat(0x03,lcd_dat_2);
lcd_dat_tmp=((tmp%1000)%100)/10;//取出个位数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x04,lcd_dat_1); //显示个位
LCD_Add_Dat(0x05,lcd_dat_2);
lcd_dat_tmp=tmp%10; //取出小数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x06,lcd_dat_1|0x08);//显示小数和小数点
LCD_Add_Dat(0x07,lcd_dat_2);
}
}
void main(void)
{
unsigned char i;
C8051F310_Init();
FAN_CON = 0;
WDI=0;
LCD_Init();
WDI=~WDI;
while(1)
{
WDI=~WDI;
DS18B20_ReadTemperature();
WDI=~WDI;
Temper_showed();
WDI=~WDI;
if(Temperature>37)
{
FAN_CON = 1;
LED_CON = 0;
while(Temperature>35)
{
//延时180s
for(i=4;i>0;i--)
{ WDI=~WDI;
Delay_4ms(250);
WDI=~WDI;
}
DS18B20_ReadTemperature();
WDI=~WDI;
Temper_showed();
}
FAN_CON = 0;
LED_CON = 1;
}
else
FAN_CON = 0;
LED_CON = 1;
//延时180s
for(i=4;i>0;i--)
{
WDI=~WDI;
Delay_4ms(250);
WDI=~WDI;
}
}
}
#include <c8051F310.h>
#include <INTRINS.H>
sbit FAN_CON=P0^1;
sbit DQ=P1^0;
sbit WDI=P1^1;
sbit LED_CON=P1^2;
sbit LCD_DA=P1^4;
sbit LCD_WR=P1^5;
sbit LCD_RD=P1^6;
sbit LCD_CS=P1^7;
bit FLG_DS18B20_RET;
bit Temper_Flag=1;
float Temperature=0.0;
unsigned char lcd_dat_1;
unsigned char lcd_dat_2;
//*************************************************************************************
//函数名称;Delay_1us()
//函数功能:执行 12*cnt+1 条单指令,对于C8051F221晶振频率为12M的情况下,延时1us乘以cnt
//输入参数;unsigned char cnt
//返回参数:无
//*************************************************************************************
void Delay_1us(unsigned char cnt)
{
unsigned char i;
for (i = cnt; i > 0; i--)
{
_nop_();
_nop_();
_nop_();
}
}
//************************************************************************************
//函数名称;Delay_4ms()
//函数功能:执行 4000*cnt+1 条单指令,对于C8051F221晶振频率为12M的情况下,延时4ms乘以cnt
//输入参数;unsigned char cnt
//返回参数:无
//************************************************************************************
void Delay_4ms(unsigned char cnt)
{//(5k+4)j+9
unsigned char i,j,k;
for(i=cnt;i>0;i--)
{
for(j=224;j>0;j--)
{
for(k=42;k>0;k--)
WDI=~WDI;
_nop_();
_nop_();
}
}
}
/**************************************************************************************
函数名称;C8051F310_Init()
函数功能:寄存器及端口初始化
输入参数;无
返回参数:无
**************************************************************************************/
void C8051F310_Init(void)
{
int i = 0;
//看门狗
PCA0MD &= ~0x40; // disable watchdog timer
P0MDIN=0xFF;//p012口全部设置为数字输入
P1MDIN=0xFF;
P2MDIN=0xFF;
P0MDOUT=0x02;//p0.1设置为推挽输出(风扇控制设置为推挽输出)
P1MDOUT=0xB6;//其余为漏极开路
P2MDOUT=0x00;
XBR1=0x40;//端口弱上拉使能,交叉开关使能
//XBR0=0x00;//
OSCXCN |= 0x27; // Use external Crystal,SYSCLK-12M
CLKSEL |= 0x01;
OSCICN &= 0x7F; //关闭内部振荡
}
/**************************************************************************************
函数名称;DS18B20_Init()
函数功能:DS18B20初始化
输入参数;无
返回参数:无
全局变量:FLG_DS18B20_RET 为1初始化失败,为0初始化成功
**************************************************************************************/
void DS18B20_Init(void)
{
DQ = 0; // 单片机将DQ拉低
Delay_1us(250); // 精确延时大于480us,小于960us
Delay_1us(250);
DQ = 1; // 释放总线
Delay_1us(30); // DS18B20检测到高后,等待15-60us将总线拉低,保持60-240us
FLG_DS18B20_RET=DQ; // 稍做延时后 如果FLG_DS18B20_RET=0则初始化成功,否则初始化失败
Delay_1us(250); // 精确延时 大于 240us
}
/**************************************************************************************
函数名称;LCD_WrCom()
函数功能:向LCD写入命令--LCM046
输入参数;unsigned char command
返回参数:无
全局变量:无
**************************************************************************************/
void LCD_WrCom(unsigned char command)
{
unsigned char i,tmp;
tmp = command;
LCD_CS=0;
Delay_1us(30);
LCD_WR=0; //写入"100"
LCD_DA=1;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
LCD_WR=0;
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
LCD_WR=0;
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
CY=0;
for(i=9;i>0;i--)//写入命令
{
LCD_WR=0;
if(tmp&0x80)
LCD_DA=1;
else
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
tmp=tmp<<1;
}
LCD_DA=1;
LCD_WR=1;
LCD_CS=1;
Delay_1us(60);
}
/**************************************************************************************
函数名称;LCD_Add_Dat()
函数功能:向LCD写入地址、数据
输入参数;unsigned char command
返回参数:无
全局变量:无
备注: 格式;101 0 A4 A3 A2 A1 A0 D0 D1 D2 D3
**************************************************************************************/
void LCD_Add_Dat(unsigned char add,unsigned char dat)
{
unsigned char i,j,tmp1,tmp2;
tmp1=add;
tmp2=dat;
LCD_CS=0;
Delay_1us(15);
LCD_WR=0; //写入"101"
LCD_DA=1;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
LCD_WR=0;
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
LCD_WR=0;
LCD_DA=1;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
for(i=6;i>0;i--) //写入5位地址
{
LCD_WR=0;
if(tmp1&0x20)
LCD_DA=1;
else
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
tmp1=tmp1<<1;
}
Delay_1us(6);
for(j=4;j>0;j--) //写入4位数据
{
LCD_WR=0;
if(tmp2&0x01)
LCD_DA=1;
else
LCD_DA=0;
Delay_1us(6);
LCD_WR=1;
Delay_1us(6);
tmp2=tmp2>>1;
}
LCD_DA=1;
LCD_WR=1;
LCD_CS=1;
Delay_1us(60);
}
//LCD初始化
/**************************************************************************************
函数名称;LCD_Init()
函数功能:LCD初始化
输入参数;无
返回参数:无
全局变量:无
**************************************************************************************/
void LCD_Init(void)
{
LCD_CS=1;
LCD_WR=1;
LCD_RD=1;
Delay_1us(250);
Delay_1us(20);
Delay_1us(20);
LCD_WrCom(0x29); //初始化命令
LCD_WrCom(0x18); //内部RC
LCD_WrCom(0x01); //开振荡器
LCD_WrCom(0x03); //开显示器
}
/**************************************************************************************
函数名称;Lcd_Hex()
函数功能:将要显示的数值转换为LCD输入的十六进制
输入参数;unsigned char lcd_dat
返回参数:无
全局变量:lcd_dat_1; lcd_dat_2
**************************************************************************************/
void Lcd_Hex(unsigned char lcd_dat)
{
switch(lcd_dat)
{
case 1:
lcd_dat_1=0x00;
lcd_dat_2=0x05;
break;
case 2:
lcd_dat_1=0x05;
lcd_dat_2=0x0b;
break;
case 3:
lcd_dat_1=0x01;
lcd_dat_2=0x0f;
break;
case 4:
lcd_dat_1=0x02;
lcd_dat_2=0x07;
break;
case 5:
lcd_dat_1=0x03;
lcd_dat_2=0x0e;
break;
case 6:
lcd_dat_1=0x07;
lcd_dat_2=0x0e;
break;
case 7:
lcd_dat_1=0x01;
lcd_dat_2=0x05;
break;
case 8:
lcd_dat_1=0x07;
lcd_dat_2=0x0f;
break;
case 9:
lcd_dat_1=0x03;
lcd_dat_2=0x0f;
break;
case 0:
lcd_dat_1=0x07;
lcd_dat_2=0x0d;
break;
}
}
/**************************************************************************************
函数名称;Temper_showed()
函数功能:LCD显示温度值
输入参数;无
返回参数:无
全局变量:lcd_dat_1; lcd_dat_2; Temperature; Temper_Flag
**************************************************************************************/
void Temper_showed(void)
{
unsigned int tmp;
unsigned char lcd_dat_tmp;
tmp=(int)(Temperature*10); //将要显示的数变为整数取出
if(Temperature<100)
{
if(!Temper_Flag)
{
LCD_Add_Dat(0x00,0x00); //显示负号
LCD_Add_Dat(0x01,0x02);
}
else
{
LCD_Add_Dat(0x00,0x00); //不显示
LCD_Add_Dat(0x01,0x00);
}
lcd_dat_tmp=tmp/100; //取出十位数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x02,lcd_dat_1); //显示十位
LCD_Add_Dat(0x03,lcd_dat_2);
lcd_dat_tmp=(tmp%100)/10; //取出个位数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x04,lcd_dat_1); //显示个位
LCD_Add_Dat(0x05,lcd_dat_2);
lcd_dat_tmp=tmp%10; //取出小数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x06,lcd_dat_1|0x08);//显示小数和小数点
LCD_Add_Dat(0x07,lcd_dat_2);
}
else
{
lcd_dat_tmp=tmp/1000; //取出百位数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x00,lcd_dat_1); //显示百位
LCD_Add_Dat(0x01,lcd_dat_2);
lcd_dat_tmp=(tmp%1000)/100; //取出十位数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x02,lcd_dat_1); //显示十位
LCD_Add_Dat(0x03,lcd_dat_2);
lcd_dat_tmp=((tmp%1000)%100)/10;//取出个位数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x04,lcd_dat_1); //显示个位
LCD_Add_Dat(0x05,lcd_dat_2);
lcd_dat_tmp=tmp%10; //取出小数
Lcd_Hex(lcd_dat_tmp);
LCD_Add_Dat(0x06,lcd_dat_1|0x08);//显示小数和小数点
LCD_Add_Dat(0x07,lcd_dat_2);
}
}
void main(void)
{
unsigned char i;
C8051F310_Init();
FAN_CON = 0;
WDI=0;
LCD_Init();
WDI=~WDI;
while(1)
{
WDI=~WDI;
DS18B20_ReadTemperature();
WDI=~WDI;
Temper_showed();
WDI=~WDI;
if(Temperature>37)
{
FAN_CON = 1;
LED_CON = 0;
while(Temperature>35)
{
//延时180s
for(i=4;i>0;i--)
{ WDI=~WDI;
Delay_4ms(250);
WDI=~WDI;
}
DS18B20_ReadTemperature();
WDI=~WDI;
Temper_showed();
}
FAN_CON = 0;
LED_CON = 1;
}
else
FAN_CON = 0;
LED_CON = 1;
//延时180s
for(i=4;i>0;i--)
{
WDI=~WDI;
Delay_4ms(250);
WDI=~WDI;
}
}
}
顶起来啊
