lcd1602上的数字变动求助求助!!

2019-07-15 17:09发布

本帖最后由 xch111 于 2015-5-16 17:16 编辑

在设计单片机电子秤时,在没接HX711传感器之前lcd显示正常,但在接上HX711烧入程序后会出现lcd上的重量位置上的数字不停的变动,蜂鸣器也不断的响,是为什么?求帮助啊~~~include <reg52.h>                 //调用单片机头文件#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

#define ulong unsigned long

#include "ds1302.h"

#include<intrins.h>

uchar code table_num[]="0123456789abcdefg";

sbit rs=P1^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit rw=P1^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit e =P1^2;         //片选信号   下降沿触发

sbit hx711_dout=P2^1;
sbit hx711_sck=P2^0;

sbit beep = P1^6;     //蜂鸣器
uchar menu_1,menu_2;

long weight;

uint temp,qi_weight;
bit chaozhong_flag;
bit leiji_flag;
bit flag_200ms ;

ulong price,z_price;   //单价 总价
uchar flag_p;

/***************
删除键
去皮
价格清零

***************/

/******1ms延时函数***12M晶振**************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}

/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
        while(q--);
}

/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
        e=0;
        rs=0;
        rw=0;
        P0=com;
        delay_uint(3);
        e=1;
        delay_uint(25);
        e=0;
}

/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
        e=0;
        rs=1;
        rw=0;
        P0=dat;
        delay_uint(3);
        e=1;
        delay_uint(25);
        e=0;       
}



/***********************lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        while(1)                                                                                                                 
        {
                if(*p == '')  break;
                write_data(*p);
                p++;
        }       
}

/***********************lcd1602初始化设置************************/
void init_1602()         //lcd1602初始化设置
{
        write_com(0x38);        //
        write_com(0x0c);
        write_com(0x06);
        delay_uint(1000);
}

////////////////在指定位置显示指定字符//////////
void write_zifu(uchar hang,uchar add,uchar dat)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(dat);
}

/********************************************************************
* 名称 : write_sfm4_price(uchar hang,uchar add,uchar date)
* 功能 : 显示价格
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_sfm4_price(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
                write_data(0x30+date/1000%10);
                write_data(0x30+date/100%10);
                write_data('.');
                write_data(0x30+date/10%10);
                write_data(0x30+date%10);
}

void write_sfm4_price1(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
                write_com(0x80+0x40+add);
                write_data(0x30+date/1000%10);
                write_data(0x30+date/100%10);
                write_data('.');
                write_data(0x30+date/10%10);
                write_data(0x30+date%10);
}

/****************开机液晶显示函数 初始化液晶的内容********************************/
void init_1602_dis_csf()  //初始化液晶
{                                                                    
        write_string(1,0,"   W:0.000kg    ");
        write_string(2,0,"P:00.00  Z:00.00");
        write_zifu(2,7,0x5c);        //¥               
//        write_zifu(2,15,0x5c);        //¥               

}

void init_1602_dis_sj()  //初始化液晶
{                                                                    
        write_string(1,0,"    :  :    W:    ");               
        write_string(2,0," 20  -  -         ");       
}

/***********************lcd1602上显示两位十进制数************************/
void write_sfm1(uchar hang,uchar add,uchar date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date % 10);       
}

/***********************lcd1602上显示两位十进制数************************/
void write_sfm2_ds1302(uchar hang,uchar add,uchar date)
{
        uchar shi,ge;
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        shi=date/16;
        ge=date%16;                  
        write_data(table_num[shi]);
        write_data(table_num[ge]);       
}

/*****************控制光标函数********************/
void write_guanbiao(uchar hang,uchar add,uchar date)
{               
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        if(date == 1)
                write_com(0x0f);     //显示光标并且闪烁       
        else
                write_com(0x0c);   //关闭光标
}         


/*******************压力显示程序***********************/
void write_1602_yl(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date/10000%10);
        write_data('.');
        write_data(0x30+date/100%10);
        write_data(0x30+date/10%10);
        write_data(0x30+date%10);       
       
}


void Delay__hx711_us(void)
{
        _nop_();
        _nop_();
}

ulong ReadCount(void)        //增益128
{
        ulong count,value = 0;
        uchar i;
          hx711_dout=1;
        Delay__hx711_us();
          hx711_sck=0;
          count=0;
          while(hx711_dout)          ;
          for(i=0;i<24;i++)
        {
                  hx711_sck=0;
                  count=count<<1;
                hx711_sck=1;
                  if(hx711_dout)
                        count++;
        }
        hx711_sck=1;
        Delay__hx711_us();
        hx711_sck=0;  
        return(count);
}

void get_pizhong()          //获取皮重,秤盘重量
{
        ulong hx711_dat;
        hx711_dat=ReadCount();                //HX711AD转换数据处理
        temp=(uint)(hx711_dat/100);       
}

void get_weight()          //获取被测物体重量
{
        ulong hx711_data,a;
        uint get,aa;       
        hx711_data=ReadCount();                   //HX711AD转换数据处理
        get=(uint)(hx711_data/100);
        if(get>temp)
        {
                a=ReadCount();
                aa=(uint)(a/100)-temp;
                weight=(uint)((float)aa/3.7+0.05);//重量转换函数,传感器型号不同此函数要适当修改
        }
}

/************************************************/
/*  由于称重传感器线性度参数的不同,而对获得的重量数据处理,
此处可能会根据不同称重传感器,程序的代码会有所不同      */       
/************************************************/


/*************定时器0初始化程序***************/
void time_init()          
{
        EA   = 1;                   //开总中断
        TMOD = 0X01;          //定时器0、定时器1工作方式1
        ET0  = 1;                  //开定时器0中断
        TR0  = 1;                  //允许定时器0定时
}

/********************独立按键程序*****************/
uchar key_can;         //按键值

void key()         //独立按键程序
{
        static uchar key_new = 0;
        key_can = 20;                   //按键值还原
        P3 = 0x0f;
        if((P3 & 0x0f) != 0x0f)                //按键按下
        {
                delay_1ms(1);                     //按键消抖动
                if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
                {                                                //确认是按键按下
                        key_new = 0;
                        P3 = (P3 | 0xf0);   //矩阵键盘扫描
                        switch(P3)
                        {
                                case 0xee:  key_can = 1;  break;  //得到按键值
                                case 0xde:  key_can = 4;  break;   //得到按键值
                                case 0xbe:  key_can = 7;  break;   //得到按键值
                                case 0x7e:  key_can = 10;  break;   //得到按键值
       
                                case 0xed:  key_can = 0;  break;  //得到按键值
                                case 0xdd:  key_can = 8;  break;   //得到按键值
                                case 0xbd:  key_can = 5;  break;   //得到按键值
                                case 0x7d:  key_can = 2;  break;   //得到按键值
       
                                case 0xeb:  key_can = 3;  break;  //得到按键值
                                case 0xdb:  key_can = 6;  break;   //得到按键值
                                case 0xbb:  key_can = 9;  break;   //得到按键值
                                case 0x7b:  key_can = 11;  break;   //得到按键值
       
                                case 0xe7:  key_can = 15;  break;  //得到按键值
                                case 0xd7:  key_can = 14;  break;  //得到按键值
                                case 0xb7:  key_can = 13;  break;   //得到按键值
                                case 0x77:  key_can = 12;  break;  //得到按键值        
                        }       
                        beep = 0;  //蜂鸣器叫一声
                        delay_1ms(100);
                        beep = 1;
                }                       
        }
        else
                key_new = 1;       
}

/************按键控制函数*************/
void key_with()
{
        if(key_can <= 9)   //数字键
        {
                if(flag_p >= 4)
                {
                        flag_p = 0;
                }
                if(flag_p == 0)
                        price = key_can;
                else
                {
                        price = price * 10 + key_can;           
                }          
                write_sfm4_price(2,2,price);        //显示单价               
                flag_p ++;
//                write_sfm2(1,0,flag_p);
        }
        if(key_can == 15)   //删除键
        {   
                if(price != 0 )
                {
                        flag_p --;
                        price /= 10;                 //删除
                        write_sfm4_price(2,2,price);//显示单价                               
                }
        }
        if(key_can == 14)   //去皮
        {
                get_pizhong();          //获取皮重,秤盘重量
                        write_1602_yl(1,5,0);              //显示压力
        }
        if(key_can == 13)   //价格清零
        {
                flag_p = 0;
                price = 0;
                write_sfm4_price(2,2,price);//显示单价                               
        }
}

/**********************设置函数************************/
void key_with_sj()
{
        if(key_can == 12)   // 切换键
        {
                menu_1++;
                menu_2 = 0;
                if(menu_1 == 1)
                {
                        init_1602_dis_sj();
                }
                if(menu_1 >= 2)
                {
                        menu_1 = 0;       
                    init_1602();
                          init_1602_dis_csf();  //初始化液晶

                }
        }
        if(menu_1 == 1)
        {
                if(key_can == 15)        //选择键
                {
                        if(menu_1 == 1)                  //设置时间
                        {
                                menu_2 ++;
                                if(menu_2 > 7)
                                {
                                        menu_2 = 0;
                                        write_guanbiao(1,2,0);          //关闭光标
                                }
                        }
                }
               
                if(menu_1 == 1)
                {
                        if(menu_2 == 1)                  //设置时
                        {
                                if(key_can == 14)        //加
                                {
                                        shi+=0x01;
                                        if((shi & 0x0f) >= 0x0a)
                                                shi = (shi & 0xf0) + 0x10;
                                        if(shi >= 0x24)
                                                shi = 0;
                                }               
                                if(key_can == 13)        //减
                                {
                                        if(shi == 0x00)
                                                shi = 0x24;
                                        if((shi & 0x0f) == 0x00)
                                                shi = (shi | 0x0a) - 0x10;
                                        shi -- ;
                                }                                         
                        }
                        if(menu_2 == 2)                  //设置分
                        {
                                if(key_can == 14)        //加
                                {
                                        fen+=0x01;
                                        if((fen & 0x0f) >= 0x0a)
                                                fen = (fen & 0xf0) + 0x10;
                                        if(fen >= 0x60)
                                                fen = 0;
                                }               
                                if(key_can == 13)        //减          
                                {
                                        if(fen == 0x00)
                                                fen = 0x5a;
                                        if((fen & 0x0f) == 0x00)
                                                fen = (fen | 0x0a) - 0x10;
                                        fen -- ;
                                }       
                        }
                        if(menu_2 == 3)                  //设置秒
                        {
                                if(key_can == 14)        //加
                                {
                                        miao+=0x01;
                                        if((miao & 0x0f) >= 0x0a)
                                                miao = (miao & 0xf0) + 0x10;
                                        if(miao >= 0x60)
                                                miao = 0;
                                }       
                                if(key_can == 13)        //减          
                                {
                                        if(miao == 0x00)
                                                miao = 0x5a;
                                        if((miao & 0x0f) == 0x00)
                                                miao = (miao | 0x0a) - 0x10;
                                        miao -- ;                       
                                }
                        }
                        if(menu_2 == 4)                  //设置星期
                        {
                                if(key_can == 14)        //加
                                {
                                    week+=0x01;
                                        if((week & 0x0f) >= 0x0a)
                                                week = (week & 0xf0) + 0x10;
                                        if(week >= 0x08)
                                                week = 1;
                                }               
                                if(key_can == 13)        //减          
                                {
                                        if(week == 0x01)
                                                week = 0x08;
                                        if((week & 0x0f) == 0x00)
                                                week = (week | 0x0a) - 0x10;
                                        week -- ;
                                }       
                        }
                        if(menu_2 == 5)                  //设置年
                        {
                                if(key_can == 14)        //加
                                {
                                    nian+=0x01;
                                        if((nian & 0x0f) >= 0x0a)
                                                nian = (nian & 0xf0) + 0x10;
                                        if(nian >= 0x9a)
                                                nian = 1;
                                }               
                                if(key_can == 13)        //减          
                                {
                                        if(nian == 0x01)
                                                nian = 0x9a;
                                        if((nian & 0x0f) == 0x00)
                                                nian = (nian | 0x0a) - 0x10;
                                        nian -- ;               
                                }       
                        }
                        if(menu_2 == 6)                  //设置月
                        {
                                if(key_can == 14)        //加
                                {
                                    yue+=0x01;
                                        if((yue & 0x0f) >= 0x0a)
                                                yue = (yue & 0xf0) + 0x10;
                                        if(yue >= 0x12)
                                                yue = 1;
                                }               
                                if(key_can == 13)        //减          
                                {
                                        if(yue == 0x01)
                                                yue = 0x13;
                                        if((yue & 0x0f) == 0x00)
                                                yue = (yue | 0x0a) - 0x10;
                                        yue -- ;                                       
                                }       
                        }
                        if(menu_2 == 7)                  //设置日
                        {
                                if(key_can == 14)        //加
                                {
                            ri+=0x01;
                                if((ri & 0x0f) >= 0x0a)
                                        ri = (ri & 0xf0) + 0x10;
                                if(ri >= 0x32)
                                        ri = 0;                       
                                }               
                                if(key_can == 13)        //减          
                                {
                                        if(ri == 0x01)
                                                ri = 0x32;
                                        if((ri & 0x0f) == 0x00)
                                                ri = (ri | 0x0a) - 0x10;
                                        ri -- ;                       
                                }       
                        }
                        write_sfm2_ds1302(1,2,shi);           //显示时
                        write_sfm2_ds1302(1,5,fen);           //显示分
                        write_sfm2_ds1302(1,8,miao);           //显示秒
                        write_sfm1(1,14,week);           //显示星期                                       
                        write_sfm2_ds1302(2,3,nian);           //显示年
                        write_sfm2_ds1302(2,6,yue);           //显示月
                        write_sfm2_ds1302(2,9,ri);           //显示日
                        switch(menu_2)           // 光标显示
                        {
                                case 1:  write_guanbiao(1,2,1);  break;
                                case 2:  write_guanbiao(1,5,1);  break;
                                case 3:  write_guanbiao(1,8,1);  break;
                                case 4:  write_guanbiao(1,14,1); break;
                                case 5:  write_guanbiao(2,3,1);  break;
                                case 6:  write_guanbiao(2,6,1);  break;
                                case 7:  write_guanbiao(2,9,1);  break;
                        }
                        write_time();           //把时间写进去
                }
        }       
}

/*************定时器0初始化程序***************/
void init_1602_ds1302()
{
        write_sfm2_ds1302(2,3,nian);       
        write_sfm2_ds1302(2,6,yue);       
        write_sfm2_ds1302(2,9,ri);       
        write_sfm2_ds1302(1,2,shi);       
        write_sfm2_ds1302(1,5,fen);       
        write_sfm2_ds1302(1,8,miao);
        write_sfm1(1,14,week);               
}


/*****************主函数********************/
void main()
{       
        beep = 0;  //蜂鸣器叫一声
        delay_1ms(100);
        P0 = P1 = P2 = P3 = 0xff;                //单片机IO口初始化为1
        time_init();                    //初始化定时器
        init_1602();                 //lcd1602初始化
        init_1602_dis_csf(); //lcd1602初始化显示
        while(1)
        {
                key();         //独立按键程序
                if(key_can < 20)
                {       
                        if(menu_1 == 0)
                                key_with();  
                        key_with_sj();  
                }
                if(flag_200ms == 1)
                {
                        flag_200ms = 0;
                        if(weight >= 5000)  //超重报警
                                beep = ~beep;
                        else
                                beep = 1;
                        if((menu_1 == 1) && (menu_2 == 0))
                        {                
                                read_time();                  //读时间
                                init_1602_ds1302();   //显示时钟          
                        }
                        if(menu_1 == 0)
                        {
                                get_weight();          //获取被测物体重量
                                if(weight >= 0 )
                                        write_1602_yl(1,5,weight);              //显示压力
                                z_price = weight * price / 1000;   //总价等于重量*单价
                                write_sfm4_price1(2,11,z_price);        //显示总价                                       
                        }
                }
                delay_1ms(1);
        }
}


/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{       
        static uchar value;                         //定时2ms中断一次
        TH0 = 0xf8;
        TL0 = 0x30;     //2ms
        value++;          
        if(value >= 100)
        {
                value = 0;          
                flag_200ms = 1;
        }
}

新建文本文档.rar 下载积分: 积分 -1 分
3.7 KB, 下载次数: 34, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。