wulin 发表于 2019-1-18 11:28 非常感谢!无以言表我试试,虽然现在还不是很理解 |
![]() |
真心感谢你们![]() |
weidoit 发表于 2019-1-18 12:05 谢谢大神!我试试 |
yzwzfyz 发表于 2019-1-18 08:20 动态显示确实让我很懵逼,6ms切换一行一直循环人眼看到的就是全亮了啊。1号灯灭的同时25号灯亮,逐个移位过去,静态和动态都不能实现 |
给你写一个示例程序,因为用LED仿真视觉不好,用LED点阵屏代替演示。
![]() #include <reg51.h> #define uint unsigned int #define uchar unsigned char sbit code0 =P2^0;//列 sbit code1 =P2^1; sbit code2 =P2^2; sbit code3 =P2^3; sbit code4 =P2^4; sbit code5 =P2^5; sbit code6 =P2^6; sbit code7 =P2^7; sbit code8 =P0^0; sbit code9 =P0^1; sbit code10=P0^2; sbit code11=P0^3; sbit Column0=P1^0;//行 sbit Column1=P1^1; sbit Column2=P1^2; uint code table[]={0x001,0x002,0x004,0x008,0x010,0x020,0x040,0x080,0x100,0x200,0x400,0x800,0x0fff}; uint num=0x0000; uchar i,j,k; bit a; void PX(uint i) //写入12位数据 { code0 =i&0x01;i>>=1; code1 =i&0x01;i>>=1; code2 =i&0x01;i>>=1; code3 =i&0x01;i>>=1; code4 =i&0x01;i>>=1; code5 =i&0x01;i>>=1; code6 =i&0x01;i>>=1; code7 =i&0x01;i>>=1; code8 =i&0x01;i>>=1; code9 =i&0x01;i>>=1; code10=i&0x01;i>>=1; code11=i&0x01; } void Timer0Init(void) //1毫秒@12.000MHz { TMOD |= 0x01; //设置定时器模式 TL0 = 0x18; //设置定时初值 TH0 = 0xFC; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 EA=1; //开总中断 ET0=1; //开T0中断 } void main() { Timer0Init(); PX(0x0000); while(1) { if(a==1) { a=0; switch(j)//动态逐行显示 { case 0: P1&=0xf8;//P1低3位清0 P1|=0x01;//P1低3位赋值 num&=0xf000;//num低12位清0 num|=table;//num低12位赋值 PX(num);j++;//num值写入列端口 break; case 1: P1&=0xf8; P1|=0x02; num&=0xf000; num|=table; PX(num);j++; break; case 2: P1&=0xf8; P1|=0x04; num&=0xf000; num|=table; PX(num);j=0; break; } if(++k==3)//流水灯 { k=0; i++; if(i==12) i=0; } } } } void timer0() interrupt 1 { TL0 = 0x18; //设置定时初值 TH0 = 0xFC; //设置定时初值 a=1; } |
你的空间想力不够啊。 建议: 每6ms切换一行显示,一直永远循环。试试吧。 |
貌似?当时谁提出来点亮几十个LED时我说用点阵做,但是,你却没有按点阵的思路来操作!如果是按点阵方式来做应该是8个I/O取纵,其于取横!这样你要点一个灯时用取模软件直接取模就得到数组值就OK的,也不用复杂的计算。这就同点阵点一个灯是一样的。 |
参与人数 1 | 黑币 +15 | 收起 理由 |
---|---|---|
![]() | + 15 | 回帖助人的奖励! |