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

📄 8279的时钟程序.txt

📁 单片机程序包
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    col=col-64;
  }
  for(j=0;j<2;j++)
  {
       write_cmd1(Page_Add+page+j);write_cmd1(Col_Add+col);
       for(i=0;i<12;i++)
               write_data1(english[n*24+12*j+i]);
  }
}

void display_e(uchar page,uchar col,uchar code *english,uchar n)
{
  uchar j,i;
  if(col<64)
  {
          CS2=1;CS1=0;
   }
  else
  {
          CS2=0;CS1=1;
    col=col-64;
  }
  for(j=0;j<2;j++)
  {
       write_cmd1(Page_Add+page+j);write_cmd1(Col_Add+col);
       for(i=0;i<7;i++)
               write_data1(english[n*14+7*j+i]);
  }
}
//************************写数据到LCD**********************


void point(uchar x,uchar y)
{
  uchar y1,y2,pp;
  uchar datain;
  pp=1;
  y1=y>>3;
  y2=y%8;
  pp=pp<<y2;
  if (x<64)
  {
    CS2=1;
 CS1=0;
 write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);  
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    delay1(10);
    datain=read_data();

    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    datain=datain|pp;
    write_data1(datain);
  }
  else
  {

    CS2=0;
 CS1=1;
 write_cmd1(Page_Add+y1);
 write_cmd1(Col_Add+x-64);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    delay1(10);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    datain=datain|pp;
    write_data1(datain);
  }
  

  
}


vp_p(uchar *s)
{
    uchar i;
 unsigned long vp=0;
 max=s[0],min=s[0];
 for(i=1;i<120;i++)
 {
    if (max<s[i])max=s[i];
    if(min>s[i])min=s[i]; 
 }
 vp=max-min;
 vp=vp*500;
 vp=vp/255;

 d[2]=vp/100;
 d[1]=(vp-d[2]*100)/10+1;
 d[0]=vp%10;
    
}
void pointb(uchar x,uchar y)
{
  uchar y1,y2,pp;
  uchar datain;
  
  pp=1;
  y1=y>>3;
  y2=y%8;

  pp=~(pp<<y2);
  
  if (x<64)
  {
    CS2=1;
 CS1=0;
 write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);  
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    delay1(10);
    datain=read_data();

    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    datain=datain&pp;
    write_data1(datain);
  }
  else
  {

    CS2=0;
 CS1=1;
 write_cmd1(Page_Add+y1);
 write_cmd1(Col_Add+x-64);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    delay1(10);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    datain=datain&pp;
    write_data1(datain);
  }
   
}
//5*7
display_num(uchar x,uchar y,uchar *num,uchar n)
{
    uchar i,j,temp;
 for(j=0;j<5;j++)
 { temp=num[5*n+j];
     for(i=0;i<8;i++)
     {

      if(temp&1)point(x+j,y+i);
   else pointb(x+j,y+i);
   temp=temp>>1;
  }
  }
}

     
display8_16(uchar x,uchar y,uchar *num,uchar n)
{
    uchar i,j,temp;
 for(j=0;j<16;j++)
 { temp=num[16*n+j];
     if(j<8)
     { 
      temp=temp>>4;
      for(i=0;i<4;i++)
         {
       
          if(temp&1)point(x+j,y+i);
       else pointb(x+j,y+i);
       temp=temp>>1;
      }
  }
  else
  {   
      for(i=0;i<4;i++)
         {
       //temp=temp>>4;
             if(temp&1)point(x+j-8,y+i+4);
          else pointb(x+j-8,y+i+4);
           temp=temp>>1;
       }
   }
    
  }
}
     
   



void write_data1(uchar dout)  
{

        DI=1; RW=0;
        Lcd_Bus=dout;
        E=1;
        E=0;
     delay1(1);
}




//***************************读LCD数据*********************
 
uchar read_data()  
{
  uchar din;
  Lcd_Bus=0xff;
  DI=1; RW=1;
  E=0;
  E=0;
  E=1;
  E=1;
  E=1;
  din=Lcd_Bus;
  return din;        
}



//****************************清除内存*********************

void cls()  
{
        uchar j,k;
        CS2=1;CS1=0;
        for(k=0;k<8;k++)
        {
                write_cmd1(Page_Add+k);
             write_cmd1(Col_Add);       //列地址0
             for(j=0;j<64;j++)     //列地址自动加一
                     write_data1(0x00);
         }
      CS2=0;CS1=1;
      for(k=0;k<8;k++)
      {
             write_cmd1(Page_Add+k);
             write_cmd1(Col_Add);           //列地址0
             for(j=0;j<64;j++)         //列地址自动加一
                  write_data1(0x00);
         }
}


