久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3182|回復: 0
打印 上一主題 下一主題
收起左側

單片機4x4鍵盤,數碼管顯示時間,鬧鐘設置 Proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


*鍵時鐘和鬧鐘光標
#鍵用于控制鬧鐘和時鐘切換
A/B/C/D鍵預留,暫時控制LED2燈
數字鍵用于設置鬧鐘和時鐘時間

單片機源程序如下:
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int


unsigned char ReturnKeyValue=0;
unsigned char KeyN=0;

#define WE8 0xfe
#define WE7 0xfd
#define WE6 0xfb
#define WE5 0xf7
#define WE4 0xef
#define WE3 0xdf
#define WE2        0xbf
#define WE1 0x7f


//sbit dula = P2^6;
//sbit wela = P2^7;

sbit BEEP =P3^0;
sbit LED1 =P3^2;
sbit LED2 = P3^3;

unsigned char CurrentSec_ge=0;
unsigned char CurrentSec_shi=0;
unsigned char CurrentMin_ge=0;
unsigned char CurrentMin_shi=0;
unsigned char CurrentHour_ge=0;
unsigned char CurrentHour_shi=0;


unsigned char SetClockSec_ge=0;
unsigned char SetClockSec_shi=0;
unsigned char SetClockMin_ge=0;
unsigned char SetClockMin_shi=0;
unsigned char SetClockHour_ge=0;
unsigned char SetClockHour_shi=0;

unsigned char ChangeTimeCount =0;
uint TimeKCount         =0;
uint TimeGCount  =0;
uint TimeKflag   =0;
uint num = 0;
uint flag;
uint cflag;

uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code table1[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x80};

uint rsec = 0, rmin = 0, rhour = 0;
uint csec = 0, cmin = 1, chour = 0;

void clock();
void delay(uint z);
void displaysec(uint sec);
void displaymin(uint min);
void displayhour(uint hour);

unsigned char AlarmTimeCount =0;

void Alarmclock()
{
        if(rsec == csec && rmin == cmin && rhour == chour)
        {
      BEEP =0;
      LED1 =0;
          AlarmTimeCount=200;
        }
}
void delay(uint z)
{
        uint x,y;
        for(x=0;x<z;x++)
                for(y=0;y<110;y++);
}

void displaysec(uint sec)
{  
        P2 = WE1;
        if((KeyN==1)||(KeyN==7))
        {
                if(TimeKflag==1)
                {
                          P0 = 0xff;
                }
                else
                {
                           P0 = table[sec%10];
                }
        }
        else
        {
                  P0 = table[sec%10];
        }
        delay(3);
        P2 = WE2;
        if((KeyN==2)||(KeyN==8))
        {
        if(TimeKflag==1)
        {
                  P0 = 0xff;
        }
        else
        {
        P0 = table[sec/10];
        }
        }
        else
        {
          P0 = table[sec/10];
        }
        delay(3);
        P2 = WE3;
        P0 = 0xBF;
        delay(3);
        
}
void displaymin(uint min)
{

         P2 = WE4;
         if((KeyN==3)||(KeyN==9))
        {
                if(TimeKflag==1)
                {
                          P0 = 0xff;
                }
                else
                {
                            P0 = table[min%10]- 0x80;
                }
        }
        else
        {
                   P0 = table[min%10]- 0x80;
        }

        delay(5);
        P2 = WE5;
         if((KeyN==4)||(KeyN==10))
        {
                if(TimeKflag==1)
                {
                          P0 = 0xff;
                }
                else
                {
                                    P0 = table[min/10] ;
                }
        }
        else
        {
                           P0 = table[min/10] ;
        }

        delay(5);
        P2 = WE6;
        P0 = 0xBF;
        delay(3);
}


void displayhour(uint hour)
{
        P2 = WE7;
         if((KeyN==5) ||(KeyN==11))
        {
                if(TimeKflag==1)
                {
                          P0 = 0xff;
                }
                else
                {
                            P0 = table[hour%10] - 0x80;
                }
        }
        else
        {
                           P0 = table[hour%10] - 0x80;
        }
        
        delay(3);
        P2 = WE8;
        if((KeyN==6)||(KeyN==12))
        {
                if(TimeKflag==1)
                {
                          P0 = 0xff;
                }
                else
                {
                            P0 = table[hour/10];
                }
        }
        else
        {
                           P0 = table[hour/10];
        }
        
        delay(3);
}



  /****************************************************************************
函數功能:鍵盤掃描子程序
入口參數:
出口參數:
****************************************************************************/

unsigned char keyscan(void)
{  
         unsigned KeyValue =0;
        unsigned char n=0;

        //掃描第一行
        P1=0xfe;
        n=P1;
        n&=0xf0;
        if(n!=0xf0)
        {
                 P1=0xfe;
                 n=P1;
                 n&=0xf0;
                 if(n!=0xf0)
                {
                  delay(10);
                           switch(n)
                        {

                    case(0xe0):KeyValue=1;break;  //
                    case(0xd0):KeyValue=2;break;  //
                    case(0xb0):KeyValue=3;break;        //
                    case(0x70):KeyValue=13;break;        //
                    }
                   }
         }
        //掃描第二行
        P1=0xfd;
        n=P1;
        n&=0xf0;
        if(n!=0xf0)
        {
                  P1=0xfd;
                  n=P1;
                  n&=0xf0;
                  if(n!=0xf0)
                {
                    delay(10);
                          switch(n)
                        {
                        case(0xe0):KeyValue=4;break;          //
                    case(0xd0):KeyValue=5;break;         //         
                    case(0xb0):KeyValue=6;break;
                    case(0x70):KeyValue=14;break;
                    }
                   }
         }
        //掃描第三行
        P1=0xfb;
        n=P1;
        n&=0xf0;
        if(n!=0xf0)
        {

                  P1=0xfb;
                  n=P1;
                  n&=0xf0;
                  if(n!=0xf0)
                {
                delay(10);
                           switch(n)
                        {
                    case(0xe0):KeyValue=7;break;
                    case(0xd0):KeyValue=8;break;
                           case(0xb0):KeyValue=9;break;
                    case(0x70):KeyValue=15;break;
                    }
                   }
         }
        //掃描第四行
        P1=0xf7;
        n=P1;
        n&=0xf0;
        if(n!=0xf0)
        {
            
                  P1=0xf7;
                  n=P1;
                  n&=0xf0;
                  if(n!=0xf0)
                {
                   delay(10);
                           switch(n)
                        {
                    case(0xe0):KeyValue=11;break; //*鍵
                    case(0xd0):KeyValue=10;break; //0鍵
                    case(0xb0):KeyValue=12;break; //#鍵
                    case(0x70):KeyValue=16;break;
                    }
                   }
         }
        return         KeyValue;
}



