⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text1.c

📁 set(key6) left(key5) right(key4) up(key3) down(key2) OK(key1) 功能一:时钟 时钟计时; 按下set(一次)键即可调时间
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -