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

📄 4key电子钟1602.c

📁 51_DEMO测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg51.h>
#include<intrins.h>
#include<stdio.h>
#include<string.h>
#define UN  unsigned char
//变量类型标识的宏定义,大家都喜欢这么做
#define Uchar unsigned char
#define Uint unsigned int
#define HW1 0
#define HW2 1
#define LW1 0
#define LW2 1
#define LW3 2
#define LW4 3
#define LW5 4
#define LW6 5
#define LW7 6
#define LW8 7
#define LW9 8
#define LW10 9
#define LW11 10
#define LW12 11
#define LW13 12
#define LW14 13
#define LW15 14
#define LW16 15

// 控制引脚定义,不同的连接必须修改的部分
sbit RS=P2^5;
sbit RW=P2^6;
sbit Elcm=P2^7;
sbit leden=P3^7;
#define DataPort P0 // 数据端口
#define Busy 0x80
void d2ms();
void d1ms();
void d70ms();
void memory(UN f,UN x);
UN rout(UN x);
UN  raddr();
 void waddr();
UN rdby();
void wrby(UN x);
void start();
void stop();
void  ask();
void w8addr(UN x);
void dislsd();
static bit dsb;
static bit dsbk;
static bit nzb;
static bit tiaob;
//sbit Elcm=P2^7;
sbit eclk=P3^3;
sbit esda=P3^4;
sbit yin=P3^2;
sbit led=P0^7;

sbit tkey=P1^4;
sbit mkey=P1^5;
sbit gkey=P1^6;
sbit esckey=P1^7;
sbit nzled=P2^0;
sbit  lsledcs=P3^7;
static unsigned int data  m250us;
static UN data  m_sec;
static UN data  m_min;
static UN data  m_hour;
static UN data  xx,hh,minb;
sbit    ACC0=ACC^0;
sbit    ACC1=ACC^1;
sbit    ACC2=ACC^2;
sbit    ACC3=ACC^3;
sbit    ACC4=ACC^4;
sbit    ACC5=ACC^5;
sbit    ACC6=ACC^6;
sbit    ACC7=ACC^7;
UN keytab();
void csf();
void keycl(UN x);
void distime(UN h,m);
void discd(hh);
void keyv(UN pu1,pu2);
void zly();
void txchar(Uchar x,Uchar y, Uchar n[]);

/*===================================================================

KS0070(44780) 16x2 字符液晶屏驱动演示程序
=====================================================================
连接线图: LCM-------51 LCM-------51 LCM--------51
DB0-----P2.0 DB4-----P2.4 RS-------P3.7
DB1-----P2.1 DB5-----P2.5 RW-------P3.6
DB2-----P2.2 DB6-----P2.6 E--------P3.5
DB3-----P2.3 DB7-----P2.7  V0接1K2电阻到GND

[注]:AT89C51的晶振频率为12MHz
====================================================================*/






void Delay400Ms(void);
void Delay5Ms(void);
void WaitForEnable( void );
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdReset( void );
void Display( Uchar dd );
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void ePutstr(Uchar x,Uchar y, Uchar code *ptr);




UN code discode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
UN code keycode[]={0x00,0xe0,0xd0,0xb0,0x70};
UN data nztab[40];
//UN code addr24c[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
//                   19,20,21,22,23,24,25,26,27,28,29,30,31,
//#################################################
    main()
 {      unsigned char  a;


 	csf();


while(1)                {
while(1)
     {

 	a=0;
       while (a==0)
 	{       //dsbk=dsb;
 	         Elcm=0;
 	        discd(hh);
 		//dislsd();

 	 	//if(dsbk!=dsb){SBUF=m_hour;while(TI==0){;}TI=0; SBUF=m_min;while(TI==0){;}TI=0;}
 		a=keytab();}
/*开定时器0中断,重赋初值后开始发送*/

        keycl(a);
     }                   }
}
//#################################################
void dscl()
{UN dd1=0;
	if(nzled==0&&minb==1)
	 {
	  do{dd1++;if((nztab[dd1*2-1]==m_hour)&&(nztab[dd1*2]==m_min)){zly();minb=0;dd1=18;}
	     }
	     while(dd1!=18);
 	  }
}
//####################################################
UN keytab()
{UN k;
	P2=0xff;
	if((P2&0xf0)==0xf0){return(0);}
        d70ms();
        P2=0xff;
        if((P2&0xf0)==0xf0){return(0);}
        k=0;
        do{k++;if((P1&0xf0)==keycode[k]){return(k);}}
        while(k<4);
Elcm=0;P2=0xff;return(0);}
//#######################################################
void keycl(UN x)
{ switch(x)
        {case 1:if(hh==19){nzled=!nzled;tiaob=0;hh=0xff;}
                 else if(hh<19){tiaob=1;}
                 else{;}
                 break;
         case 2:if(hh==19){nzled=!nzled;tiaob=0;hh=0xff;}
                 else if(hh<19){tiaob=1;}
                 else{;}
                 break;
         case 3:hh++;if(hh==20){hh=0;}
               ;break;
         case 4:tiaob=0;hh=0xff;
               ;break;

        }
}
//###################根据hh的值显示时间或功能入号#####################################
void discd(hh)
{UN x,y,ht,mt;

    if(hh==0xff)    {distime(m_hour,m_min);}
////////////////////////////////////////////////////////////////////
 else if(hh==0)
     { if(tiaob==0)
    	          { P1=0xff;P0=0x77;P1=0xfe;d1ms();
	            P1=0xff;P0=0x77;P1=0xfd;d1ms();
	            P1=0xff;P0=0x77;P1=0xfb;d1ms();
	            P1=0xff;P0=0x77;P1=0xf7;d1ms();}
       else{        ht=12;mt=0;
	              do{ do{distime(ht,mt);x=keytab();}while(x==0);keyv(3,50);
	                    switch(x)
	                     {case 1:ht++;if(ht==24){ht=0;}distime(ht,mt);break;
	                      case 2:mt++;if(mt==60){mt=0;}distime(ht,mt);break;
	                      case 3:m_hour=ht;m_min=mt;m_sec=0;m250us=0;TH0=6;TL0=6;
	                             hh=0xff;
	                             break;
                              case 4:hh=0xff;break;}
	                  }
	              while(hh!=0xff);
	              tiaob=0;keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);
	    }
      }
