利用定时器 按下一个按键后 如何让一个数自动减一 用C语言写?请教 啊

 我来答
susehht
2011-05-11
知道答主
回答量:25
采纳率:0%
帮助的人:0
展开全部
C语言中哪里来的按钮啊,看来你没搞清楚,C基本不设计界面的问题
如果非要用C来做,可以使用time函数,但效率会低一点。如下
#include "time.h"
#include "malloc.h"
int main(int argc, char* argv[])
{
time_t *clock=(time_t*)malloc(sizeof(time_t));
struct tm *mytime=(tm*)malloc(sizeof(tm));
int sec, curTime;
int num = 10; //需要减一的数,为0结束
while( num >=0 ){
time(clock);
mytime = localtime(clock);
sec = mytime->tm_sec;
num --;
printf("%d\n",num);
curTime = sec;
while(sec == curTime ){ // 隔1秒,减1,可以根据情况修改。效率在这里低下
//因为是单线程
time(clock);
mytime = localtime(clock);
curTime = mytime->tm_sec;
}

}
return 0;
}
程序运行是每隔1秒输出一个数。
原理是用time取得当前的时间,然后判断当前时间的秒有没有变化
Laplas
2011-05-25 · TA获得超过1万个赞
知道大有可为答主
回答量:2680
采纳率:50%
帮助的人:2446万
展开全部
//#include<reg51.h>
#include<intrins.h>

#include<STC10F08XE.H>

/********************************************************************
定义发光二极管管腿
=0,点亮
=1,熄灭
*********************************************************************/
sbit LED1=P3^4;
sbit LED2=P3^5;

/********************************************************************
串口定义
*********************************************************************/
//定义波特率发生器重载值
//晶体频率22.1184M,1T,SMOD=0;波特率115200bps
#define RELOAD_COUNT 0XFA

void serial_port_initial();
void send_UART(unsigned char);
void UART_Interrupt_Receive(void);
/**************************************************************/
//延时函数
/**************************************************************/
void delay(unsigned int uldata);

/**************************************************************/
//timer0函数
/**************************************************************/
#define TIMER_COUNT_LX 0XA8
#define TIMER_COUNT_HX 0XFD //约5ms

void timer0_initial();
void TIMER0_Interrupt_Receive(void);

/**************************************************************/
//testKEY函数
/**************************************************************/
sbit KEY_0= P4 ^ 2;
sbit KEY_1= P4 ^ 1;
sbit KEY_2= P4 ^ 0;
sbit KEY_3= P4 ^ 3;
unsigned char ucstate[4];
unsigned char uccount[4];
#define STATE_IDLE 0
#define STATE_DOWN 1
#define STATE_DOWN1 2
#define STATE_RELEASE 3
#define STATE_RELEASE1 4
void TestKEY(unsigned char i);

void main()
{

int i;
//状态分量初始化
for (i=0;i<4;i++)
{
ucstate[i]=STATE_IDLE;
uccount[i]=0;
}

serial_port_initial(); //串口初始化
timer0_initial(); //定时器1初始化

while(1)
{
/***********************************
test key
key按下的变化0-1-0
*************************************/
for (i=0;i<4;i++)
{
TestKEY(i);
}
delay(1);

}

}

/********************************************************************
函数名:void serial_port_initial
功能:使用定时器1作为波特率发生器
参数:无
*********************************************************************/
/*void serial_port_initial()
{
SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位
TMOD = 0x21; //0011,0001 设置定时器1为8位自动重装计数器
TH1 = RELOAD_COUNT; //设置定时器1自动重装数
TL1 = RELOAD_COUNT;
TR1 = 1; //开定时器1
ES = 1; //允许串口中断
EA = 1; //开总中断
}
*/

/********************************************************************
函数名:void serial_port_initial
功能:使用独立波特率发生器作为波特率发生器
参数:无
*********************************************************************/
void serial_port_initial()
{
SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位
BRT = RELOAD_COUNT; ////定义波特率发生器重载值,晶体频率22.1184M,1T,SMOD=0;波特率115200bps
AUXR = 0x15; //将BRTR=1,BRTx12=1(1T模式),SBRS=1
//T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,XRAM,SBRS
//Baud=Fosc/(256-RELOAD_COUNT)/32/12 (12T模式)
//Baud=Fosc/(256-RELOAD_COUNT)/32 (1T模式)
//BRTR=1,启动独立波特率发生器
//S1BRS=1,串口1选择独立波特率发生器作为波特率发生器
//此时定时器1可以释放出来作为定时器,计数器,时钟输出使用
//AUXR1=0x80;//释放该行指令,则串行口从P3切换到P1,设计串口在P1,不支持
ES = 1; //允许串口中断
EA = 1; //开总中断

}

