Android实现正数计时/倒计时

在这里插入图片描述


public class MainActivity extends AppCompatActivity implements Chronometer.OnChronometerTickListener, View.OnClickListener {

    private Chronometer mChronometer;
    int current = 0;
    private MyCountDownTimer myCountDownTimer;
    private TextView mTxt_count;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mChronometer = findViewById(R.id.chronometer);
        Button btn_start = findViewById(R.id.btn_start);
        Button btn_close = findViewById(R.id.btn_close);
        Button btn_count = findViewById(R.id.btn_count);
        mTxt_count = findViewById(R.id.txt_count);
        btn_start.setOnClickListener(this);
        btn_close.setOnClickListener(this);
        btn_count.setOnClickListener(this);
        //倒计时初始化60秒
        myCountDownTimer = new MyCountDownTimer(60000, 1000);
        //正数计时设置初始值(重置)
        mChronometer.setBase(0);
        //正数计时事件监听器,时间发生变化时可进行操作
        mChronometer.setOnChronometerTickListener(this);
        //设置格式(默认"MM:SS"格式)
        mChronometer.setFormat("%s");
        mChronometer.setText(FormatMiss(current));
        initData();
    }

    //倒计时函数
    private class MyCountDownTimer extends CountDownTimer {

        public MyCountDownTimer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        //计时过程
        @Override
        public void onTick(long l) {
            //防止计时过程中重复点击
            mTxt_count.setClickable(false);
            mTxt_count.setText(l / 1000 + "秒");

        }

        //计时完毕的方法
        @Override
        public void onFinish() {
            //重新给Button设置文字
            mTxt_count.setText("重新获取");
            //设置可点击
            mTxt_count.setClickable(true);
        }
    }


    //正数计时
    private void initData() {
        mChronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer chronometer) {
                current++;
                chronometer.setText(FormatMiss(current));
            }
        });
    }

    @Override
    public void onChronometerTick(Chronometer chronometer) {

    }

    //正数计时显示格式
    public static String FormatMiss(int time) {
        String hh = time / 3600 > 9 ? time / 3600 + "" : "0" + time / 3600;
        String mm = (time % 3600) / 60 > 9 ? (time % 3600) / 60 + "" : "0" + (time % 3600) / 60;
        String ss = (time % 3600) % 60 > 9 ? (time % 3600) % 60 + "" : "0" + (time % 3600) % 60;
        return hh + ":" + mm + ":" + ss;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_start:
                //开始
                mChronometer.start();
                break;
            case R.id.btn_close:
                //结束
                mChronometer.stop();
                break;
            case R.id.btn_count:
                //倒计时开始
                myCountDownTimer.start();
                break;
        }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Chronometer
        android:id="@+id/chronometer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center" />

    <TextView
        android:id="@+id/txt_count"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="60" />

    <Button
        android:id="@+id/btn_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始" />

    <Button
        android:id="@+id/btn_close"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="结束" />

    <Button
        android:id="@+id/btn_count"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="倒计时" />

</LinearLayout>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C51单片机上使用两个端口实现正数计时和倒数计时,可以通过以下步骤实现: 1. 初始化端口,将控制数码管的引脚设置为输出模式。 2. 初始化计时器,设置定时器的计时时间和工作模式。 3. 在主函数中使用 while 循环实现正数计时功能。在 while 循环中,通过中断或轮询方式更新计时器的计数值,并将计时器的计数值转换为数码管的显示值。 4. 在倒数计时功能中,通过 switch 语句实现计时器的计数值进行递减,并将计时器的计数值转换为数码管的显示值。 以下是示例代码: ``` #include <reg52.h> sbit LED1 = P1^0; // 假设数码管的a段连接到P1.0引脚 sbit LED2 = P1^1; // 假设数码管的b段连接到P1.1引脚 sbit LED3 = P1^2; // 假设数码管的c段连接到P1.2引脚 sbit LED4 = P1^3; // 假设数码管的d段连接到P1.3引脚 sbit SW1 = P2^0; // 假设正数计时按钮连接到P2.0引脚 sbit SW2 = P2^1; // 假设倒数计时按钮连接到P2.1引脚 unsigned int count = 0; // 计时器计数值 void timer_init() { TMOD = 0x01; // 设置定时器为模式1 TH0 = 0xFC; // 设置计时时间为1ms TL0 = 0x18; EA = 1; // 开启总中断 ET0 = 1; // 开启定时器中断 TR0 = 1; // 启动定时器 } void display(unsigned int num) { switch (num) { case 0: LED1 = LED2 = LED3 = 0; LED4 = 1; break; case 1: LED2 = LED3 = 1; LED1 = LED4 = 0; break; case 2: LED1 = LED2 = LED4 = 1; LED3 = 0; break; case 3: LED1 = LED2 = LED3 = 1; LED4 = 0; break; case 4: LED2 = LED3 = LED4 = 1; LED1 = 0; break; case 5: LED1 = LED3 = LED4 = 1; LED2 = 0; break; case 6: LED1 = LED3 = LED4 = LED2 = 1; break; case 7: LED1 = LED2 = LED3 = 0; LED4 = 1; break; case 8: LED1 = LED2 = LED3 = LED4 = 1; break; case 9: LED1 = LED2 = LED4 = LED3 = 1; break; default: break; } } void main() { unsigned int i; timer_init(); // 初始化计时器 while (1) { if (SW1 == 0) // 正数计时 { for (i = 0; i < 1000; i++) // 用循环模拟延时 { display(count); } count++; // 更新计时器计数值 } else if (SW2 == 0) // 倒数计时 { switch (count) { case 0: display(0); break; case 1: display(1); break; case 2: display(2); break; case 3: display(3); break; case 4: display(4); break; case 5: display(5); break; case 6: display(6); break; case 7: display(7); break; case 8: display(8); break; case 9: display(9); break; default: break; } for (i = 0; i < 1000; i++) // 用循环模拟延时 { display(count); } count--; // 更新计时器计数值 } else // 显示空白 { display(10); } } } void timer_isr() interrupt 1 { TH0 = 0xFC; // 重置计时器计数值 TL0 = 0x18; } ``` 注意:以上代码仅为示例,具体实现需要根据实际情况进行调整。同时,如果需要实现不同的定时时间,需要根据具体情况调整定时器的计时时间和计数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值