找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3781|回復(fù): 2
收起左側(cè)

為什么我仿真LM016L老是不顯示

[復(fù)制鏈接]
ID:787147 發(fā)表于 2020-6-29 09:16 | 顯示全部樓層 |閱讀模式
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>                       //包含必要的頭文件

#define uint unsigned int
#define uchar unsigned char
#define delay4us() {_nop_();_nop_();_nop_();_nop_();}
#define NOP _nop_()


sbit HIGH=P2^3;
sbit LOW=P2^4 ;
sbit AD_CS =P1^0;
sbit SCK=P1^1;
sbit DO=P1^2;
sbit DI=P1^2;
sbit RS=P2^0;
sbit RW=P2^1;
sbit E =P2^2;                            //必要的位定義

unsigned char adval;
uchar Display_Buffer[] = "000.0KPa";
uchar code Line1[] = "Current Press:";          //初始化所顯示的字符


uchar adc0832(uchar channel)      //讀ADC0832函數(shù),采集并返回
{
    uchar i=0;
    uchar j;
    uint dat2=0;
    uchar ndat=0;
    if(channel==0)channel=2;
    if(channel==1)channel=3;
    AD_CS=0;NOP; NOP;                           //拉低CS端,AD片選
DI=1;NOP; NOP;  
//在第一個脈沖下降之前 DI 必須是高電平,表示啟始信號
    SCK=1;NOP; NOP;
    SCK=0;NOP; NOP;
    SCK=1;                  
DI=channel&0x1;NOP;NOP;
  //在第二和第三個脈沖下降之前 DI 輸入兩位表示通道

    SCK=0;NOP; NOP;
    SCK=1;                  
    DI=(channel>>1)&0x1;NOP; NOP;
    SCK=0;                                  //寫命令完成,DI失去輸入作用
    DI=1;NOP;NOP;   
    dat2=0;
    for(i=0;i<8;i++)                                    //讀出8字節(jié)數(shù)據(jù)
    {
       dat2|=DO;
       SCK=1;NOP; NOP;
       SCK=0;NOP; NOP;
       dat2<<=1;
       if(i==7)
               dat2|=DO;
}

    for(i=0;i<8;i++)
    {
      j=0;
      j=j|DO;
      SCK=1;NOP; NOP;
      SCK=0;NOP; NOP;
      j=j<<7;
      ndat=ndat|j;
      if(i<7)ndat>>=1;
}

    AD_CS=1;
    SCK=0;
    DO=1;
    dat2<<=8;
    dat2|=ndat;
    return(dat2);                                      //返回數(shù)據(jù)
}


void DelayMS(uint ms)             //延時程序,相應(yīng)數(shù)值為相應(yīng)毫秒數(shù)
{
    uchar i;
    while(ms--)
    {
      for(i=0;i<120;i++);                               //1mS延時
    }  
}


uchar Read_LCD_State()                         //檢測LCD是否“忙”
{
    uchar state;
    RS=0;RW=1;E=1;DelayMS(1);
    state=P0;                                         //返回P0的值
    E= 0;DelayMS(1);
    return state;                                       //返回狀態(tài)
}

void LCD_Busy_Wait()
{
    while((Read_LCD_State()&0x80)==0x80);
    DelayMS(5);
}


void LCD_Write_Command(uchar cmd)                      //寫命令函數(shù)
{
     LCD_Busy_Wait();
     RS = 0;
     RW = 0;
     E  = 0;
     _nop_();
     _nop_();
     P0 = cmd;                   //將CMD值寫入LCD產(chǎn)生相應(yīng)的控制
     delay4us();
    E = 1;
     delay4us();
     E = 0;
}

void Set_LCD_Pos(uchar pos)     
{
    LCD_Write_Command(pos | 0x80);
}

void LCD_Write_Data(uchar dat)                        //寫數(shù)據(jù)函數(shù)
{
    LCD_Busy_Wait();
    RS = 1;
    RW = 0;
    E  = 0;
    P0 = dat;
    delay4us();
   E = 1;  
    delay4us();
    E = 0;
}


void LCD_Initialise()                               //LCD初始化函數(shù)
{
     LCD_Write_Command(0x38); DelayMS(1);
     LCD_Write_Command(0x0c); DelayMS(1);
     LCD_Write_Command(0x06); DelayMS(1);
     LCD_Write_Command(0x01); DelayMS(1);
}


void Display_LCD_String(uchar p,uchar *s)              //LCD顯示函數(shù)
{
    uchar i;
    Set_LCD_Pos(p);
    for(i=0;i<16;i++)
{  
   LCD_Write_Data(s);                                  //調(diào)用寫數(shù)據(jù)函數(shù)
       DelayMS(1);  
    }
}


void write_sfm(uchar add,uchar num)                    //分秒函數(shù)
{   
     LCD_Write_Command(0x80+0x40+add);
                                            //第行數(shù)據(jù)指針位置調(diào)整
     LCD_Write_Data(0x30+num);  
}


void main()
{     
      uchar c;
      uint bai,sh,ge,xiaoshu;
           long d;                         //為得到小數(shù)部分,使用長整形數(shù)
      LCD_Initialise();
      DelayMS(10);
      Display_LCD_String(0x00,Line1);
      Display_LCD_String(0x46,Display_Buffer);
      HIGH=0;
           LOW=0;     

     while(1)
     {
          c=adc0832(0);
                   d=c;
                   d=d*10;                         //將數(shù)值擴(kuò)大10倍得到小數(shù)
          d=((d-100)*1000/2360)+150;         //將電壓值轉(zhuǎn)換為壓力值   
          bai=d/1000 ;                                 //分離出百位
          sh=d%1000/100;                               //分離出十位
          ge=d%100/10;                                 //分離出個位
                     xiaoshu=d%10        ;                            //分離出小數(shù)位
                    if(c>246)                                  //判斷過壓函數(shù)
                   {       HIGH=1;LOW=0;                     //開啟過壓報警燈
                           DelayMS(1) ;
                           write_sfm(6,bai);
                  write_sfm(7,sh);   
                  write_sfm(8,ge);
                           write_sfm(10,xiaoshu);                    //寫數(shù)據(jù)
                   }
                   else if(c<10)                             //開啟欠壓報警燈                    {
                    {      LOW=1; HIGH=0;
                           write_sfm(6,bai);
                  write_sfm(7,sh);   
                  write_sfm(8,ge);
                           write_sfm(10,xiaoshu);                     //寫數(shù)據(jù)
                   }
                   else
                   {  
                          HIGH=0;LOW=0;                           //正常狀態(tài),顯示壓力值                                 write_sfm(6,bai);
                 write_sfm(7,sh);   
                 write_sfm(8,ge);
                          write_sfm(10,xiaoshu);
                   }                     
}
}                                                            //程序完
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>                       //包含必要的頭文件

#define uint unsigned int
#define uchar unsigned char
#define delay4us() {_nop_();_nop_();_nop_();_nop_();}
#define NOP _nop_()


sbit HIGH=P2^3;
sbit LOW=P2^4 ;
sbit AD_CS =P1^0;
sbit SCK=P1^1;
sbit DO=P1^2;
sbit DI=P1^2;
sbit RS=P2^0;
sbit RW=P2^1;
sbit E =P2^2;                            //必要的位定義

unsigned char adval;
uchar Display_Buffer[] = "000.0KPa";
uchar code Line1[] = "Current Press:";          //初始化所顯示的字符


uchar adc0832(uchar channel)      //讀ADC0832函數(shù),采集并返回
{
    uchar i=0;
    uchar j;
    uint dat2=0;
    uchar ndat=0;
    if(channel==0)channel=2;
    if(channel==1)channel=3;
    AD_CS=0;NOP; NOP;                           //拉低CS端,AD片選
DI=1;NOP; NOP;  
//在第一個脈沖下降之前 DI 必須是高電平,表示啟始信號
    SCK=1;NOP; NOP;
    SCK=0;NOP; NOP;
    SCK=1;                  
DI=channel&0x1;NOP;NOP;
  //在第二和第三個脈沖下降之前 DI 輸入兩位表示通道

    SCK=0;NOP; NOP;
    SCK=1;                  
    DI=(channel>>1)&0x1;NOP; NOP;
    SCK=0;                                  //寫命令完成,DI失去輸入作用
    DI=1;NOP;NOP;   
    dat2=0;
    for(i=0;i<8;i++)                                    //讀出8字節(jié)數(shù)據(jù)
    {
       dat2|=DO;
       SCK=1;NOP; NOP;
       SCK=0;NOP; NOP;
       dat2<<=1;
       if(i==7)
               dat2|=DO;
}

    for(i=0;i<8;i++)
    {
      j=0;
      j=j|DO;
      SCK=1;NOP; NOP;
      SCK=0;NOP; NOP;
      j=j<<7;
      ndat=ndat|j;
      if(i<7)ndat>>=1;
}

    AD_CS=1;
    SCK=0;
    DO=1;
    dat2<<=8;
    dat2|=ndat;
    return(dat2);                                      //返回數(shù)據(jù)
}


void DelayMS(uint ms)             //延時程序,相應(yīng)數(shù)值為相應(yīng)毫秒數(shù)
{
    uchar i;
    while(ms--)
    {
      for(i=0;i<120;i++);                               //1mS延時
    }  
}


uchar Read_LCD_State()                         //檢測LCD是否“忙”
{
    uchar state;
    RS=0;RW=1;E=1;DelayMS(1);
    state=P0;                                         //返回P0的值
    E= 0;DelayMS(1);
    return state;                                       //返回狀態(tài)
}

void LCD_Busy_Wait()
{
    while((Read_LCD_State()&0x80)==0x80);
    DelayMS(5);
}


void LCD_Write_Command(uchar cmd)                      //寫命令函數(shù)
{
     LCD_Busy_Wait();
     RS = 0;
     RW = 0;
     E  = 0;
     _nop_();
     _nop_();
     P0 = cmd;                   //將CMD值寫入LCD產(chǎn)生相應(yīng)的控制
     delay4us();
    E = 1;
     delay4us();
     E = 0;
}

void Set_LCD_Pos(uchar pos)     
{
    LCD_Write_Command(pos | 0x80);
}

void LCD_Write_Data(uchar dat)                        //寫數(shù)據(jù)函數(shù)
{
    LCD_Busy_Wait();
    RS = 1;
    RW = 0;
    E  = 0;
    P0 = dat;
    delay4us();
   E = 1;  
    delay4us();
    E = 0;
}


void LCD_Initialise()                               //LCD初始化函數(shù)
{
     LCD_Write_Command(0x38); DelayMS(1);
     LCD_Write_Command(0x0c); DelayMS(1);
     LCD_Write_Command(0x06); DelayMS(1);
     LCD_Write_Command(0x01); DelayMS(1);
}


void Display_LCD_String(uchar p,uchar *s)              //LCD顯示函數(shù)
{
    uchar i;
    Set_LCD_Pos(p);
    for(i=0;i<16;i++)
{  
   LCD_Write_Data(s);                                  //調(diào)用寫數(shù)據(jù)函數(shù)
       DelayMS(1);  
    }
}
void write_sfm(uchar add,uchar num)                    //分秒函數(shù)
{   
     LCD_Write_Command(0x80+0x40+add);
                                            //第行數(shù)據(jù)指針位置調(diào)整
     LCD_Write_Data(0x30+num);  
}
void main()
{     
      uchar c;
      uint bai,sh,ge,xiaoshu;
           long d;                         //為得到小數(shù)部分,使用長整形數(shù)
      LCD_Initialise();
      DelayMS(10);
      Display_LCD_String(0x00,Line1);
      Display_LCD_String(0x46,Display_Buffer);
      HIGH=0;
           LOW=0;     
     while(1)
     {
          c=adc0832(0);
                   d=c;
                   d=d*10;                         //將數(shù)值擴(kuò)大10倍得到小數(shù)
          d=((d-100)*1000/2360)+150;         //將電壓值轉(zhuǎn)換為壓力值   
          bai=d/1000 ;                                 //分離出百位
          sh=d%1000/100;                               //分離出十位
          ge=d%100/10;                                 //分離出個位
                     xiaoshu=d%10        ;                            //分離出小數(shù)位
                    if(c>246)                                  //判斷過壓函數(shù)
                   {       HIGH=1;LOW=0;                     //開啟過壓報警燈
                           DelayMS(1) ;
                           write_sfm(6,bai);
                  write_sfm(7,sh);   
                  write_sfm(8,ge);
                           write_sfm(10,xiaoshu);                    //寫數(shù)據(jù)
                   }
                   else if(c<10)                             //開啟欠壓報警燈                    {
                    {      LOW=1; HIGH=0;
                           write_sfm(6,bai);
                  write_sfm(7,sh);   
                  write_sfm(8,ge);
                           write_sfm(10,xiaoshu);                     //寫數(shù)據(jù)
                   }
                   else
                   {  
                          HIGH=0;LOW=0;                           //正常狀態(tài),顯示壓力值                                 write_sfm(6,bai);
                 write_sfm(7,sh);   
                 write_sfm(8,ge);
                          write_sfm(10,xiaoshu);
                   }                     
}
}                                                            //程序完

仿真圖

仿真圖
回復(fù)

使用道具 舉報

ID:789121 發(fā)表于 2020-6-29 11:05 | 顯示全部樓層
看著也不像有問題的,初始化后的字符顯示不顯示?先單獨測試顯示試一下
回復(fù)

使用道具 舉報

ID:861063 發(fā)表于 2020-12-24 09:59 來自手機(jī) | 顯示全部樓層
不要黑 發(fā)表于 2020-6-29 11:05
看著也不像有問題的,初始化后的字符顯示不顯示?先單獨測試顯示試一下

是設(shè)置的電壓的問題么?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表