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

📄 1602+定时器.c

📁 74hc164键盘显示 红外控制DS1302 超级IO扫描 12864+遥控解码 1602+定时器 LCD1602+自定义图形
💻 C
字号:
#include<reg5122.h>
#include<intrins.h>
#define uchar unsigned char
#define uint   unsigned int

sbit T_CLK=P1^5;
sbit T_IO =P1^6;
sbit T_RST=P1^7;

sbit CLK1=P2^0;
sbit DAT1=P2^1;
sbit CLK2=P3^6;
sbit DAT2=P3^7;
sbit xuan1=P2^2;
sbit xuan2=P3^4;

sbit ACC0=ACC^0;
sbit ACC7=ACC^7;

//************ lm016  ************************
sbit LCM_RS=P2^3;
sbit LCM_RW=P2^4;
sbit LCM_EN=P2^5;

#define BUSY  0x80             	     //LCD1602 中的宏定义
#define DATAPORT P0	
								  
uchar code table[]={"0123456789 "};
uchar code str0[]={"HuNan KeJi DaXue"};
uchar code str1[]={"ShiJian 12:55:50"};

/**************函数声明*************************/
void delay(uint);
void WriteCommandLCM(uchar WCLCM,uchar BusyC);
void WriteDataLCM(uchar WDLCM);
void lcd_wait(void);
void initLCM(void);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void DisplayListChar(uchar X,uchar Y,uchar  *DData);

unsigned char keyscan(void);


/*********延时K*1ms,12.000mhz**********/
void delay(uint k)
{
    uchar j;
    for(;k>0;k--)   
    for(j=0;j<125;j++);  
}  
  
/**********写指令到ICM子函数************/
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
    if(BusyC)lcd_wait();
	DATAPORT=WCLCM;
    LCM_RS=0;                   // 选中指令寄存器
    LCM_RW=0;               	// 写模式	
    LCM_EN=1;    
	_nop_();   
	_nop_();
	_nop_(); 
    LCM_EN=0; 
}


/**********写数据到LCM子函数************/
void WriteDataLCM(uchar WDLCM)
{ 
    lcd_wait( );            //检测忙信号    
	DATAPORT=WDLCM;
    LCM_RS=1;               // 选中数据寄存器
    LCM_RW=0;           	// 写模式
    LCM_EN=1;
    _nop_();
	_nop_();
	_nop_();
    LCM_EN=0;
}


/***********lcm内部等待函数*************/
void lcd_wait(void)
{
    DATAPORT=0xff;	     //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
	LCM_EN=1;
    LCM_RS=0;   			
    LCM_RW=1;   			
    _nop_();
    _nop_();
	_nop_();
    while(DATAPORT&BUSY)
	{  LCM_EN=0;
	   _nop_();
	   _nop_();
	   LCM_EN=1;
	   _nop_();
	   _nop_();
	   }
   	LCM_EN=0;	
}


/**********LCM初始化子函数***********/
void initLCM(void )
{   
	DATAPORT=0;	
	delay(15);
	WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号
    delay(5); 
    WriteCommandLCM(0x38,0);
    delay(5); 
    WriteCommandLCM(0x38,0);
    delay(5); 

    WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
    WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号
    WriteCommandLCM(0x01,1);    //清屏,检测忙信号
    WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号
    WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
}


/****显示指定坐标的一个字符子函数****/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
    Y&=1;
    X&=15;
    if(Y)X|=0x40;               //若y为1(显示第二行),地址码+0X40
    X|=0x80;                    //指令码为地址码+0X80
    WriteCommandLCM(X,0);
    WriteDataLCM(DData);
}


/*******显示指定坐标的一串字符子函数*****/ 
void DisplayListChar(uchar X,uchar Y,uchar  *DData)
{
    uchar ListLength=0;
    Y&=0x01;
    X&=0x0f;
    while(X<16)
    {
        DisplayOneChar(X,Y,DData[ListLength]);
        ListLength++;
        X++;
    }
}

char hour=12,minute=55,second=50;
int tcount=0;
/******************the mian function***********************/
void main(void)
{  
   unsigned char  flag=0,keynumber=0;
   char d=-1;
   
   initLCM( );                 //液晶初始化	
   WriteCommandLCM(0x01,1);	   //清显示屏

   TMOD=0X01;
   TH0=15536/256;
   TL0=15536%256;
   TR0=1;
   ET0=1;
   EA=1;
   DisplayListChar(0,0,str0);
   DisplayListChar(0,1,str1); 
 
   while(1)
   {     
         keynumber=keyscan();
		 if(keynumber==1) //调时分秒
		  { 
		    flag=1;	 d++;   
			if(d==3)
            {
			 d=-1;flag=0;
			}
		  }
		  if(flag==1)    //闪烁
		  {  
		     DisplayOneChar(8+3*d ,1,' ');  
 	         DisplayOneChar(9+3*d ,1,' ');
			 delay(400);
			 if(d==0)
			 {
			    DisplayOneChar(8 ,1,table[hour/10]);  
 	            DisplayOneChar(9 ,1,table[hour%10]);
			 }
			 if(d==1)                                        
			 { 
			    DisplayOneChar(11,1,table[minute/10]);  
 	            DisplayOneChar(12,1,table[minute%10]);
	         }
			 if(d==2)                                         
			 { 
			    DisplayOneChar(14,1,table[second/10]);  
                DisplayOneChar(15,1,table[second%10]);
			 }   
		  }   
		  
		  if((keynumber==2)&&(flag==1))                   //加加 
		  {
		    if(d==0)                                      //时
			{ 
			  hour++;if(hour==24) hour=0;
			  DisplayOneChar(8 ,1,table[hour/10]);  
 	          DisplayOneChar(9 ,1,table[hour%10]);
			} 
    
			if(d==1)                                       //分
			{ 
			  minute++;if(minute==60) minute=0;
			  DisplayOneChar(11,1,table[minute/10]);  
 	          DisplayOneChar(12,1,table[minute%10]);
	        }
	 		if(d==2)                                        //秒	
			{ 
			  second++;if(second==60) second=0;
			  DisplayOneChar(14,1,table[second/10]);  
              DisplayOneChar(15,1,table[second%10]);
			}   
		  }

		 if((keynumber==3)&&(flag==1))    //减减
		  {
		    if(d==0)                              //时
			{ 
			  hour--;if(hour==-1) hour=23;
			  DisplayOneChar(14,1,table[second/10]);  
              DisplayOneChar(15,1,table[second%10]);
			}     
			if(d==1)                              //分
			{ 
			  minute--;if(minute==-1) minute=59;
			  DisplayOneChar(11,1,table[minute/10]);  
 	          DisplayOneChar(12,1,table[minute%10]);
			} 
			if(d==2)                             //秒
			{
			  second--;if(second==-1) second=59;
			  DisplayOneChar(14,1,table[second/10]);  
              DisplayOneChar(15,1,table[second%10]);
		    }	  
		  }
       delay(400);
   }
}

void t0(void) interrupt 1 using 0
{
  tcount++;
  if(tcount==20)
  {
    tcount=0;
    second++;
	DisplayOneChar(14,1,table[second/10]);  
    DisplayOneChar(15,1,table[second%10]);
    if(second==60)
    {
      second=0;
	  minute++;
	  DisplayOneChar(14,1,table[second/10]);  
      DisplayOneChar(15,1,table[second%10]);
	  DisplayOneChar(11,1,table[minute/10]);  
 	  DisplayOneChar(12,1,table[minute%10]);
      if(minute==60)
	  {
	    minute=0;
		hour++;
		DisplayOneChar(11,1,table[minute/10]);  
 	    DisplayOneChar(12,1,table[minute%10]);
		DisplayOneChar(8 ,1,table[hour/10]);  
 	    DisplayOneChar(9 ,1,table[hour%10]);
		if(hour==24)
		{
		  hour=0;
		  DisplayOneChar(8 ,1,table[hour/10]);  
 	      DisplayOneChar(9 ,1,table[hour%10]);
		}
	  }
	}                  
  }
  TH0=15536/256;
  TL0=15536%256;
}

unsigned char keyscan(void)
{
     unsigned char k,keynumber=0; 
     P3_0=0;
     P3_0=1;
     if(xuan1==0)
     {
	   delay(1); 
	   if(xuan1==0);
	   {
	     DAT1=1;
		 for(k=0;k<8;k++)
		 {
		   CLK1=0;
		   CLK1=1;
           
		   if(xuan1==1)
		   {
		     keynumber=k; break;
		   }
		   DAT1=0;		 
		 }
	   }
	 }
	
	 if(xuan2==0)
     {
	   delay(1);
	   if(xuan2==0);
	   {
	     DAT1=1;
		 for(k=0;k<8;k++)
		 { 
		   CLK1=0;
		   CLK1=1;
		   
		   if(xuan2==1)
		   {
		     keynumber=k+8; break;
		   }
		   DAT1=0;		   
		 }
	   }
     }	 
	 return keynumber;
}



 

⌨️ 快捷键说明

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