上次说的多功能时钟代码如下,闹钟功能暂时还没有搞定。另外,直接对P0赋值来改变S1、S2、S3、S4的值的想法竟然在多模式下是无效的,这使得我昨天整整一个白天都在纠结原因,结果还是没有结果。今天上课的时候有时间再研究下吧。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit S1 = P1^3;
sbit S2 = P1^1;
sbit S3 = P1^2;
sbit S4 = P1^0;
sbit beep = P2^7; //蜂鸣器
sbit a = P0^0;
sbit b = P0^1;
sbit c = P0^2;
sbit d = P0^3;
sbit e = P0^4;
sbit f = P0^5;
sbit g = P0^6;
sbit p = P0^7;
sbit key1 = P1^4; //开始/暂停
sbit key2 = P1^5; //功能键
sbit key3 = P3^6;
sbit key4 = P3^7;
bit flag_add, flag_ring; //定义两个位变量
uchar icount, th, tl, mode;
uchar clock[5], stopwatch[5], tmp[5], alarm[2] = {0, 0};
uchar *point = clock;
uchar clockPosition = 3, alarmPosition = 0; //时钟设置模式下, 光标所在的位置; 默认在0
uchar clockTmp = 0, alarmTmp = 0; //用于时钟模式下临时计数
bit changeDisplay = 0, clockTmpBit = 0, alarmTmpBit = 0; //用于时钟模式下临时标志位
uchar code N[10] = {0xc0, 0xf9 ,0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //0-9数码管的编码(共阳极)
uchar code Z[10] = {0x40, 0x79 ,0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //0-9数码管的编码(共阳极), 带小数点
//延时函数, 针对12MHz时钟
void delayms(uint xms)
{
uint i,j;
for(i = xms; i > 0; i--)
for(j = 110; j > 0; j--);
}
void alarm_ring() //蜂鸣器报警声音
{
beep = 0;
delayms(100);
beep = 1;
}
uchar alarmtime()
{
uchar flag_alarm;
for(icount = 0; icount < 2; icount++)
{
if(alarm[icount] == clock[icount+3])
flag_alarm = 1;
else
{
flag_alarm = 0;
break;
}
}
return flag_alarm;
}
void setZero(uchar *p)
{
for(icount = 0; icount < 5; icount++)
p[icount] = 0;
}
void init()
{
TMOD = 0x11; //定时器1, 0 都工作方式1
th = 0xd8; //(65536-10000)/256 //定时10ms
tl = 0xf0; //(65536-10000)%256
TH0 = TH1 = th;
TL0 = TL1 = tl;
EA = 1; //打开总中断
ET0 = ET1 = 1; //允许定时器1, 0 中断请求
TR0 = 1; //时钟-定时器0
TR1 = 0; //秒表-定时器1
mode &