SOGO論壇
  登入   註冊   找回密碼
查看: 5533|回覆: 4
列印 上一主題 下一主題

[問題求助] 七段顯示器 到數的程式碼 [複製連結]

Rank: 2

狀態︰ 離線
跳轉到指定樓層
1
發表於 2013-1-17 15:22:26 |只看該作者 |倒序瀏覽 | x 1
請問一下有人可以幫我看一下嗎??

    #include <reg51.h>           //IC為AT89C51
    #include <stdlib.h>          //載入 8051 相關暫存器含括檔
    sbit SEG_A = P2 ^ 6;   // 七段 接腳   測試用接腳
    sbit SEG_B = P2 ^ 5;
    sbit SEG_C = P2 ^ 4;
    sbit SEG_D = P2 ^ 3;
    sbit SEG_E = P2 ^ 2;
    sbit SEG_F = P2 ^ 1;
    sbit SEG_G = P2 ^ 0;
         
    // 定義共陽極與腳位對應關係
    sbit SEG_0 = P0 ^ 5; // 個位 開關   測試用接腳
    sbit SEG_1 = P0 ^ 6; // 十位 開關   測試用接腳
         
    // 定義七個節段的腳位,將 A, B, C, D, E, F, G 依序放入陣列
    byte segs[7] = { SEG_A, SEG_B, SEG_C, SEG_D, SEG_E, SEG_F, SEG_G };
         
    // 定義共陽極七段顯示器的字型(digit pattern)
    // define the LED digit patterns, from 0 - 9
    // 0 = LED on, 1 = LED off, in this order:
    //                Mapping to       a,b,c,d,e,f,g of Seven-Segment LED
    byte seven_seg_digits[10][7] = { { 0,0,0,0,0,0,1 },  // = 0
                                     { 1,0,0,1,1,1,1 },  // = 1
                                     { 0,0,1,0,0,1,0 },  // = 2
                                     { 0,0,0,0,1,1,0 },  // = 3
                                     { 1,0,0,1,1,0,0 },  // = 4
                                     { 0,1,0,0,1,0,0 },  // = 5
                                     { 0,1,0,0,0,0,0 },  // = 6
                                     { 0,0,0,1,1,1,1 },  // = 7
                                     { 0,0,0,0,0,0,0 },  // = 8
                                     { 0,0,0,1,1,0,0 }   // = 9
                                 };

    // 定義每個七段顯示器顯示的時間 (延遲時間), 預設 1ms
    int delay_time = 1;
                                    
    void setup() {
      pinMode(SEG_A, OUTPUT);
      pinMode(SEG_B, OUTPUT);
      pinMode(SEG_C, OUTPUT);
      pinMode(SEG_D, OUTPUT);
      pinMode(SEG_E, OUTPUT);
      pinMode(SEG_F, OUTPUT);
      pinMode(SEG_G, OUTPUT);
      pinMode(SEG_0, OUTPUT);
      pinMode(SEG_1, OUTPUT);
    }
         
    void loop() {
      // 從 00 計數到 99
      for (unsigned int number = 0; number < 100; number++) {
        // 每一秒鐘計數一次
        unsigned long startTime = millis();
        for (unsigned long elapsed=0; elapsed < 100; elapsed = millis() - startTime) {
          // 多工掃瞄,輪流點亮個、十位數的七段顯示器
            
         // 顯示個位數
          lightDigit1(number%10);
          delay(delay_time);
          // 顯示十位數
          lightDigit2((number/10)%10);
          delay(delay_time);      
        }
      }
    }
         
    // 選擇顯示的位數 (2:十、或 1:個位數)
    void pickDigit(int x) {
      digitalWrite(SEG_0, HIGH);
      digitalWrite(SEG_1, HIGH);

      switch(x) {
        case 1: digitalWrite(SEG_0, LOW); break;
        case 2: digitalWrite(SEG_1, LOW); break;
      }
    }
         
    // 點亮個位數
    void lightDigit1(byte number) {
      pickDigit(1);
      lightSegments(number);
    }
    // 點亮十位數
    void lightDigit2(byte number) {
      pickDigit(2);
      lightSegments(number);
    }
    // 點亮七段顯示器
    void lightSegments(byte number) {
      for (int i = 0; i < 7; i++) {
          digitalWrite(segs[i], seven_seg_digits[number][i]);
      }
    }

Line 16: error: missing ';' before 'segs'     
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

Rank: 5Rank: 5

數位軟體勳章

狀態︰ 離線
2
發表於 2013-1-18 14:33:30 |只看該作者
Hi,看起來你的原先程式碼不是在8051上,8051上基本上不用設定I/O輸出入以及有些函數不是在標準Keil C51上.根據你的問題 我寫一個很簡單的範例,時間沒有正確不過你可以做實驗修改
  1. #include <AT89X51.h>           //IC為AT89C51
  2. #include <stdlib.h>          //載入 8051 相關暫存器含括檔

  3. //共陽極(接VDD)0~9對應數值
  4. unsigned char seven_seg[10]={        0xC0,        //0
  5.                                                                                                                                                                                                 0xF9,        //1
  6.                                                                                                                                                                                                 0xA4,        //2
  7.                                                                                                                                                                                                 0xB0,        //3
  8.                                                                                                                                                                                                 0x99,        //4
  9.                                                                                                                                                                                                 0x92,        //5
  10.                                                                                                                                                                                                 0x83,        //6
  11.                                                                                                                                                                                                 0xF8,        //7
  12.                                                                                                                                                                                                 0x80,        //8
  13.                                                                                                                                                                                                 0x98                //9
  14.                                                                                                                                                                                 };

  15. //顯示七段顯示器內容
  16. void disp_7seg(unsigned char num);
  17. //顯示數值
  18. void disp_number(unsigned int num);
  19. //初始化系統
  20. void setup(void);
  21. void delay(unsigned char ms);

  22. int main()
  23. {
  24.         unsigned int num=0;

  25.         setup();
  26.         while(1)
  27.         {
  28.                 //顯示數值
  29.                 disp_number(num);
  30.                 delay(255);
  31.                
  32.                 if(num<100)
  33.                         num++;
  34.                 else
  35.                         num=0;
  36.         }
  37.         return 0;
  38. }
  39. //初始化I/O
  40. void setup(void)
  41. {
  42.         P0=0x00;
  43.         P1=0x00;
  44.         P2=0x00;
  45.         P3=0x00;
  46. }
  47. //將數值轉換為7段顯示器數值
  48. void disp_7seg(unsigned char num)
  49. {
  50.         P2=seven_seg[num];
  51. }
  52. void disp_number(unsigned int num)
  53. {               
  54.                 P3=1;                                                                                                        //選擇10位數I/O
  55.                 disp_7seg((num/10));                //顯示10位數
  56.                
  57.                 delay(2);
  58.                
  59.                 P3=2;                                                                                                        //選擇個數I/O
  60.                 disp_7seg((num%10));        //顯示個位數
  61.                
  62. }
  63. //延遲函數
  64. void delay(unsigned char ms)
  65. {
  66.         unsigned char i,j;
  67.         for(i=0;i<ms;i++)
  68.                 for(j=0;j<255;j++)
  69.                                 ;
  70.        
  71. }
複製代碼
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 2 感謝您熱心幫助會員解決問題,論壇需要您的.

總評分: 威望 + 2   查看全部評分

失敗只有一種:那就是半途而廢

Rank: 2

狀態︰ 離線
3
發表於 2013-1-19 02:23:59 |只看該作者
感謝 我先收下 找時間來試看看

Rank: 2

狀態︰ 離線
4
發表於 2013-9-2 15:50:31 |只看該作者
各位大大!! 我試了alphi大 提供測試的程式
但是卻不能同時二個七段顯示器
數字都只有再 個位數 跳動,拾位數都沒有動

另外的電路是用二個共陽七段顯示器

不知那出問題,請幫我看一下

七段顯示器-1.jpg (122.95 KB, 下載次數: 15)

Rank: 13Rank: 13Rank: 13Rank: 13

原創及親傳圖影片高手勳章 熱心參予論壇活動及用心回覆主題勳章 榮譽會員勳章 數位硬體勳章 小說之星勳章 原創寫手勳章

狀態︰ 離線
5
發表於 2013-9-2 19:02:37 |只看該作者
本帖最後由 又靜 於 2013-9-2 19:05 編輯

我不會C 語言啦

不過稍稍看一下發現:alphi 大俠切換個位數與十位數是用 P3.0 & P3.1
而您是用 P0.5 & P0.6 ,我想....問題會不會出在這裡

另外,掃描停留的時間也是關鍵
太短LED會比較暗甚至看不出有顯示
設得太長LED又會閃爍甚至交換顯示
alphi 也有提到時間沒有很正確.
請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2025-3-14 17:13

© 2004-2025 SOGO論壇 OURSOGO.COM
回頂部