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

📄 clock.c

📁 用51单片机内部定时器实现数字钟功能
💻 C
字号:
#include"reg51.h"
#define SELECT_LCD()	CS0=0; CS1=1; CS2=0
#define SELECT_NONE()	CS0=1; CS1=1; CS2=1
sbit LED=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;

sbit CS0 = P2^5 ;
sbit CS1 = P2^6 ;
sbit CS2 = P2^7 ;
sbit Lcd_RW = P2^4 ;
sbit Lcd_RS = P2^3 ;

typedef struct _data
 {
   unsigned char datah;
   unsigned char datal;
  }DATA2;

unsigned char data msecond,second,minute,hour;
bit flag;
DATA2 data tmp;
unsigned char clockstr[]="   00-00-00   ";


/*******************  函数声明 ********************/
void LcdWrite(unsigned char value , bit RS);
unsigned char LcdRead(bit RS);
void LcdWriteCmd(unsigned char value , unsigned char attrib);
void LcdWriteData(unsigned char value);
unsigned char LcdReadData();
void delay(unsigned int time); 
void LcdInit(void);
void LocateXY(char x , char y);
void PutChar(char x , char y , char value);
void PutStr(char x , char y , char* str);
//void dispaly(unsigned char next);

void display_minute();
void  display_second();

void VariableInit(void);
void Hex2Int(unsigned char hex);
unsigned char Hex2Ascii(unsigned char hex);
void TimerInit(void);

void LcdWrite(unsigned char value , bit RS)
{
	/* 1. 设置RS信号线 */
	Lcd_RS = RS ;
	/* 2. 设置RW信号线为读 */
	Lcd_RW = 0 ;
	/* 3. 设置LCD片选 */
	SELECT_LCD();
	/* 4. 通过P0端口写值 */
	P0 = value ;
	/* 5. 锁存 */
	SELECT_NONE();
}

/***************************************
说明: 	LCD读函数,完成LCD读操作的物理时序
RS:		0 - 写指令
		1 - 写数据
return:	读出的具体值
*****************************************/
unsigned char LcdRead(bit RS)
{
	unsigned char rt ;

	/* 1. 设置RS信号线 */
	Lcd_RS = RS ;
	/* 2. 设置RW信号线为读 */
	Lcd_RW = 1 ;
	/* 3. 释放P0口 */
	P0 = 0xff ;
	/* 4. 设置LCD片选 */
	SELECT_LCD();
	SELECT_LCD();
	SELECT_LCD();
	SELECT_LCD();
	/* 5. 通过P0端口读值 */
	rt = P0 ;
	/* 6. 锁存 */
	SELECT_NONE();

	return rt ;
}	

/***************************************
说明: 	LCD写指令
value:	写的具体值
attrib:	0 - 不检测忙信号
	   	1 - 监测忙信号
*****************************************/
void LcdWriteCmd(unsigned char value , unsigned char attrib)
{
	/* 监测忙状态 */
	if(attrib)
		while( LcdRead(0)&0x80 ) ;
	
	LcdWrite(value , 0);
 }

/***************************************
说明: 	LCD写数据
*****************************************/
void LcdWriteData(unsigned char value)
{
 	/* 监测忙状态 */
	while( LcdRead(0)&0x80 ) ;

	LcdWrite(value , 1);
}

/***************************************
说明: 	LCD读数据
*****************************************/
unsigned char LcdReadData()
{
	/* 监测忙状态 */
	while( LcdRead(0)&0x80 ) ;

	return LcdRead(1);
}


/***************************************
说明: 	LCD初始化函数,需要按照产品
        说明书完成
*****************************************/
void LcdInit(void)
{
	delay(800);

	/* 写指令0x38连续3次, 不检测忙信号*/
	LcdWriteCmd(0x38 , 0 );
	delay(10);

	LcdWriteCmd(0x38 , 0 );
	delay(10);

	LcdWriteCmd(0x38 , 0 );
	delay(10);

	/* 以后的读写操作均要判断忙信号 */
	LcdWriteCmd(0x38 , 1 );
	/* 先设置关屏 */
	LcdWriteCmd(0x08 , 1 );
	/* 清屏 */
	LcdWriteCmd(0x01 , 1 );
	/* 设置光标显示模式 */
	LcdWriteCmd(0x06 , 1 );
	/* 开屏并显示光标 */
	LcdWriteCmd(0x0c , 1 );
}

/***************************************
说明: 	设置光标定位
*****************************************/
void LocateXY(char x , char y)
{
	unsigned char temp;

	temp = x & 0xf;
	y &= 0x1;
	if ( y )temp |= 0x40;
	temp |= 0x80;
	LcdWriteCmd(temp,1);
}

/***************************************
说明: 	显示字符
x: 横坐标 y: 纵坐标
value: 显示的字符
*****************************************/
void PutChar(char x , char y , char value)
{
	LocateXY(x,y);
	LcdWriteData(value);
}

/***************************************
说明: 	显示字符串
*****************************************/
void PutStr(char x , char y , char* str)
{
	unsigned char i,len=0;
	/* 计算字符串长度 */
	while (str[len] >31)
		len++;
	
	/* 显示字符串 */
	for (i=0;i<len;i++) 
	{
		PutChar(x++,y,str[i]);
		if ( x == 16 )
		{
			x = 0; y ^= 1;
		}
	}
}

void delay(unsigned int time)     // time*0.5ms延时
{
   unsigned int i,j;

   for(j=0;j<time;j++)
     {
       for(i=0;i<60;i++)
       {;}
      }
}

void VariableInit()
{ 

  msecond=0;
  second=0;
  minute=0;
  hour=0;
  flag=0;
}

void Hex2Int(unsigned char hex)
{
 tmp.datah=hex/10;
 tmp.datal=hex%10;
}

unsigned char Hex2Ascii(unsigned char hex)
{
 if(hex>9)
    return' ';
 else
    return(hex+'0');
}

void TimerInit(void)
{
 TMOD=0x00;
 TH1=0x3c;
 TL1=0xb0;
 EA=1;
 ET1=1;
}

void timer(void) interrupt 3 using 2
{
 TH1=0x3c;
 TL1=0xb0;
 TF1=0;
 
 msecond++;
 if(msecond==148)
    {
      msecond=0;
      flag=1;
     }
 if(msecond<1)
    LED=0;
 else
    LED=1; 
}

void main()
{
  VariableInit();
  TimerInit();
  LcdInit();
 
  PutStr(0,0,"BEJING CLOCK");

  PutStr(0,1,clockstr);
//  delay(100);
 
  TR1=1;
  EA=1;
  
  while(1)
   { 
     if(flag==1)
        {
          second++;
          if(second!=60)
             {
              goto display_second;
             }
          else
             {
               second=0;
               minute++;
               if(minute!=60)
                  {
                   goto display_minute;
                  }
                else
                   {
                     minute=0;
                     hour++;
                     if(hour==24)
                        hour=0;
                   }
              }
              Hex2Int(hour);
              clockstr[3]=Hex2Ascii(tmp.datah);
              clockstr[4]=Hex2Ascii(tmp.datal);
    display_minute:
	               P11=0;
                   Hex2Int(minute);
                   clockstr[6]=Hex2Ascii(tmp.datah);
                   clockstr[7]=Hex2Ascii(tmp.datal);

    display_second:
	               
                   Hex2Int(second);
                   clockstr[9]=Hex2Ascii(tmp.datah);
                   clockstr[10]=Hex2Ascii(tmp.datal);                                
                   PutStr(0,1,clockstr);
                   flag=0;
           }
     }     
}
                                  
 

⌨️ 快捷键说明

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