小弟问一个不用蕊片控制100个LED显示字的问题。。。小弟不想用蕊片控制LED,用89S51和十个三极管作开关控制100个LED,电路图原理像键盘扫描差不多(图画得好烂各位大侠请多多包涵)当扫描时间为一秒时可精确控制每一个LED闪烁。。。但扫描时间很快时(利用视觉XX使字显示)显示出的字不停抖动而且亮度很差。。为什么呢??有什么解救方法。。。。
#include <reg51.h> #include <stdio.h> #define TRUE 1 #define FALSE 0 void OFF(); void del(); void lll(char *a); sbit D0=P0^0; sbit D1=P0^1; sbit D2=P0^2; sbit D3=P0^3; sbit D4=P0^4; sbit D5=P0^5; sbit D6=P0^6; sbit D7=P0^7; sbit D8=P1^0; sbit D9=P1^1; sbit X8=P1^2; sbit X9=P1^3; sbit X0=P2^0; sbit X1=P2^1; sbit X2=P2^2; sbit X3=P2^3; sbit X4=P2^4; sbit X5=P2^5; sbit X6=P2^6; sbit X7=P2^7; char a[10][10]={'0','0','0','0','1','1','0','0','0','0', '0','0','0','0','1','1','0','0','0','0', '0','0','0','0','1','1','0','0','0','0', '0','0','0','0','1','1','0','0','0','0', '1','1','1','1','1','1','1','1','1','1', '0','0','0','0','1','1','0','0','0','0', '0','0','0','0','1','1','0','0','1','0', '0','0','0','0','1','0','0','0','0','0', '1','1','1','1','0','0','1','1','1','1' }; main() {OFF();
while(1) { lll(a);
} } void del() //延时 {int i,j; for(i=0;i<10;i++) for(j=0;j<1000;j++); } void OFF() //全部关闭 {P0=0xFF; D8=TRUE; D9=TRUE; P2=0x00; X8=FALSE; X9=FALSE; }
void lll(char a[10][10]) //在数组里面扫描使LED亮 {int i,j; for(i=0;i<10;i++) for(j=0;j<10;j++) { del(); //延时 OFF(); //关闭灯 switch(j) {case 0: X0=TRUE;break; case 1: X1=TRUE;break; case 2: X2=TRUE;break; case 3: X3=TRUE;break; case 4: X4=TRUE;break; case 5: X5=TRUE;break; case 6: X6=TRUE;break; case 7: X7=TRUE;break; case 8: X8=TRUE;break; case 9: X9=TRUE;break; } if(a[j]=='1'&&i==0) D0=FALSE; if(a[j]=='0'&&i==0) D0=TRUE; if(a[j]=='1'&&i==1) D1=FALSE; if(a[j]=='0'&&i==1) D1=TRUE; if(a[j]=='1'&&i==2) D2=FALSE; if(a[j]=='0'&&i==2) D2=TRUE; if(a[j]=='1'&&i==3) D3=FALSE; if(a[j]=='0'&&i==3) D3=TRUE; if(a[j]=='1'&&i==4) D4=FALSE; if(a[j]=='0'&&i==4) D4=TRUE; if(a[j]=='1'&&i==5) D5=FALSE; if(a[j]=='0'&&i==5) D5=TRUE; if(a[j]=='1'&&i==6) D6=FALSE; if(a[j]=='0'&&i==6) D6=TRUE; if(a[j]=='1'&&i==7) D7=FALSE; if(a[j]=='0'&&i==7) D7=TRUE; if(a[j]=='1'&&i==8) D8=FALSE; if(a[j]=='0'&&i==8) D8=TRUE; if(a[j]=='1'&&i==9) D9=FALSE; if(a[j]=='0'&&i==9) D9=TRUE; } }
|