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

📄 yejingshizhong.c

📁 一个可调小时分钟的数字钟系统
💻 C
字号:
#include <reg51.h>
#include "intrins.h"
#include "absacc.h"

sbit RS=P2^0;
sbit RW=P2^1;
sbit E   = P2^2;
sbit PSB = P2^3;
sbit RST = P2^4;
sbit key1= P2^5;
sbit tiaoh=P2^6;
sbit tiaom=P2^7;
sbit P37=P3^7;

unsigned char dispbuf[8]={0,0,10,0,0,10,0,0};
unsigned char flag;
unsigned char second;
unsigned char minite;
unsigned char hour;
unsigned int tcnt;
unsigned char z;
unsigned int tcnt1;
unsigned char scnt1;
unsigned char y;

void delay10ms(void) 
{
   char i,j; 
  for(i=20;i>0;i--) 
  for(j=248;j>0;j--);
  }  
void delay_10us( unsigned char x )
{
     while( x-- );	  
}
void delay_ms( unsigned char cnt ) 
{ 
     unsigned char i; 
     do{ 
            i = 4; 
            do{ 
                   delay_10us(39); 
               } while(--i); 
        } while( --cnt ); 
} 
void smNop(void)
{
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}

void check_busy(void)
{
 P1=0xff;
 RS=0;
 RW=1;
 while(1)
 {smNop();
  E=1;
  smNop();
  if(P1<0x80)
     break;
  smNop();
  E=0; 
   }
 E=0;
 }

void send_com(const unsigned char command) 
{ 
     check_busy(); 
     RS = 0; 
     RW = 0;	 
	 P1 = command; 
     E  = 1; 
     smNop(); 
     E = 0; 
}

void send_com_init(const unsigned char command_init ) 
{ 
     RS    = 0; 
     RW    = 0;
	 P1    = command_init; 
     E     = 1; 
     smNop();
     E     = 0; 
}

void send_data(const unsigned char data_a)
{ 
     check_busy(); 
     RS    = 1; 		//DB7-DB0为显示数据
     RW    = 0; 	    //写入数据
	 P1    = data_a; 
     E     = 1; 	
     smNop();
     E     = 0; 			//下降沿
}

void initial_LCD(void) 
{   
     PSB = 1; 	//水平显示
     RST = 0;   //复位 
     _nop_(); 
     _nop_(); 
     RST = 1;   //不复位
     _nop_(); 
     delay_10us(10); 
     send_com_init(0x30);//30H--基本指令操作 
     delay_10us(4); 
     send_com_init(0x0c);//开显示,关光标,不闪烁。 
     delay_10us(10); 
     send_com_init(0x01);//清除显示 
     delay_ms(10); 
     send_com_init(0x06);//指定在资料写入或读取时,光标的移动方向,DDRAM的地址计数器(AC)加1。     
}

void Display_num( unsigned char *ptr, unsigned char line, unsigned char col, unsigned char i1 )
{    
     unsigned char ddram = 0x00;

	 if(line == 1)
	 	ddram = 0x80;
	 if(line == 2)
	 	ddram = 0x90;
	 if(line == 3)
	 	ddram = 0x88;
	 if(line == 4)
	    ddram = 0x98;

     ddram = ddram + col - 1;

     send_com( ddram );  //定位显示起始地址

	 send_data( ptr[i1] );//输出单个字符 
     		  
}

void Display_ch( unsigned char *ptr, unsigned char line, unsigned char col, unsigned char length )
{

	 unsigned char ddram = 0x00;
	 unsigned char i1;
	 if(line == 1)
	 	ddram = 0x80;
	 if(line == 2)
	 	ddram = 0x90;
	 if(line == 3)
	 	ddram = 0x88;
	 if(line == 4)
	    ddram = 0x98;

	 ddram = ddram + col - 1;
     send_com( ddram );   //定位显示起始地址
   	 for( i1 = 0;i1 < length;i1 ++ )
	 {
 		 send_data(ptr[i1*2]);//输出单个字符
		 send_data(ptr[i1*2+1]); 
     }		  
}

const unsigned char code suc[]=
{  "智能闹钟"
 };
 const unsigned char code shuzhi[]={
   "0123456789 "};

  void main()
 {TMOD=0x22;
  TH1=0x06;
  TL1=0x06;
  ET1=1;
  EA=1; 
  TH0=0x06; 
  TL0=0x06;  
  ET0=1; 
  EA=1;
  TR0=1;
  initial_LCD();
  Display_ch(suc,1,3,4);
  while(1)
    {
	 if(tiaoh==0)
	   {delay10ms();
	    if(tiaoh==0)
		  {hour++;
		   if(hour==24)
		      hour=0;
			dispbuf[0]=hour/10;
			dispbuf[1]=hour%10;
			while(tiaoh==0);
			}
	   }
	 if(tiaom==0)
	    {delay10ms();
		 if(tiaom==0)
		   {minite++;
		    if(minite==60)
			   minite=0;
			dispbuf[3]=minite/10;
			dispbuf[4]=minite%10;
			while(tiaom==0);
		    }
		   }
     if(flag==1)
	   {flag=0;
		send_com(0x90);
		for(y=0;y<8;y++)
		   {send_data( shuzhi[dispbuf[y]] );}
		if(dispbuf[3]==5&&dispbuf[4]==9&&dispbuf[6]==5)
	       TR1=1;
		 }
	    
	 }    
  }

void t0(void) interrupt 1 using 0 
{ 
  tcnt++; 
  if(tcnt==4000) 
    { 
      tcnt=0;
	  flag=1; 
      second++; 
      if(second==60) 
        { 
          second=0; 
          minite++; 
          if(minite==60) 
            { 
              minite=0; 
              hour++; 
              if(hour==24) 
                { 
                 hour=0; 
                } 
            } 
        } 
      dispbuf[7]=second%10; 
      dispbuf[6]=second/10; 
      dispbuf[4]=minite%10; 
      dispbuf[3]=minite/10; 
      dispbuf[1]=hour%10; 
      dispbuf[0]=hour/10; 
    }
}

void t1(void) interrupt 3 using	1
{
 scnt1++;
 if(scnt1==4)
   {scnt1=0;
   P37=~P37;}
 tcnt1++;
 if(tcnt1==800)
    {TR1=0;
	 P37=0;}
 }

⌨️ 快捷键说明

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