else if((hh<10)&&(hh>0))
   {if(tiaob==0)
               {P1=0xff;P0=0x8e;P1=0xfe;d1ms();
	        P1=0xff;P0=0xf9;P1=0xfd;d1ms();
	        P1=0xff;P0=0xbf;P1=0xfb;d1ms();
	        P1=0xff;P0=discode[hh];P1=0xfe;d1ms();}

	else{ht=12;mt=0;
	              do{   do{distime(ht,mt);x=keytab();}while(x==0);keyv(3,50);
	                    switch(x)
	                     {case 1:ht++;if(ht==24){ht=0;}distime(ht,mt);break;
	                      case 2:mt++;if(mt==60){mt=0;}distime(ht,mt);break;
	                      case 3:memory((hh*2)-1,ht);memory(hh*2,mt);
	                             nztab[(hh*2)-1]=ht;nztab[hh*2]=mt;
	                             hh=0xff;break;
	                      case 4:hh=0xff;break;}
	                  }
	              while(hh!=0xff);
	              tiaob=0;keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);
       }

    }
///////////////////////////////////////////////////////////////////////////////////////
   else{
     	if(tiaob==0)
     	     {  P1=0xff;P0=0x8e;P1=0xfe;d1ms();
	              P1=0xff;P0=0xa4;P1=0xfd;d1ms();
	              P1=0xff;P0=0xbf;P1=0xfb;d1ms();
	              P1=0xff;P0=discode[hh-9];P1=0xfe;d1ms();}
	else{ht=12;mt=0;
	              do{   do{distime(ht,mt);x=keytab();}while(x==0);keyv(3,50);
	                 switch(x)
	                     {case 1:ht++;if(ht==24){ht=0;}distime(ht,mt);break;
	                      case 2:mt++;if(mt==60){mt=0;}distime(ht,mt);break;
	                      case 3:memory((hh*2)-1,ht);memory(hh*2,mt);
	                             nztab[(hh*2)-1]=ht;nztab[hh*2]=mt;
	                             hh=0xff;
	                             break;
                              case 4:hh=0xff;break;}
	                  }
	              while(hh!=0xff);
	              tiaob=0;keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);
	    }



       }
}
 //###################################################################
void csf()
{ UN i;
       //eclk=0;
       yin=1;
       dsb=0;
       TMOD=2;
       TH0=6;
       TL0=6;
       TR0=1;
       ET0=1;
       hh=0xff;
       xx=0;
       minb=0;
       nzled=0;EA=1;
      // i=0;
      // do{i++;
      // nztab[i]=rout(i);}
      // while(i!=40);
       /*T2CON=0x30;
 	RCAP2H=0xff;
 	RCAP2L=0xd9;
 	TH2=0xff;
        TL2=0xd9;
        SCON=0x50;
        TR2=1;
        //ES=1;*/
       m_hour=12;m_min=58;
       Elcm=0;
       //Uchar temp;
P0=0xff;
//leden=0;
//leden=0;
P0=0xff;
P0=0x55;
//Delay400Ms();

LcdReset();
//Delay400Ms();Delay400Ms();
//temp = 32;
//ePutstr(0,0,exampl); // 上面一行显示一个预定字符串
//ePutstr(0,1,exampl);

//DispOneChar(0,0,0x02);
//DispOneChar(1,0,0x42);
//DispOneChar(2,0,0x43);
//DispOneChar(0,1,0x41);
//txchar(0,0,"  WWW.QLMCU.COM");
//txchar(0,1,"  0595-22313231");
//txchar(LW2,HW1,"WWW.QLMCU.COM 0595-22313231");
txchar(LW2,HW1,"WWW.QLMCU.COM");
txchar(LW2,HW2,"0595-22313231");
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
 Elcm=0;

       zly();

}


 /*##############################################*/
/* 定时器0中断*/
 void time0() interrupt 1 using 1
 {
      	m250us++;
      	xx++;
    if(m250us==2000){dsb=!dsb;}
    if(m250us==4000)
     {   //led=!led;
         m250us=0;
         //dsb=1;
         dsb=!dsb;
         m_sec++;
          if(m_sec==60)
            {m_sec=0;m_min++;minb=1;
               if(m_min==60)
                  {m_min=0;m_hour++;
                   if(m_hour==24)
                     {m_hour=0;m_min=0;m_sec=0;
                     }
                  }
             }
     }
 }
/*24c256 ask  */
 /*###################################*/
/*24c256 ask  */
void  ask()
    {
    	unsigned int i=0xffff;
    	esda=1;_nop_();eclk=1;_nop_();
    	do
    	{i--;
    	if(esda!=1)
    	   {eclk=0;i=0;}
    	 }
    	 while(i!=0);
       }
/*###################################*/
void stop()
 {
 	  eclk=0; _nop_();
 	  esda=0; _nop_();
 	  eclk=1; _nop_();
 	  esda=1;_nop_();
 	  eclk=0;_nop_();
 	  }
/*  */
/*###################################*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -