楼主按照原作示例写的程序不成功是没有充分理解原作意图。楼主的头文件#include <STC15Wxx.h>,想必是使用了STC15系列单片机,由于STC15系列是1T单片机,速度比51快许多,所以原来的延时函数要修改。原作是用定时器中断计数的方式判断长、短按时间,楼主没有开中断,所以numl不可能>= 10,也就不会有长按响应。
给你的代码补充完整:
- #include <STC15Wxx.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- sbit key =P1^7;
- sbit LED1=P3^0;
- sbit LED2=P3^1;
-
- bit key_flag = 0;//按键有效标志位变量
- uchar count = 0;//中断计数变量
- /*
- void delayms(uint xms) //添加延时
- {
- uint i, j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);//12T单片机
- }*/
- void delayms(uint xms) //添加延时
- {
- uint i, j;
- for(i=xms;i>0;i--)
- for(j=1150;j>0;j--);//1T单片机
- }
- void main()
- {
- //初始化定时器0
- TMOD= 0x01; //设置定时器模式
- TH0 = 0xDC; //10毫秒@11.0592MHz
- TL0 = 0x00; //10毫秒@11.0592MHz
- TR0 = 0; //定时器0关闭
- ET0 = 1; //开定时器0中断
- EA = 1; //开总中断
- while(1)
- {
- if(key == 0)//判断键按下
- {
- delayms(10);//延时10ms防抖
- if(key == 0)//确认键按下
- {
- key_flag = 1; //有效标志位置1
- TR0 = 1; //开定时器
- while(!key); //等待松手
- TR0 = 0; //关定时器
- }
- }
- if(key_flag) //判断按键有效
- {
- if(count>=100) //超过1秒算长按
- {
- LED1=~LED1; //LED1取反
- }
- else //小于1秒算短按
- {
- LED2=~LED2; //LED2取反
- }
- }
- count=0; //中断计数变量清0
- key_flag = 0; //按键有效标志位清0
- }
- }
- //定时器0 中断服务函数
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0xDC; //10毫秒@11.0592MHz
- TL0 = 0x00; //10毫秒@11.0592MHz
- if(count<250) //防止溢出
- count++; //中断计数变量自+1
- }
复制代码 |