2794|3

13

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求大神帮我看看程序咋死在1602液晶显示里了 [复制链接]

求大神帮我看看程序咋死在1602液晶显示里了,加上陀螺仪程序也不行
#include "REG52.H"       
#include "math.h"    //Keil library  
#include "stdio.h"   //Keil library       
#include "INTRINS.H"
#include "Automatic_Level_Include.h"
//****************************************
//整数转字符串
//****************************************
void lcd_printf(uc *s,int temp_data)
{
        if(temp_data<0)
        {
                temp_data=-temp_data;
                *s='-';
        }
        else *s=' ';
        *++s =temp_data/100+0x30;
        temp_data=temp_data%100;     //取余运算
        *++s =temp_data/10+0x30;
        temp_data=temp_data%10;      //取余运算
        *++s =temp_data+0x30;        
}
//**************************************
//在1602上显示10位数据
//**************************************
void Display10BitData(int value,uc x,uc y)
{
        value/=64;                                                        //转换为10位数据
        lcd_printf(dis, value);                        //转换数据显示
        DisplayListChar(x,y,dis,4);        //启始列,行,显示数组,显示长度
}
//****************************************
//LCD1602初始化
//****************************************
void InitLcd()                               
{                       
        WriteCommandLCM(0x38,1);       
        WriteCommandLCM(0x08,1);       
        WriteCommandLCM(0x01,1);       
        WriteCommandLCM(0x06,1);       
        WriteCommandLCM(0x0c,1);
}                       
//****************************************
//LCD1602写允许
//****************************************
void WaitForEnable(void)       
{                                       
        Lcd_DataPort=0xff;               
        LCD_RS=0;
        LCD_RW=1;
        _nop_();
        LCD_EN=1;
        _nop_();
        _nop_();
        while(Lcd_DataPort&0x80);       
        LCD_EN=0;                               
}                                       
//****************************************
//LCD1602写入命令
//****************************************
void WriteCommandLCM(uc CMD,uc Attribc)
{                                       
        if(Attribc)WaitForEnable();       
        LCD_RS=0;
        LCD_RW=0;
        _nop_();
        Lcd_DataPort=CMD;
        _nop_();       
        LCD_EN=1;
        _nop_();
        _nop_();
        LCD_EN=0;
}                                       
//****************************************
//LCD1602写入数据
//****************************************
void WriteDataLCM(uc dataW)
{                                       
        WaitForEnable();               
        LCD_RS=1;
        LCD_RW=0;
        _nop_();
        Lcd_DataPort=dataW;
        _nop_();       
        LCD_EN=1;
        _nop_();
        _nop_();
        LCD_EN=0;
}               
//****************************************
//LCD1602写入一个字符
//****************************************
void DisplayOneChar(uc X,uc Y,uc DData)
{                                               
        Y&=1;                                               
        X&=15;                                               
        if(Y)
        X|=0x40;                                       
        X|=0x80;                       
        WriteCommandLCM(X,0);               
        WriteDataLCM(DData);               
}                                               
//****************************************
//LCD1602显示字符串
//****************************************
void DisplayListChar(uc X,uc Y,uc *DData,L)
{
        uc ListLength=0;
        Y&=0x1;               
        X&=0xF;               
        while(L--)            
        {                       
                DisplayOneChar(X,Y,DData[ListLength]);
                ListLength++;  
                X++;                        
        }   
}

#include "reg52.h"       
#include "math.h"
#include "stdio.h"
#include "INTRINS.H"
#include "Automatic_Level_Include.h"
#include "Automatic_Level_I2C.c"
#include "Automatic_Level_LCD.c"
#include "Automatic_Level_MPU6050.c"
#include "Automatic_Level_Motor.c"
#include "Automatic_Level_Delay.c"
#include "KEY.c"

