|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
為什么我的12232LCD讀數(shù)顯示會(huì)出現(xiàn)小數(shù)點(diǎn)漂移? |
| 作者:xzhenggen 欄目:單片機(jī) |
為什么我的12232LCD讀數(shù)顯示會(huì)出現(xiàn)小數(shù)點(diǎn)漂移,同時(shí)出現(xiàn)兩個(gè)小數(shù)點(diǎn)? 實(shí)際上我的定義的小數(shù)位只為兩位。但是調(diào)用串行AD7896函數(shù)時(shí)讀電流值。 隨著電流的增大會(huì)出現(xiàn)兩個(gè)小數(shù)點(diǎn)。 首先顯示是000.00mA,然后隨著電流的增加到000.99mA時(shí),再增加電流LCD上會(huì)讀出001.00.00A的數(shù)據(jù),全亂了。請(qǐng)各位大俠幫我看看下面這個(gè)子程序 這樣定位小數(shù)及讀數(shù)有什么問(wèn)題?多謝!! void DISPLAY(uint v) { unsigned CHAR row, count; float tt; unsigned int tmp ; int VALUE; tt=v*AD_Loop_PickVol_PER; VALUE = tt * 100 + (VALUE > 0 ? 0.5 : -0.5); tmp = abs(VALUE); serial_buff[0] = tmp / 10000.html">10000; serial_buff[1] = tmp % 10000.html">10000 / 1000; serial_buff[2] = tmp % 1000 / 100; serial_buff[3] = tmp % 100 / 10; serial_buff[4] = tmp % 10; draw_bmp(0,1,8,ELAPHT[0]);// 顯示“I” draw_bmp(8,1,8,num[15]);//顯示“:” /* if(VALUE< 0) { draw_bmp(16,1,8,num[14]);//顯示“-” } else { draw_bmp(16,1,8,num[13]);//顯示“+” } */ for(count = 0; count != 5; count++) { draw_bmp(16+row*8,1,8,num[serial_buff][count]]);//顯示讀數(shù) row++; if((count == 2))////定位小數(shù)位 { draw_bmp(16+row*8,1,8,num[10]); row++; } } if((serial_buff[0]==0)&&(serial_buff[1]==0)&&(serial_buff[2]==0)) { for(row=0;row !=4;row++) { draw_bmp(16+row*8,1,8,num[12]);//消隱設(shè)置“空格” } if(serial_buff[3]==0) { draw_bmp(16+row*8,1,8,num[12]);//消隱設(shè)置“空格” } draw_bmp(104,1,8,ELAPHT[10]);//顯示“m” draw_bmp(112,1,8,ELAPHT[1]);//顯示“A” } else { draw_bmp(104,1,8,num[12]);//消隱設(shè)置“空格” draw_bmp(112,1,8,ELAPHT[1]);//顯示“A” if(serial_buff[0]==0) { row=0; draw_bmp(16+row*8,1,8,num[12]);//消隱設(shè)置“空格” if(serial_buff[1]==0) { row++; draw_bmp(16 +row*8,1,8,num[12]);//消隱設(shè)置“空格” } } } } |
| 2樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/5/14 12:03:00 發(fā)布:
例程如下: #include "reg52.h" #include "LCD_code.h" #include "intrins.h" #include "math.h" #include "AD7896.h" #define nop() _nop_() #define uCHAR unsigned CHAR #define uint unsigned int sbit A0 = 0xb3; sbit E2 = 0xb4; sbit E1 = 0xb5; sbit _WR= P2^6; sbit LED=P2^3; sbit up=P1^6;//S1 sbit down=P1^7;//S3 /* sbit A0 = P2^5; sbit _WR = P2^6; sbit E1 = P2^4; sbit E2 = P2^7; */ #define lcd_data P0 //#define lcd_data PORTA //data; #define set_E1() (E1=1) #define set_E2() (E2=1) #define set_A0() (A0=1) #define set_WR() (_WR=1) #define clr_E1() (E1=0) #define clr_E2() (E2=0) #define clr_A0() (A0=0) #define clr_WR() (_WR=0) #define disp_off 0xae #define disp_on 0xaf #define disp_start_line 0xc0 #define page_addr_set 0Xb8 #define col_addr_set 0x00 #define status_busy 0x80 #define write_mode 0xee #define dynamic_driver 0xa4 #define adc_select 0xA0 #define clk32 0xa9 #define clk16 0xa8 #define reset 0xe2 #define uCHAR unsigned CHAR #define uint unsigned int uCHAR time_counter=0; uCHAR key=0; uCHAR serial_counter; bit disp_flag=0; #define AD_Vol_PER 2.5 #define AD_Loop_PickVol_PER 0.0024414 sbit SCLK=P1^1; sbit WDI=P1^2; sbit SDATA=P1^0; bit r_flag=0; unsigned CHAR idata serial_buff[77]; void lcd_init(void); void lcd_clr(void); void wait_ready(void); void draw_bmp(uCHAR col,uCHAR layer,uCHAR width,uCHAR *bmp); void ASCII2BCD(void); void LOGO(void); extern uint read7896(void); void delay_nu(uCHAR n) { uCHAR i; for(i=0;i<n;i++) { _nop_(); } } uint read7896(void) { uint result; uCHAR h; SCLK=0; WDI=0; delay_nu(30); WDI=1; delay_nu(30); SDATA=1; for(h=0;h<16;h++) { result<<=1; SCLK=1; _nop_(); if(SDATA)result++; SCLK=0; } result=result&0xfff; return result; } void delay(uCHAR i) { uCHAR j; for(i=i<<1;i>0;i--) for(j=0xf3;j>0;j--) {} } void int_t0() interrupt 1 using 1 { TH0=0X4C; TL0=0X00; time_counter++; if(time_counter==200) { time_counter=0; LED=1; TR0=0; } } void send_mi(uCHAR instruction) { clr_E2(); set_E1(); wait_ready(); clr_A0(); clr_WR(); nop(); lcd_data=instruction; nop(); clr_E1(); } void send_md(uCHAR c) { clr_E2(); set_E1(); wait_ready(); set_A0(); clr_WR(); nop(); lcd_data=c; nop(); clr_E1(); } void send_si(uCHAR instruction) { clr_E1(); set_E2(); wait_ready(); clr_A0(); clr_WR(); nop(); lcd_data=instruction; nop(); clr_E2(); } void send_sd(uCHAR c) { clr_E1(); set_E2(); wait_ready(); set_A0(); clr_WR(); lcd_data=c; nop(); clr_E2(); } void wait_ready(void) { clr_A0(); set_WR(); nop(); nop(); //while(lcd_data&status_busy); } void lcd_init(void) { send_mi(reset); send_si(reset); send_mi(disp_off); send_si(disp_off); send_mi(dynamic_driver); send_si(dynamic_driver); send_mi(clk32); send_si(clk32); send_mi(adc_select); send_si(adc_select); send_mi(write_mode); send_si(write_mode); send_mi(col_addr_set); send_mi(disp_start_line); send_si(col_addr_set); send_si(disp_start_line); send_mi(disp_on); send_si(disp_on); } void lcd_clr(void) { uCHAR i,page; for(page=0;page<4;page++) { send_mi(page_addr_set|page); send_si(page_addr_set|page); send_mi(0); send_si(0); for(i=0;i<61;i++) { send_md(0x00); send_sd(0x00); } } } void set_page(uCHAR page) { send_mi(page_addr_set|page); send_si(page_addr_set|page); } void set_address(uCHAR address) { send_mi(address&0x7f); send_si(address&0x7f); } void putCHAR_l(uCHAR c) { send_md(c); } void putCHAR_r(uCHAR c) { send_sd(c); } void draw_bmp(uCHAR col,uCHAR layer,uCHAR width,uCHAR *bmp) { uCHAR x; uCHAR address; //顯存的物理地址 uCHAR p=0; // &nb |
|
| 3樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/5/14 12:09:00 發(fā)布:
顯示小數(shù)點(diǎn)注釋補(bǔ)充一下,重發(fā)! void DISPLAY(uint v) { unsigned CHAR row, count; float tt; unsigned int tmp ; int VALUE; tt=v*AD_Loop_PickVol_PER; VALUE = tt * 100 + (VALUE > 0 ? 0.5 : -0.5); tmp = abs(VALUE); serial_buff[0] = tmp / 10000.html">10000; serial_buff[1] = tmp % 10000.html">10000 / 1000; serial_buff[2] = tmp % 1000 / 100; serial_buff[3] = tmp % 100 / 10; serial_buff[4] = tmp % 10; draw_bmp(0,1,8,ELAPHT[0]);// 顯示“I” draw_bmp(8,1,8,num[15]);//顯示“:” /* if(VALUE< 0) { draw_bmp(16,1,8,num[14]);//顯示“-” } else { draw_bmp(16,1,8,num[13]);//顯示“+” } */ for(count = 0; count != 5; count++) { draw_bmp(16+row*8,1,8,num[serial_buff][count]]);//顯示讀數(shù) row++; if((count == 2))////定位小數(shù)位 { draw_bmp(16+row*8,1,8,num[10]);//顯示小數(shù)點(diǎn) row++; } } if((serial_buff[0]==0)&&(serial_buff[1]==0)&&(serial_buff[2]==0)) { for(row=0;row !=4;row++) { draw_bmp(16+row*8,1,8,num[12]);//消隱設(shè)置“空格” } if(serial_buff[3]==0) { draw_bmp(16+row*8,1,8,num[12]);//消隱設(shè)置“空格” } draw_bmp(104,1,8,ELAPHT[10]);//顯示“m” draw_bmp(112,1,8,ELAPHT[1]);//顯示“A” } else { draw_bmp(104,1,8,num[12]);//消隱設(shè)置“空格” draw_bmp(112,1,8,ELAPHT[1]);//顯示“A” if(serial_buff[0]==0) { row=0; draw_bmp(16+row*8,1,8,num[12]);//消隱設(shè)置“空格” if(serial_buff[1]==0) { row++; draw_bmp(16 +row*8,1,8,num[12]);//消隱設(shè)置“空格” } } } } |
|
| 4樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/5/14 12:10:00 發(fā)布:
是不是我這樣的定位小數(shù)點(diǎn)方法不正確? 有什么好的方式定義小數(shù)位? |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |