SOGO論壇
  登入   註冊   找回密碼
查看: 4404|回覆: 6

[技術文章] MCU 8051 控制 8x8 LED display [複製連結]

Rank: 4

數位軟體勳章

狀態︰ 離線
發表於 2014-1-4 15:25:44 |顯示全部樓層
在此提供 單晶片微電腦 MCU,使用的是 ATMEL AT89S52
控制 8x8 LED display 輪流顯示 0 1 2 3 4 5 6 7 8 9
完整程式碼 如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. uchar code Table_OF_Digits[]={              // 將要顯示的字形,存於 Flash ROM
  6.         0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,
  7.         0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,
  8.         0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,
  9.         0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00,
  10.         0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00,
  11.         0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00,
  12.         0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00,
  13.         0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00,
  14.         0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,
  15.         0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00,};   
  16.    
  17. uchar i=0,t=0,Num_Index = 0;

  18. void main()                                 // 主程式
  19. {
  20.         P3   = 0x80;
  21.         TMOD = 0x00;
  22.         TH0  = (8192-2000)/32;                  // 設定 T0 初值,2mS 中斷一次
  23.         TL0  = (8192-2000)%32;
  24.         TR0  = 1;                               // 啟動 T0 開始計時
  25.         IE   = 0x82;                            // 啟動 Timer 0 中斷功能
  26.         Num_Index = 0;   
  27.         while(1);                               // 無窮迴圈,等待 Timer 0 每間隔 2mS 執行中斷服務程式
  28. }

  29. void LED_Screen_Display() interrupt 1       // 每間隔 2mS T0 中斷一次,中斷服務程式
  30. {
  31.         TH0 = (8192-2000)/32;                   // T0 reload 新值,設定於 2mS 後,再中斷一次
  32.         TL0 = (8192-2000)%32;
  33.         P3  = _crol_(P3,1);                     // Port 3 左移位 1 bit
  34.         P0  = ~Table_OF_Digits[Num_Index * 8 +i];
  35.         if(++i == 8)
  36.         i = 0;
  37.         if(++t == 250)
  38.         {
  39.                  t = 0x00;
  40.                 if(++Num_Index == 10)
  41.             Num_Index = 0;
  42.         }
  43. }
複製代碼
電路圖 如下:
8x8.gif


已有 1 人評分威望 收起 理由
紅塵孤鳥 + 2 您發表的文章內容豐富,無私分享造福眾人,.

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

Rank: 3Rank: 3

狀態︰ 離線
發表於 2014-1-8 01:16:58 |顯示全部樓層
感謝分享阿!! 我想問一下 是否有試過擴充呢?
如變成4X2(8顆8X8點矩陣)可以顯示兩個中文字的?
我超想做

Rank: 4

數位軟體勳章

狀態︰ 離線
發表於 2014-1-8 07:17:43 |顯示全部樓層
對不起!我不是學生,屈指一算職場工作已有 32 年了;服完 2 年兵役之後,第三天就上班了 ( 電子技術員 ),
一年兩個月之後離職,第二份工作是當業務員,從事一年十個月之後,就自行創業至今 。

很感概!現今的年輕人專業能力不濟,對技術無熱誠  無感!學非所用,用非所學;選擇 賣飲料,賣雞排 ...
誠屬國家人才培育不力啊!現今整個大環境和早期大不同!工廠外移,收的收,粥少僧多,外來人口增多搶
食之下,台灣人就職困難,自行購屋誠屬不可能的任務比登天還難啊!

大陸掘起,相形之下台灣競爭優勢正消退中,冀望台灣年輕人更能加把勁,我的想法是能為台灣人盡一點心
力,培養後起之秀再創巔峰,非常感謝此論壇提供此平台,讓大家一齊成長 。

不錯,在既有的電路上擴充功能,增加賣點是很好磨鍊技能的機會,但我的時間有限 ... 希望能啟蒙新進,
對有興趣研究此  8x8 LED display 的朋友有所幫助 。

