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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2061|回復(fù): 8
收起左側(cè)

麻煩大家?guī)臀铱聪聠纹瑱C程序,百思不得其解啊,哪里錯了?

[復(fù)制鏈接]
ID:100982 發(fā)表于 2021-9-25 11:14 | 顯示全部樓層 |閱讀模式
#include <reg52.h>

unsigned char ledbuf[] = {0xfc,0xc,0xda,0xf2,0x66,0xb6};
unsigned char ledchar[] = {     0xfc,0xc,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
                                0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e };
void ledscan();
void init_interrupt0(unsigned char ms);

unsigned char th0 = 0;
unsigned char tl0 = 0;

int main()
{
        EA = 1;
        init_interrupt0(2);

        while(1)
        {
               
        }


        return 0;
}

void init_interrupt0(unsigned char ms)
{
        unsigned long tmp ;
        tmp = 11059200 / 12;
        tmp = (ms * tmp) / 1000;
        tmp = 65536 - tmp;
        
        th0 = (unsigned char)(tmp>>8);
        tl0 = (unsigned char)tmp;
        
        TMOD &= 0xf0;
        TMOD |= 0x01;
        TH0 = th0;
        TL0 = tl0;
        TR0 = 1;
        ET0 = 1;
                        
}
void ledscan()
{
        static unsigned char i =0;

        
        P0 = 0x00;
        P1 = (P1 & 0xf8) | i;

        P0 = ledbuf;

        if(i < 5)
        {
                i++;
        }
        else
        {
                i = 0;
        }               
}

void interrupt_0() interrupt 1
{
        
        TH0 = th0;
        TL0 = tl0;
        
        ledscan();
}

程序的目的只是為了單純的動態(tài)刷新顯示幾個數(shù),現(xiàn)在現(xiàn)象是,一開始顯示六位數(shù),顯示一會后就自動跳變?yōu)橹皇R晃粩?shù)顯示了。

回復(fù)

使用道具 舉報

ID:451718 發(fā)表于 2021-9-25 17:32 | 顯示全部樓層
tmp = (ms * tmp) / 1000;  你這里除以1000是什么操作?  如果要除以1000, 你那個ms的值應(yīng)該取10為單位的值吧?
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-9-25 19:18 | 顯示全部樓層
當搞不清什么地方出問題的時候, 就不要搞太多虛頭巴腦的東西。所有東西最簡化,
TH0, TL0, 全用定值賦值后,測試一下有沒有問題。
也不要搞什么函數(shù)調(diào)用,尤其自己都不知道是什么,怎么用的函數(shù)。老老實實一行行代碼,自己也容易理解人家也容易理解。

void ledscan()
這個子函數(shù), 進去 i = 0; 你后面 那些if 根本沒有意義。每次進去都是 i 都會變成 0 根本不會變。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-9-25 21:22 | 顯示全部樓層
本帖最后由 wulin 于 2021-9-25 21:24 編輯

注釋掉的語句都是錯誤的 無標題.jpg
  1. #include <reg52.h>
  2. unsigned char ledbuf[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6};
  3. //unsigned char ledbuf[] = {0xfc,0xc,0xda,0xf2,0x66,0xb6};
  4. unsigned char ledchar[] = {     0xfc,0xc,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
  5.                                 0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e };
  6. void ledscan();
  7. void init_interrupt0(unsigned char ms);

  8. unsigned char th0 = 0;
  9. unsigned char tl0 = 0;

  10. int main()
  11. {
  12.         EA = 1;
  13.         init_interrupt0(2);
  14.         
  15.         while(1);
  16.                
  17.         return 0;
  18. }

  19. void init_interrupt0(unsigned char ms)
  20. {
  21.         unsigned long tmp ;
  22.         tmp = 11059200 / 12;
  23.         tmp = (ms * tmp) / 1000;
  24.         tmp = 65536 - tmp;        
  25.         th0 = (unsigned char)(tmp>>8);
  26.         tl0 = (unsigned char)tmp;
  27.         TMOD &= 0xf0;
  28.         TMOD |= 0x01;
  29.         TH0 = th0;
  30.         TL0 = tl0;
  31.         TR0 = 1;
  32.         ET0 = 1;
  33.                         
  34. }
  35. void ledscan()
  36. {
  37.         static unsigned char i =0;
  38.         P0 = 0x00;
  39. //        P1 = (P1 & 0xf8) | i;
  40.         P1 =        ~(1<<i);
  41.         P0 = ledbuf[i];
  42.         if(i < 5)
  43.         {
  44.                 i++;
  45.         }
  46.         else
  47.         {
  48.                 i = 0;
  49.         }               
  50. }

  51. void interrupt_0() interrupt 1
  52. {      
  53.         TH0 = th0;
  54.         TL0 = tl0;
  55.         ledscan();
  56. }