//****************显示小数字*******************************




//***************************初始化LCD屏*******************
void init()  
{
  delay1(100);
  CS2=1; CS1=0;
  delay1(100);
  write_cmd1(Disp_Off);
  write_cmd1(Page_Add);
  write_cmd1(Start_Line);
  write_cmd1(Col_Add);
  write_cmd1(Disp_On);
  CS2=0; CS1=1;
  delay1(100);
  write_cmd1(Disp_Off);
  write_cmd1(Page_Add);
  write_cmd1(Start_Line);
  write_cmd1(Col_Add);
  write_cmd1(Disp_On);
}

void line_h(uchar x,uchar y,uchar l)
{
    uchar i;
 for(i=0;i<l;i++) point(x+i,y);
      
}

void line_v(uchar x,uchar y,uchar l)
{
    uchar i;
 for(i=0;i<l;i++) point(x,y+i);
      
}







wave()
{
    uchar data i,j,t=64;
 uint te;
 uchar xdata s[120];
 uchar tt=1;
/* line_h(8,0,120);
 line_h(8,63,120);
 line_v(8,0,64);
 line_v(127,0,64);
 for(i=1;i<4;i++)
     for(j=4;j<64;j++)point(j*2,16*i);

    for(i=0;i<10;i++)
     for(j=0;j<32;j++)point(12*i+8,j*2);
 
 */
 while(1)
 {
    
  cls();
  line_h(8,0,120);
     line_h(8,63,120);
     line_v(8,0,64);
     line_v(127,0,64);

  for(i=1;i<4;i++)
         for(j=4;j<64;j++)point(j*2,16*i);

     for(i=0;i<10;i++)
        for(j=0;j<32;j++)point(12*i+8,j*2);

  display_num(0,55,str_num,0);
  for(i=0;i<5;i++) display_num(0,3+11*i,str_num,5-i);
  for(i=0;i<6;i++)
  {
      point(6,5+11*i);point(7,5+11*i);
  }
  
     for(i=0;i<120;i++)
     {
      s[i]=adconvert();
        }
   for(i=1;i<120;i++)
   {
     
       te=s[i]*53;
          te=te/255;
          point(i+8,60-te);
          point(i+8,59-te);
     }
     for(i=0;i<5;i++)display8_16(60+7*i,55,str_vp,i);
     vp_p(s);
     for(i=0;i<3;i++)

     display_num(92+7*i,55,str_num,d[2-i]);
     point(100,61);point(100,62);
     /*screen1();
     te=fi_int&0x7ff;
     dd[0]=te/1000;
     dd[1]=te/100-dd[0]*10;
     dd[2]=te/10-dd[1]*10-dd[0]*100;
     dd[3]=te%10;

     for(i=0;i<4;i++)display_num(10+6*i,55,str_num,dd[i]);
     display_num(10+24,55,str_num,10);
     display_num(10+24+5,55,str_num,11);*/
     for(i=0;i<100;i++)delay1(500);
     if(key()!=0)
     {
         state=1;
      cls();
      break;

     }     
 }
}


/************************测频率*******************************/
void timer2(void) interrupt 5 using 3
{ TF2=0;
time2_count--;
  
 }
