单片机检测方波频率显示到液晶屏有问题,求指教

2019-07-15 15:09发布

/**************************************************/
/*                                    ÍⲿÖжϲⷽ²¨ÆµÂÊ                          */
/*************************************************/
#include<reg52.h>
#include <intrins.h>
#include <MATH.H>

#define uint unsigned int    //¶¨Òåuint´úÌæunsigned int
#define uchar unsigned char  //¶¨Òåuchar´úÌæunsigned char
#define ulong unsigned long //¶¨Òåulong´úÌæunsigned long

uchar code count[]="0123456789";
uint counter=0;        //¼Ç¼Ï½µÑصĸöÊý
uint  ge,shi,bai,qian,wan,calsp,f,a;         // ÖжÏʱ¼ä
ulong Fre;

sbit rs=P3^5;
sbit rw=P3^6;
sbit en=P3^4;
sbit LCD_PSB =  P3^7;
sbit wela    =  P2^6;
sbit dula    =  P2^7;

void delay(uint z);
void lcd_init();
void timer_Fre_init();
bit lcd_busy() ;
void write_cmd(uchar);
void write_data(uchar);
void display_num();                                 
void lcd_pos(uchar X,uchar Y);
void read_frequency();
void display_ceshi();
void display();

/**************************************************/
/*                                     Ö÷º¯Êý                                   */
/*************************************************/
void main()
{
                EA=1;//¿ªÆô×ÜÖжϠ    
        lcd_init();                        
        //read_frequency();
                timer_Fre_init(); //¶¨Ê±Æ÷ºÍÍⲿÖжϳõʼ»¯
                while(1)
                {
                   if(f==1)
                   {                                  
                     f=0;
                     display_num();
                   }       
                }               
}
/**************************************************/
/*                                     ÑÓʱº¯Êý 1ms                                */
/*************************************************/
void delay(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
   for(y=110;y>0;y--);

}

/**************************************************/
/*                                    12864³õʼ»¯                               */
/*************************************************/
void lcd_init()      
{
                wela=0;
             dula=0;
                LCD_PSB = 1;
                write_cmd(0x34);      //À©³äÖ¸Áî²Ù×÷
            delay(5);
            write_cmd(0x30);      //»ù±¾Ö¸Áî²Ù×÷
            delay(5);
            write_cmd(0x0c);      //ÏÔʾ¿ª£¬¹Ø¹â±ê
            delay(5);
            write_cmd(0x01);      //Çå³ýLCDµÄÏÔʾÄÚÈÝ
            delay(5);
}
/*******************************************************************/
/*                                                                 */
/*¼ì²éLCDæ״̬                                                    */
/*lcd_busyΪ1ʱ£¬Ã¦£¬µÈ´ý¡£lcd-busyΪ0ʱ,ÏУ¬¿ÉдָÁîÓëÊý¾Ý¡£      */
/*                                                                 */
/*******************************************************************/
bit lcd_busy()
{                          
    bit result;
    rs = 0;
    rw = 1;
    en = 1;
    delay(5);
    result = (bit)(P0&0x80);
    en = 0;
    return(result);
}

/*******************************************************************/
/*                                                                 */
/*дָÁîÊý¾Ýµ½LCD                                                  */
/*RS=L£¬RW=L£¬E=¸ßÂö³å£¬D0-D7=Ö¸ÁîÂë¡£                             */
/*                                                                 */
/*******************************************************************/
void write_cmd(uchar cmd)
{                          
   while(lcd_busy());
    rs = 0;         //ÃüÁî
    rw = 0;         // ¶Á
    en = 0;
    P0 = cmd;
    delay(5);
    en = 1;
    delay(5);
    en = 0;  
}
/*******************************************************************/
/*                                                                 */
/*дÏÔʾÊý¾Ýµ½LCD                                                  */
/*RS=H£¬RW=L£¬E=¸ßÂö³å£¬D0-D7=Êý¾Ý¡£                               */
/*                                                                 */
/*******************************************************************/
void write_data(uchar dat)
{                          
   while(lcd_busy());
    rs = 1;
    rw = 0;
    en = 0;
    P0 = dat;
    delay(5);
    en = 1;
    delay(5);
    en = 0;
}
/**************************************************/
/*                                      Öжϳõʼ»¯                              */
/*************************************************/

