SOGO論壇
標題:
MCU 8051 控制 8x8 LED display
[列印本頁]
作者:
if8051
時間:
2014-1-4 15:25:44
標題:
MCU 8051 控制 8x8 LED display
在此提供 單晶片微電腦 MCU,使用的是 ATMEL AT89S52
控制 8x8 LED display 輪流顯示 0 1 2 3 4 5 6 7 8 9
完整程式碼 如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Table_OF_Digits[]={ // 將要顯示的字形,存於 Flash ROM
0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,
0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,
0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00,
0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00,
0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00,
0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00,
0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00,
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,
0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00,};
uchar i=0,t=0,Num_Index = 0;
void main() // 主程式
{
P3 = 0x80;
TMOD = 0x00;
TH0 = (8192-2000)/32; // 設定 T0 初值,2mS 中斷一次
TL0 = (8192-2000)%32;
TR0 = 1; // 啟動 T0 開始計時
IE = 0x82; // 啟動 Timer 0 中斷功能
Num_Index = 0;
while(1); // 無窮迴圈,等待 Timer 0 每間隔 2mS 執行中斷服務程式
}
void LED_Screen_Display() interrupt 1 // 每間隔 2mS T0 中斷一次,中斷服務程式
{
TH0 = (8192-2000)/32; // T0 reload 新值,設定於 2mS 後,再中斷一次
TL0 = (8192-2000)%32;
P3 = _crol_(P3,1); // Port 3 左移位 1 bit
P0 = ~Table_OF_Digits[Num_Index * 8 +i];
if(++i == 8)
i = 0;
if(++t == 250)
{
t = 0x00;
if(++Num_Index == 10)
Num_Index = 0;
}
}
複製代碼
電路圖 如下:
2014-1-4 15:24:52 上傳
下載附件
(536.34 KB)
附件:
8x8.gif
(2014-1-4 15:24:52, 536.34 KB) / 下載次數 40
https://oursogo.com/forum.php?mod=attachment&aid=NzQzODYyN3xjNzE4NmZjMXwxNzQ1MjExNzQyfDB8MA%3D%3D
作者:
胖才是王道
時間:
2014-1-8 01:16:58
感謝分享阿!! 我想問一下 是否有試過擴充呢?
如變成4X2(8顆8X8點矩陣)可以顯示兩個中文字的?
我超想做
作者:
if8051
時間:
2014-1-8 07:17:43
對不起!我不是學生,屈指一算職場工作已有 32 年了;服完 2 年兵役之後,第三天就上班了 ( 電子技術員 ),
一年兩個月之後離職,第二份工作是當業務員,從事一年十個月之後,就自行創業至今 。
很感概!現今的年輕人專業能力不濟,對技術無熱誠 無感!學非所用,用非所學;選擇 賣飲料,賣雞排 ...
誠屬國家人才培育不力啊!現今整個大環境和早期大不同!工廠外移,收的收,粥少僧多,外來人口增多搶
食之下,台灣人就職困難,自行購屋誠屬不可能的任務比登天還難啊!
大陸掘起,相形之下台灣競爭優勢正消退中,冀望台灣年輕人更能加把勁,我的想法是能為台灣人盡一點心
力,培養後起之秀再創巔峰,非常感謝此論壇提供此平台,讓大家一齊成長 。
不錯,在既有的電路上擴充功能,增加賣點是很好磨鍊技能的機會,但我的時間有限 ... 希望能啟蒙新進,
對有興趣研究此 8x8 LED display 的朋友有所幫助 。
作者:
a37583758
時間:
2014-1-8 19:14:12
我6年前做的 MCU 8051 控制 8x8 LED display 沒有特別透過 IC(感覺好浪費)
當時嫌不夠亮是加排阻、電晶體...
我只對版大 PO 的電路圖動畫圖片有興趣而已...
作者:
if8051
時間:
2014-1-10 09:24:23
再提供一個更進階的 8x8x8 點矩陣 LED display 的電路圖及程式碼
使用的 MCU 是 ATMEL AVR ATmega16
includes.h
#ifndef ___includes_h
#define ___includes_h
#include <iom16v.h> // 包含標頭檔頭文件
#include <macros.h> // 包含"位"操作頭文件
#include <stdio.h> // 標準輸入輸出頭文件
#include <func.h>
#include <data.h> // 字型庫
#endif
複製代碼
data.h
#ifndef ___data_h
#define ___data_h
#include <includes.h>
extern const char table[];
extern const char num0[];
extern const char num1[];
extern const char num2[];
extern const char num3[];
extern const char num4[];
extern const char num5[];
extern const char num6[];
extern const char num7[];
extern const char num8[];
extern const char num9[];
extern const char cubenum[8][8];
extern const char xing[8][8];
extern const char x[8][8];
extern const char cube[];
extern const char heart[];
extern const char wave[];
extern const char climb[];
extern const char drop[];
#endif
複製代碼
func.h
#ifndef ___fun_h
#define ___fun_h
#define uchar unsigned char
#define uint unsigned int
//A0-7為數據輸出,C0-7為138的使能選擇
//B5-7為每個138的位選,D0為數據573時使能
void intial(void); //初始化程式
void showlay(char num, const char *data); //水平方向顯示某一層圖案
void showlayall(char const *data);
void show(int num,char const *data);
void showlay138(char const *data); //水平方向顯示數據
void showstand(char num,const char* data); //豎直方向顯示某一層圖案
void showstand138( const char *data); //豎直方向顯示數據
void delay(uint ms); //延時函數
void showcube(const char pic[8][8]); //顯示一個圖案
void showcubeX(const char pic[][8]);
void showcubeY(const char pic[][8]);
#endif
複製代碼
func.c
#include<includes.h>
#define LONG 1000
#define MIDDLE 200
#define LITTLE 50
extern void delay(uint ms) // delay mS subroutine
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<11;j++); //j=1141
}
}
extern void intial(void) //初始化程式
{
DDRA=0XFF; //PORTA都配置為輸出,都輸出低電位
PORTA=0X00;
DDRB=0XFF; //PORTB都配置為輸出,都輸出低電位
PORTB=0X00;
DDRC=0XFF; //PORTC都配置為輸出,都輸出低電位
PORTC=0X00;
DDRD=0XFF; //PORTD都配置為輸出,都輸出低電位
PORTD=0X00;
}
//A0-7為數據輸出,C0-7為138的使能選擇
//B5-7為每個138的位選,D0為數據573時使能
extern void showcubeX(const char pic[8][8]) //顯示一個圖案
{
int i=0;
const char *dd;
for(i=0;i<8;i++)
{
dd=&pic[i][0];
showlay(i,dd);
}
}
extern void showlay(char num,char const *data) //方向顯示某一層圖案
{
switch (num+1)
{
case 1: PORTB=0X1F; showlay138(data); break;
case 2: PORTB=0X3F; showlay138(data); break;
case 3: PORTB=0X5F; showlay138(data); break;
case 4: PORTB=0X7F; showlay138(data); break;
case 5: PORTB=0X9F; showlay138(data); break;
case 6: PORTB=0XBF; showlay138(data); break;
case 7: PORTB=0XDF; showlay138(data); break;
case 8: PORTB=0XFF; showlay138(data); break;
default: break;
}
}
extern void showlay138(const char *data) //後方向顯示數據
{
int i=0;
for(i=0;i<8;i++)
{
PORTC=PORTC|BIT(i);
PORTD=PORTD|BIT(0);
PORTA=*data;
data++;
delay(5);
PORTA=0X00;
PORTD=PORTD&~BIT(0);
PORTC=PORTC&~BIT(i);
}
}
extern void show(int num,const char *data)
{
int i=0,general,j;
const char *dd;
for(i=0;i<num;i++)
{
for(general=0;general<LITTLE;general++)
{
for(j=0;j<8;j++)
{
dd=&data[i*64+j*8];
showstand(j,dd);
}
}
}
}
extern void showcubeY(const char pic[][8]) //左右顯示一個圖案
{
int i=0;
const char *dd;
for(i=0;i<8;i++)
{
dd=&pic[i][0];
showstand(i,dd);
}
}
extern void showstand(char num,const char *data)//左右方向顯示某一層圖案
{
switch (num+1)
{
case 1:PORTC=PORTC|BIT(0); showstand138(data); PORTC=PORTC&~BIT(0); break;
case 2:PORTC=PORTC|BIT(1); showstand138(data); PORTC=PORTC&~BIT(1); break;
case 3:PORTC=PORTC|BIT(2); showstand138(data); PORTC=PORTC&~BIT(2); break;
case 4:PORTC=PORTC|BIT(3); showstand138(data); PORTC=PORTC&~BIT(3); break;
case 5:PORTC=PORTC|BIT(4); showstand138(data); PORTC=PORTC&~BIT(4); break;
case 6:PORTC=PORTC|BIT(5); showstand138(data); PORTC=PORTC&~BIT(5); break;
case 7:PORTC=PORTC|BIT(6); showstand138(data); PORTC=PORTC&~BIT(6); break;
case 8:PORTC=PORTC|BIT(7); showstand138(data); PORTC=PORTC&~BIT(7); break;
default: break;
}
}
extern void showstandall(char const *data) //一層的數據全局顯示
{
uint count,temp=0;
for(count=0;count<8;count++)
showstand(count,data);
}
extern void showstand138(char const *data) //左右方向顯示數據
{
int i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0: PORTB&=~BIT(7); PORTB&=~BIT(6); PORTB&=~BIT(5);PORTD=PORTD|BIT(0);
PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
case 1: PORTB|=BIT(7); PORTB&=~BIT(6); PORTB&=~BIT(5);PORTD=PORTD|BIT(0);
PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
case 2: PORTB&=~BIT(7); PORTB|=BIT(6); PORTB&=~BIT(5);PORTD=PORTD|BIT(0);
PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
case 3: PORTB|=BIT(7); PORTB|=BIT(6); PORTB&=~BIT(5);PORTD=PORTD|BIT(0);
PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
case 4: PORTB&=~BIT(7); PORTB&=~BIT(6); PORTB|=BIT(5); PORTD=PORTD|BIT(0);
PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
case 5: PORTB|=BIT(7); PORTB&=~BIT(6); PORTB|=BIT(5); PORTD=PORTD|BIT(0);
PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
case 6: PORTB&=~BIT(7); PORTB|=BIT(6); PORTB|=BIT(5); PORTD=PORTD|BIT(0);
PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
case 7: PORTB|=BIT(7); PORTB|=BIT(6); PORTB|=BIT(5); PORTD=PORTD|BIT(0);
PORTA=*data;delay(5);PORTA=0X00;PORTD=PORTD&~BIT(0);break;
default:break;
}
data++;
}
}
複製代碼
main.c
#include <includes.h>
#define LONG 1000
#define MIDDLE 150
#define LITTLE 200
void main(void)
{
uint count,temp,general;
intial();
for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num9);}}
for(general=0;general<MIDDLE;general++){showstandall(num9);}
for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num8);}}
for(general=0;general<MIDDLE;general++){showstandall(num8);}
for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num7);}}
for(general=0;general<MIDDLE;general++){showstandall(num7);}
for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num6);}}
for(general=0;general<MIDDLE;general++){showstandall(num6);}
for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num5);}}
for(general=0;general<MIDDLE;general++){showstandall(num5);}
for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num4);}}
for(general=0;general<MIDDLE;general++){showstandall(num4);}
for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num3);}}
for(general=0;general<MIDDLE;general++){showstandall(num3);}
for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num2);}}
for(general=0;general<MIDDLE;general++){showstandall(num2);}
for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num1);}}
for(general=0;general<MIDDLE;general++){showstandall(num1);}
for(count=0;count<8;count++){for(general=0;general<LITTLE;general++){showstand(count,num0);}}
for(general=0;general<MIDDLE;general++){showstandall(num0);}
while(1)
{
show(71,climb);
show(64,cube);
show(28,wave);
show(28,wave);
show(15,heart);
show(15,heart);
show(15,heart);
show(15,heart);
show(34,drop);
show(34,drop);
show(34,drop);
show(34,drop);
show(71,climb);
}
}
複製代碼
作者:
if8051
時間:
2014-1-10 09:30:48
電路圖
2014-1-10 09:26:26 上傳
下載附件
(256.26 KB)
2014-1-10 09:27:03 上傳
下載附件
(252.2 KB)
2014-1-10 09:27:27 上傳
下載附件
(221.33 KB)
2014-1-10 09:27:56 上傳
下載附件
(278.17 KB)
附件:
電路圖 4.jpg
(2014-1-10 09:27:56, 278.17 KB) / 下載次數 15
https://oursogo.com/forum.php?mod=attachment&aid=NzQ2OTMxMnwzZjA0ZDBhMnwxNzQ1MjExNzQyfDB8MA%3D%3D
附件:
電路圖 3.jpg
(2014-1-10 09:27:27, 221.33 KB) / 下載次數 15
https://oursogo.com/forum.php?mod=attachment&aid=NzQ2OTMxMXw5MjM3YjRlNnwxNzQ1MjExNzQyfDB8MA%3D%3D
附件:
電路圖 1.jpg
(2014-1-10 09:26:26, 256.26 KB) / 下載次數 18
https://oursogo.com/forum.php?mod=attachment&aid=NzQ2OTMwOXwyYTg2NzMyZXwxNzQ1MjExNzQyfDB8MA%3D%3D
附件:
電路圖 2.jpg
(2014-1-10 09:27:03, 252.2 KB) / 下載次數 20
https://oursogo.com/forum.php?mod=attachment&aid=NzQ2OTMxMHw3NDcyYjc3N3wxNzQ1MjExNzQyfDB8MA%3D%3D
作者:
if8051
時間:
2014-1-10 09:43:14
動畫 GIF 檔
2014-1-10 09:43:04 上傳
下載附件
(1.54 MB)
附件:
anigif.gif
(2014-1-10 09:43:04, 1.54 MB) / 下載次數 52
https://oursogo.com/forum.php?mod=attachment&aid=NzQ2OTQzN3wzZWRhODRiYnwxNzQ1MjExNzQyfDB8MA%3D%3D
歡迎光臨 SOGO論壇 (https://oursogo.com/)
Powered by OURSOGO.COM