/**************************采样******************************/
void time1(void) interrupt 3 using 2  
{ 
  EA=0;
  TR1=0;
  TH1=(65536-1365)/256;
  TL1=(65536-1365)%256;   
  s[ii].real=adconvert();
  s[ii].image=0;
  ii++;
  TR1=1;
  EA=1;
  if(ii>=64)
  { 
      ET1=0;
   TR1=0;
   EA=0; 
   ii=0;  
   over=1;   
  }  
}
/**************************对外部计数***************************/
void time0(void) interrupt 1 using 1
{
 if(T0_counter<=Time_NO)
   {T0_counter++;    
    TR2=1;//启动T2
    }
 if(T0_counter>Time_NO)//够4个,停止T2,T0
    { 
   TR2=0;TR0=0;EA=0;ET0=0;ET2=0;T0_counter=0;//停止T0,T2            
      T2NOW=0;T2NOW=((T2NOW|TH2)<<8)|TL2;
      fi_int=(((Time_NO/2)*5461167)/((65535-time2_count)*65536+T2NOW+1+(65535-time2_count)*13));//计算频率
               
      time2_count=65535;   
      TH2=0;        
      TL2=0;
   TH0=0;
   TL0=0;
   /*if(fi_int>=625)
   {
       fs=42655/625;
   }
   else {fs=42665/fi_int;}//3276800/12/fi_int
   */
   TH1=(65536-1365)/256;
   TL1=(65536-1365)%256;
   ET1=1;
   TR1=1;//启动T1进行采样
   EA=1; 
      
     }
}   
/************************测频率并显示波形**********************/
void screen1(void)
{
 TMOD=0x16;//T0对外部计数,T1对内部定时
 TH0=255;
 TL0=255;//计1次数
 T2CON=0x00;//16位重装
 //CKCON=0x28;//T0,T2 在4 clock 下工作
 TH2=0;
 TL2=0;
 RCAP2L=0;
 RCAP2H=0;//初值清零
 PT0=1;//设置T0的优先级别高,T0继续判断是否到了4个周期 
 ET0=1;//开T/C0中断
 ET1=1;//开T/C1中断
 ET2=1;//开T/C2中断
 EA=1; 
 TR1=0;
 TR2=0;
 TR0=1;//启动T0
over=0;
while(over==0);
over=0;
   
}
 
  
unsigned char key()
{    unsigned char  k,tem,keytem;
    // uchar idata d[150]; 
     keytem=0;
  s0=1;s1=1;s2=1;s3=1;
     tem=P2 & 0x0f;
     if(tem!=0x0f)
     {   beep=0;
         for(k=0;k<40;k++)
         tem=P2 & 0x0f;
         if(tem!=0x0f)
         {    if(tem==0x07) keytem=1;
              else if(tem==0x0b) keytem=2;
              else if(tem==0x0d) keytem=3;
              else if(tem==0x0e) keytem=4;
         }
      }
      while(tem!=0x0f)
      tem=P2 & 0x0f;  
      beep=1;
      return(keytem);
}

void amp()
{
    uchar i,ii;
 for(i=2;i<33;i++)
 {
     for(ii=0;ii<s[i-2].real;ii++)
  {
         point(i*2,55-ii);
      point(i*2-1,55-ii);

   }
 }
}

hextobcd(uint x)
{
    uint i,t=1000;
 uint temp;
 temp=x;
 for(i=0;i<4;i++)
 {
     d[3-i]=x/t;
  x=x%t;
  t=t/10;
 }
 if(temp>1000)
 {
     for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//频率
 }
 else if(temp>100)
 {
     d[3]=14;
     for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//频率
 }
 else if(temp>10)
 {
     d[3]=d[2]=14;
     for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//频率
 }

}


void cursor(uchar x)
{
    uchar i;
    CS1=0;CS2=1;
 write_cmd1(Page_Add+7);
 write_cmd1(Col_Add);
    for(i=0;i<64;i++)write_data1(0);
    write_cmd1(Page_Add+7);
 write_cmd1(Col_Add+x-2);
 write_data1(0x8);
 write_data1(0x4);
 write_data1(0xfe);
 write_data1(0x4);
 write_data1(0x8);   
}

static_fft()
{
   
 uchar i,j,iii;
 uchar ii=1;
 cls();
 line_h(0,0,68);
 line_h(0,55,68);
 hextobcd(0);
 for(i=0;i<8;i++)display_e(0,70+7*i,str_fft,i);
 for(i=0;i<2;i++)display_h(2,70+12*i,str_f,i);
 for(i=0;i<2;i++)display_num(10+105+5*i,19,str_num,i+10);//HZ
    for(j=1;j<7;j++)
 for(i=1;i<68;i=i+2) point(i,8*j);
 for(j=1;j<6;j++)
 for(i=2;i<56;i=i+2) point(11*j,i);
 line_v(0,0,56);
 line_v(68,0,56);
    amp();
 while(1)
 {
     
  iii=key();
  if(iii==1)
  {
     ii++;if(ii==32)ii=1;
  }
  else if(iii==2)
  {
      if(ii==1)ii=32;
   ii--;
  }
  else if (iii==3) 
  {
     cls();
     state=1;
     break;
  }
  cursor(2*ii);
  hextobcd(95*(ii-1));
  

 }
}

fft_screen()
{ 

    uchar i,j,iii;
 uchar ii=1;
 while(1)
 {
     cls();
     line_h(0,0,68);
     line_h(0,55,68);
  hextobcd(0);
  for(i=0;i<8;i++)display_e(0,70+7*i,str_fft,i);
  //for(i=0;i<4;i++)display_num(2,95+5*i,str_num,i+1);//频率
  for(i=0;i<2;i++)display_h(2,70+12*i,str_f,i);
  for(i=0;i<2;i++)display_num(10+105+5*i,19,str_num,i+10);//HZ
     for(j=1;j<7;j++)
     for(i=1;i<68;i=i+2) point(i,8*j);
     for(j=1;j<6;j++)
     for(i=2;i<56;i=i+2) point(11*j,i);
     line_v(0,0,56);
     line_v(68,0,56);

     for(i=0;i<64;i++)
  {
      s[i].real=adconvert();
   s[i].image=0;
  }
     FFT(s);
     amp();
  iii=key();
  if(iii==1)
  {
     ii++;if(ii==32)ii=1;
  }
  else if(iii==2)
  {
      if(ii==1)ii=32;
   ii--;
  }
  else if(iii==3)
  {
      cls();
   state=2;
   break;
  } 
  else if(iii==4)
  {
      cls();
   state=0;
   break;
  }
  cursor(2*ii);
  hextobcd(95*(ii-1));
  for(i=0;i<100;i++)delay1(500);
  

 }
}


main()
{
    init();
 cls();

 while(1)
 {
     if(state==0) wave();
   else if (state==1)fft_screen();
  else if (state==2)static_fft();


 }

}

================================================

该时钟为24小时制P1为共阳极LED数据,P2。0~P2。3为LED单元的位选
//P3。2以按键次数来选择要设置的LED单元,P3。6为加1按键
/*******************************************************/

#include<reg51.h>
#define uchar unsigned char
#define DISSET P2//控制LED显示端口
#define DISOUT P1//LED口数据
sbit K2=P3^6;//+
sbit K3=P3^2;//选位
uchar data Msecond=0;
uchar data Second=0;
uchar code dis[4]={0xf1,0xf2,0xf4,0xf8};//选通各位
uchar code discode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管,0。。。9
uchar  disnum[4]={0,0,0,0};
uchar counter;
////////延时子程序//////////////////
Delay(uchar n)
{
 uchar i;
 while (n--)
 for (i=0;i<150;i++);
}


///////////////// 定时器0中断处理子程序/////////////////////////////////
 void time_0() interrupt 1 using 1
 {
 
  TH0=0xb1;
  TL0=0xdf;
  Msecond++;
 if(Msecond==50)///1S时间到
 { Msecond=0;Second++ ;}
 if(Second==60)//1 分钟到
 {Second=0;disnum[3]++;}
 if(disnum[3]==10)//分钟从个位向十位进位
 {disnum[3]=0;disnum[2]++;}
 if(disnum[2]==6)//一小时到
 {disnum[2]=0;disnum[1]++;}
 if(disnum[1]==10)//时的个位向十位进位
 {disnum[1]=0;disnum[0]++;}
 if((disnum[0]==2)&&(disnum[1]==4))//到00:00时
 {disnum[0]=0;disnum[1]=0;}
 }
 
/****************显示程序***************************/
void Display(void)
{
 uchar i;
 for (i=0;i<4;i++)
 {
  DISOUT=discode[disnum[i]];//显示代码
  DISSET=dis[i];//选通位
  Delay(1);//扫描时间 
 }
}


void main(void)
{
 EA=1;
 ET0=1;
 TMOD=0x01;
 TH0=0xb1;
 TL0=0xeb;//2000us-12us
 TR0=1;
 while(1)
 {
 if (!K3)
  {
   Delay(3);
   while (!K3)//键松开?
   Display();//防止数码管灭
   Delay(3);
   counter++;
   if (counter==4) counter=0;
  }
  if (!K2)
  {
   Delay(3);
     while (!K2)//键松开?
   Display();//防止数码管灭
   Delay(3);
   disnum[counter]++;
   if(counter==0)//小时的十位LED单元处理
       {
      if(disnum[counter]==3) disnum[counter]=0;
        }
         if(counter==1)//小时的个位LED单元处理
   { if (disnum[0]>=2){if(disnum[counter]==4)disnum[counter]=0;} 
      else{if(disnum[counter]==10) disnum[counter]=0;}   
   }
     if(counter==2){if(disnum[counter]==6) disnum[counter]=0;}//分钟的十位LED单元处理
   if(counter==3){if (disnum[counter]==10) disnum[counter]=0;} //分钟的个位LED单元处理 
   
  } 
  Display();       
 }
}



⌨️ 快捷键说明

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