微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请哪位大虾帮我看下 我是不程序哪有问题 为何液晶屏...

请哪位大虾帮我看下 我是不程序哪有问题 为何液晶屏...

时间: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;
                        }
         }       
}

顶起来啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top