|
以下为测试成功的源代码
- /****************************************************
- * 声明: 此制作为CIKY单片机学习过程,欢迎爱好者
- 一起学习和探讨,共同进步。
- * Title: 改进动感闪灯
- * Description: 通过AT89S51单片机控制LED点亮方式,依次
- 为单灯循环轮流点亮、两点循环轮流点亮、
- LED从中心向两边逐个点亮和从中心渐亮渐灭
- 四种方式,还可以给亮灯速度进行加减速。
- * @author CIKY
- * Date: Dec. 27, 2009
- ****************************************************/
- #include
- #define uchar unsigned char
- sbit P2_0 = P2^0; //循环轮流点亮控制按键
- sbit P2_1 = P2^1; //两灯循环轮流点亮控制按键
- sbit P2_2 = P2^2; //LED从中心向两边逐个点亮控制按键;
- sbit P2_3 = P2^3; //
- sbit P2_4 = P2^4; //慢速按键
- sbit P2_5 = P2^5; //加速按键
- uchar uKeyTemp = 3; //保存按键模式,0为单灯循环轮流点亮,
- //1为两灯循环轮流点亮,2为LED从中心
- //向两边逐个点亮方式;
- uchar LEDT1 = 0x01; //保存循环轮流点亮左移时LED状态;
- uchar LEDT2 =0x80; //保存循环轮流点亮右移时LED状态;
- uchar m = 0; //控制方向
- uchar LEDShine[4] = {0xe7,0xc3,0x81,0x00};
- //LED灯从中心向四周逐个点亮;
- uchar LEDShineC[14] = {0xef,0xcf,0x8f,0x0f,0x8f,0xcf,0xef,0xf7,0xf3,0xf1,0xf0,0xf1,0xf3,0xf7};
- //LED从中心向单边逐个点亮熄灭过程;
- uchar n = 50; //延时时间
- //////////////////延时函数//////////////////////
- void Delay(uchar x)
- {
- while(x--)
- {
- uchar j;
- for(j=0;j<=125;j++);
- }
- }
- //////////////////扫描按键子程序////////////////////
- uchar fun_KeyScan()
- {
- if(P2_0 == 0) //单灯轮流点亮
- {
- m=0;
- n=50;
- LEDT1=0x01;
- LEDT2=0x80;
- uKeyTemp=0;
- }
- if(P2_1 == 0) //双灯轮流点亮
- {
- n=50;
- LEDT1=0x01;
- LEDT2=0x80;
- uKeyTemp=1;
- }
- if(P2_2 == 0) //中心向两边点亮
- {
- m=0;
- n=50;
- LEDShine[0]=0xe7;
- uKeyTemp=2;
- }
- if(P2_3 == 0) //从中心向左边点亮,再逐个熄灭,
- //再向右边逐个点亮,再熄灭,进行循环;
- {
- m=0;
- n = 100;
- LEDShineC[0]=0xef;
- uKeyTemp=3;
- }
- if(P2_4==0) //减速
- {
- if(n>=10)
- n-=10;
- }
- if(P2_5==0) //加速
- {
- if(n<240)
- n+=10;
- }
- return uKeyTemp;
- }
- //////////////////1灯循环轮流点亮子程序/////////////////////
- //循环左移
- void fun_LEDTurnL()
- {
- LEDT1<<=1;
- if(LEDT1==0)
- LEDT1=1;
- }
- //循环右移
- void fun_LEDTurnR()
- {
- LEDT2>>=1;
- if(LEDT2==0)
- LEDT2=0x80;
- }
- //1灯循环轮流点亮
- void fun_LEDTurn()
- {
- fun_LEDTurnL();
- fun_LEDTurnR();
- m=++m%16;
- if(m<8)
- P1=~LEDT2;
- else
- P1=~LEDT1;
- }
- //////////////////两灯循环轮流点亮方式子程序////////////////
- void fun_LEDTurn2()
- {
- fun_LEDTurnB();
- fun_LEDTurnA();
- P1=~(LEDT1|LEDT2);
- }
- //////////////////LED从中心向两边逐个点亮子程序/////////////////////
- void fun_LEDShine()
- {
- m=++m%4;
- P1=LEDShine[m];
- }
- //////////////////LED从中心逐步单边点亮子程序/////////////////////
- void fun_LEDShineC()
- {
- m=++m%14;
- P1=LEDShineC[m];
- }
- /////////////////主程序入口/////////////////////////
- void main(void)
- {
- uchar uKey; //保存存在按键的端口
- P1=0xff;
- P2=0xff;
- P1=0xfe;
- while(1)
- {
- uKey = fun_KeyScan();
- if (uKey == 0)
- fun_LEDTurn();
- else if(uKey == 1)
- fun_LEDTurn2();
- else if(uKey == 2)
- fun_LEDShine();
- else
- fun_LEDShineC();
- Delay(n);
- }
- }
复制代码 |
|