Rank: 10Rank: 10Rank: 10

狀態︰ 離線
發表於 2014-1-8 19:14:12 |顯示全部樓層
我6年前做的 MCU 8051 控制 8x8 LED display 沒有特別透過 IC(感覺好浪費)
當時嫌不夠亮是加排阻、電晶體...

我只對版大 PO 的電路圖動畫圖片有興趣而已...

Rank: 4

數位軟體勳章

狀態︰ 離線
發表於 2014-1-10 09:24:23 |顯示全部樓層
再提供一個更進階的 8x8x8 點矩陣 LED display 的電路圖及程式碼
使用的 MCU 是 ATMEL AVR ATmega16

includes.h
  1. #ifndef ___includes_h
  2. #define ___includes_h

  3. #include <iom16v.h>                        // 包含標頭檔頭文件
  4. #include <macros.h>                        // 包含"位"操作頭文件
  5. #include <stdio.h>                        // 標準輸入輸出頭文件
  6. #include <func.h>
  7. #include <data.h>           // 字型庫

  8. #endif
複製代碼
data.h
  1. #ifndef ___data_h
  2. #define ___data_h
  3. #include <includes.h>
  4. extern const char table[];
  5. extern const char num0[];
  6. extern const char num1[];
  7. extern const char num2[];
  8. extern const char num3[];
  9. extern const char num4[];
  10. extern const char num5[];
  11. extern const char num6[];
  12. extern const char num7[];
  13. extern const char num8[];
  14. extern const char num9[];
  15. extern const char cubenum[8][8];
  16. extern const char xing[8][8];
  17. extern const char x[8][8];
  18. extern const char cube[];
  19. extern const char heart[];
  20. extern const char wave[];
  21. extern const char climb[];
  22. extern const char drop[];
  23. #endif
複製代碼
func.h
  1. #ifndef ___fun_h
  2. #define ___fun_h
  3. #define  uchar unsigned char
  4. #define  uint  unsigned int

  5. //A0-7為數據輸出,C0-7為138的使能選擇
  6. //B5-7為每個138的位選,D0為數據573時使能

  7. void intial(void);                          //初始化程式
  8. void showlay(char num, const char *data);   //水平方向顯示某一層圖案
  9. void showlayall(char const *data);
  10. void show(int num,char const *data);
  11. void showlay138(char const *data);          //水平方向顯示數據
  12. void showstand(char num,const char* data);  //豎直方向顯示某一層圖案
  13. void showstand138( const char *data);       //豎直方向顯示數據
  14. void delay(uint ms);                        //延時函數
  15. void showcube(const char pic[8][8]);        //顯示一個圖案
  16. void showcubeX(const char pic[][8]);
  17. void showcubeY(const char pic[][8]);

  18. #endif
複製代碼
func.c
  1. #include<includes.h>
  2. #define LONG 1000
  3. #define MIDDLE 200
  4. #define LITTLE 50
  5. extern void delay(uint ms)  // delay mS subroutine
  6. {
  7.     uint i,j;
  8.         for(i=0;i<ms;i++)
  9.         {
  10.            for(j=0;j<11;j++);   //j=1141
  11.     }
  12. }
  13. extern void intial(void)    //初始化程式
  14. {
  15. DDRA=0XFF;                  //PORTA都配置為輸出,都輸出低電位
  16. PORTA=0X00;
  17. DDRB=0XFF;                  //PORTB都配置為輸出,都輸出低電位
  18. PORTB=0X00;
  19. DDRC=0XFF;                  //PORTC都配置為輸出,都輸出低電位
  20. PORTC=0X00;             
  21. DDRD=0XFF;                  //PORTD都配置為輸出,都輸出低電位
  22. PORTD=0X00;
  23. }
  24. //A0-7為數據輸出,C0-7為138的使能選擇
  25. //B5-7為每個138的位選,D0為數據573時使能
  26. extern void showcubeX(const char pic[8][8])     //顯示一個圖案
  27. {
  28.     int i=0;
  29.     const char *dd;
  30.     for(i=0;i<8;i++)
  31.         {
  32.             dd=&pic[i][0];
  33.                 showlay(i,dd);
  34.         }
  35. }
  36. extern void showlay(char num,char const *data)  //方向顯示某一層圖案
  37. {
  38.     switch (num+1)
  39.     {
  40.         case 1: PORTB=0X1F; showlay138(data); break;
  41.         case 2: PORTB=0X3F; showlay138(data); break;
  42.         case 3: PORTB=0X5F; showlay138(data); break;
  43.         case 4: PORTB=0X7F; showlay138(data); break;
  44.         case 5: PORTB=0X9F; showlay138(data); break;               
  45.         case 6: PORTB=0XBF; showlay138(data); break;               
  46.         case 7: PORTB=0XDF; showlay138(data); break;               
  47.         case 8: PORTB=0XFF; showlay138(data); break;         
  48.             default:    break;
  49.     }
  50. }
  51. extern void showlay138(const char  *data)       //後方向顯示數據
  52. {   
  53.     int i=0;
  54.     for(i=0;i<8;i++)
  55.     {
  56.             PORTC=PORTC|BIT(i);
  57.             PORTD=PORTD|BIT(0);
  58.             PORTA=*data;
  59.             data++;
  60.             delay(5);
  61.             PORTA=0X00;
  62.             PORTD=PORTD&~BIT(0);
  63.             PORTC=PORTC&~BIT(i);       
  64.     }
  65. }
  66. extern void show(int num,const char  *data)
  67. {
  68.     int i=0,general,j;
  69.     const char *dd;
  70.     for(i=0;i<num;i++)
  71.         {
  72.             for(general=0;general<LITTLE;general++)
  73.                 {
  74.                     for(j=0;j<8;j++)
  75.                 {
  76.                         dd=&data[i*64+j*8];
  77.                         showstand(j,dd);
  78.                     }
  79.                 }
  80.         }
  81. }
  82. extern void showcubeY(const char pic[][8])      //左右顯示一個圖案
  83. {   
  84.     int i=0;
  85.     const char *dd;
  86.     for(i=0;i<8;i++)
  87.         {
  88.             dd=&pic[i][0];
  89.                 showstand(i,dd);
  90.         }
  91. }
  92. extern void showstand(char num,const char *data)//左右方向顯示某一層圖案
  93. {
  94.     switch (num+1)
  95.     {
  96.         case 1:PORTC=PORTC|BIT(0);         showstand138(data); PORTC=PORTC&~BIT(0); break;
  97.             case 2:PORTC=PORTC|BIT(1);         showstand138(data); PORTC=PORTC&~BIT(1); break;
  98.             case 3:PORTC=PORTC|BIT(2);         showstand138(data); PORTC=PORTC&~BIT(2); break;
  99.             case 4:PORTC=PORTC|BIT(3);         showstand138(data); PORTC=PORTC&~BIT(3); break;
  100.             case 5:PORTC=PORTC|BIT(4);         showstand138(data); PORTC=PORTC&~BIT(4); break;
  101.             case 6:PORTC=PORTC|BIT(5);         showstand138(data); PORTC=PORTC&~BIT(5); break;
  102.             case 7:PORTC=PORTC|BIT(6);         showstand138(data); PORTC=PORTC&~BIT(6); break;
  103.             case 8:PORTC=PORTC|BIT(7);         showstand138(data); PORTC=PORTC&~BIT(7); break;
  104.             default: break;
  105.     }
  106. }
  107. extern void showstandall(char const *data)      //一層的數據全局顯示
  108. {
  109.     uint count,temp=0;
  110.     for(count=0;count<8;count++)
  111.         showstand(count,data);
  112. }
  113. extern void showstand138(char const *data)      //左右方向顯示數據
  114. {
  115.     int i=0;
  116.     for(i=0;i<8;i++)
  117.     {
  118.         switch(i)
  119.         {
  120.             case 0: PORTB&=~BIT(7); PORTB&=~BIT(6); PORTB&=~BIT(5);PORTD=PORTD|BIT(0);
  121.                     PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
  122.             case 1: PORTB|=BIT(7);  PORTB&=~BIT(6); PORTB&=~BIT(5);PORTD=PORTD|BIT(0);
  123.                     PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
  124.             case 2: PORTB&=~BIT(7); PORTB|=BIT(6);  PORTB&=~BIT(5);PORTD=PORTD|BIT(0);
  125.                     PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
  126.             case 3: PORTB|=BIT(7);  PORTB|=BIT(6);  PORTB&=~BIT(5);PORTD=PORTD|BIT(0);
  127.                     PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
  128.             case 4: PORTB&=~BIT(7); PORTB&=~BIT(6); PORTB|=BIT(5); PORTD=PORTD|BIT(0);
  129.                     PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
  130.             case 5: PORTB|=BIT(7);  PORTB&=~BIT(6); PORTB|=BIT(5); PORTD=PORTD|BIT(0);
  131.                     PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
  132.             case 6: PORTB&=~BIT(7); PORTB|=BIT(6);  PORTB|=BIT(5); PORTD=PORTD|BIT(0);
  133.                     PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
  134.             case 7: PORTB|=BIT(7);  PORTB|=BIT(6);  PORTB|=BIT(5); PORTD=PORTD|BIT(0);
  135.                     PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
  136.             default:break;
  137.         }
  138.         data++;
  139.     }
  140. }
複製代碼
main.c
  1. #include <includes.h>
  2. #define LONG 1000
  3. #define MIDDLE 150
  4. #define LITTLE 200
  5. void main(void)
  6. {
  7.     uint count,temp,general;
  8.     intial();
  9.     for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num9);}}
  10.     for(general=0;general<MIDDLE;general++){showstandall(num9);}  
  11.     for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num8);}}
  12.     for(general=0;general<MIDDLE;general++){showstandall(num8);}
  13.     for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num7);}}
  14.     for(general=0;general<MIDDLE;general++){showstandall(num7);}
  15.     for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num6);}}
  16.     for(general=0;general<MIDDLE;general++){showstandall(num6);}
  17.     for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num5);}}
  18.     for(general=0;general<MIDDLE;general++){showstandall(num5);}
  19.     for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num4);}}
  20.     for(general=0;general<MIDDLE;general++){showstandall(num4);}
  21.     for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num3);}}
  22.     for(general=0;general<MIDDLE;general++){showstandall(num3);}
  23.     for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num2);}}
  24.     for(general=0;general<MIDDLE;general++){showstandall(num2);}
  25.     for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num1);}}
  26.     for(general=0;general<MIDDLE;general++){showstandall(num1);}
  27.     for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num0);}}
  28.     for(general=0;general<MIDDLE;general++){showstandall(num0);}
  29.     while(1)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
  30.     {
  31.         show(71,climb);
  32.         show(64,cube);
  33.         show(28,wave);
  34.         show(28,wave);
  35.         show(15,heart);
  36.         show(15,heart);
  37.         show(15,heart);
  38.         show(15,heart);
  39.         show(34,drop);
  40.         show(34,drop);
  41.         show(34,drop);
  42.         show(34,drop);
  43.         show(71,climb);
  44.     }
  45. }
複製代碼

Rank: 4

數位軟體勳章

狀態︰ 離線
發表於 2014-1-10 09:30:48 |顯示全部樓層
電路圖
電路圖 1.jpg


電路圖 2.jpg


電路圖 3.jpg


電路圖 4.jpg



Rank: 4

數位軟體勳章

狀態︰ 離線
發表於 2014-1-10 09:43:14 |顯示全部樓層
動畫 GIF 檔

anigif.gif
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 3 您發表的文章內容豐富,無私分享造福眾人,.

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

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


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

GMT+8, 2024-4-16 16:24

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