void main ()
{
        EA = 1;
        ET1 = 1;
        TMOD = 0x10;
        TR1 = 1;
         TH1 = (65536-46071)/256;
        TL1 = (65536-46071)%256;

        KeyN=0;
        P1=0x0f;
               
        while(1)
        {        

            Alarmclock();
            ReturnKeyValue = keyscan();
        
                if(ReturnKeyValue!=0)
                {
                      delay(200);
                                switch(ReturnKeyValue)
                                {
                                
                                 case 11:
                                 {
                                    TimeKCount         =10;
                    TimeGCount  =0;
                    TimeKflag   =1;        
                                         KeyN++;
                                        if(KeyN>12)
                                        {
                                         KeyN=0;
                                        }
                                 }
                                 break;
                                 case 12:          //顯示鬧鐘時間
                                 {
                                    ChangeTimeCount++;
                                 }
                                 break;

                                  case 13:          // 沒用到 可以用于點亮指示燈
                                   case 14:          //
                                   case 15:          // 沒用到 可以用于點亮指示燈
                                   case 16:          //
                                 {
                                    LED2=~LED2;

                                 }
                                 break;
                                 

                                }
                if(ReturnKeyValue<=10)
                {
                 switch(KeyN)
                  {

                        case 1:
                                  if(ReturnKeyValue==10)
                                  {
                                   rsec=0;
                                   CurrentSec_ge =        0;
                                   }
                                   else
                                   {
                                   rsec =  ReturnKeyValue;
                                   CurrentSec_ge =        ReturnKeyValue;
                                   }

                                   
                        break;
                        case 2:
                                   if(ReturnKeyValue==10)
                                  {
                                   rsec=0*10+CurrentSec_ge;
                                   }
                                   else
                                   {
                                           if(ReturnKeyValue<6)
                                           {
                                            rsec =  ReturnKeyValue*10+CurrentSec_ge;
                                           }
                                   }

                        break;
                        case 3:
                                 
                                if(ReturnKeyValue==10)
                                 {
                                      rmin=0;
                                      CurrentMin_ge=0;
                                   }
                                   else
                                   {
                                      rmin =  ReturnKeyValue;
                                    CurrentMin_ge   =  ReturnKeyValue;
                                   }

                                 
                        break;
                        case 4:
                                          if(ReturnKeyValue==10)
                                   rmin=0*10+CurrentMin_ge;
                                   else
                                   {
                                           if(ReturnKeyValue<6)
                                           {
                                            rmin =  ReturnKeyValue*10+  CurrentMin_ge;
                                           }
                                   }

                        break;
                        case 5:
                                        if(ReturnKeyValue==10)
                                        {
                                     rhour=0;
                                     CurrentHour_ge=0;
                                   }
                                   else
                                   {
                                           //if(ReturnKeyValue<=4)
                                           {
                                            rhour =  ReturnKeyValue;
                                                CurrentHour_ge =  ReturnKeyValue;

                                           }
                                   }
                                   

                        break;
                        case 6:
                               if(ReturnKeyValue==10)
                                   {
                                     rhour=CurrentHour_ge;
                                   }
                                   else
                                   {
                                    if(ReturnKeyValue<=2)
                                           {
                                            
                                          
                                       if(CurrentHour_ge>=4)
                                                {
                                                  if(ReturnKeyValue<=1)
                                               rhour =  ReturnKeyValue*10+CurrentHour_ge;
                                                }
                                                else
                                                {
                                                  rhour =  ReturnKeyValue*10+CurrentHour_ge;
                                                }
                                           }
                                   }
                        break;

                                case 7:
                                  if(ReturnKeyValue==10)
                                  {
                                   csec=0;
                                   SetClockSec_ge =        0;
                                   }
                                   else
                                   {
                                   csec =  ReturnKeyValue;
                                   SetClockSec_ge =        ReturnKeyValue;
                                   }

                                   
                        break;
                        case 8:
                                   if(ReturnKeyValue==10)
                                  {
                                   csec=0*10+SetClockSec_ge;
                                   }
                                   else
                                   {
                                           if(ReturnKeyValue<6)
                                           {
                                            csec =  ReturnKeyValue*10+SetClockSec_ge;
                                           }
                                   }

                        break;
                        case 9:
                                 
                                         if(ReturnKeyValue==10)
                                         {
                                      cmin=0;
                                      SetClockMin_ge=0;
                                   }
                                   else
                                   {
                                   cmin =  ReturnKeyValue;
                                    SetClockMin_ge   =  ReturnKeyValue;
                                   }

                                 
                        break;
                        case 10:
                                          if(ReturnKeyValue==10)
                                   cmin=0*10+SetClockMin_ge;
                                   else
                                   {
                                           if(ReturnKeyValue<6)
                                           {
                                            cmin =  ReturnKeyValue*10+  SetClockMin_ge;
                                           }
                                   }

                        break;
                        case 11:
                                        if(ReturnKeyValue==10)
                                        {
                                     chour=0;
                                     SetClockHour_ge=0;
                                   }
                                   else
                                   {
                                           //if(ReturnKeyValue<=4)
                                           {
                                            chour =  ReturnKeyValue;
                                                SetClockHour_ge =  ReturnKeyValue;

                                           }
                                   }
                                   

                        break;
                        case 12:
                               if(ReturnKeyValue==10)
                                   {
                                     chour=SetClockHour_ge;
                                   }
                                   else
                                   {
                                    if(ReturnKeyValue<=2)
                                           {
                                            
                                          
                                       if(SetClockHour_ge>=4)
                                                {
                                                  if(ReturnKeyValue<=1)
                                               chour =  ReturnKeyValue*10+SetClockHour_ge;
                                                }
                                                else
                                                {
                                                  chour =  ReturnKeyValue*10+SetClockHour_ge;
                                                }
                                           }
                                   }
                        break;


                  }
                 }        
            }
    }
}
余下篇幅文件里下 矩陣鍵盤數碼管鬧鐘.zip (165.79 KB, 下載次數: 33)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美国产一区二区 | 99久久99 | 在线观看深夜视频 | www.久久国产精品 | 91秦先生艺校小琴 | 亚洲欧美一区二区三区国产精品 | 亚洲国产成人久久综合一区,久久久国产99 | 精品成人免费视频 | 亚洲天堂中文字幕 | 国产精品久久精品 | 亚洲精品国产精品国自产在线 | 国产91在线精品 | 亚洲手机在线 | 日韩成人免费视频 | 激情毛片| 成人国产精品久久久 | 久久久久久国产 | 欧美一区二区三区免费在线观看 | 成人av在线大片 | 日本一区二区三区四区 | 日日干干夜夜 | 在线观看中文字幕亚洲 | 91精品国产91久久久久久最新 | 日韩成人 | 91婷婷韩国欧美一区二区 | 精品一区二区三区在线视频 | 国产日韩欧美一区 | 亚洲欧美中文日韩在线v日本 | 国产精产国品一二三产区视频 | 欧美黄色性生活视频 | 亚洲婷婷一区 | 国产精品99久久久久久www | 欧美精品欧美精品系列 | 日韩高清一区二区 | 国产精品国产三级国产aⅴ中文 | 久久久www成人免费精品 | 韩日一区二区 | 日韩欧美在线视频观看 | 亚洲一区二区电影在线观看 | 欧美一级高潮片免费的 | 毛片视频免费观看 |