|
/******************************
配合原理图编写
带编码器的直流小电机的控制软件
2018-06-13
内部晶体频率11.0592MHz
*******************************/
#include "STC15W40XXX.H"
#include "intrins.h"
sbit LEDA=P3^5;
sbit LEDB=P3^6;
sbit LEDC=P3^7;
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;
sbit KEY1=P3^4;
bit key=0;
bit KeySta = 1; //当前按键状态
bit backup = 1; //按键值备份,保存前一次的扫描值
unsigned char cnt=14;
void Key_scan(); //按键扫描函数
void Key_Function(); //按键功能函数
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{
while (--j);
} while (--i);
}
void main()
{
//定时器T0设定
EA=0; //关闭总中断
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //禁止T0中断
EA = 1;
LEDA=LEDB=LEDC=0;
P1=0X00;
while(1)
{
unsigned char i;
if(key)
{
LED1=1;LED2=0;for(i=0;i<cnt;i++){Delay5ms();}
LED2=1;LED3=0;for(i=0;i<cnt;i++){Delay5ms();}
LED3=1;LED4=0;for(i=0;i<cnt;i++){Delay5ms();}
LED4=1;LED5=0;for(i=0;i<cnt;i++){Delay5ms();}
LED5=1;LED6=0;for(i=0;i<cnt;i++){Delay5ms();}
LED6=1;LED7=0;for(i=0;i<cnt;i++){Delay5ms();}
LED7=1;LED8=0;for(i=0;i<cnt;i++){Delay5ms();}
LED8=1;LED1=0;for(i=0;i<cnt;i++){Delay5ms();}
}
else
{
P1=0XFF;
}
}
}
//定时器2中断入口
void t0int() interrupt 1 //中断入口
{
static bit on=1;
static unsigned int time1=0;
time1++;
if(on)
{
Key_scan();
Key_Function();
}
if(KEY1==0)
{
time1++;
if(time1==1800)
{
if(KEY1==0)
{
on=!on;
key=!key;
}
}
}
else
{
time1=0;
}
}
void Key_scan()//按键扫描函数
{
static unsigned char keybuf = 0xFF; //扫描缓冲区,保存一段时间内的扫描值
keybuf = (keybuf<<1) | KEY1; //缓冲区左移一位,并将当前扫描值移入最低位
if (keybuf == 0x00)
{ //连续 8 次扫描值都为 0,即 16ms 内都只检测到按下状态时,可认为按键已按下
KeySta = 0;
}
else if (keybuf == 0xFF)
{ //连续 8 次扫描值都为 1,即 16ms 内都只检测到弹起状态时,可认为按键已弹起
KeySta = 1;
}
else
{} //其它情况则说明按键状态尚未稳定,则不对 KeySta 变量值进行更新
}
void Key_Function()
{
if (KeySta != backup) //当前值与前次值不相等说明此时按键有动作
{
if (backup == 0) //如果前次值为 0,则说明当前是弹起动作
{
key=1;
cnt--;
if(cnt==9)
cnt=14;
}
backup = KeySta; //更新备份为当前值,以备进行下次比较
}
|
评分
-
查看全部评分
|