這是我的程式
#include <stdio.h>
#include<reg51.h>
sbit p1=P2^7; //定義數碼管十位選
sbit p2=P2^6; //定義數碼管個位選
sbit p3=P2^5; //定義數碼管小數位選
sbit p4=P2^4; //定義數碼管V字位選
sbit dp=P0^7; //定義數碼管小數點位選 void init_timer( )
{ int TMOD,TH0,TL0,EA,ET0,TR0; TMOD=0x01; TH0=(65536-3500)/256; TL0=(65536-3500)%256; EA=1; ET0=1; TR0=1; }
void display(void)
{ int p1,p2,p3,p4;
long int P0,bb,sgn; p1=0;p2=0;p3=0;p4=0; //位選關 if(bb/100%10==0) //判斷電壓十位是不是等于0 P0=sgn[10]; //是的話,不顯示 ,發送段碼 else P0=sgn[bb/100%10]; //不是的話,就顯示,發送段碼 p1=1;p2=0;p3=0;p4=0; //位選開 DelayMs(3); //顯示延遲 p1=0;p2=0;p3=0;p4=0; //位選關 P0=SegCode[bb/10%10]; //發送個位段碼 dp=0; //點亮小數點 p1=0;p2=1;p3=0;p4=0; //位選開 DelayMs(3); //顯示延遲 p1=0;p2=0;p3=0;p4=0; //位選關 P0=SegCode[bb%10]; //發送小數位段碼 p1=0;p2=0;p3=1;p4=0; //位選開 DelayMs(3); //顯示延遲 p1=0;p2=0;p3=0;p4=0; //位選關 P0=SegCode[11]; //發送V欄位碼 p1=0;p2=0;p3=0;p4=1; //位選開 DelayMs(3); //顯示延遲 p1=0;p2=0p3=0;p4=0; //位選關
}
void DA_Conver(unsigned int DAValue) { unsigned char i; DAValue <<= 6; CS = 0; CLK = 0; for(i = 0; i < 12; i++) { DIN = (bit)(DAValue & 0x8000); CLK = 1; DAValue <<= 1; CLK = 0; } CS = 1; CLK = 0; }
void keyscan1( ) //復位按鍵掃描
{ if(an1==0) //按鍵按下 { aa=0; //DA變數賦值為0 bb=0; } while(an1==0); //退出
uj5u.com熱心網友回復:
我覺得lz應先找本入門級的教材先好好學學就題目的問題,應該是display函式的sgn變數,明明是個普通的long,卻被當成陣列使用P0=sgn[0]
另外,變數的作用范圍不清,bb是display的區域變數,keyscan1看不見bb,又怎么能給bb清0?
還有,變數沒有初始化就使用,if(bb/100%10==0) 這里bb都沒賦過值,計算結果能正確嗎?
除非bb是全域變數
uj5u.com熱心網友回復:
謝謝大佬,我是大一學生,要做課設,真的不太會,我應該怎么改一下呢
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/47638.html
標籤:C語言
