📄 一个按键控制的10 级变速跑马灯.c
字号:
/*一个按键控制的10 级变速跑马灯试验
我们要用一个按键来实现跑马灯的10 级调速。这又会涉及到键的去抖的问
题。 本课的试验结果是,每按一次按键,跑马速度就降低一级,共10 级。
这里我们又增加了一个变量speedlever,来保存当前的速度档次。 在按键
里的处理中,多了当前档次的延时值的设置。
经验:++ 写成 + 将无法运行程序,并出现编译警告
请看程序: */
#define uchar unsigned char//宏定义
#define uint unsigned int
#define ulong unsigned long
#include <reg51.h>//51内部说明
sbit K=P3^2;//按键位定义
bit ldelay=0;//长定时溢出标记,预置是0 即软件定时溢出标志位
uchar speed=10;//软件定时值
uchar speedlever=0;//按钮值
void main(void)//主程序
{
/*LED的8位值 无符号字符型,code表示定义为内部ROM数据*/
uchar code ledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar ledi;//用来选择LED值的位
uint n;
TMOD=0x01;//定时器0工作方式1
TH0=0x10;//定时器高位初值
TL0=0x00;//低位值
TR0=1;//开始计时
ET0=1;//允许T0中断
EA=1;//打开总中断
while(1)//主程序循环
{
if(ldelay)//如果软件定时标志位溢出,执行{}
{
ldelay=0;//清软件定时标志位,让它继续计时
P1=ledp[ledi];//查表把值送到P0口
ledi++;//自加移到下一位,
if(ledi==8)//如果到了第8位LED则回到第一位
{
ledi=0;
}
}
if(!K)//有按键按下?有则执行{}
{
for(n=0;n<1000;n++);//延时去抖
while(!K);//待放键
for(n=0;n<1000;n++);//延时去抖
speedlever++;//自加1,按一次键盘加一次
if(speedlever==10)//到10则清零,
speedlever=0;//在这因为只有一个语句所以省了{}
speed=speedlever*3;/*档次和延时之间的预算法则,也可以用查表方法,做出
不规则的法则,按键值speedlever X 3=speed 作软件定时时间参数*/
}
}
}
timer2() interrupt 1
{
static uchar t;//静态变量,使t在中断返回后的值不变,否则t返回后会自动复位
TF0=0;//清零T0标志位
t++;
if((t==speed)||(t>30))//T到按钮设的速度值且小于30,则软件定时溢出t=0,ldelay=1
{
t=0;
ldelay=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -