久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2083|回復: 8
打印 上一主題 下一主題
收起左側

新手想做一個定時器控制的動態數碼管 遇到問題 求大神解答 代碼如下

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 MTR 于 2020-2-20 23:29 編輯

#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit A0=P2^2;
sbit A1=P2^3;
sbit A2=P2^4;

u8 code shuzu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main ()
{
        u8 j=0;
        int i,k;
        TMOD|=0x01;
        TH0=0xFC;
        TL0=0X18;
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {
                switch(j)
                {
                        case(0):    A0=0;A1=0;A2=0;break;
                        case(1):    A0=1;A1=0;A2=0;break;
                        case(2):    A0=0;A1=1;A2=0;break;
                        case(3):    A0=1;A1=1;A2=0;break;
                        case(4):    A0=0;A1=0;A2=1;break;
                        case(5):    A0=1;A1=0;A2=1;break;
                        case(6):    A0=0;A1=1;A2=1;break;
                        case(7):    A0=1;A1=1;A2=1;break;
                }
                if(i==1000)
                {
                        P0=shuzu[j];
                        i=0;                  
                        j++;
                        if(j==7)
                        {
                                j=0;
                        }
                }        


        }
           //while(1);

}
void time0() interrupt 1
{
        static int i;
        TH0=0xFC;
        TL0=0X18;
        i++;        
}
為什么實現不了我理想中的 數碼管從右向左動態顯示0-7呢 程序哪里出了問題(編譯沒有問題 語法上應該沒錯) 求解答 感謝!

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

使用道具 舉報

沙發
ID:235200 發表于 2020-2-21 00:42 | 只看該作者
位的選擇最好在中斷里實現較好
#define A0 P22
#define A1 P23
#define A2 P24
#define DISP P0

//共陰數碼管顯示段碼
u8 code dispcode[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
u8 dispbuf[8]={0,1,2,3,4,5,6,7};
void time0() interrupt 1 using 1
{
        static u8 wei;                 //wei用于位掃描
        DISP=0;                        //消影
        DISP=SHUZI[dispbuf[wei]];   //顯示緩沖區數據依次顯示
        switch(wei)
        {
                case 0:A2=1;A1=1;A0=1;break;
                case 1:A2=1;A1=1;A0=0;break;       
                case 2:A2=1;A1=0;A0=1;break;
                case 3:A2=1;A1=0;A0=0;break;
                case 4:A2=0;A1=1;A0=1;break;
                case 5:A2=0;A1=1;A0=0;break;       
                case 6:A2=0;A1=0;A0=1;break;
                case 7:A2=0;A1=0;A0=0;break;       
        }
        wei++;
        wei%=8;                         //m在0-7之間變化
}
TH0  TL0改為
       TH0=0xF8;
        TL0=0XCD;  //11.0592MHZ  或0x30 對應12MHz
主程序只需要:
while(1)
{
;
}
回復

使用道具 舉報

板凳
ID:213173 發表于 2020-2-21 05:32 | 只看該作者
錯誤已在注釋中指出


  1. #include<reg51.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. sbit A0=P2^2;
  5. sbit A1=P2^3;
  6. sbit A2=P2^4;

  7. u8 code shuzu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  8. u8 i=0;//中斷標志

  9. void main ()
  10. {
  11.         u8 j=0;
  12. //        int i,k;
  13.         TMOD|=0x01;
  14.         TH0=0xFC;
  15.         TL0=0X18;
  16.         EA=1;
  17.         ET0=1;
  18.         TR0=1;
  19.         while(1)
  20.         {
  21.                 if(i==1)
  22.                 {
  23.                         i=0;//中斷標志清0
  24.                         P0=0x00;//消隱
  25.                         switch(j)//送位碼
  26.                         {
  27.                                 case(0):A0=0;A1=0;A2=0;break;
  28.                                 case(1):A0=1;A1=0;A2=0;break;
  29.                                 case(2):A0=0;A1=1;A2=0;break;
  30.                                 case(3):A0=1;A1=1;A2=0;break;
  31.                                 case(4):A0=0;A1=0;A2=1;break;
  32.                                 case(5):A0=1;A1=0;A2=1;break;
  33.                                 case(6):A0=0;A1=1;A2=1;break;
  34.                                 case(7):A0=1;A1=1;A2=1;break;
  35.                         }
  36.                         P0=shuzu[j];//送段碼
  37. //                        i=0;                  
  38.                         j++;
  39.                         if(j>=8)
  40.                         {
  41.                                 j=0;
  42.                         }
  43.                 }        
  44.         }
  45.         //while(1);
  46. }
  47. void time0() interrupt 1
  48. {
  49. //        static int i;//靜態局部變量外部函數不可使用
  50.         TH0=0xFC;
  51.         TL0=0X18;
  52. //        i++;        
  53.         i=1;
  54. }
復制代碼



回復

使用道具 舉報

地板
ID:462827 發表于 2020-2-21 09:04 | 只看該作者
  1. #include<reg51.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. sbit A0=P2^2;
  5. sbit A1=P2^3;
  6. sbit A2=P2^4;

  7. u8 j=0;
  8. u8 code shuzu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  9. void delay(u16 t)
  10. {
  11.     while(t--);
  12. }

  13. void main ()
  14. {
  15.     u8 i;
  16.     TMOD|=0x01;
  17.     TH0=0xFC;
  18.     TL0=0X18;
  19.     EA=1;
  20.     ET0=1;
  21.     TR0=1;
  22.     while(1)
  23.     {
  24.         for(i=0;i<8;i++)
  25.         {
  26.             A0=i&0x01;
  27.             A1=i&0x02;
  28.             A2=i&0x04;
  29.             P0=shuzu[(i+j)%8];
  30.             delay(100);
  31.             P0=0x00;
  32.         }
  33.     }
  34. }

  35. void time0() interrupt 1
  36. {
  37.     static int tick=0;
  38.     TH0=0xFC;
  39.     TL0=0X18;
  40.     tick++;
  41.     if(tick==1000)
  42.     {
  43.         tick=0;
  44.         j=(j+1)%8;
  45.     }
  46. }
復制代碼
回復

使用道具 舉報

5#
ID:687423 發表于 2020-2-21 09:06 | 只看該作者
樓主的大致思路沒有問題,但是在c語言變量方面的控制存在些問題,中斷程序中的i和主函數的i并不是一個i,中斷的i++只是對中斷函數的i進行了處理,并沒有對主函數中的i處理,直接將i設置為全局變量,就可以實現了。
回復

使用道具 舉報

6#
ID:688861 發表于 2020-2-21 14:10 | 只看該作者

大哥您這個程序太強了 是每一個數碼管都會從0-7
我想做的僅僅是從右到左這8個數碼管一次從0-7 然后接著循環
回復

使用道具 舉報

7#
ID:688861 發表于 2020-2-21 14:57 | 只看該作者
wulin 發表于 2020-2-21 05:32
錯誤已在注釋中指出

您的注釋我看明白了 可是在中斷服務函數里沒有持續的加1 怎么能夠計時呢 這個程序我傳到單片機里顯示的是8個數碼管全亮
回復

使用道具 舉報

8#
ID:688861 發表于 2020-2-21 14:58 | 只看該作者
。。jj 發表于 2020-2-21 09:06
樓主的大致思路沒有問題,但是在c語言變量方面的控制存在些問題,中斷程序中的i和主函數的i并不是一個i,中 ...

明白 感謝!
回復

使用道具 舉報

9#
ID:462827 發表于 2020-2-21 19:24 | 只看該作者
MTR 發表于 2020-2-21 14:10
大哥您這個程序太強了 是每一個數碼管都會從0-7
我想做的僅僅是從右到左這8個數碼管一次從0-7 然后接著 ...

那簡單,把我那份代碼的
P0=shuzu[(i+j)%8];
這一行代碼改成
P0=(i<=j)?shuzu[ i]:0;
就可以了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品专区 | 欧美黑人国产人伦爽爽爽 | 精品少妇一区二区三区在线播放 | caoporn国产精品免费公开 | 2一3sex性hd | 天天射天天操天天干 | 欧美成人激情 | 97伦理最新伦理 | 国产精品视屏 | 国产精品久久久久久av公交车 | 亚洲精品一区二三区不卡 | 欧美日韩在线免费 | 日韩欧美中文字幕在线视频 | 特黄视频 | 国产二区在线播放 | 欧美日本一区 | 日本精品在线一区 | 日韩一区二区三区视频在线播放 | 天天澡天天狠天天天做 | 欧美成人激情 | 视频三区| 麻豆精品国产91久久久久久 | 午夜在线免费观看视频 | 国产精品国产三级国产aⅴ原创 | a级在线免费 | 日本免费在线 | 国产探花| 国产激情免费视频 | 日韩av手机在线观看 | 国产日韩精品一区 | 成人精品久久 | 91国产精品 | 暖暖日本在线视频 | 99热.com| 久久国产香蕉 | 国产午夜精品一区二区三区四区 | 四虎影视一区二区 | 国产一区二区免费电影 | 午夜免费福利电影 | 国产精品黄色 | 日一日操一操 |