📄 text1.c
字号:
#include<reg51.h>
#define SET 0x20
#define LEFT 0x10
#define RIGHT 0x08
#define UP 0x04
#define DOWN 0x02
#define OK 0x01
#define DoubleSET 0x20 //键值
unsigned char sec,min,hour;
unsigned char code table[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管显示0~15所需码
sbit Ring=P2^4;//控制声音control ring
sbit DAT = P2^7;
sbit PL = P2^6;
sbit CLK = P2^5;
sbit P23=P2^3;
unsigned char pLED; //点灯用
unsigned char DispBuf[6]; //数据缓存器
unsigned char count;
bit xTim,xKey,Alarm; //走时,扫描按键,闹钟的标志位
unsigned char KeyVal; //扫描到的键值
unsigned char EditSec,EditMin,EditHour;//设定的时间
unsigned char AlarmSec,AlarmMin,AlarmHour;//设定的闹钟时间
unsigned char SetedAlarmSec,SetedAlarmMin,SetedAlarmHour;//已设定的闹钟时间
unsigned char CurKey,LastKey;//当前键值与上一次的键值
unsigned char KeySts,SetState;//判断与切换状态所用变量
unsigned char KeyPressed;//判断的键值
unsigned char p;//控制整点报时铃响时间的变量
void TimUpdate(void) //走时功能模块
{
//主函数中使用,作为整点报时声音停止的标志位
if(++sec==60)
{
sec = 0;
if(++min==60)
{
min = 0;
if(++hour == 24) hour = 0;
}
}
}
void DisplayTim() //将当前时间存入数据缓存器
{
DispBuf[0] = table[sec % 10];
DispBuf[1] = table[sec / 10];
DispBuf[2] = table[min % 10];
DispBuf[3] = table[min / 10];
DispBuf[4] = table[hour % 10];
DispBuf[5] = table[hour / 10];
}
void InitT0(void) //开启中断
{
pLED = 0;
xTim = 0;
count = 0;
TMOD = (TMOD & 0xF0) |0x01;
TH0 = 0xF1; // 1/240 s
TL0 = 0x00;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void T0Srv(void) interrupt 1 using 1 //中断服务程序
{
unsigned char i;
TH0 = 0xF1; // 1/240 s
P2 =(P2&0xF8)| pLED; //控制数码管
P0 = DispBuf[pLED]; //将数据赋给P0口显示
if(++pLED==6) pLED = 0; //循环点亮六位数码管
count++; //计数
if((count&0x03)==0) // 每4次中断16ms读一次按键
{
CLK = 0;
PL = 0; // Latch Key 锁存器打开
PL = 1;
KeyVal = 0;
for(i=0;i<8;i++)
{
KeyVal <<= 1;
if(!DAT) KeyVal |= 0x01; // 低电平检测
CLK = 1;
CLK = 0;
}
KeyVal &= 0x3F;
xKey = 1; // 发信号,表示读了一次按键
}
if(count==240) // 每240次中断发秒更新标志
{
count = 0;
xTim = 1;
Ring=1;
}
}
void DisplayEdit() //设定时间时的显示函数
{
DispBuf[0] = table[EditSec % 10];
DispBuf[1] = table[EditSec / 10];
DispBuf[2] = table[EditMin % 10];
DispBuf[3] = table[EditMin / 10];
DispBuf[4] = table[EditHour % 10];
DispBuf[5] = table[EditHour / 10];
DispBuf[5-KeySts] &= 0x7F;
} // 编辑期间的显示
void DisplayAlarm() //设定闹钟时的显示函数
{
DispBuf[0] = table[AlarmSec % 10];
DispBuf[1] = table[AlarmSec / 10];
DispBuf[2] = table[AlarmMin % 10];
DispBuf[3] = table[AlarmMin / 10];
DispBuf[4] = table[AlarmHour % 10];
DispBuf[5] = table[AlarmHour / 10];
DispBuf[5-KeySts] &= 0x7F;
} // 编辑期间的显示
void Copy1() //将设定好的时间赋给当前时间
{
sec =EditSec;
min =EditMin;
hour =EditHour;
} // 编辑值刷新当前时间
void Copy2() //将设定好的闹铃时间保存
{
SetedAlarmSec=AlarmSec;
SetedAlarmMin=AlarmMin;
SetedAlarmHour=AlarmHour;
}
void KeyPro(void) //按键功能模块
{
LastKey = CurKey;
CurKey = KeyVal;
KeyPressed = CurKey^LastKey;
if(KeyPressed==0) return; //检测键的变化
if(CurKey==0) return; // 键释放忽略
switch(SetState) //判断所要执行的功能
{
case 0: EditSec = sec;
EditMin = min;
EditHour = hour;
if(KeyPressed==SET) //准备进入设定时间功能
SetState++;
break;
case 1: { //设定时间功能
switch(KeySts)
{
case 0: // hourHi edit status;小时高位设置
switch(KeyPressed)
{
case DoubleSET :SetState++;KeySts=0; Copy1();break;//准备进入设定闹钟功能
case RIGHT: KeySts++; break;
case LEFT: KeySts+=5; break;
case UP: if(EditHour<13) EditHour += 10;
else EditHour = 23;
break;
case DOWN: if(EditHour>10) EditHour -= 10;
else EditHour = 0;
break;
case OK: Copy1();
SetState=0; KeySts=0;
break;
}
break;
case 1: // hourLo edit status;小时低位设置
switch(KeyPressed)
{
case DoubleSET :SetState++;KeySts=0; Copy1();break;//准备进入设定闹钟功能
case RIGHT: KeySts++;
break;
case LEFT: KeySts--;
break;
case UP: if(EditHour<23) EditHour++;
break;
case DOWN: if(EditHour>0) EditHour--;
break;
case OK: Copy1();
SetState=0; KeySts=0;
break;
}
break;
case 2: // minHi edit status;分时高位设置
switch(KeyPressed)
{
case DoubleSET :SetState++;KeySts=0; Copy1();break;//准备进入设定闹钟功能
case RIGHT: KeySts++;
break;
case LEFT: KeySts--;
break;
case UP: if(EditMin<49) EditMin+=10;
else EditMin = 59;
break;
case DOWN: if(EditMin>10) EditMin-=10;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -