1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標題:
求助:電子秤鎖定屏顯問題?
[打印本頁]
作者:
fbzsn
時間:
2016-6-11 20:39
標題:
求助:電子秤鎖定屏顯問題?
各位師傅好!我用STC12LE5A60S2單片機和HX711編寫了一個電子秤程序,我想通過一只按鍵按一次鎖定數(shù)碼管顯示的重量,再按一次解除鎖定,進入正常顯示。我試了下,斷開hx711的DOUT或者PD_SCK或者同時斷開均可達到目的,但不知C程序如何編寫,試了很多方法均不行,敬請個位師傅給點思路,謝謝!!下面是程序:請大家?guī)兔纯矗≈x謝指教! #include<reg52.h>#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint Lheight;
uint compensate;
uchar discode[4]={0,0,0,0};
extern void LedDisplay(void);
sbit P10= P1^0; //按鍵
sbit hx711_dout=P3^6;
sbit hx711_sck=P3^7;
extern unsigned char discode[4];
uchar code Dis_7[10]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };//0,1,2,3,4,5,6,7,8,9
uchar code scan_con[4]= {0xfe,0xfd,0xfb,0xf7 };
unsigned int ReadCount(void);
// 延時 MS
void delay(uint x)
{
uchar j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
//延時 500US
void delay500us(void)
{
unsigned char a,b;
for(b=7l;b>0;b--)
for(a=2;a>0;a--);
}
//hx711 us延時
void delay_hx711_us(void)
{
_nop_();
_nop_();
}
//數(shù)碼管顯示
void LedDisplay(void)
{
uchar k;
for(k=0;k<4;k++)
{
P0=Dis_7[discode[k]];
P2=scan_con[k];
delay500us();
P2=0xff;
}
}
// 按鈕
void ButtonScan(void)
{
if(!P10)
{
delay(10);
}
if(!P10)
{
compensate=ReadCount();//
}
}
//讀重量值,并A/D轉(zhuǎn)換,返回 (hx711驅(qū)動程序)
unsigned int ReadCount(void)
{
unsigned long Count;
uint ADval;
uchar i;
hx711_dout=1;
delay_hx711_us();
hx711_sck=0;
Count=0;
while(hx711_dout)
LedDisplay();
for(i=0;i<24;i++)
{
hx711_sck=1;
Count=Count<<1;
hx711_sck=0;
if(hx711_dout)
Count++;
}
hx711_sck=1;
delay_hx711_us();
Count=Count^0x800000; //第25個脈沖下降沿來時轉(zhuǎn)換數(shù)據(jù)
hx711_sck=0;
ADval=(float)(Count>>8);
return(ADval);
}
//分解
void discode0(void)
{
discode[0]=Lheight%10;
discode[1]=(Lheight%100)/10;
discode[2]=(Lheight%1000)/100;
discode[3]=(Lheight%10000)/1000;
}
//讀取重量值
void WeighWork(void)
{
float Tempheight;
uint a;
a=ReadCount();
if(a<=compensate)
Lheight=0; //校0
else Lheight=a-compensate;
discode0(); //調(diào)用數(shù)值分解函數(shù)
Lheight=discode[3]*1000+discode[2]*100+discode[1]*10+discode[0];
Tempheight=(float)(Lheight/0.822);
Lheight=(float)(Tempheight); // 將Tempheight轉(zhuǎn)浮點型
discode0(); //調(diào)用數(shù)值分解函數(shù)
}
void main(void)
{
P10=1;
delay(1000);
compensate=ReadCount()+1;
while(1)
{
// ReadCount();
WeighWork();
LedDisplay();
ButtonScan();
}
}
作者:
sxszpeng
時間:
2016-6-11 22:38
在單片機和數(shù)碼管之間加一個573之類的芯片,利用芯片的鎖存端實現(xiàn)硬件方面的鎖定
作者:
fbzsn
時間:
2016-6-12 10:38
謝謝樓上大哥的指點!請問:不另加573鎖存器行不行?
作者:
yzwzfyz
時間:
2016-6-12 19:44
1,做一個標記位K,每按鍵一次K求反(K=0或1,TURE/FALSE)
2,做兩個顯示區(qū)(比如:四個字節(jié)),放秤的采樣顯示數(shù)據(jù).設為XS1和XS2.
3,每次采樣值只存放于XS1中.
4,當K=0時,顯示XS1的值,即正常顯示秤的測量值.
5.當K=1時,將XS1復制至XS2中,并顯示XS2的值.
作者:
fbzsn
時間:
2016-6-12 21:09
本帖最后由 fbzsn 于 2016-6-15 22:14 編輯
非常感謝yzwzfyz高級工程師的指導!有點思路了,我去試試。再次感謝!(問題已解決,再次感謝yzwzfyz高級工程師的指導!
)
作者:
yzwzfyz
時間:
2016-6-16 10:39
初學者:總是把數(shù)據(jù)(現(xiàn)場處理過的),拿去直接顯示,就是不好的做法,機會性很差.
正確的做法是:把數(shù)據(jù)(現(xiàn)場處理過的),先送到顯示緩沖區(qū)(如XS1,XS2...),而后再從顯示緩沖區(qū)取出數(shù)據(jù)去顯示.
這樣顯示的機動性就強了,要怎么做就怎么做?
對于你來說.只是修改XS1,或XSn中的數(shù)據(jù)而矣.
而XS1,或XSn,只是幾個字節(jié)的內(nèi)存而矣,隨便定義一下即可.
比如,XS1放的是動態(tài)數(shù)據(jù)(隨顯示內(nèi)容更改變動),而XS2,只是在需要的時候,從XS1中復制一下,那么:
當你將XS1送去顯示時,顯示的內(nèi)容就是不斷變化的(如時間)
當你將XS2送去顯示時,顯示的內(nèi)容就是不變的(如永遠是"13:57",因為你在13:57將XS1復制到了XS2中,而XS2已后就不變了)
所以你只要選擇從哪個緩沖區(qū)取數(shù)據(jù)顯示,就會得到不同的顯示效果.
作者:
fbzsn
時間:
2017-3-29 22:33
謝謝 yzwzfyz總工程師指點!完美解決問題。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1