|
求助大神,現在這個單片機代碼只實現了計時和定時功能,就key 0,1, 2三個有用,我現在想實現key3(功能待定鍵)按下,就跳轉到自己設定規定時間,再按下key3又回到初始計時顯示,當計時到規定時間,蜂鳴器一直響。只有按下key4整個程序重新開始。以下就是代碼,求大家幫忙加點程序實現我這個功能,愿意送出我全部黑幣,萬分感謝!
#include<reg51.h>
#include"DS18B20.h"
#define uchar unsigned char
#define uint unsigned int
void delayms(uint xms); // Ñóê±oˉêy
void beep(); // ·äÃùÆ÷Ïì
void display(); // êyÂë1üÏÔê¾¼Æêy
void key_scan(); // ¼üÅìé¨Ãè
void timer_init(); // ÖD¶Ï3õê¼»ˉ
sbit key0 = P1^0; // μ÷êÔ¿ØÖư′¼ü
sbit key1 = P1^1; // Ôö¼ó°′¼ü
sbit key2 = P1^2; // ¼õD¡
sbit key3 = P1^3; // 1|Äü′y¶¨
sbit buzzer = P1^4; // ·äÃùÆ÷¶Ë¿ú
uchar tab[];
uchar code w[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20}; // êyÂë1üλѡ
// êyÂë1ü¶ÎÑ¡ 12òõ
/*
uchar code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; */
// 12ÑôêyÂë1ü¶ÎÂë±í
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x98,0x83,0xc6,0xa1,0x86,0x8e};
uchar count, set_place; // count óÃóú¶¨ê±Æ÷1sÖD¶Ï set_placeóÃóú¼ÆËã°′¼üμÄ′Îêy ±ãóúÑ¡Ôñμ÷½úÄÇ2¿·Öê±¼ä
uchar second = 0, minute = 0, hour = 0; //3õê¼»ˉ ê±¼ä
void main()
{
timer_init();
for(; ;)
{
key_scan();
display();
}
}
void beep()
{
buzzer = 1;
delayms(2);
buzzer = 0;
delayms(2);
}
// ¼üÅìé¨Ãèoˉêy
void key_scan()
{
if(key0 == 0)
{
delayms(5);
if(key0 == 0)
{
set_place++;
while(!key0);
beep();
if(set_place == 1) //°′ÏÂò»′Î Ôò¶¨ê±Æ÷ÖD¶Ï
{
TR0 = 0;
}
if(set_place == 4) // °′ÏÂá½′Î ¶¨ê±Æ÷′óéÏ′Î×′쬻ָ′1¤×÷
{
set_place = 0;
TR0 = 1;
}
}
}
if(set_place != 0)
{
if(key1 == 0)
{
delayms(5);
if(key1 == 0)
{
while(!key1); // °′¼üêí·Å
beep();
if(set_place == 1)
{
second++;
if(second == 60)
{
second = 0;
}
}
if(set_place == 2)
{
minute++;
if(minute == 60)
{
minute = 0;
}
}
if(set_place == 3)
{
hour++;
if(hour == 24)
{
hour = 0;
}
}
}
}
}
if(set_place != 0)
{
if(key2 == 0)
{
delayms(5);
if(key2 == 0)
{
while(!key2); // °′¼üêí·Å
beep();
if(set_place == 1)
{
second--;
if(second == -1)
{
second = 59;
}
}
if(set_place == 2)
{
minute--;
if(minute == -1)
{
minute = 59;
}
}
if(set_place == 3)
{
hour--;
if(hour == -1)
{
hour = 23;
}
}
}
}
}
}
// êyÂë1üÏÔê¾ê±¼ä
void display()
{
uchar j;
P2 = 0x01;
P0 = table[hour / 10];
j = 60;
while(j--);
P2 = 0x02;
P0 = table[hour % 10];
j = 60;
while(j--);
P2 = 0x04;
P0 = table[minute / 10];
j = 60;
while(j--);
P2 = 0x08;
P0 = table[minute % 10];
j = 60;
while(j--);
P2 = 0x10;
P0 = table[second / 10];
j = 60;
while(j--);
P2 = 0x20;
P0 = table[second % 10];
j = 60;
while(j--);
}
// ¶¨ê±Æ÷3õê¼»ˉ
void timer_init()
{
TMOD = 0x01; //¶¨ê±Æ÷T0 1¤×÷·½ê½1
TH0 = (65536 - 45872) / 256; // ×°3õÖμ 50ms
TL0 = (65536 - 45872) % 256;
EA = 1; //¿a·Å×üÖD¶Ï
ET0 = 1; //¿aÆô¶¨ê±Æ÷0ÖD¶Ï
TR0 = 1; //¿aÆô¶¨ê±Æ÷0
}
// 50msÖD¶Ï
void t0_timer() interrupt 1
{
TH0 = (65536 - 45872) / 256; // ×°3õÖμ ′Ëê±¾§ÕñÎa 11.0592MHz
TL0 = (65536 - 45872) % 256;
count++;
if(count == 20) //1s ê±¼äμ½
{
count = 0;
second++;
if(second == 60) // ÃëÎa60 Çåáã ·Ö½øò»
{
second = 0;
minute++;
if(minute == 60) // ·ÖÎa60 Çåáã ê±½øò»
{
minute = 0;
hour++;
if(hour == 24) // ê±Îa 24 Çåáã
{
hour =0;
}
}
}
}
}
void delayms(uint xms) // Ñóê±xms
{
uchar i, j;
for(i = xms; i > 0; i--) // ¸Ä±äxmsμÄÖμ ¿éòÔμ÷½úÑóê±ê±¼ä
for(j = 110; j > 0; j--);
}
|
|