51单片机 抢答器

answerMachine.c

/****************************************************
    抢答器

    1.用键盘设定两位的计数值
    2.按回车键结束设定,并开始倒计时
    3.按下0-9的一位,表示抢答,停止计时,
    在数码管上显示选手的编号并通过串口
    将抢答选手的编号发送给上位机

****************************************************/
#include <reg52.h>
#include <stdio.h>
#include "utilities.h"

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

extern uchar T0RH;
extern uchar T0RL;
extern uchar LEDBuff[6];
extern uchar code LEDChar[];
extern void showNumber(ulong num);
//extern void LEDScan();
extern void keyScan();
extern void keyDriver();
extern void setTmr0Mod1(uint ms);
extern void setUART(uint baud);

ulong number = 0;
bit LEDLock = 1;
uchar RXDByte = 0;

void LEDScan() {
    static uchar i = 0;
    P0 = 0xFF;
    P1 = (P1 & 0xF8) | i;
    P0 = LEDBuff[i];
    if (i == 0)
        i = 1;
    else if (i == 1)
        i = 4;
    else
        i = 0;
}

void interruptTmr0() interrupt 1 {
    static uchar cnt = 0;
    static uint cnt1 = 0;		//!!!


    TH0 = T0RH;
    TL0 = T0RL;
    LEDScan();
    if (cnt == 1) {
        keyScan();
        cnt = 0;
    }
    else
        cnt++;

    if (LEDLock == 0) {
        if (cnt1 == 499) {
            if (number) {
                number--;
                showNumber(number);
            }
			cnt1 = 0; 		//!!!
        }
        else
            cnt1++;
    }
    else {
        cnt1 = 0;
    }
}

void keyAction(uchar keyCode) {
    static uchar stage = 0;

    if (keyCode >= 0x30 && keyCode <= 0x39) {
        if (stage == 0) {
            number = number * 10 + keyCode - 0x30;
            showNumber(number);
        }
        if (stage == 1) {
            number += (keyCode - 0x30) * 10000L;	//could be overflow uint
            showNumber(number);
			LEDLock = 1;
            stage = 2;
			setUART(9600);

			//RXDByte = keyCode - 0x30;
			//SBUF = RXDByte;
			ES = 0;
			TR1 = 1;
			TI = 1;
			putchar(keyCode);
			//if (TI == 1)
				TI = 0;
        }
    }
    else if (keyCode == 0x0D && stage == 0) {
        LEDLock = 0;
		stage = 1;
    }
    else if (keyCode == 0x1B && stage == 2) {
        number = 0;
        LEDLock = 1;
        stage = 0;
    }
    else {
        LEDLock = 1;
    }
}

void main() {
    EA = 1;
    ENLED = 0;
    ADDR3 = 1;
    setTmr0Mod1(2);
    TH0 = T0RH;
    TL0 = T0RL;
    ET0 = 1;
    TR0 = 1;
    LEDBuff[0] = LEDChar[0];
    while (1) {
        keyDriver();
    }
}






你可能感兴趣的:(51单片机 抢答器)