/*************************************************************************************
函数名:Count(Check_Num_X,Check_Num_Y);
函数作用:利用传递的X,Y轴加速度:计算运动需要控制的电机位置,计算旋转方向,旋转步数
参数:
运动的马达数量:Run_Motor_Num = 1--上电机  2--下电机  3--两个电机
运动步数:Step_Num
运动方向:L_Dir = 0--逆时针转   1--顺时针转
运动方向:R_Dir = 0--逆时针转   1--顺时针转
*************************************************************************************/
                        /*void Motor_Run(        uc Run_Motor_Num,//运动马达选择
                                                                ui L1_Step,//L1运动步数
                                                                ui L2_Step,//L2运动步数
                                                                ui R1_Step,//R1运动步数
                                                                ui L1_Dir,//L1电机旋转方向
                                                                ui L2_Dir,//L2电机旋转方向
                                                                ui R1_Dir//R1电机旋转方向
                                                        )*/
void Count(int X_Num,int Y_Num)
{       
        //Motor_Run(L1_L2_R1,5,5,5,Up,Up,Up);//L1_L2_R1同时上升
        if((X_Num < 0) && (Y_Num == 0))//X为负数,左高右低
        {
                Motor_Run(L1_L2_R1,1,1,1,Down,Down,Up);//L1_L2同时下降  R1上升
        }
        else if((X_Num > 0) && (Y_Num == 0))//X为正数,左低右高
        {
                Motor_Run(L1_L2_R1,1,1,1,Up,Up,Down);//L1_L2同时上升  R1下降
        }
        else if((Y_Num < 0) && (X_Num == 0))//Y为负数,上低下高
        {
                Motor_Run(L1_L2,1,1,0,Up,Down,No_Way);//L1上升,L2下降,R1不管
        }
        else if((Y_Num > 0) && (X_Num == 0))//Y为正数,上高下低
        {
                Motor_Run(L1_L2,1,1,0,Down,Up,No_Way);//L1下降,L2上升,R1不管
        }       
        else if((X_Num > 0) && (Y_Num > 0))//X为正数,Y为正数
        {
                Motor_Run(L1_L2_R1,1,1,1,Down,Up,Down);
        }
        else if((X_Num < 0) && (Y_Num < 0))//X为负数,Y为负数
        {
                Motor_Run(L1_L2_R1,1,1,1,Up,Down,Up);                                          
        }
        else if((X_Num > 0) && (Y_Num < 0))//X为正数,Y为负数
        {
                Motor_Run(L1_L2_R1,1,1,1,Up,Down,Down);
        }
        else if((X_Num < 0) && (Y_Num > 0))//X为负数,Y为正数
        {
                Motor_Run(L1_L2_R1,1,1,1,Down,Up,Up);
        }
       
}

