|
樓主按照原作示例寫的程序不成功是沒有充分理解原作意圖。樓主的頭文件#include <STC15Wxx.h>,想必是使用了STC15系列單片機(jī),由于STC15系列是1T單片機(jī),速度比51快許多,所以原來的延時(shí)函數(shù)要修改。原作是用定時(shí)器中斷計(jì)數(shù)的方式判斷長(zhǎng)、短按時(shí)間,樓主沒有開中斷,所以numl不可能>= 10,也就不會(huì)有長(zhǎng)按響應(yīng)。
給你的代碼補(bǔ)充完整:
- #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;//按鍵有效標(biāo)志位變量
- uchar count = 0;//中斷計(jì)數(shù)變量
- /*
- void delayms(uint xms) //添加延時(shí)
- {
- uint i, j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);//12T單片機(jī)
- }*/
- void delayms(uint xms) //添加延時(shí)
- {
- uint i, j;
- for(i=xms;i>0;i--)
- for(j=1150;j>0;j--);//1T單片機(jī)
- }
- void main()
- {
- //初始化定時(shí)器0
- TMOD= 0x01; //設(shè)置定時(shí)器模式
- TH0 = 0xDC; //10毫秒@11.0592MHz
- TL0 = 0x00; //10毫秒@11.0592MHz
- TR0 = 0; //定時(shí)器0關(guān)閉
- ET0 = 1; //開定時(shí)器0中斷
- EA = 1; //開總中斷
- while(1)
- {
- if(key == 0)//判斷鍵按下
- {
- delayms(10);//延時(shí)10ms防抖
- if(key == 0)//確認(rèn)鍵按下
- {
- key_flag = 1; //有效標(biāo)志位置1
- TR0 = 1; //開定時(shí)器
- while(!key); //等待松手
- TR0 = 0; //關(guān)定時(shí)器
- }
- }
- if(key_flag) //判斷按鍵有效
- {
- if(count>=100) //超過1秒算長(zhǎng)按
- {
- LED1=~LED1; //LED1取反
- }
- else //小于1秒算短按
- {
- LED2=~LED2; //LED2取反
- }
- }
- count=0; //中斷計(jì)數(shù)變量清0
- key_flag = 0; //按鍵有效標(biāo)志位清0
- }
- }
- //定時(shí)器0 中斷服務(wù)函數(shù)
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0xDC; //10毫秒@11.0592MHz
- TL0 = 0x00; //10毫秒@11.0592MHz
- if(count<250) //防止溢出
- count++; //中斷計(jì)數(shù)變量自+1
- }
復(fù)制代碼 |
|