久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1758|回復: 1
打印 上一主題 下一主題
收起左側

如何在lcd12864上顯示hmc5883的三軸磁場強度數據 求幫助

[復制鏈接]
跳轉到指定樓層
樓主
ID:327029 發表于 2019-5-24 20:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我自己寫的程序如下,但是三軸數據在lcd上直接顯示都是0,明明磁場角度都顯示好了。
#include <reg52.h>
#include <intrins.h>
#include <stdlib.h>
#include <math.h>
#include "LCD_Head.h"
uchar code Num[]={"0123456789"};
/*******************************************************************/
/* 延時函數 */
/*******************************************************************/
void delayms(int ms)   //毫秒級延遲
{
  while(ms--)
    {
  uchar i;
  for(i=0;i<150;i++)
        {
         _nop_();
         _nop_();
         _nop_();
         _nop_();
        }
     }
}
void delayNOP()   //最小延時函數,4條 NOP 指令
{
          _nop_();
          _nop_();
          _nop_();
          _nop_();
}
/************** 忙檢查 ***************/
void WaitForEnable(void)   
{           
  DataPort=0xFF;     
  LCM_RS=0;
  LCM_RW=1;
  delayNOP();
  LCM_EN=1;
  delayNOP();
  while(DataPort&0x80);   
  LCM_EN=0;         
}
/************** 寫命令 ***************/  
/**** Attribc=0 不要檢忙 *************
***** Attribc=1 需要檢忙 *************/        
void WriteCommandLCM(uchar CMD,bit Attribc)
{           
  if(Attribc)
  WaitForEnable();   
  LCM_RS=0;
  LCM_RW=0;
  delayNOP();
  DataPort=CMD;
  delayNOP();  
  LCM_EN=1;
  delayNOP();
  LCM_EN=0;
}
/************** 寫數據 ***************/         
void WriteDataLCM(uchar dataW)
{           
  WaitForEnable();     
  LCM_RS=1;
  LCM_RW=0;
  delayNOP();
  DataPort=dataW;
  delayNOP();  
  LCM_EN=1;
  delayNOP();
  LCM_EN=0;
}
/************** 讀數據 **************/
/************************************/
/*從lcd 讀取數據到 DataPort */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
uchar ReadDataLCM()
{
  uchar r_dat;
  WaitForEnable();
  DataPort = 0xFF;
  LCM_RS = 1;
  LCM_RW = 1;
  LCM_EN = 1;
  r_dat = DataPort;
  LCM_EN = 0;
  return(r_dat);
}
/********** 初始化液晶 *************/     
void InitLcd()
{
// LCM_PSB = 1; //并口方式
//  LCM_RST = 0; //液晶復位
// delayms(2);
// LCM_RST = 1;
  delayms(2);
  WriteCommandLCM(0x34,1); //擴充指令操作
  WriteCommandLCM(0x30,1); //基本指令操作
  WriteCommandLCM(0x0C,1); //顯示開,關光標
  WriteCommandLCM(0x01,1); //清除LCD 的顯示內容
}
/********** 初始化HMC5883 ***********/
void Init_HMC5883()
{
     Single_Write_HMC5883(0x02,0x00);    //選擇模式寄存器,選為連續測量模式
}
/********** 清屏函數 ***********/
void ClearScreen()
{
  uchar x,y,z;
  uchar Temp=0x00;
  WriteCommandLCM(0x34,1);
  WriteCommandLCM(0x36,1);        //擴充指令 繪圖顯示
  for(z=0;z<9;z+=8)   
    for(y=0;y<0x20;y++)      
      for(x=0;x<8;x++)
      {   
        WriteCommandLCM(y+0x80,0);        //行地址
        WriteCommandLCM(x+0x80+z,0);      //列地址              WriteDataLCM(Temp);          //寫數據 D15-D8  
        WriteDataLCM(Temp);           //寫數據 D7-D0  
      }
}
/************ 數字顯示函數, 參數入口:DisplayNumber(地址,數字) ************/   
void DisplayNumber(uchar address,double number)
{
  uchar qian,bai,shi,ge;
  int number2;
  number*=10;                            //
  number2=(int)number;    //校驗得出角度差為 58°
//  number2=(int)number+580;
//  if(number2>3600) number2-=3600;
//  else number2=number2;
//  delayNOP();
  qian=number2/1000;   
  bai=(number2%1000)/100;
  shi=(number2%100)/10;
  ge=number2%10;
  WriteCommandLCM(address,1);
  delayms(2);
  WriteDataLCM(' ');
  delayms(2);
  WriteDataLCM(Num[qian]);
  delayms(2);
  WriteDataLCM(Num[bai]);
  delayms(2);
  WriteDataLCM(Num[shi]);
  delayms(2);
  WriteDataLCM('.');
  delayms(2);
  WriteDataLCM(Num[ge]);
  delayms(2);
  DisplayListChar(address+3,2,"°");
  delayms(2);
}
/************ 數字顯示函數2, 參數入口:DisplayNumber(地址,數字) ************/   
void DisplayNumber2(uchar address,double number)
{
  uchar wan,qian,bai,shi,ge;
  int number2;
  number*=10;                            //
  number2=(int)number;    //校驗得出角度差為 58°
//  number2=(int)number+580;
//  if(number2>3600) number2-=3600;
//  else number2=number2;
//  delayNOP();
  //wan=number2/10000;        
  qian=number2/1000;   
  bai=(number2%1000)/100;
  shi=(number2%100)/10;
  ge=number2%10;
  WriteCommandLCM(address,1);
        delayms(2);
  WriteDataLCM(' ');
  delayms(2);
  WriteDataLCM(Num[qian]);
  delayms(2);
  WriteDataLCM(Num[bai]);
  delayms(2);
  WriteDataLCM(Num[shi]);
  delayms(2);
  WriteDataLCM('.');
  delayms(2);
  WriteDataLCM(Num[ge]);
  delayms(2);
  DisplayListChar(address+3,2,"mG");
  delayms(2);
}
/***** 漢字/字符數組顯示函數, 參數入口:DisplayListChar(地址,顯示寬度,漢字/
字符數組) *****/
void DisplayListChar(uchar address,uchar L,uchar Str[])
{
  uchar i;
  WriteCommandLCM(address,1);
  for(i=0;i<L;i++)
  {
    WriteDataLCM(Str);
  }

}  //例如:DisplayListChar(0x80,4,"");     
/*********************************************************
*                                                        *
* 圖形顯示                                               *
*                                                        *
*********************************************************/
void PhotoDisplay(uchar  *img)   
{  
  uchar i,j;
  WriteCommandLCM(0x34,1);        //寫數據時,關閉圖形顯示
  for(i=0;i<32;i++)
  {
    WriteCommandLCM(0x80+i,1);    //先寫入水平坐標值   
        WriteCommandLCM(0x80,1);      //寫入垂直坐標值
    for(j=0;j<16;j++)          //再寫入兩個 8位元的數據     
    WriteDataLCM(*img++);      
    delayms(1);
  }
  for(i=0;i<32;i++)
  {  
    WriteCommandLCM(0x80+i,1);
    WriteCommandLCM(0x88,1);
    for(j=0;j<16;j++)         
    WriteDataLCM(*img++);     
    delayms(1);
  }
  WriteCommandLCM(0x36,1);         //寫完數據,開圖形顯示  
}
/***********************************************************
函數名: DrawPoint
函數說明:畫點
傳入參數:打點位置(x0,y0);color=1,點亮;color=0,擦除
傳出參數:無
返回值: 無
**********************************************************/
void DrawPoint(uchar x,uchar y,bit color)
{
  uchar row,collum,cbite;
  uchar tempH,tempL;
  WriteCommandLCM(0x34,1);  //打開擴充指令集
  WriteCommandLCM(0x36,1);  //打開圖形顯示
  collum=x>>4;
  cbite=x&0x0f;
  if(y<32)
  row=y;
  else
  {
    row=y-32;
    collum+=8;
  }
  WriteCommandLCM(0x80+row,1);    //先寫 Y 坐標
  WriteCommandLCM(0x80+collum,1); //再寫 X 坐標
  ReadDataLCM();
  tempH = ReadDataLCM();        //先讀出高字節
  tempL = ReadDataLCM();        //再讀出低字節
  WriteCommandLCM(0x80+row,1);    //先寫 Y 坐標
  WriteCommandLCM(0x80+collum,1); //再寫 X 坐標  
   if (color)
  {
    if(cbite<8)
    {
      tempH|=(1<<(7-cbite));
      //tempL=(1<<(7-cbite));
    }
    else
    {
      //tempH=(1<<(15-cbite));
      tempL|=(1<<(15-cbite));
    }
  }
  else
  {
    if(cbite<8)
    {
      tempH&=~(1<<(7-cbite));
      //tempL=(1<<(7-cbite));
    }
    else
    {
      //tempH=(1<<(15-cbite));
      tempL&=~(1<<(15-cbite));
    }
  }
  WriteDataLCM(tempH);
  WriteDataLCM(tempL);
  WriteCommandLCM(0x30,1);
}
/***********************************************************
函數名: Line
函數說明:畫直線
傳入參數:直線起始位置(x0,y0);終點(x1,y1)
傳出參數:無
返回值: 無
**********************************************************/
void Line(uchar x0,uchar y0, uchar x1,uchar y1,bit color)
{
  int dx;       // 直線x 軸差值變量
  int dy;      // 直線y 軸差值變量  
  char dx_sym;     // x 軸增長方向,為-1 時減值方向,為1 時增值方向  
  char dy_sym;     // y 軸增長方向,為-1 時減值方向,為1 時增值方向  
  int dx_x2;      // dx*2 值變量,用于加快運算速度   
  int dy_x2;      // dy*2 值變量,用于加快運算速度
  int di;       // 決策變量  
  if (x0 == x1)     // 畫垂直線  
  {
    if (y0 > y1)
    {
      dx = y0;
      y0 = y1;
      y1 = dx;
    }
    for (dx = y0; dx < y1+1; dx++)
    {
      DrawPoint(x0, dx, color);
    }
  }
  if (y0 == y1)     // 畫水平線
  {
    if(x0 > x1)
    {
      dy = x0;
      x0 = x1;
      x1 = dy;
    }
    for (dy = x0; dy< x1+1; dy++)
    {
      DrawPoint(dy, y0,color);
    }
  }
  /****************************畫斜線******************************/
  dx = x1-x0;     // 求取兩點之間的差值
  dy = y1-y0;
  if (dx > 0)     // 判斷x 軸方向
  {
    dx_sym = 1;     // dx>0,設置dx_sym=1
  }
  else
  {
    if (dx < 0)
    {
      dx_sym = -1;     // dx<0,設置dx_sym=-1
    }
  }
  if (dy> 0)    // 判斷y 軸方向
  {     dy_sym = 1;     // dy>0,設置dy_sym=1
  }
  else
  {
    if (dy< 0)
    {
      dy_sym = -1;     // dy<0,設置dy_sym=-1
    }
  }
  dx = dx_sym * dx;   // 將dx、dy 取絕對值
  dy = dy_sym * dy;
  dx_x2 = dx*2;     // 計算2 倍的dx 及 dy 值
  dy_x2 = dy*2;
  /***** 使用Bresenham 法進行畫直線 *****/
  if (dx >= dy)     // 對于dx>=dy,則使用x 軸為基準
  {
    di = dy_x2 - dx;
    while(x0!=x1)
    {
      DrawPoint(x0, y0,color);
      x0 += dx_sym;
      if (di < 0)
      {
        di += dy_x2;     // 計算出下一步的決策值
      }
      else
      {
        di += dy_x2 - dx_x2;
        y0 += dy_sym;
      }
    }
    DrawPoint(x0, y0,color);   // 顯示最后一點
  }
  else         // 對于dx<dy,則使用 y 軸為基準
  {
    di = dx_x2 - dy;
    while(y0!=y1)
    {
      DrawPoint(x0, y0,color);
      y0 += dy_sym;
      if (di < 0)
      {
        di += dx_x2;
      }       else
      {
        di += dx_x2 - dy_x2;
        x0 += dx_sym;
      }
    }
    DrawPoint(x0, y0,color);     // 顯示最后一點
  }
}
/*******************************************
函數名稱:voidDrawHand(uchar x0,uchar y0,uchar length,int int_degree,bit color)
功 能:畫指針
參 數:(x0,y0)圓盤圓心坐標
        length 指針長度
int_degree 順時針相對正北的角度 取整數
        color 指針顏色
返回值 :無
********************************************/
// void DrawHand(uchar x0,uchar y0,uchar length,int int_degree,bit color)
  //角度校驗前函數定義
// {
//  uchar x,y;
//  x=length * cos(int_degree * 3.14159265 / 180 - 3.14159265 / 2) + x0;
//  y=length * sin(int_degree * 3.14159265 / 180 - 3.14159265 / 2) + y0;
//  Line(x0,y0,x,y,color);
// }
void DrawHand(uchar x0,uchar y0,uchar length,int int_degree,bit color)
{
  uchar x,y;
// int_degree+=58;
  x=length * cos(int_degree * 3.14159265 / 180 - 3.14159265 / 2) + x0;
  y=length * sin(int_degree * 3.14159265 / 180 - 3.14159265 / 2) + y0;
  Line(x0,y0,x,y,color);
}
/**************************************
起始信號
**************************************/
void HMC5883_Start()
{
    SDA = 1;                    //拉高數據線
    SCL = 1;                    //拉高時鐘線
        delayNOP();                 //延時
            SDA = 0;                    //產生下降沿
        delayNOP();                 //延時     
        SCL = 0;                    //拉低時鐘線
}
/**************************************
停止信號
**************************************/
void HMC5883_Stop()
{
    SDA = 0;                    //拉低數據線
    SCL = 1;                    //拉高時鐘線
        delayNOP();                 //延時
            SDA = 1;                //產生上升沿
        delayNOP();                 //延時
}
/**************************************
發送應答信號
入口參數:ack (0:ACK 1:NAK)
**************************************/
void HMC5883_SendACK(bit ack)
{
    SDA = ack;                  //寫應答信號
    SCL = 1;                    //拉高時鐘線
        delayNOP();                 //延時
            SCL = 0;                    //拉低時鐘線
        delayNOP();                 //延時
}
/**************************************
接收應答信號
**************************************/
bit HMC5883_RecvACK()
{
    SCL = 1;                    //拉高時鐘線
        delayNOP();                 //延時
        CY = SDA;                   //讀應答信號
        SCL = 0;                    //拉低時鐘線
        delayNOP();                 //延時
        return CY;
}
/**************************************
向IIC總線發送一個字節數據
**************************************/
void HMC5883_SendByte(BYTE dat)
{
    BYTE i;
    for (i=0; i<8; i++)         //8位計數器   
         {
        dat<<= 1;              //移出數據的最高位
                SDA = CY;               //送數據口
                SCL = 1;                //拉高時鐘線
        delayNOP();             //延時
                SCL = 0;                //拉低時鐘線
        delayNOP();             //延時
    }
    HMC5883_RecvACK();
}
/**************************************
從IIC總線接收一個字節數據
**************************************/
BYTE HMC5883_RecvByte()
{
    BYTE i;
    BYTE dat = 0;
    SDA = 1;                    //使能內部上拉,準備讀取數據,
    for (i=0; i<8; i++)         //8位計數器
    {
                dat<<= 1;
                        SCL = 1;                //拉高時鐘線
                delayNOP();             //延時
                dat |= SDA;             //讀數據               
                        SCL = 0;                //拉低時鐘線
                delayNOP();             //延時
                    }
    return dat;
}
/**************** 單字節寫入數據 **********************/
void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
{
    HMC5883_Start();                  //起始信號
    HMC5883_SendByte(SlaveAddress);   //發送設備地址+寫信號
    HMC5883_SendByte(REG_Address);    //內部寄存器(模式寄存器)地址,請參考中文pdf

    HMC5883_SendByte(REG_data);       //內部寄存器數據(即要發送到模式寄存器的數//據),請參考中文pdf

    HMC5883_Stop();                   //發送停止信號
}
/*********** 單字節讀取內部寄存器 ***************/
uchar Single_Read_HMC5883(uchar REG_Address)
{  
    uchar REG_data;
    HMC5883_Start();                          //起始信號     
        HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號始   
    HMC5883_SendByte(REG_Address);                   //發送存儲單元地址,從 0 開

    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
    REG_data=HMC5883_RecvByte();              //讀出寄存器數據
    HMC5883_SendACK(1);   
    HMC5883_Stop();                           //停止信號
    return REG_data;  
}
//******************************************************
//
//連續讀出HMC5883內部角度數據,地址范圍 0x3~0x8 共六個地址數據
//
//******************************************************
void Multiple_read_HMC5883(void)
{  
    uchar i;
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
    HMC5883_SendByte(0x03);                   //發送存儲單元地址,從 0x3 開始

    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
   for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中 BUF
    {
        BUF = HMC5883_RecvByte();          //BUF[0]存儲數據
     if (i == 5)
        {
           HMC5883_SendACK(1);                //最后一個數據需要回NOACK
        }
    else
        {
          HMC5883_SendACK(0);                //回應ACK
       }
   }
    HMC5883_Stop();                          //停止信號
    delayms(5);
}


//3.主程序(指南針指針圖形、方向、角度的顯示):
/*********************************************************
******** 文件名:LCD_Main.c ********************************/
/******** 作用:主函數,圖形、方向、角度的顯示 **********/
//*********************************************************
#include <reg52.h>
#include <intrins.h>
#include <stdlib.h>
#include <math.h>
#define x0 31
#define y0 31  //表盤圓心坐標      
#define R 19   //指針長度
BYTE BUF[8];   //接收數據緩存區  
/******************* 初始化界面鑲嵌字模 ********************/
uchar code img_ChuShiHua[]=
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x02,0x08,0xFF,0x80,0x00,0xC2,0x10,0x82,0x78,0x42,0x01,0x03,0xFE,0x7F,0xC0,
0x80,
  0x0F,0xFE,0x08,0x1E,0x31,0xFF,0x10,0x82,0x48,0x42,0x1F,0xF0,0x04,0x4A,0x43,
0xF8,
  0x02,0x08,0x08,0x10,0x51,0x11,0x1F,0xEF,0x48,0xF7,0x91,0x10,0x18,0x4A,0x42,
0xC8,
  0x03,0xF8,0x08,0x10,0x11,0xFF,0x10,0x02,0x48,0x94,0x9F,0xF0,0x20,0x7F,0xC7,
0xFC,
  0x02,0x09,0xFF,0xDC,0x11,0x11,0x10,0x07,0x48,0x9C,0x91,0x17,0xFF,0x08,0x02,
0x88,
  0x0F,0xFE,0x08,0x02,0x11,0xFF,0x1F,0x8E,0xC8,0xF2,0x91,0x10,0x20,0x1F,0x82,
0x48,
  0x02,0x48,0x08,0x02,0x10,0x10,0x10,0x8A,0x48,0x91,0x9F,0xF0,0x20,0x60,0x87,
0xF8,
  0x0D,0xF6,0x08,0x12,0x13,0xFF,0xB0,0x82,0xCA,0x90,0x91,0x08,0x20,0x9B,0x05,
0x28,
  0x00,0x40,0x08,0x1C,0x7C,0x10,0x20,0x82,0x8A,0xF0,0x81,0x08,0x20,0x0C,0x05,
0x28,
  0x07,0xFC,0x38,0x00,0x00,0x10,0x40,0x83,0x0E,0x97,0x81,0xF0,0xE0,0x70,0x0F,
0xFC,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x14,0x08,0x1F,0xF1,0x18,0x02,0x08,0xF9,0x04,0x28,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x28,0xFF,0x80,0x22,0x7F,0x0D,0x04,0x88,0x84,0x14,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x28,0x88,0x80,0xC4,0xC1,0x30,0x83,0x0C,0x04,0x14,0x00,0x00,0x00,
  0x00,0x00,0x00,0x50,0xFF,0x81,0x07,0x3E,0xFF,0xFC,0x01,0xBF,0x8A,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x50,0x88,0xBF,0xFA,0x00,0x00,0x05,0xF8,0x84,0x0A,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x50,0x88,0x81,0x02,0x7F,0x3F,0xC5,0x08,0x84,0x0A,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x28,0xFF,0x81,0x07,0x08,0x20,0x44,0x90,0x84,0x14,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x28,0x88,0x41,0x04,0x2A,0x20,0x46,0x60,0xA4,0x14,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x14,0x08,0x41,0x01,0xC9,0x3F,0xCD,0xB0,0xC4,0x28,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x14,0x0F,0x87,0x06,0x38,0x20,0x43,0x0C,0x84,0x28,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x01,0x08,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x3E,0x47,0xFE,0xFF,0xC0,0x4F,0xC5,0xFC,0xBF,0x80,0x72,0x00,0x00,0x90,
0x00,
  0x00,0x06,0x43,0x9C,0x73,0x80,0x20,0x44,0x94,0x92,0x80,0x5F,0xE0,0x00,0x88,
0x00,
  0x00,0x0C,0x47,0xFE,0xFF,0xC0,0x14,0x4E,0xFB,0xDF,0xC0,0x54,0x00,0x0F,0xFE,
0x00,
  0x00,0x08,0xD1,0x08,0x21,0x00,0x04,0x4A,0x41,0x48,0x00,0x65,0x00,0x00,0xA0,
0x00,
  0x00,0x0C,0xD7,0xFE,0xFF,0xC0,0x07,0xEB,0xFF,0x7F,0xC0,0x67,0xE0,0x00,0xA4,
0x00,
  0x00,0x39,0x5B,0xFF,0x7F,0xE0,0x10,0x2A,0x41,0x48,0x00,0x51,0x00,0x01,0x28,
0x00,
  0x00,0x09,0x48,0x02,0x00,0x40,0x20,0x2C,0x7D,0x8F,0x80,0x75,0x40,0x01,0x28,
0x00,
  0x00,0x0A,0x4B,0xFE,0x7F,0xC0,0x3F,0xA4,0xC4,0x98,0x80,0x45,0x20,0x03,0x32,
0x00,
  0x00,0x08,0x42,0xA0,0x54,0x00,0x40,0x2B,0x39,0x67,0x00,0x49,0x20,0x06,0x62,0x00,
  0x00,0x39,0xC6,0xA7,0x54,0xE0,0x41,0xF0,0xCE,0x19,0xC0,0x47,0x00,0x0D,0xBC,
0x00,
  0x00,0x00,0x04,0xFD,0x5F,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00
};
/******************* 圓盤字模 **************************/
uchar code img_YuanPan[]=
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x0C,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x0A,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x09,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x08,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x08,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0xE3,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x03,0x03,0x81,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x0C,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x30,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x80,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x20,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x20,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x20,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x40,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x41,0x40,0x00,0x00,0x00,0x00,0x05,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x49,0x40,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x49,0x70,0x00,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x6B,0x70,0x00,0x00,0x00,0x00,0x1D,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x36,0x70,0x00,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x14,0x40,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x14,0x40,0x00,0x00,0x00,0x00,0x05,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x40,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x20,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x20,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x20,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x80,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x30,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x0C,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x03,0x03,0x81,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0xE3,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,
  0x00,0x00,0x00,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00
};
/******************** 主函數 *****************************
*********************************************************/
void main()
{  
  int x,y,z;
  int degree,degree_past,times;  //考慮到指針精度不會小于 1° 于是用整型變量
//degree_past與degree的比較決定指針與顯示方向的字符是否需要變化
  double angle;
  delayms(40);               //等待上電穩定
  InitLcd();                 //LCD12864初始化
  delayms(5);
  Init_HMC5883();            //HMC5883L初始化
  delayms(5);
//  PhotoDisplay(img_ChuShiHua);    //鑲嵌圖片
//  delayms(3000);
  ClearScreen();        //清屏
  PhotoDisplay(img_YuanPan);  
  delayms(20);                 
// angle=-58;   
// degree_past=-58;
  DrawHand(x0,y0,R,degree_past,1);
  delayms(20);   
//  DisplayNumber(0x94,-58);
  delayms(10);
// DisplayListChar(0x8D,1,"N");
  delayms(500);           //圖形顯示初始化

  while(1)            
  {  
    Multiple_Read_HMC5883();    //連續讀出數據,存儲在 BUF中
    x=BUF[0] << 8 | BUF[1];     //Combine MSB and LSB of X Data  output register
    z=BUF[2] << 8 | BUF[3];     //Combine MSB and LSB of Z Data output  register

    y=BUF[4] << 8 | BUF[5];     //Combine MSB and LSB of Y Data output         register

    angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180;         // 度數(0~360)

    DisplayNumber(0x84,angle);  //度數顯示的精度是0.1° 所以用double型數據 -angle
                delayms(10);
    DisplayNumber2(0x94,x);//顯示x的強度
                delayms(10);
                DisplayNumber2(0x8C,y);//顯示y的強度
                delayms(10);
                DisplayNumber2(0x9c,z);//顯示z的強度
    delayms(5);
    degree=(int)angle;
    if(( degree >= ( degree_past + 3 ) )||( degree <= degree_past - 3 ))
      //檢驗angle 是否發生了3°以上的變化
    {
      DrawHand(x0,y0,R,degree_past,0);    //擦除原顯示指針
      delayms(10);
      DrawHand(x0,y0,R,degree,1);         //更新角度信息后更新指針顯示
      delayms(10);
      degree_past=degree;
      delayNOP();
      DisplayListChar(0x8D,2,"  ");        //擦除原顯示方向
      delayms(5);
      //更新顯示方位
     // angle+=58;                          //      
//          if(angle>360) angle-=360;            //
//      else angle=angle;                    //
//      delayNOP();                         // 這四
//句調整顯示方向的角度  *** 校驗角度后進行的修改 ***
      times=(angle*10)/225;
      delayNOP();
     /* if((times < 1) || (times >= 15 ))    //0°為正北方
      {
        DisplayListChar(0x8D,1,"N");
      }
      else if((times >= 1) && (times < 3 ))   
      {
        DisplayListChar(0x8D,2,"NE");
      }
      else if((times >= 3) && (times < 5 ))     
      {
        DisplayListChar(0x8D,1,"E");
      }
      else if((times >= 5) && (times < 7 ))   
      {
        DisplayListChar(0x8D,2,"SE");
      }
      else if((times >= 7) && (times < 9 ))   
      {
        DisplayListChar(0x8D,1,"S");
      }
      else if((times >= 9) && (times < 11 ))     
      {
        DisplayListChar(0x8D,2,"SW");
      }
      else if((times >= 11) && (times < 13 ))   
      {
        DisplayListChar(0x8D,2,"W");
      }
      else                     
      {
        DisplayListChar(0x8D,2,"NW");
      } */
    }
       delayms(1000);                     
  }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:327029 發表于 2019-5-26 12:36 | 只看該作者
找到問題了傳感器得到的值是負值,,沒處理會在lcd上直接顯示000
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品乱码久久久久久蜜桃 | 粉嫩一区二区三区国产精品 | 午夜国产一级 | 欧美片网站免费 | 日本不卡一区二区 | zzzwww在线看片免费 | 国产在线一区二区 | av免费观看在线 | 午夜精| 成人午夜性成交 | 国产91观看 | 人人爽人人爽人人片av | 玖玖玖在线观看 | 中文字幕免费中文 | 国产一区欧美一区 | 日韩高清av | 免费观看一级特黄欧美大片 | 国产99免费| www国产成人免费观看视频,深夜成人网 | 色婷婷av777| 亚洲九九精品 | 欧美精品一二三区 | 天天人人精品 | 日韩网| 龙珠z在线观看 | 国产一区二区三区 | 69av片| 久久免费高清视频 | 欧洲亚洲一区二区三区 | 成人免费观看男女羞羞视频 | 国产欧美一区二区在线观看 | 成人av电影在线观看 | 玖玖视频| 久久国产成人 | 精品国产一区二区三区成人影院 | 精品久久久久久久久久久久久久 | 日韩久久在线 | 国产精品欧美一区喷水 | 亚洲欧美另类在线观看 | 巨大荫蒂视频欧美另类大 | 美女黄网站视频免费 |