标题:
STC8单片机单击,双击,长按代码,纯逻辑语法
[打印本页]
作者:
ycbw
时间:
2023-3-12 12:25
标题:
STC8单片机单击,双击,长按代码,纯逻辑语法
单片机初学入门写的,没用定时器计数器,纯粹的逻辑代码,高手请路过。
#include <STC8Gxx.H>
//--声明全局函数--//
void Delay10ms(unsigned int c); //延时10ms
unsigned int i, y, z, key_on;
//--定义要使用的IO口--//
sbit out_1 = P5^4; //定义使用的IO口1
sbit out_2 = P5^5; //定义使用的IO口2
sbit out_3 = P3^3; //定义使用的IO口3
sbit k1 = P3^2; //定义按键使用的IO口
void Delay10ms(unsigned int c) //延时函数
{
unsigned char a, b
for (;c>0;c--)
{
for (b=162;b>0;b--)
{
for (a=235;a>0;a--);
}
}
}
void main()
{
P5M0 = 0x18;
P5M1 = 0x00;
P3M0 = 0x08;
P3M1 = 0x00; //设置需要端口模式
out_1 = 0;
out_2 = 0;
out_3 = 0; //端口上电状态
i = 0; y = 0; z = 0; key_on = 0; //变量初始化
while(1)
{
if((!k1 || z) && i<15) //按键按下,并只会执行1.5S
{
Delay10ms(2);
if(!k1) //按下
{
key_on = 1; //标志位,允许计时开始
z = 1; //状态锁定
}
if(z==1 && k1==1) //松开
{
y ++; //y次数+1
z = 0; //状态解锁
}
}
if(key_on==1 && i<16) //限制总时长1.6S
{
i ++; //循环i次数+1
Delay10ms(10);
}
/*
1次:按y=0,z=0 ;松y=1,z=0
2次:按y=1,z=1 ;松y=2,z=0
3次:按y=2,z=1 ;松y=3,z=0
4次:按y=3,z=1 ;松y=4,z=0
长按:按松均为 y=0,z=1
*/
if(k1 && i>=15) //松开后处理
{
if(y==0 && z==1) //长按
{
out_1 = 0; out_2 = 0; out_3 = 0;
}
else if(z==0 && y>0)
{
if(y==1) //单击
{
//out_3 = ~out_3;
}
else if(y==2) //双击
{
out_1 = ~out_1;
}
else if(y==3) //三击
{
out_2 = ~out_2;
}
else //4击及以上为长按
{
out_1 = 0; out_2 = 0; out_3 = 0;
}
}
i = 0; y = 0; z = 0; key_on = 0;
}
}
}
复制代码
作者:
wangwing
时间:
2023-3-14 12:51
时钟是多少?
作者:
liucan2020
时间:
2023-3-14 14:23
这个方法可以借用一下,感觉有点意思。
作者:
liucan2020
时间:
2023-3-14 14:24
wangwing 发表于 2023-3-14 12:51
时钟是多少?
这个是用延时来做的 ,没用定时器 ,时间频率可以按自己的来算
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1