12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)

eeleader-mcu   2010-8-23 16:02 楼主

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
void lcd_ini();
void ascii_change(void);
void delay();
void wri_add(uchar com);
void wri_dat(uchar com1);
void shan(void);
void disp();
void tkey(void);
sbit cs=P1^7;
sbit sid=P1^6;
sbit sclk=P1^5;
bit flag=1;
uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态  
uchar data clock[3]={23,45,12};
uchar code clockname[10]={"北京时间:"};  
uchar data num[6];

/*******主程序*************/
void main()
{
 lcd_ini();
 count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒
 TMOD=0x01;
 TL0=0XB0;
 TH0=0X3C;
 EA=1;
 ET0=1;
 IT0=1;
 EX0=1;
 TR0=1;
 while(1)
 {
 back:ascii_change();
 disp();
 delay();
 if(flag==1)
 goto back;
 tkey();
 shan();
 delay();
 }
}

/****lcd初始化*******/
 
void lcd_ini()
{

 wri_add(0x30);
 delay();

 wri_add(0x0c);
 delay();

 wri_add(0x01);
 delay();
 
 wri_add(0x06);
 delay();
}
 

/********定时程序*************/
 void timer1() interrupt 1 using 2
{
 TL0=0XB0;
 TH0=0X3C;
 count--;
 if(count==0)
 {
  count=10;
  clock[2]++;//秒//
  }
  else
  goto out;

  if(clock[2]==60)
  {
   clock[2]=0;
   clock[1]++;//分//
   }

  if(clock[1]==60)
  {
   clock[1]=0;
   clock[0]++;
   }
  
  if(clock[0]==24)//时//
  clock[0]=0;
  
  out:_nop_();
}

/*******十位个位转换成ASCII码************/
 void ascii_change(void)
 {
   num[5]=clock[2]-(clock[2]/10)*10+0x30;
   num[4]=clock[2]/10+0x30;
   num[3]=clock[1]-(clock[1]/10)*10+0x30;
   num[2]=clock[1]/10+0x30;
   num[1]=clock[0]-(clock[0]/10)*10+0x30;
   num[0]=clock[0]/10+0x30;
 }


 /********廷时程序*************/
  void delay()
{
  uchar i,j;
  for (i=250;i>0;i--)
  for (j=250;j>0;j--);

}
/*****Write address*********/
void wri_add(uchar com)
{
 uchar i,j,k;
 cs=0;
 cs=1;
 dat=0xf8;

 for(i=1;i<=8;i++)
 {
  sid=(bit)(dat&0x80);
  sclk=0;
  sclk=1;
  sclk=0;
  dat=dat<<1;
}
 dat=com;
 dat=dat&0xf0;
 for(j=1;j<=8;j++)
{
 sid=(bit)(dat&0x80);
  sclk=0;
  sclk=1;
  sclk=0;
  dat=dat<<1;
 }

 dat=com;
 dat=_cror_(dat,4);// 此为高低四位交换
 dat=dat&0xf0;

 for(k=1;k<=8;k++)
 {
  sid=(bit)(dat&0x80);
  sclk=0;
  sclk=1;
  sclk=0;
  dat=dat<<1;
  }
 
}

/*********Write data*************/
void wri_dat(uchar com1)
{
 uchar i,j,k;
 cs=0;
 cs=1;
 dat=0xfa;
 for(i=1;i<=8;i++)
 {
  sid=(bit)(dat&0x80);
  sclk=0;
  sclk=1;
  sclk=0;
  dat=dat<<1;
}

  dat=com1;
  dat=dat&0xf0;
  for(j=1;j<=8;j++)
{
  sid=(bit)(dat&0x80);
  sclk=0;
  sclk=1;
  sclk=0;
  dat=dat<<1;
 }

 dat=com1;
 dat=_cror_(dat,4);// 此为高低四位交换
 dat=dat&0xf0;

 for(k=1;k<=8;k++)
 {
  sid=(bit)(dat&0x80);
  sclk=0;
  sclk=1;
  sclk=0;
  dat=dat<<1;
  }
 }
         

 /******display program***********/
void disp()
{
 uchar i,k=0;
 wri_add(0x80);

 for (i=1;i<=9;i++)
 wri_dat(clockname[i-1]);

 wri_add(0x90);

 for (i=1;i<=6;i++)
 {
 k++;
 if(k==3||k==5)
 wri_dat(clockname[8]);//时间之间的冒号。
 wri_dat(num[i-1]);
 }
}

/*******闪烁程序*************************/
void shan(void)
{
 uchar i,k=0;
 wri_add(0x90);
 if(f==1)
 {
 num[0]=' ';
 num[1]=' ';
 }
 else
 goto next;
  for (i=1;i<=6;i++)
 {
 k++;
 if(k==3||k==5)
 wri_dat(clockname[8]);//时间之间的冒号。
 wri_dat(num[i-1]);
 }
goto return1;

next: if(f==2)
 {
 num[2]=' ';
 num[3]=' ';
 }
 else
 goto next1;
  for (i=1;i<=6;i++)
 {
 k++;
 if(k==3||k==5)
 wri_dat(clockname[8]);//时间之间的冒号。
 wri_dat(num[i-1]);
 }
goto return1;

next1: if(f==3)
 {
 num[4]=' ';
 num[5]=' ';
 }
 else
 goto return1;

  for (i=1;i<=6;i++)
 {
 k++;
 if(k==3||k==5)
 wri_dat(clockname[8]);//时间之间的冒号。
 wri_dat(num[i-1]);
 }
 return1:_nop_();

}  


 
/*******外部中断***********/
void intr0() interrupt 0 using 2
{
flag=~flag;//判断是否闪烁位//
TR0=~TR0;  //闪关定时否则开定时
f=1;

    
/**********按键程序************/
 void tkey(void)
{
  uchar judcekey;
  judcekey=P1&0x0f;
  if(judcekey==0x0f)
  goto return2;

  /*******移位键*********/
  if (judcekey==0x0e)
  f++;
  if (f==4)
  f=1;
  /**********加一键*********/
  if(judcekey==0x0d)
  {clock[f-1]++;}

  if (f==1)
  { if (clock[f-1]==24){
  clock[f-1]=0;}
   }
  else{  if (clock[f-1]==60)
   clock[f-1]=0;
   }

 /******减一键***********/ 
 if(judcekey==0x0b)
  {clock[f-1]--;}

  if (f==1)
  { if (clock[f-1]==0xff){
  clock[f-1]=23;}
   }
  else
   {  if (clock[f-1]==0xff)
   clock[f-1]=59;
   } 
 
return2:_nop_();

    } 

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复