/*********************************************************
函数名:void main()
函数作用:接收显示MPU6050的数据,控制步进电机,按键检测
参数:无
返回值:无
*********************************************************/
void main()
{
        ui Look_Refresh_Temp = 20;//LCD扫描时间初始化       
        Sys_Delay(5);        //上电延时               
        InitLcd();                //液晶初始化
        InitMPU6050();        //初始化MPU6050
        init_T0();        //定时器初始化
        P1=0x00;
//        ENA=0;         //ENA  控制端
//    ENB=0;         //ENB  控制端                    //控制电机端口置地电平
//    ENC=0;
//    delay(20);       
        Sys_Delay(150);        //系统初始化完成后延时一会
        while(1)
        {       
            if(Button_Up==0)
                {
                        delay(2);
                        if(Button_Up==0)
                        {
                  while(!Button_Up);//上升按钮按下       
                          ENA=1;         //ENA  控制端
                          ENB=1;         //ENB  控制端
                          ENC=1;       
                          Motor_Timer=hig(70);
                          Motor_Run(L1_L2_R1,Motor_Timer,Motor_Timer,Motor_Timer,Down,Down,Down);       
                        }               
             }
                if(Button_Down==0)
                {
                        delay(2);
                        if(Button_Down==0)
                        {
                                while(!Button_Down);
                                ENA=1;         //ENA  控制端
                                ENB=1;         //ENB  控制端
                                ENC=1;       
                                Motor_Timer=hig(40);
                                Motor_Run(L1_L2_R1,Motor_Timer,Motor_Timer,Motor_Timer,Up,Up,Up);
                        }
            }
        if(Look_Refresh_Temp == 20)
                {
                        Display10BitData(GetData(ACCEL_XOUT_H),2,0);        //显示X轴加速度
                        Display10BitData(GetData(ACCEL_YOUT_H),7,0);        //显示Y轴加速度
                        Display10BitData(GetData(ACCEL_ZOUT_H),12,0);        //显示Z轴加速度
//                        Display10BitData(GetData(GYRO_XOUT_H),2,1);                //显示X轴角速度
//                        Display10BitData(GetData(GYRO_YOUT_H),7,1);                //显示Y轴角速度
//                        Display10BitData(GetData(GYRO_ZOUT_H),12,1);        //显示Z轴角速度
//                        Look_Refresh_Temp = 0;//扫描时间复位
                }
                //Check_Num_X = GetData(ACCEL_XOUT_H);//获得X轴加速度
                //Check_Num_Y = GetData(ACCEL_YOUT_H);//获得Y轴加速度
                /*将获得的XY轴加速度传递给Count函数:计算运动需要控制的电机位置,计算旋转方向,旋转步数*/
//                Count(GetData(ACCEL_XOUT_H),GetData(ACCEL_YOUT_H));
//                Look_Refresh_Temp ++;//扫描时间自加

//           if(spot==0)
//          {
//
//          while(!spot);
//          IN1 = 0;
//          IN2 = 0;
//          IN3 = 0;//逆时针相序
//          IN4 = 0;
//          IN5 = 0;//逆时针相序
//          IN6 = 0;       
//          
//          
//         }

        }
}


void T0_temp(void) interrupt 1  //电机转速定时器0
{
  TH0=(65536-3036)%256;   //  16mm/s==1mm/62500us
  TL0=(65536-3036)/256;
  n++;                                                                                                                                  
}

#include "REG52.H"       
#include "math.h"    //Keil library  
#include "stdio.h"   //Keil library       
#include "INTRINS.H"
#include "Automatic_Level_Include.h"


//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050()
{
        Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态
        Single_WriteI2C(SMPLRT_DIV, 0x07);
        Single_WriteI2C(CONFIG, 0x06);
        Single_WriteI2C(GYRO_CONFIG, 0x18);
        Single_WriteI2C(ACCEL_CONFIG, 0x01);
}

此帖出自单片机论坛

最新回复

那你就先把液晶点亮了在实现其他功能啊,因为液晶不亮(是点不亮吧),你加陀螺仪的额程序又有何用,只要把液晶部分的程序提出来进行分析就是了。切记:调试程序不能焦躁。  详情 回复 发表于 2016-10-14 09:50
点赞 关注
 

回复
举报

70

帖子

4

TA的资源

一粒金砂(中级)

沙发
 
太长了点吧
此帖出自单片机论坛
 
 

回复

13

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

我主要想问问液晶1602部分哪里死了
此帖出自单片机论坛

点评

那你就先把液晶点亮了在实现其他功能啊,因为液晶不亮(是点不亮吧),你加陀螺仪的额程序又有何用,只要把液晶部分的程序提出来进行分析就是了。切记:调试程序不能焦躁。  详情 回复 发表于 2016-10-14 09:50
 
 
 

回复

70

帖子

4

TA的资源

一粒金砂(中级)

4
 
未来星辰 发表于 2016-10-12 13:26
我主要想问问液晶1602部分哪里死了

那你就先把液晶点亮了在实现其他功能啊,因为液晶不亮(是点不亮吧),你加陀螺仪的额程序又有何用,只要把液晶部分的程序提出来进行分析就是了。切记:调试程序不能焦躁。
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表