找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2307|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)教一個(gè)用單片機(jī)定時(shí)器通過按鍵對(duì)參數(shù)連續(xù)的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:476909 發(fā)表于 2019-11-14 17:35 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
平時(shí)對(duì)單片機(jī)一知半解的,工作不對(duì)口,但很久以前學(xué)過一些,
今天想做一個(gè)小的顯示電路,通過一個(gè)按鍵對(duì)一個(gè)數(shù)據(jù)進(jìn)行加操作,比如0~9999吧。
想用stc的單片機(jī),型號(hào)無所謂了,大致能用就行,當(dāng)按鍵按下時(shí)用定時(shí)器實(shí)現(xiàn)數(shù)據(jù)的連續(xù)加,用延時(shí)的方法實(shí)現(xiàn)連續(xù)加可以實(shí)現(xiàn),但延時(shí)的方法不理想,
想請(qǐng)教一下壇子里的師傅們能不能給一個(gè)簡單的程序?qū)W習(xí)一下
實(shí)際上為了節(jié)省IO,我是用了一個(gè)74HC595來驅(qū)動(dòng)數(shù)碼管,但考慮到不想多浪費(fèi)大家的精力,就簡單通過IO來驅(qū)動(dòng)了。
方法對(duì)了換個(gè)驅(qū)動(dòng)芯片就簡單了。
這里先謝謝了


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2019-11-14 21:38 | 只看該作者
給你寫了一個(gè)按鍵短按加減,長按連加減 4位數(shù)碼管顯示0~9999程序,端口根據(jù)實(shí)際電路自行修改。


  1. //按鍵短按加減,長按連加減 4位數(shù)碼管顯示0~9999
  2. #include <REG51.H>
  3. #define uint unsigned int                         //宏定義數(shù)據(jù)類型uint
  4. #define uchar unsigned char                 //宏定義數(shù)據(jù)類型uchar
  5. #define key_S 10                                        //宏定義短按20ms
  6. #define key_L 500                                        //宏定義長按1000ms
  7. #define key_M 400                                        //宏定義長按間隔200ms
  8. sbit key1=P1^6;                                                //加鍵
  9. sbit key2=P1^7;                                                //減鍵
  10. uchar code table[]={
  11.         0x3f,0x06,0x5b,0x4f,
  12.         0x66,0x6d,0x7d,0x07,
  13.         0x7f,0x6f,0x77,0x7c,
  14.         0x39,0x5e,0x79,0x71};
  15. uchar code wela[]={0xfe,0xfd,0xfb,0xf7};
  16. uint num=0;

  17. void Timer0Init()        //2毫秒@12.000MHz
  18. {
  19.         TMOD= 0x01;                //設(shè)置定時(shí)器模式
  20.         TL0 = 0x30;                //設(shè)置定時(shí)初值
  21.         TH0 = 0xF8;                //設(shè)置定時(shí)初值
  22.         TF0 = 0;                //清除TF0標(biāo)志
  23.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  24.         EA  = 1;                //開總中斷
  25.         ET0 = 1;                //開定時(shí)器0中斷       
  26. }

  27. void keyscan()                                                        //按鍵掃描
  28. {
  29.         static uint count1=0,count2=0;//計(jì)數(shù)變量
  30.         if(!key1)   
  31.         {  
  32.                 count1++;  
  33.                 if(count1>=key_L)                                //長按
  34.                 {
  35.                         if(num<9999)
  36.                                 num++;        
  37.                         count1=key_M;
  38.                 }
  39.         }  
  40.         else                                                                        //按鍵抬起
  41.         {  
  42.                 if(count1>key_S && count1<key_L)//短按
  43.                 {
  44.                         if(num<9999)
  45.                                 num++;
  46.                 }
  47.                 count1=0;                                                        //count清0
  48.         }   
  49.         if(!key2)   
  50.         {  
  51.                 count2++;  
  52.                 if(count2>=key_L)                                //長按
  53.                 {
  54.                         if(num>0)
  55.                                 num--;        
  56.                         count2=key_M;
  57.                 }
  58.         }  
  59.         else                                                                        //按鍵抬起
  60.         {  
  61.                 if(count2>key_S && count2<key_L)//短按
  62.                 {
  63.                         if(num>0)
  64.                                 num--;
  65.                 }
  66.                 count2=0;                                                        //count清0
  67.         }
  68. }
  69. void display()//顯示程序
  70. {
  71.         static uchar i=0;
  72.         P2=0x00;
  73.         P3=wela[i];
  74.         switch(i)
  75.         {
  76.                 case 0: P2=table[num/1000%10]; break;
  77.                 case 1: P2=table[num/100%10]; break;
  78.                 case 2: P2=table[num/10%10]; break;
  79.                 case 3: P2=table[num%10]; break;
  80.         }
  81.         i++;
  82.         i%=4;
  83. }

  84. void main()
  85. {
  86.         Timer0Init();
  87.         while(1);
  88. }

  89. void timer0() interrupt        1
  90. {
  91.         TL0 = 0x30;
  92.         TH0 = 0xF8;       
  93.         keyscan();
  94.         display();
  95. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

板凳
ID:235200 發(fā)表于 2019-11-15 01:43 | 只看該作者
一般用定時(shí)計(jì)數(shù)器可以實(shí)現(xiàn),其思路是用一個(gè)整型變量進(jìn)行加,所加的值分配按千百十個(gè)位存入數(shù)組定義的顯示緩沖區(qū),程序掃描顯示緩沖區(qū)的數(shù)據(jù)即可
如定義1秒鐘加1次的實(shí)現(xiàn)方法:
定時(shí)中斷的程序
void time0() interrupt 1
{
    n++;        //2ms定時(shí)加到500即為1秒
   if (n==500)
     {
        n=0;
        sec++;          //秒鐘加1
      }
    P2=0;                          //共陰數(shù)碼管消影
    P2=disp[dispbuf[i]];     //dispbuf數(shù)組存千百十個(gè)位數(shù)據(jù) disp數(shù)組存0-9的段碼
    P3=wei[i];                    //數(shù)組wei存放顯示的位碼依次為0x0e,0x0d,0x0b,0x07
    i++;                            //i用于計(jì)數(shù)數(shù)碼管的顯示位
   if (j==4) j=0;
   TH0=(65536-2000)/256;     //重裝2ms初值
   TL0=(65536-2000)%256;
}

主程序應(yīng)包括如下內(nèi)容:
dispbuf[0]=sec/1000;                     //千位數(shù)字
dispbuf[1]=(sec/100)%10;          //百位數(shù)字
dispbuf[2]=(sec/10)%10;           //十位數(shù)字
dispbuf[3]=sec%10;                     //個(gè)位數(shù)字
回復(fù)

使用道具 舉報(bào)

地板
ID:642363 發(fā)表于 2019-11-15 03:37 | 只看該作者
很簡單的 github 有源碼 直接找
回復(fù)

使用道具 舉報(bào)

5#
ID:476909 發(fā)表于 2019-11-15 10:46 | 只看該作者
謝謝大家,我這就仔細(xì)學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

6#
ID:230975 發(fā)表于 2019-11-16 10:31 | 只看該作者
wulin 發(fā)表于 2019-11-14 21:38
給你寫了一個(gè)按鍵短按加減,長按連加減 4位數(shù)碼管顯示0~9999程序,端口根據(jù)實(shí)際電路自行修改。

師傅在定時(shí)器里可以執(zhí)行這么多語句,為何我在定時(shí)器0里執(zhí)行一個(gè),用定時(shí)器1產(chǎn)生波特率的串口發(fā)送程序就不行呢。
回復(fù)

使用道具 舉報(bào)

7#
ID:642249 發(fā)表于 2019-11-16 14:09 | 只看該作者
wulin 發(fā)表于 2019-11-14 21:38
給你寫了一個(gè)按鍵短按加減,長按連加減 4位數(shù)碼管顯示0~9999程序,端口根據(jù)實(shí)際電路自行修改。

真厲害
回復(fù)

使用道具 舉報(bào)

8#
ID:213173 發(fā)表于 2019-11-16 18:20 | 只看該作者
hmgqljz111 發(fā)表于 2019-11-16 10:31
師傅在定時(shí)器里可以執(zhí)行這么多語句,為何我在定時(shí)器0里執(zhí)行一個(gè),用定時(shí)器1產(chǎn)生波特率的串口發(fā)送程序就不 ...

玩單片機(jī)就是玩邏輯和時(shí)間,原則上定時(shí)器中斷中不要執(zhí)行過么多語句,以免影響主程序執(zhí)行任務(wù),但只要把時(shí)序安排好,完全可以只在定時(shí)器中斷中完成任務(wù),基本沒有主函數(shù)什么事。串口發(fā)送程序也可以在T0中斷中運(yùn)行,串口發(fā)送程序在主函數(shù)中運(yùn)行時(shí)如果受到T0中斷干擾可以在發(fā)送時(shí)短暫關(guān)閉T0中斷,如果不能關(guān),也可以在T0中斷中設(shè)個(gè)標(biāo)志,串口發(fā)送程序查詢這個(gè)標(biāo)志決定發(fā)送,可以有效避免互相干擾。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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