![]() |
發(fā)布時間: 2019-1-1 19:19
正文摘要:求助QAQ,一直是這樣查了好久看不出來問題。數(shù)組沒辦法初始化。。譜中的板子 #include <reg52.h> typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; sbit LSA = P2^2;&nb ... |
根據(jù)電路圖J21跳線帽要接在VCC與LE,否則74HC573打不開,段碼送不了。 ![]() ![]() |
wulin 發(fā)表于 2019-1-4 11:21 多謝多謝 |
凜夏寒煙 發(fā)表于 2019-1-3 21:27 給你改寫成單鍵操作8位24小時百分秒表,有詳細(xì)注釋,應(yīng)該能看得懂,經(jīng)仿真無誤。 #include <AT89X52.H> #define number P0 #define wela P2 typedef unsigned int u16 ; typedef unsigned char u8 ; sbit key1=P3^0; //sbit key2=P3^1; //sbit wela_A=P2^2; //sbit wela_B=P2^3; //sbit wela_C=P2^4; u8 code smgduan[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 };//數(shù)碼管轉(zhuǎn)換表 u8 LedBuff[8];//數(shù)碼管緩沖區(qū) u8 Cntus=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0,Cnthour=0; //中斷計時變量 bit suspend=0; //暫停標(biāo)志 void LedScan(); //顯示程序聲明 void keyscan(); //按鍵掃描程序聲明 /***********按鍵掃描程序****************/ void keyscan() { static u8 count2=0,count1=0; //計數(shù)變量 static bit key_sign=0; //按鍵狀態(tài)標(biāo)志 if(key1==0) //檢測輸入如果為0 { count1++; //計數(shù)延時消抖 if((count1>=100)&&(key_sign==0))//檢測按鍵如果為0 { key_sign=1; //按鍵狀態(tài)標(biāo)志置1,防止重復(fù)響應(yīng) count2++; if(count2>=3) count2=0; switch(count2) { case 0: Cntus=0; Cnt10ms=0; Cnt1s=0; Cnt1min=0; Cnthour=0; break;//清0 case 1: suspend=1; break;//計時 case 2: suspend=0; break;//暫停 } } } else { count1=0; //計數(shù)變量清0 key_sign=0; //按鍵狀態(tài)標(biāo)志清0 } } /***********定時器初始化程序****************/ void Timer0Init() //2500微秒@11.0592MHz { TMOD = 0x01; //設(shè)置定時器模式 TL0 = 0x00; //設(shè)置定時初值 TH0 = 0xF7; //設(shè)置定時初值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時器0開始計時 EA=1; //開總中斷 ET0=1; //開定時器0中斷 } void StopwatchDisplay()//數(shù)字分解 { LedBuff[0]=Cnthour/10; LedBuff[1]=Cnthour%10; LedBuff[2]=Cnt1min/10; LedBuff[3]=Cnt1min%10; LedBuff[4]=Cnt1s/10; LedBuff[5]=Cnt1s%10; LedBuff[6]=Cnt10ms/10; LedBuff[7]=Cnt10ms%10; } /***************主程序****************/ void main() { Timer0Init(); //定時器初始化 while(1) { keyscan(); //按鍵掃描 StopwatchDisplay(); } } /**************中斷服務(wù)程序*****************/ void timer0() interrupt 1//2500微秒@11.0592MHz { TL0 = 0x00; //設(shè)置定時初值 TH0 = 0xF7; //設(shè)置定時初值 Cntus++; //中斷變量Cntus自+1 if(Cntus>=4) //10ms { Cntus=0; //清0 if(suspend==1) //暫停/啟動 Cnt10ms++; //毫秒計數(shù) if(Cnt10ms>=100) { Cnt10ms=0; Cnt1s++; //秒計數(shù) if(Cnt1s>=60) { Cnt1s=0; Cnt1min++; //分計數(shù) if(Cnt1min>=60) { Cnt1min=0; Cnthour++; //時計數(shù) if(Cnthour>=24) Cnthour=0; } } } } LedScan(); //顯示程序 } void LedScan()//顯示程序 { static u8 i=0; //計數(shù)變量 number=0x00; //消隱 wela=i<<2; //送位碼 if((i%2==1)&&(i!=7))//送段碼 number=smgduan[LedBuff]|0x80;//加點 else number=smgduan[LedBuff]; if(++i>=8) i=0; /* switch(i) { case 0: wela=i<<2; number=smgduan[LedBuff[0]];i++;break; case 1: wela=i<<2; number=smgduan[LedBuff[0]]|0x80;i++;break; case 2: wela=i<<2; number=smgduan[Cnt1min/10];it++;break; case 3: wela=i<<2; number=smgduan[Cnt1min%10]|0x80;i++;break; case 4: wela=i<<2; number=smgduan[Cnt1s/10];i++;break; case 5: wela=i<<2; number=smgduan[Cnt1s%10]|0x80;i++;break; case 6: wela=i<<2; number=smgduan[Cnt10ms/10];i++;break; case 7: wela=i<<2; number=smgduan[Cnt10ms%10];i=0;break; }*/ } |
HC6800-ES-V2.0 發(fā)表于 2019-1-2 08:23 而且復(fù)位之后無法重新啟動,求幫助 |
HC6800-ES-V2.0 發(fā)表于 2019-1-2 08:23 我把程序改了下,可是按鍵時只有第一次按下有作用,有時復(fù)位鍵有作用,我懷疑是按鍵消抖作用需要時間太長,和掃描形成了時間差,您覺得是不是有這樣的可能。普中的板子是會在長按按鍵一段時間后自動取消置高電平的嗎?
|
一點看法吧——程序我還沒有讀通 第一:你照片上的右四位數(shù)碼管的點亮的問題,不是什么數(shù)組初始化問題,是消隱問題 case(7): LSA=1;LSB=1;LSC=1; break;//顯示第7位 } } P0 = LedBuff[i]; j=10; //掃描間隔時間設(shè)定 while(j--); P0=0x00;//消隱 我在你的顯示函數(shù)中加點東西,就不亮了,就只有最左的數(shù)碼管是亮的。 第二:看你的程序結(jié)構(gòu)(雖然沒全部讀通),但你的顯示和按鍵函數(shù)都放在中斷里,是很不好的——一是讓你的定時很不準(zhǔn)確,二是顯示和按鍵在不中斷時不能執(zhí)行——我有你同樣的板子,按鍵根本沒用,長按都不行,具體原因還沒找到,但這個結(jié)構(gòu)很不好,其實就是編程思路問題。 我這里有別人的一個程序,給你看看,功能是完整的哦——一鍵秒表 //上電待令,按鍵k3計時開始,再按計時停止,再按清0,再按開始,周而復(fù)始。 #include <reg51.h> #define uint unsigned int #define uchar unsigned char sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4;//連接譯碼器,選擇點亮的數(shù)碼管 sbit k3=P3^2;//外部中斷按鍵 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar Cntus=0,Cnt100ms,Cnt1s=0;//中斷計時變量 bit zantin=0; //暫停標(biāo)志 /***********定時器初始化程序****************/ void Timer0Init(void) //2500微秒@12.000MHz { TMOD= 0x01; //設(shè)置定時器模式 TL0 = 0x3C; //設(shè)置定時初值 TH0 = 0xF6; //設(shè)置定時初值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時器0開始計時 EA=1; //開總中斷 ET0=1; //開定時器0中斷 } /***********按鍵掃描程序****************/ void keyscan() { static uint count2=0,count1=0; //計數(shù)變量 static bit key_sign=0; //按鍵狀態(tài)標(biāo)志 if(k3==0) //檢測輸入如果為0 { count1++; //計數(shù)延時消抖 if((count1>=500)&&(key_sign==0))//檢測按鍵如果為0 { key_sign=1; //按鍵狀態(tài)標(biāo)志置1,防止重復(fù)響應(yīng) count2++; if(count2>=3) count2=0; switch(count2) { case 0: Cntus=0; Cnt100ms=0; Cnt1s=0; break;//清0 case 1: zantin=1; break;//計時 case 2: zantin=0; break;//暫停 } } } else { count1=0; //計數(shù)變量清0 key_sign=0; //按鍵狀態(tài)標(biāo)志清0 } } void display()//顯示程序 { static uchar i=0; P0=0x00;//消隱 switch(i) { case(0): LSA=0;LSB=1;LSC=1;P0=table[Cnt1s/10];i++; break;//顯示第5位 case(1): LSA=1;LSB=0;LSC=1;P0=table[Cnt1s%10]|0x80;i++; break;//顯示第6位 case(2): LSA=0;LSB=0;LSC=1;P0=table[Cnt100ms];i=0; break;//顯示第7位 } } /***************主程序****************/ void main() { Timer0Init(); //定時器初始化 while(1) { keyscan(); //按鍵掃描 } } /**************中斷服務(wù)程序*****************/ void timer0() interrupt 1//2500微秒@11.0592MHz { TL0 = 0x00; //設(shè)置定時初值 TH0 = 0xF7; //設(shè)置定時初值 Cntus++; //中斷變量Cntus自+1 if(Cntus>=40) //10ms { Cntus=0; //清0 if(zantin==1) //暫停/啟動 Cnt100ms++; //毫秒計數(shù) if(Cnt100ms>=10) { Cnt100ms=0; Cnt1s++; //秒計數(shù) if(Cnt1s>=60) Cnt1s=0; } } display(); //顯示程序 } |
Powered by 單片機(jī)教程網(wǎng)