/********************************************************************
函数名: send_UART
功能:发送数据至串口
参数:i,数据
*********************************************************************/
void send_UART(unsigned char i)
{
ES = 0; //关串口中断
TI = 0; //清零串口发送完成中断请求标志
SBUF = i;
while(TI==0); //等待发送完成
TI = 0;
ES = 1; //允许串口中断

}

void timer0_initial() //使用定时器1作为波特率发生器
{
// SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位
TMOD = 0x11; //0001,0001 设置定时器016位定时器
TH0 = TIMER_COUNT_HX ; //设置定时器1自动重装数
TL0 = TIMER_COUNT_LX ;
TR0 = 1; //开定时器1

ET0= 1;
EA = 1; //开总中断
}

/********************************************************************
函数名: UART_Interrupt_Receive
功能:串口中断响应函数
参数:无
*********************************************************************/
void UART_Interrupt_Receive(void) interrupt 4
{
unsigned char k = 0;
//int i;
if (RI==1)
{
RI = 0;
k = SBUF;

}
else
{
TI = 0;
}
}

/********************************************************************
函数名: TIMER0_Interrupt_Receive
功能:timer0中断响应函数
参数:无
*********************************************************************/
void TIMER0_Interrupt_Receive(void) interrupt 1
{
int i;
TF0=0;
for (i=0;i<4;i++)
{
uccount[i]++;
}

}

/********************************************************************
函数名: delay
功能:延时函数
参数:uldata,延时分量
每个_nop_为1个Clock,由于是1T模式,每个时钟是1/22.1184M,
*********************************************************************/
void delay(unsigned int uldata)
{
unsigned int j = 0;
unsigned int g = 0;
for (j=0;j<5;j++)
{
for (g=0;g<uldata;g++)
{
_nop_();
_nop_();
_nop_();
}
}
}

/****************************************************************************
test key

/********************************************************************
函数名: GetKeyData
功能:得到当前KEY的状态
参数:ucdata,
0~3,分别代表4个KEY
*********************************************************************/
/****************************************************************************/
unsigned char GetKeyData(unsigned char ucdata)
{
unsigned char uckeydata=0;
if (ucdata==0)
{
uckeydata |= KEY_0;
}
if (ucdata==1)
{
uckeydata |= KEY_1;
}
if (ucdata==2)
{
uckeydata |= KEY_2;
}
if (ucdata==3)
{
uckeydata |= KEY_3;
}
return uckeydata;
}

/********************************************************************
函数名: TestKEY
功能:测试当前KEY的是否被按下
参数:ucdata,
0~3,分别代表4个KEY
*********************************************************************/
void TestKEY(unsigned char i)
{
unsigned char key=0xff;
switch (ucstate[i])
{
case STATE_IDLE:
key=GetKeyData(i);
if (key==0)
{
ucstate[i]=STATE_DOWN;
}
uccount[i]=0;
break;
case STATE_DOWN:
key=GetKeyData(i);
if (key==0)
{
if (uccount>2)
{
ucstate[i]=STATE_DOWN1;
uccount[i]=0;
}
}
if (key==1)
{
ucstate[i]=STATE_IDLE;
uccount[i]=0;
}
break;
case STATE_DOWN1:
key=GetKeyData(i);
if (key==1)
{
ucstate[i]=STATE_RELEASE;
uccount[i]=0;
}
break;
case STATE_RELEASE:
key=GetKeyData(i);
if (key==1)
{
if (uccount[i]>6)
{
ucstate[i]=STATE_RELEASE1;
uccount[i]=0;
send_UART(i);
ucstate[i]=STATE_IDLE;
}
}
if (key==0)
{
ucstate[i]=STATE_DOWN1;
uccount[i]=0;
}
break;
default:
break;
}
}

这个程序是有4个按键,按某一个再松开,会向串口发送按键的编号。
你把 send_UART(i); 改成什么数减一就行了。
来自:求助得到的回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式