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

📄 gen_display.c

📁 基于NXP51单片机LPC932电子时钟的设计(致远公司学生用开发板)
💻 C
字号:
/**************** File:exp10c.c ***************************
*功能:取得随机数0-9,并依次组成8位号码,输出显示。
*说明:时间时钟,显示 时  分  秒  时间设置使用Key1 ~Key3
*	   将跳线器J2、J13、J16分加短接到LED_/CS、MOSI、SPICLK端;
*      通过跳线器J8、J9选择高频晶振6MHz
***************************************************************/
#include < reg935.h>
#define	uchar unsigned char
#define uint unsigned int 

uchar temp=0x00;
uchar j;
uchar key1_val=0;//key2_val=0,key3_val=0,key4_val=0;
uchar tenms=0x00,second=0,minute=0,hour=12; //时钟初始时间
uchar Buffer[6];
/* ZLG7289驱动定义 */
sbit ZLG7289_CS=P2^0;
sbit ZLG7289_CLK=P2^5;
sbit ZLG7289_DIO=P2^2;
/*按键管脚定义*/
sbit Key1=P0^0;
sbit Key2=P0^1;
sbit Key3=P0^2;
sbit Key4=P0^3;
//uchar temp2=0x00;
//按键定义
sbit  KEY1=P0^0;

//函数声明
void IO_init();
void TIM_init();
void ZLG7289_com(uchar dat);
void Delay_S(uchar );
void Delay_L(uint )	;
void Delay_TF0(uchar t);
void ZLG7289_SENDBYTE(uchar dat);
void ZLG7289_SENDDAT(uchar dat,uchar loc);
void TMdisplay();
void DCB_convert();
void Set_time();
/*函数定义*/
void IO_init()
{
	P0M1=0x00;	// 端口设置			Key1~key4
	P0M2=0x00;							 
	P2M1=0x00;	//spi
	P2M2=0x00;
}
void TIM_init()
{
	
	/*使用定时器0:工作在定时器状态十六位计数*/

	TMOD = (TMOD & 0xF0) | 0x01;       /* Set T/C0 Mode 用作定时器*/
	TH0=(65536-30000)/256;             /*中断设置初始化 */                  
	TL0=(65536-30000)%256; 
	ET0 = 1;                           /* T0中断分路开关*/
	TR0 = 1;                           /* T0开关TR0 */
	EA = 1; 
          
}
void ZLG7289_com(uchar dat)
{
    ZLG7289_CLK=0;
	ZLG7289_CS=0;
	ZLG7289_SENDBYTE(dat);	
	ZLG7289_CS=1;
}
/*us级短延时*/
void Delay_S(uchar n)
{
       uchar   j; 
       while(n>0) 
       { 
             for(j=0;j<20;j--); 
             n--; 
       } 
}
/*ms级短延时*/
void Delay_L(uint n)
{
	uint i,j;
	i=j=n;
	while(n>0)
	{
	 while(i>0)
	 {
	 	while(j>0)
		{
		j--;
		}
		i--;
	 }
	 n--;
	}
}
void Delay_TF0(uchar t)
{
	do
	{
		while(!TF0);	
	}while(--t);
}
void ZLG7289_SENDBYTE(uchar dat)
{ 
  uchar i;
  Delay_S(5);
  //ZLG7289_CS=0;						
  for (i=0; i<0x8; i++)
     { //ZLG7289_CLK=0;
    					
    if ( (dat&0x80)!=0 )ZLG7289_DIO=1;	//设置数据线
	  else ZLG7289_DIO=0;
	Delay_S(1);
	ZLG7289_CLK=1;	
	Delay_S(1);
	ZLG7289_CLK=0;				
	dat=dat<<1;					//移动数据
     }
  ZLG7289_DIO=0;
  //ZLG7289_CS=1;						//关闭
}

void ZLG7289_SENDDAT(uchar dat,uchar loc)
{
	ZLG7289_CLK=0;
	ZLG7289_CS=0;
	ZLG7289_SENDBYTE(loc);
	ZLG7289_SENDBYTE(dat);
	ZLG7289_CS=1;	
}

void TMdisplay()
{
	DCB_convert();
	//时
	ZLG7289_SENDDAT(Buffer[0],0x80);
	ZLG7289_SENDDAT(Buffer[1],0x81);
	ZLG7289_SENDDAT(0x0a,0x82);	     //"-"
	//分
	ZLG7289_SENDDAT(Buffer[2],0x83);
	ZLG7289_SENDDAT(Buffer[3],0x84);
	ZLG7289_SENDDAT(0x0a,0x85);      //"-"
	//秒
	ZLG7289_SENDDAT(Buffer[4],0x86);
	ZLG7289_SENDDAT(Buffer[5],0x87);
}
void DCB_convert()
{
	//时
	Buffer[1]=hour%10;
	Buffer[0]=hour/10;	
	//分
	Buffer[3]=minute%10;
	Buffer[2]=minute/10;
	//秒
	Buffer[5]=second%10;
	Buffer[4]=second/10;
}
void Set_time(void)
{
   while(Key1==0) 
     {
      //Delay_L(10);
	  Delay_TF0(1);
      if(Key1)
         { key1_val++; key1_val%=4;}
     }

	switch(key1_val)
	{
	case 0: 
		ZLG7289_SENDDAT(0xdf,0x88);
		break;
	case 1: 
	   if(Key2==0)
        {
         while(Key2==0) Delay_L(10); //Delay_L(10);
          hour++;
          hour%=24 ;
        }
       if(Key3==0)
         {
         while(Key3==0) Delay_L(10); //Delay_L(10);
          hour--;
          hour%=24 ;
        } 
		ZLG7289_SENDDAT(0xfc,0x88);
        break;

	case 2:
       if(Key2==0)
        {
         while(Key2==0) Delay_L(10); //Delay_L(10);
          minute++;
          minute%=60 ;
        }
       if(Key3==0)
         {
         while(Key3==0) Delay_L(10); //Delay_L(10);
          minute--;
          minute%=60 ;
          
         }
        ZLG7289_SENDDAT(0xe7,0x88);
	    break;
	case 3:
		if(Key2==0)
        {
         while(Key2==0)Delay_L(10); //Delay_L(10);
          second++;
          second%=60 ;
        }
        if(Key3==0)
         {
         while(Key3==0) Delay_L(10);//Delay_L(10);
          second--;
          second%=60 ;
          
         }
        ZLG7289_SENDDAT(0x3f,0x88);
	    break;
	 
    default:break;
    }
}
/*********************************************************************/
/*函数:timer0_ISR(void)中断服务程序 
/*功能:tenms 记时  (second , minute , hour )                                              */
/*********************************************************************/
void timer0_ISR (void) interrupt 1 using 1
{
  tenms++;   
  TH0=(65536-30000)/256;           //中断设置初始化                   
  TL0=(65536-30000)%256;       
 //                               
 if(tenms>=100)              //满1秒
 {  
    tenms=0;                     //秒数加1
  if(++second>=60)          //满1分
    {
     second=0;                   //分数加1,秒数归零 
   if(++minute>=60)              //满1小时
    {
     minute=0;                   //小时数加1,分数归零
   if(++hour>=24) 
    {  hour=0;}
    }
    }
  }
}
void main()
{
  IO_init();
  ZLG7289_com(0xa4);
  TIM_init();           //定时器初始设置
 // ZLG7289_SENDDAT(0xdf,0x88);
  while(1)
  {
	  TMdisplay();
	  Set_time();
	  Delay_L(100);	
  }
}

⌨️ 快捷键说明

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