void timer_Fre_init() //¶¨Ê±Æ÷ºÍÍⲿÖжϳõʼ»¯
{      
        EX0=1;//¿ªÍⲿÖжÏ0      
        IT0=1;        //ÉèÖóÉϽµÑØ´¥·¢·½Ê½
        TMOD=0x01; //ÉèÖö¨Ê±Æ÷0Ϊģʽ1£¬¼´16λ¼ÆÊýģʽ
        TH0=(65536-50000)/256;         //¼ÆÊýʱ¼äΪ50ms
        TL0=(65536-50000)%256;
        ET0=1;//¿ªÆô¶¨Ê±Æ÷0ÖжÏ
        TR0=1;//Æô¶¯¶¨Ê±Æ÷0
}

/**************************************************/
/*                                      ¶¨Ê±Æ÷0ÖжϠ                             */
/*************************************************/

void timer0() interrupt 1
{
        TH0=(65536-50000)/256; ;//ÖØÐÂ×°Èë³õÖµ£¬¼ÆÊýʱ¼äΪ50ms
        TL0=(65536-50000)%256 ;
        calsp++;
                if(calsp==20)
           {       
                    calsp=0;
                    f=1;
                       
                        //EX1=0;
                        //IT1=0;
                           //ET0=0;
                   //        TR0=0;
                                                
                }

}
/**************************************************/
/*                                      ÍⲿÖжÏ0                                  */
/*************************************************/
void IN_T0() interrupt 0
{
    counter++;
}

/*******************************************************************/
/*                                                                 */
/*¶ÁƵÂÊ                                                           */
/*¿ª¶¨Ê±Æ÷ÖжÏ0£¬¶ÁȡƵÂÊ                                          */
/*                                                                 */
/*******************************************************************/
void read_frequency()
{     
        timer_Fre_init(); //¶¨Ê±Æ÷ºÍÍⲿÖжϳõʼ»¯
                while(1)
                {
                   if(f==1)
                   {
                     f=0;
                     display_num();
                   }       
                }
}

/*********************************************************/
/*                                                       */
/* ÏÔʾ³ÌÐò                                              */
/*                                                       */
/*********************************************************/

void display(uchar x,uchar y,uchar dat)     //Òº¾§ÐкÍÁÐÏÔʾ£¬X£ºÐР Y£ºÁР dat:ÒªÏÔʾµÄÊý¾Ý
{
        lcd_pos(x,y);
        write_data(dat);
}


void display_num()
{            
       //EX1=0;
          // ET0=0;
          // TR0=0;
          //IT1=0;

            Fre=counter;
            counter=0;
        ge=Fre%10000%1000%100%10;
        shi=Fre%10000%1000%100/10;
        bai=Fre%10000%1000/100;
        qian=Fre%10000/1000;
        wan=Fre/10000;
        display(0,4,count[ge]);
        delay(5);
        display(0,3,count[shi]);
        delay(5);
        display(0,2,count[bai]);
        delay(5);
        display(0,1,count[qian]);
        delay(5);
        display(0,0,count[wan]);
        delay(5);

                 //EX1=1;
                // IT1=1;
            // ET0=1;
                // TR0=1;

       
}

/*********************************************************/
/*                                                       */
/* ²âÊÔÏÔʾ                                              */
/*                                                       */
/*********************************************************/
void display_ceshi()
{
           a++;
           display(0,1,count[a]);
}


/*********************************************************/
/*                                                       */
/* É趨ÏÔʾλÖà                                         */
/*                                                       */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   pos = X+Y ;  
  write_cmd(pos);     //ÏÔʾµØÖ·
    }


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。