第22节:独立按键控制跑马灯的方向
16=3; //切换到下一个步骤
}
else //反方向
{
ucLed_dr9=1; //第9个亮
ucLed_dr10=0; //第10个灭
ucLed_update=1; //更新显示
ucLedStep_09_16=1; //返回上一个步骤
}
}
break;
case 3:
if(uiTimeCnt_09_16>=const_time_level_09_16) //时间到
{
uiTimeCnt_09_16=0; //时间计数器清零
if(ucLedDirFlag==0) //正方向
{
ucLed_dr11=0; //第11个灭
ucLed_dr12=1; //第12个亮
ucLed_update=1; //更新显示
ucLedStep_09_16=4; //切换到下一个步骤
}
else //反方向
{
ucLed_dr10=1; //第10个亮
ucLed_dr11=0; //第11个灭
ucLed_update=1; //更新显示
ucLedStep_09_16=2; //返回上一个步骤
}
}
break;
case 4:
if(uiTimeCnt_09_16>=const_time_level_09_16) //时间到
{
uiTimeCnt_09_16=0; //时间计数器清零
if(ucLedDirFlag==0) //正方向
{
ucLed_dr12=0; //第12个灭
ucLed_dr13=1; //第13个亮
ucLed_update=1; //更新显示
ucLedStep_09_16=5; //切换到下一个步骤
}
else //反方向
{
ucLed_dr11=1; //第11个亮
ucLed_dr12=0; //第12个灭
ucLed_update=1; //更新显示
ucLedStep_09_16=3; //返回上一个步骤
}
}
break;
case 5:
if(uiTimeCnt_09_16>=const_time_level_09_16) //时间到
{
uiTimeCnt_09_16=0; //时间计数器清零
if(ucLedDirFlag==0) //正方向
{
ucLed_dr13=0; //第13个灭
ucLed_dr14=1; //第14个亮
ucLed_update=1; //更新显示
ucLedStep_09_16=6; //切换到下一个步骤
}
else //反方向
{
ucLed_dr12=1; //第12个亮
ucLed_dr13=0; //第13个灭
ucLed_update=1; //更新显示
ucLedStep_09_16=4; //返回上一个步骤
}
}
break;
case 6:
if(uiTimeCnt_09_16>=const_time_level_09_16) //时间到
{
uiTimeCnt_09_16=0; //时间计数器清零
if(ucLedDirFlag==0) //正方向
{
ucLed_dr14=0; //第14个灭
ucLed_dr15=1; //第15个亮
ucLed_update=1; //更新显示
ucLedStep_09_16=7; //切换到下一个步骤
}
else //反方向
{
ucLed_dr13=1; //第13个亮
ucLed_dr14=0; //第14个灭
ucLed_update=1; //更新显示
ucLedStep_09_16=5; //返回上一个步骤
}
}
break;
case 7:
if(uiTimeCnt_09_16>=const_time_level_09_16) //时间到
{
uiTimeCnt_09_16=0; //时间计数器清零
if(ucLedDirFlag==0) //正方向
{
ucLed_dr15=0; //第15个灭
ucLed_dr16=1; //第16个亮
ucLed_update=1; //更新显示
ucLedStep_09_16=0; //返回到开始处,重新开始新的一次循环
}
else //反方向
{
ucLed_dr14=1; //第14个亮
ucLed_dr15=0; //第15个灭
ucLed_update=1; //更新显示
ucLedStep_09_16=6; //返回上一个步骤
}
}
break;
}
}
void T0_time() interrupt 1
{
TF0=0; //清除中断标志
TR0=0; //关中断
if(uiTimeCnt_09_16<0xffff) //设定这个条件,防止uiTimeCnt超范围。
{
uiTimeCnt_09_16++; //累加定时中断的次数,
}
key_scan(); //按键扫描函数
if(uiVoiceCnt!=0)
{
uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
beep_dr=0; //蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
}
else
{
; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
beep_dr=1; //蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
}
TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
TL0=0x2f;
TR0=1; //开中断
}
void delay_short(unsigned int uiDelayShort)
{
unsigned int i;
for(i=0;i
{
; //一个分号相当于执行一条空语句
}
}
void delay_long(unsigned int uiDelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i
{
for(j=0;j<500;j++) //内嵌循环的空指令数量
{
; //一个分号相当于执行一条空语句
}
}
}
void initial_myself() //第一区 初始化单片机
{
/* 注释二:
* 矩阵键盘也可以做独立按键,前提是把某一根公共输出线输出低电平,
* 模拟独立按键的触发地,本程序中,把key_gnd_dr输出低电平。
* 朱兆祺51学习板的S1就是本程序中用到的一个独立按键。
*/
key_gnd_dr=0; //模拟独立按键的地GND,因此必须一直输出低电平
beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
TMOD=0x01; //设置定时器0为工作方式1
TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
TL0=0x2f;
}
void initial_peripheral() //第二区 初始化外围
{
EA=1; //开总中断
ET0=1; //允许定时中断
TR0=1; //启动定时中断
}
总结陈词:
这一节讲了独立按键控制跑马灯的方向。如果按键要控制跑马灯的速度,我们该怎么编写程序呢?欲知详情,请听下回分解-----独立按键控制跑马灯的速度。
独立按键控制跑马 相关文章:
- 第24节:独立按键控制跑马灯的启动和暂停(11-22)
- 第23节:独立按键控制跑马灯的速度(11-22)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)