復(fù)制代碼

回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2021-9-25 22:11 | 顯示全部樓層
i = 0: P1 = XXXXX000
i = 1: P1 = XXXXX001
i = 2: P1 = XXXXX010
i = 3: P1 = XXXXX011
i = 4: P1 = XXXXX100
i = 5: P1 = XXXXX101
回復(fù)

使用道具 舉報

ID:419909 發(fā)表于 2021-9-26 07:40 | 顯示全部樓層
188610329 發(fā)表于 2021-9-25 19:18
當搞不清什么地方出問題的時候, 就不要搞太多虛頭巴腦的東西。所有東西最簡化,
TH0, TL0, 全用定值賦值 ...

static 的變量只在第一次進入時定義。后面就會保存了的。這個變量沒問題的。
回復(fù)

使用道具 舉報

ID:100982 發(fā)表于 2021-9-28 11:12 | 顯示全部樓層
謝謝大家啊,搞定了,本來是寫一個秒表程序的,在這里測試數(shù)碼管的時候就出錯了,現(xiàn)在秒表改好了,我把程序發(fā)上來
回復(fù)

使用道具 舉報

ID:100982 發(fā)表于 2021-9-28 11:13 | 顯示全部樓層
188610329 發(fā)表于 2021-9-25 19:18
當搞不清什么地方出問題的時候, 就不要搞太多虛頭巴腦的東西。所有東西最簡化,
TH0, TL0, 全用定值賦值 ...

這里沒有問題 加了static
回復(fù)

使用道具 舉報

ID:100982 發(fā)表于 2021-9-28 11:13 | 顯示全部樓層
#include <reg52.h>

