找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機按鍵調(diào)節(jié)時間程序不管用 數(shù)碼管閃爍不停 求幫助

查看數(shù): 4597 | 評論數(shù): 8 | 收藏 1
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2020-8-1 21:13

正文摘要:

按鍵調(diào)節(jié)時間。可是不管用。還有數(shù)碼管閃爍不停;;;;;求指教 #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar code table[11]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, ...

回復(fù)

ID:190577 發(fā)表于 2020-8-4 14:51

1 、此款電子時鐘,時間可以設(shè)置,有4個按鍵,一個功能按鍵,一個加,一個減,一個確定按鍵。
2、按下功能按鍵一下,時鐘走時停止,時兩位數(shù)碼管閃爍,代表此時再調(diào)時狀態(tài),這個時候加減按鍵就可以調(diào)整時鐘,再次按下功能按鍵,就可以調(diào)整分鐘,再按一下功能按鍵就可以設(shè)置秒。設(shè)置好時間后我們按確定按鍵,時鐘開始走時。
3、這個程序?qū)⒑芎玫慕虝覀冊趺醋寯?shù)碼管閃爍顯示。
#include <REG51.H>
typedef unsigned int UINT;
typedef unsigned char UCHAR ;
sbit key1=P3^3;
sbit key2=P3^4;
sbit key3=P3^5;
sbit key6=P3^6;
sbit LE1 = P3^1;  //定義位控口   
sbit LE2 = P3^2;  //定義段控口
UCHAR MODE ;
UCHAR page ;
signed char  HH = 0;  //小時初始值
signed char  MM = 0;  //分鐘初始值
signed char SS = 0;  //秒初始值
UINT u1_10ms  = 0; //10ms計數(shù)
UINT u2_10ms  = 0;
bit T_CYCLE = 0;
extern void T0_Init(void); //初始化定時器,函數(shù)定義在timer.c
UCHAR code NUM[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};

void delay(UINT t) //延時t時鐘周期
{
while (t--) ;
}

void H_Increase(void) //小時增1
{
IF(HH<23) HH++;
else
{
  HH = 0;
}
}

void M_Increase(void)  //分鐘增1
{
if(MM<59) MM++;
else
{
  MM = 0;

}
}

void S_Increase(void)  //秒增1
{
if(SS<59) SS++;
else
{
  SS = 0;

}
}
void H(void) //小時增1
{
if(HH>0) HH--;
else
{
  HH =23;
}
}

void M(void)  //分鐘增1
{
if(MM>0) MM--;
else
{
  MM = 59;

}
}

void S(void)  //秒增1
{
if(SS>0) SS--;
else
{
  SS = 59;

}
}
void display(UCHAR SEG,UCHAR Digi) //顯示一位數(shù)碼管,SEG = 0-9數(shù)字,Digi = 第0-6位
{
LE2 = 1;
P0 = (0x01<<Digi) ;
LE2 = 0;
P0 = 0x00;
LE1 = 1;
P0 = NUM[SEG];
if (Digi==1||Digi==4) P1&= 0x7f ;  //顯示分隔符
delay(50);
P0 = 0xff;
LE1 = 0;
}
void key()
{

if(key1==0)
{
  delay(2);
  if(key1==0)
  {
   while(!key1);
        TR0=0;
  
       if(MODE == 3) MODE = 1;
   else MODE ++;
   
  
     }
  }
   
  if(key2==0)
{
  delay(2);
  if(key2==0)
  {
   while(!key2);
  
     if(MODE == 1) H_Increase() ;
    if(MODE == 2) M_Increase() ;
     if(MODE == 3) S_Increase() ;
     
     }
  }
if(key3==0)
{
  delay(2);
  if(key3==0)
  {
   while(!key3);
  
           if(MODE == 1) H() ;
    if(MODE == 2) M() ;
     if(MODE == 3) S() ;
     
           }
  
  
   
  }

   if(key6==0)
{
  delay(2);
  if(key6==0)
  {
   while(!key6);
         TR0=1;
   MODE=0;
     }
  }
}
void main(void)
{
    P1 = 0xff;
    LE1 = 0;
    LE2 = 0;
T0_Init();
    while(1)
{
     key();
  if(MODE != 1 || T_CYCLE)
  {
   display(HH/10,0);  //顯示小時十位數(shù)
   display(HH%10,1);  //顯示小時個位數(shù)
      display(10,2);  
  }
  if(MODE != 2  || T_CYCLE)
  {
   display(MM/10,3);  //顯示分鐘十位數(shù)
   display(MM%10,4);  //顯示分鐘個位數(shù)
   display(10,5);  //顯示小時個位數(shù)
  }
   if(MODE != 3  || T_CYCLE)
  {
  display(SS/10,6);  //顯示秒十位數(shù)
  display(SS%10,7);  //顯示秒個位數(shù)
  }
}
}
extern void key_Process(void);
extern void S_Increase(void);

void T0_Init(void)
{
TMOD = 0x11;
//定時器賦初始值,定時時間為10ms。
TH0 = 0xd8;
TL0 = 0xf0;
TH1 = 0xd8;
TL1= 0xf0;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}

void T0_INTSrv(void) interrupt 1
{
//定時器重新開始計時。
TH0 = 0xd8;
TL0 = 0xf0;
u1_10ms ++;
if (u1_10ms>99) // 1000 ms = 1 second
{
  u1_10ms = 0;
  SS++;
  if(SS==60)
  {
   SS=0;
   MM++;
   if(MM==60)
   {
    MM=0;
    HH++;
    if(HH==24)
    HH=0;
   }
  }
}
}
void T1_INTSrv(void) interrupt 3
{
//定時器重新開始計時。
TH0 = 0xd8;
TL0 = 0xf0;
u2_10ms ++;
if (u2_10ms%10==0) // 100 ms
{
  T_CYCLE = ! T_CYCLE; //閃爍循環(huán)
}
}
ID:138080 發(fā)表于 2020-8-3 11:04
k9702 發(fā)表于 2020-8-3 11:00
樓主你寫代碼要習(xí)慣寫注釋啊,這樣不論是發(fā)出來分享還是自己查錯的時候都容易讓人讀懂

菜鳥剛起步。。。。
多謝指點哈。下次寫上注釋;
ID:138080 發(fā)表于 2020-8-3 11:03

謝謝大佬。。。。。
ID:609192 發(fā)表于 2020-8-3 11:00
樓主你寫代碼要習(xí)慣寫注釋啊,這樣不論是發(fā)出來分享還是自己查錯的時候都容易讓人讀懂
ID:138080 發(fā)表于 2020-8-3 10:53
xianfajushi 發(fā)表于 2020-8-2 06:48
判斷亂嵌套邏輯也就亂了,從代碼看不是單獨按鍵了,而是2個按鍵同時按下才起作用,閃爍可調(diào)節(jié)延時少點。

自己都看不下去了。。。
所以換成設(shè)置6個按鍵的了;那樣就行了;
這個還不太會寫;;還是要參考別人的代碼仿寫一下
ID:138080 發(fā)表于 2020-8-3 10:51

謝啦。
ID:213173 發(fā)表于 2020-8-2 15:25
給你改好了
數(shù)碼管時鐘.zip (252.44 KB, 下載次數(shù): 17)




ID:332444 發(fā)表于 2020-8-2 06:48
判斷亂嵌套邏輯也就亂了,從代碼看不是單獨按鍵了,而是2個按鍵同時按下才起作用,閃爍可調(diào)節(jié)延時少點。

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表