標題: 為什么我仿真LM016L老是不顯示 [打印本頁]
作者: 9-76 時間: 2020-6-29 09:16
標題: 為什么我仿真LM016L老是不顯示
#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函數,采集并返回
{
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字節數據
{
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); //返回數據
}
void DelayMS(uint ms) //延時程序,相應數值為相應毫秒數
{
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; //返回狀態
}
void LCD_Busy_Wait()
{
while((Read_LCD_State()&0x80)==0x80);
DelayMS(5);
}
void LCD_Write_Command(uchar cmd) //寫命令函數
{
LCD_Busy_Wait();
RS = 0;
RW = 0;
E = 0;
_nop_();
_nop_();
P0 = cmd; //將CMD值寫入LCD產生相應的控制
delay4us();
E = 1;
delay4us();
E = 0;
}
void Set_LCD_Pos(uchar pos)
{
LCD_Write_Command(pos | 0x80);
}
void LCD_Write_Data(uchar dat) //寫數據函數
{
LCD_Busy_Wait();
RS = 1;
RW = 0;
E = 0;
P0 = dat;
delay4us();
E = 1;
delay4us();
E = 0;
}
void LCD_Initialise() //LCD初始化函數
{
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顯示函數
{
uchar i;
Set_LCD_Pos(p);
for(i=0;i<16;i++)
{
LCD_Write_Data(s); //調用寫數據函數
DelayMS(1);
}
}
void write_sfm(uchar add,uchar num) //分秒函數
{
LCD_Write_Command(0x80+0x40+add);
//第行數據指針位置調整
LCD_Write_Data(0x30+num);
}
void main()
{
uchar c;
uint bai,sh,ge,xiaoshu;
long d; //為得到小數部分,使用長整形數
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; //將數值擴大10倍得到小數
d=((d-100)*1000/2360)+150; //將電壓值轉換為壓力值
bai=d/1000 ; //分離出百位
sh=d%1000/100; //分離出十位
ge=d%100/10; //分離出個位
xiaoshu=d%10 ; //分離出小數位
if(c>246) //判斷過壓函數
{ HIGH=1;LOW=0; //開啟過壓報警燈
DelayMS(1) ;
write_sfm(6,bai);
write_sfm(7,sh);
write_sfm(8,ge);
write_sfm(10,xiaoshu); //寫數據
}
else if(c<10) //開啟欠壓報警燈 {
{ LOW=1; HIGH=0;
write_sfm(6,bai);
write_sfm(7,sh);
write_sfm(8,ge);
write_sfm(10,xiaoshu); //寫數據
}
else
{
HIGH=0;LOW=0; //正常狀態,顯示壓力值 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函數,采集并返回
{
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字節數據
{
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); //返回數據
}
void DelayMS(uint ms) //延時程序,相應數值為相應毫秒數
{
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; //返回狀態
}
void LCD_Busy_Wait()
{
while((Read_LCD_State()&0x80)==0x80);
DelayMS(5);
}
void LCD_Write_Command(uchar cmd) //寫命令函數
{
LCD_Busy_Wait();
RS = 0;
RW = 0;
E = 0;
_nop_();
_nop_();
P0 = cmd; //將CMD值寫入LCD產生相應的控制
delay4us();
E = 1;
delay4us();
E = 0;
}
void Set_LCD_Pos(uchar pos)
{
LCD_Write_Command(pos | 0x80);
}
void LCD_Write_Data(uchar dat) //寫數據函數
{
LCD_Busy_Wait();
RS = 1;
RW = 0;
E = 0;
P0 = dat;
delay4us();
E = 1;
delay4us();
E = 0;
}
void LCD_Initialise() //LCD初始化函數
{
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顯示函數
{
uchar i;
Set_LCD_Pos(p);
for(i=0;i<16;i++)
{
LCD_Write_Data(s); //調用寫數據函數
DelayMS(1);
}
}
void write_sfm(uchar add,uchar num) //分秒函數
{
LCD_Write_Command(0x80+0x40+add);
//第行數據指針位置調整
LCD_Write_Data(0x30+num);
}
void main()
{
uchar c;
uint bai,sh,ge,xiaoshu;
long d; //為得到小數部分,使用長整形數
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; //將數值擴大10倍得到小數
d=((d-100)*1000/2360)+150; //將電壓值轉換為壓力值
bai=d/1000 ; //分離出百位
sh=d%1000/100; //分離出十位
ge=d%100/10; //分離出個位
xiaoshu=d%10 ; //分離出小數位
if(c>246) //判斷過壓函數
{ HIGH=1;LOW=0; //開啟過壓報警燈
DelayMS(1) ;
write_sfm(6,bai);
write_sfm(7,sh);
write_sfm(8,ge);
write_sfm(10,xiaoshu); //寫數據
}
else if(c<10) //開啟欠壓報警燈 {
{ LOW=1; HIGH=0;
write_sfm(6,bai);
write_sfm(7,sh);
write_sfm(8,ge);
write_sfm(10,xiaoshu); //寫數據
}
else
{
HIGH=0;LOW=0; //正常狀態,顯示壓力值 write_sfm(6,bai);
write_sfm(7,sh);
write_sfm(8,ge);
write_sfm(10,xiaoshu);
}
}
} //程序完
I(1W@A)V31_E6ZJ(5NN0FCO.png (174.59 KB, 下載次數: 16)
下載附件
仿真圖
2020-6-29 09:15 上傳
作者: 不要黑 時間: 2020-6-29 11:05
看著也不像有問題的,初始化后的字符顯示不顯示?先單獨測試顯示試一下
作者: 晚安啦 時間: 2020-12-24 09:59
不要黑 發表于 2020-6-29 11:05
看著也不像有問題的,初始化后的字符顯示不顯示?先單獨測試顯示試一下
是設置的電壓的問題么?
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |