单片机初学入门写的,没用定时器计数器,纯粹的逻辑代码,高手请路过。
- #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;
- }
- }
- }
复制代码
|