利用定时器 按下一个按键后 如何让一个数自动减一 用C语言写?请教 啊
2个回答
展开全部
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取得当前的时间,然后判断当前时间的秒有没有变化
如果非要用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取得当前的时间,然后判断当前时间的秒有没有变化
展开全部
//#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); 改成什么数减一就行了。
#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); 改成什么数减一就行了。
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询