說明:我圖上擺放的是上面一排引腳是行,下面一排引腳是列。行是LED陽極。
行列各由四個74HC573控制,每個控制8個腳。同時注意單片機P0口上拉保持供電充足。
還有注意每行的掃描時間要合理設置。否則會有顯示殘缺。根據實際設置吧!!!
橫向顯示4個字:少 占 魚 制 作
其實可以把這個程序和我另外的一個單片機串口與電腦通信的程序結合起來,加上我用VC做的上位機界面。可以自由輸入顯示內容,還可以反向控制電腦的一些操作。不過我還是熱衷不用電腦輸入顯示內容,而用一只感應筆掃描一個32*32LED模板,實現自己點哪就讓哪個LED亮的效果。簡單有省事。等我做出實物來再發吧!!!其實就是加個光敏三極管,LED模板上各個LED點亮時間不同。通過測頻達到取某點坐標的目的。
//32*32點陣LED顯示,由8*8點陣組成。列高行低點亮
/*****我在修改的時候,總是字顯示不完整,一開始還以為是哪里有錯,后來改延時程序也不行,最后每行連續掃描幾次,可以了******/
//少占魚 河北正定歡迎您 長沙航院 QQ:411656434
#include <stc89c52.h> #define uchar unsigned char #define uint unsigned int //少占魚制作 河北正定歡迎您 長沙航空職業技術學院 2010 年QQ:411656434 //郵箱:ssou_1985@163.com sbit CS1=P1^0; sbit CS2=P1^1; sbit CS3=P1^6; sbit CS4=P1^7; sbit L1=P1^2; sbit L2=P1^3; sbit L3=P1^4; sbit L4=P1^5; uchar hang[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code tab[]={ 0x01,0x00,0x01,0x00,0x01,0x00,0x09,0x20, 0x09,0x10,0x11,0x0C,0x11,0x04,0x21,0x10, 0x41,0x10,0x01,0x20,0x01,0x40,0x00,0x80, 0x01,0x00,0x02,0x00,0x0C,0x00,0x70,0x00, //少 0x02,0x00,0x02,0x00,0x02,0x08,0x03,0xFC, 0x02,0x00,0x02,0x00,0x02,0x10,0x3F,0xF8, 0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10, 0x20,0x10,0x20,0x10,0x3F,0xF0,0x20,0x10, //占 0x04,0x00,0x04,0x00,0x0F,0xE0,0x10,0x40, 0x20,0x88,0x7F,0xFC,0xA1,0x08,0x21,0x08, 0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8, 0x20,0x08,0x00,0x04,0xFF,0xFE,0x00,0x00, //魚 0x04,0x04,0x24,0x04,0x25,0x04,0x3F,0xA4, 0x24,0x24,0x44,0xA4,0xFF,0xE4,0x04,0x24, 0x3F,0xA4,0x24,0xA4,0x24,0xA4,0x24,0x84, 0x26,0x84,0x25,0x04,0x04,0x14,0x04,0x08 //制 }; void delay(uint); void delayus(); void xianshi(); void dis1(); void dis2(); void dis3(); void dis4(); /****************************************************************/ //主函數入口 main() { delayus(); delay(20); P0=0x00; P2=0xff; L1=0; L2=0; L3=0; L4=0; CS1=0; CS2=0; CS3=0; CS4=0; while(1) { xianshi(); } } void xianshi() { dis1(); dis1(); dis2(); dis2(); dis3(); dis3(); dis4(); dis4(); } /************第一個16*16點陣顯示***************/ // void dis1() { //第一個16*16點陣開始顯示 uchar i,j; /*****我在修改的時候,總是字顯示不完整,一開始還以為是哪里有錯,后來改延時程序也不行,最后每行連續掃描幾次,可以了******/ //少占魚 河北正定歡迎您 長沙航院 QQ:411656434 for(i=0;i<8;i++) { for(j=0;j<8;j++)//特別注意這里每組點陣的每行掃描8遍,人眼看起來才完整,否則會有殘缺不亮 { /*****我在修改的時候,總是字顯示不完整,一開始還以為是哪里有錯,后來改延時程序也不行,最后每行連續掃描幾次,可以了******/ P2=hang[i]; CS1=1; P0=tab[i*2]; L1=1; delay(1); P0=0x00; L1=0; P0=tab[i*2+1]; L2=1; delay(1); P0=0x00;//這句才是真正關閉陽極正電的 L2=0; //關閉列,這句是使以后的操作不再影響本列狀態 P2=0xff;//這句才是關閉陰極正電的語句 CS1=0; //關閉行低,使以后的操作部影響本行狀態 i++; } } /*****我在修改的時候,總是字顯示不完整,一開始還以為是哪里有錯,后來改延時程序也不行,最后每行連續掃描幾次,可以了******/ for(i=8;i<16;i++) { for(j=0;j<8;j++)//特別注意這里每組點陣的每行掃描8遍,人眼看起來才完整,否則會有殘缺不亮 { P2=hang[i%8]; CS2=1; P0=tab[i*2]; L1=1; delay(1); P0=0x00; L1=0; P0=tab[i*2+1]; L2=1; delay(1); P0=0x00;//這句才是真正關閉陽極正電的 L2=0; //關閉列,這句是使以后的操作不再影響本列狀態 P2=0xff;//這句才是關閉陰極正電的語句 CS2=0; //關閉行低,使以后的操作部影響本行狀態 i++; } } } /*************第2個16*16點陣顯示*********************/ // void dis2() { //第二個16*16點陣開始顯示 uchar i,j; for(i=16;i<24;i++) {/*****我在修改的時候,總是字顯示不完整,一開始還以為是哪里有錯,后來改延時程序也不行,最后每行連續掃描幾次,可以了******/ for(j=0;j<8;j++)//特別注意這里每組點陣的每行掃描8遍,人眼看起來才完整,否則會有殘缺不亮 { P2=hang[i%16]; CS1=1; P0=tab[i*2]; L3=1; delay(1); P0=0x00; L3=0; P0=tab[i*2+1]; L4=1; delay(1); P0=0x00;//這句才是真正關閉陽極正電的 L4=0; //關閉列,這句是使以后的操作不再影響本列狀態 P2=0xff;//這句才是關閉陰極正電的語句 CS1=0; //關閉行低,使以后的操作部影響本行狀態 i++; } } for(i=24;i<32;i++) { /*****我在修改的時候,總是字顯示不完整,一開始還以為是哪里有錯,后來改延時程序也不行,最后每行連續掃描幾次,可以了******/ for(j=0;j<8;j++)//特別注意這里每組點陣的每行掃描8遍,人眼看起來才完整,否則會有殘缺不亮 { P2=hang[i%24]; CS2=1; P0=tab[i*2]; L3=1; delay(1); P0=0x00; L3=0; P0=tab[i*2+1]; L4=1; delay(1); P0=0x00;//這句才是真正關閉陽極正電的 L4=0; //關閉列,這句是使以后的操作不再影響本列狀態 P2=0xff;//這句才是關閉陰極正電的語句 CS2=0; //關閉行低,使以后的操作部影響本行狀態 i++; } } //第二個16*16點陣顯示完畢 } /***********第3個16*16點陣顯示**************************/ // void dis3() { //第三個16*16點陣開始顯示 uchar i,j; for(i=32;i<40;i++) { /*****我在修改的時候,總是字顯示不完整,一開始還以為是哪里有錯,后來改延時程序也不行,最后每行連續掃描幾次,可以了******/ for(j=0;j<8;j++)//特別注意這里每組點陣的每行掃描8遍,人眼看起來才完整,否則會有殘缺不亮 { P2=hang[i%32]; CS3=1; P0=tab[i*2]; L1=1; delay(1); P0=0x00; L1=0; P0=tab[i*2+1]; L2=1; delay(1); P0=0x00;//這句才是真正關閉陽極正電的 L2=0; //關閉列,這句是使以后的操作不再影響本列狀態 P2=0xff;//這句才是關閉陰極正電的語句 CS3=0; //關閉行低,使以后的操作部影響本行狀態 i++; } } for(i=40;i<48;i++) { for(j=0;j<8;j++)//特別注意這里每組點陣的每行掃描8遍,人眼看起來才完整,否則會有殘缺不亮 { P2=hang[i%40]; CS4=1; P0=tab[i*2]; L1=1; delay(1); P0=0x00; L1=0; P0=tab[i*2+1]; L2=1; delay(1); P0=0x00;//這句才是真正關閉陽極正電的 L2=0; //關閉列,這句是使以后的操作不再影響本列狀態 P2=0xff;//這句才是關閉陰極正電的語句 CS4=0; //關閉行低,使以后的操作部影響本行狀態 i++; } } //第三個16*16點陣顯示完畢 } /********第4個16*16點陣顯示*********************/ // void dis4() { /************第4個16*16點陣顯示***********************/ //第四個16*16點陣開始顯示 uchar i,j; for(i=48;i<56;i++) { for(j=0;j<8;j++)//特別注意這里每組點陣的每行掃描8遍,人眼看起來才完整,否則會有殘缺不亮 { P2=hang[i%48]; CS3=1; P0=tab[i*2]; L3=1; delay(1); P0=0x00; L3=0; P0=tab[i*2+1]; L4=1; delay(1); P0=0x00;//這句才是真正關閉陽極正電的 L4=0; //關閉列,這句是使以后的操作不再影響本列狀態 P2=0xff;//這句才是關閉陰極正電的語句 CS3=0; //關閉行低,使以后的操作部影響本行狀態 i++; } } for(i=56;i<64;i++) { for(j=0;j<8;j++)//特別注意這里每組點陣的每行掃描8遍,人眼看起來才完整,否則會有殘缺不亮 { P2=hang[i%56]; CS4=1; P0=tab[i*2]; L3=1; delay(1); P0=0x00; L3=0; P0=tab[i*2+1]; L4=1; delay(1); P0=0x00;//這句才是真正關閉陽極正電的 L4=0; //關閉列,這句是使以后的操作不再影響本列狀態 P2=0xff;//這句才是關閉陰極正電的語句 CS4=0; //關閉行低,使以后的操作部影響本行狀態 i++; } } //第四個16*16點陣顯示完畢 } // void delayus() { uchar i=3; while(i--); } void delay(uint k) { uint data i,j; for(i=0;i<k;i++) { for(j=0;j<155;j++) {;} } }