说明:我图上摆放的是上面一排引脚是行,下面一排引脚是列。行是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++) {;} } }