unsigned char ledbuf[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char ledchar[] = {     0xfc,0xc,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
                                0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e };

unsigned char key_sta[] = {1,1,1,1};

sbit key1 = P2^4;
sbit key2 = P2^5;
sbit key3 = P2^6;
sbit key4 = P2^7;

bit watch_running = 0;

void ledscan();
void init_interrupt0(unsigned int ms);
void keydriver();
void keyscan();
void count_time();
void watch_show();
void watch_close();
void watch_reset();

unsigned char t0_high = 0;
unsigned char t0_low = 0;
unsigned char decimal = 0;
unsigned int integer = 0;

int main()
{
        EA = 1;
        init_interrupt0(2);
        P2 = 0xfe;       

        while(1)
        {
                watch_show();
                keydriver();       
        }


        return 0;
}

void init_interrupt0(unsigned int ms)
{
        unsigned long tmp;
        tmp = 11059200 / 12;
        tmp = (ms * tmp) / 1000;                                                                                                                                            
        tmp = 65536 - tmp;
       
       
        t0_high = (unsigned char)(tmp>>8);
        t0_low = (unsigned char)tmp;
       
        TMOD &= 0xf0;
        TMOD |= 0x01;
        TH0 = t0_high;
        TL0 = t0_low;

        TR0 = 1;
        ET0 = 1;                        
}

void watch_show()
{
          unsigned char buf[4];
          signed char i = 0;

          ledbuf[5] = ledchar[decimal % 10];
          ledbuf[4] = ledchar[decimal / 10];
          
          buf[0] = integer % 10;
          buf[1] = (integer / 10) % 10;
          buf[2] = (integer / 100) %10;
          buf[3] = (integer / 1000) % 10;
          
          for(i = 3;i >= 1;i--)
          {
                  if(buf[i] == 0)
                {
                        ledbuf[3 - i] = 0x00;
                }
                else
                {
                        break;
                }
          }
          for(;i >= 0;i--)
          {
                  ledbuf[3 - i] = ledchar[buf[i]];
          }
          
          ledbuf[3] |= 0x01;                  
}

void watch_close()
{
        decimal = 0;
        integer = 0;
        watch_running = 0;       
}

void watch_reset()
{
        if( watch_running == 1)
        {
                 watch_running = 0;
        }
        else if( watch_running == 0)
        {
                 watch_running = 1;
        }               
}

void keydriver()
{
        static unsigned char backup[] = {1,1,1,1};
        unsigned char i = 0;
       
        for(i = 0; i < 4;i++)
        {
                if(backup[i] != key_sta[i])
                {
                        if(backup[i] == 0)
                        {
                                if(i == 0)
                                {
                                        watch_close();       
                                }
                                else if(i == 1)
                                {
                                        watch_reset();
                                }
                        }
                        backup[i] = key_sta[i];
                }
        }       
}

void ledscan()
{
        static unsigned char i = 0;       
        P0 = 0x00;
        P1 = (P1 & 0xf8) | i;

        P0 = ledbuf[i];

        if(i < 5)
        {
                i++;
        }
        else
        {
                i = 0;
        }
                       
}

void keyscan()
{
        static unsigned char keybuf[] = {0xff,0xff,0xff,0xff};
        unsigned char i = 0;

        keybuf[0] = (keybuf[0] << 1) | key1;
        keybuf[1] = (keybuf[1] << 1) | key2;
        keybuf[2] = (keybuf[2] << 1) | key3;
        keybuf[3] = (keybuf[3] << 1) | key4;
       
        for(i = 0;i < 4;i++)
        {
                if(keybuf[i] == 0x00)
                {
                        key_sta[i] = 0;
                }
                else if(keybuf[i] == 0xff)
                {
                        key_sta[i] = 1;
                }               
        }                       
}

void count_time()
{
        if(watch_running)
        {
                decimal++;
                if(decimal >= 100)
                {
                        decimal = 0;
                        integer++;
                        if(integer >= 10000)
                        {
                                integer = 0;
                        }
                }
        }               
}

void interrupt0() interrupt 1
{
        static unsigned char ms10 = 0;

        TH0 = t0_high;
        TL0 = t0_low;
       
        ledscan();
        keyscan();
       
        ms10++;
        if(ms10 >= 5)
        {
                count_time();
                ms10 = 0;
        }
}
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 二区中文 | 国产精品99久久免费观看 | 日韩视频精品在线 | 在线婷婷| 欧美日韩国产三级 | 精品一区二区三区不卡 | 国产黄a一级| av国产精品| 一区二区三区精品视频 | 久久久入口 | 一区中文字幕 | 中文字幕国产在线 | 国户精品久久久久久久久久久不卡 | 日本精品久久 | 成人在线精品视频 | 蜜月aⅴ国产精品 | 国产精品一区二区精品 | 日韩在线视频一区二区三区 | 91视频大全 | 丝袜美腿一区二区三区 | 亚洲一区二区三区视频 | 国产馆 | 日韩第一夜 | 免费一级欧美在线观看视频 | 亚洲国产午夜 | 国产99久久精品一区二区永久免费 | 日韩精品一区二区三区在线播放 | 成年人网站在线观看视频 | 国产一区二区三区在线看 | 求毛片 | 国产99小视频 | 久久精品| 欧美一区二区免费 | 一级片在线免费播放 | 男人天堂网址 | 久久精品欧美一区二区三区不卡 | 一本色道精品久久一区二区三区 | 日本免费小视频 | 欧美一级特黄aaa大片在线观看 | 在线免费看毛片 | 操操操日日日 |