Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с брояч
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=11620
Страница 1 от 1

Автор:  bobi13 [ Сря Авг 07, 2013 1:19 am ]
Заглавие:  Проблем с брояч

Здравейте, имам проблем с показването на числа на LCD. Проблема се състои в това, че при извикване на функцията void izobrazqvane (), и при натискане на кой и да е бутон програмата блокира, а на дисплея се появява знака + . Контролера който ползвам е at89c2051.

Код:
#include <at89x51.h>
#include "delay.h"
#include "lcd.h"
#define PRELOAD01 (65536 - (tWord)(OSC_FREQ / (OSC_PER_INST * 1020)))
#define PRELOAD01H (PRELOAD01 / 256)
#define PRELOAD01L (PRELOAD01 % 256)
#define LED1 P1_6 //sin
#define LED2 P1_7 //cherven
#define BUT1 P3_4
#define BUT2 P3_5
#define CNTZAK
#define   LCD_RS       P1_5
#define LCD_EN       P1_4
#define LCD_DATA   P1

__data __at (0x020) unsigned char BUT1FL;

__bit __at (0x00) BUT1FL_0;
__bit __at (0x01) BUT1FL_1;
__bit __at (0x02) BUT1FL_2;
__bit __at (0x03) BUT1FL_3;
__bit __at (0x04) BUT1FL_4;
__bit __at (0x05) BUT1FL_5;
__bit __at (0x06) BUT1FL_6;
__bit __at (0x07) BUT1FL_7;
__data __at (0x022) unsigned char BUT2FL;
__bit __at (0x10) BUT2FL_0;
__bit __at (0x11) BUT2FL_1;
__bit __at (0x12) BUT2FL_2;
__bit __at (0x13) BUT2FL_3;
__bit __at (0x14) BUT2FL_4;
__bit __at (0x15) BUT2FL_5;
__bit __at (0x16) BUT2FL_6;
__bit __at (0x17) BUT2FL_7;
__data __at (0x030) unsigned char CNT1;
__data __at (0x031) unsigned char CNTB1;
__data __at (0x032) unsigned char CNT2; 
__data __at (0x033) unsigned char CNTB2;

void izobrazqvane () //
{      
   unsigned char   counter_button[1];
   counter_button[0] = CNT2+0x30;
        lcd_puts(counter_button); //display on LCD
}

void led_sw (void)
{
   
   LED2=!LED2;
}
void but1do () // count down
{   
   
      LED1=!LED1;
      BUT1FL_5=1;
      CNT2=CNT2-5;
      if(CNT2==5)
         {
            CNT2=15;
   
         }
       izobrazqvane ();// breakdown
         
}

void but2do () // count up
{
   
      LED1=!LED1;
      BUT2FL_5=1;
      CNT2=CNT2+5;
      if(CNT2==250)
         {
            CNT2=240;
            
         }
      izobrazqvane ();   
        
}

void but1obr ()
{
if(BUT1FL_7==1)
{
    if(BUT1FL_5==0)     
    {
       if(BUT1FL_0==0)   
       {
        BUT1FL_0=1;
        CNTB1=3;
       }

       else
       {
           if(BUT1FL_2==0)
           {
           CNTB1--;
              if(CNTB1==0)
              {
               BUT1FL_2=1;
              }

              else
              {
                ;
              }
          }

          else
          {
          but1do();
          }
       }
    }

    else
    {
     ;
    }
}
else
{
BUT1FL=0;
}
}

void but2obr ()
{
if(BUT2FL_7==1)
{
    if(BUT2FL_5==0)     
    {
       if(BUT2FL_0==0) 
       {
        BUT2FL_0=1;
        CNTB2=3;
       }

       else
       {
           if(BUT2FL_2==0)
           {
           CNTB2--;
              if(CNTB2==0)
              {
               BUT2FL_2=1;
              }

              else
              {
                ;
              }
          }

          else
          {
          but2do();
          }
       }
    }

    else
    {
     ;
    }
}
else
{
BUT2FL=0;
}
}


   
void main(void)
{   

   lcd_init();

   {   
   
   
   TMOD = 0x11;       // timer 0
     TR0 = 1;
      TH0 = 0xDF;       //5 ms ?
   TL0 = 0x75;
      ET0 = 1;
      IT0 = 1;
   EA = 1;
     CNT1 = 50;
     __asm                  // nulira operativnata pamet
       MOV   R0,#0x2F
RES1:   MOV @R0,#0
      DJNZ   R0,RES1
     __endasm;
     
   SP=0x40;
   }

   
   while(1)
   {
   
      if(BUT1==0)
      {
      BUT1FL_7=1;
      }
      else
      {   
      BUT1FL_7=0;
      }
     
      if(BUT2==0)
      {
      BUT2FL_7=1;
      }
      else
      {   
      BUT2FL_7=0;
      }

   }
}   

void timer_0 (void) __interrupt 1
{
   TH0 = 0xEF;       //5 ms
   TL0 = 0xBA;
   CNT1--;
     if(CNT1==0)
   {
       CNT1=CNT2;
       led_sw();
   }
   
   but1obr();
   but2obr();

}   







/*============================================================================================
         Programa za LCD
==============================================================================================*/


void LCD_STROBE (void);

int reverse(unsigned char byte_to_shift)
{
unsigned char U8byte_new = byte_to_shift;

unsigned char bit0_Mask = 0x01;
unsigned char bit1_Mask = 0x02;
unsigned char bit2_Mask = 0x04;
unsigned char bit3_Mask = 0x08;
unsigned char bit4_Mask = 0x10;
unsigned char bit5_Mask = 0x20;
unsigned char bit6_Mask = 0x40;
unsigned char bit7_Mask = 0x80;

U8byte_new = ((byte_to_shift&bit7_Mask)>>3)|((byte_to_shift&bit6_Mask)>>1)|((byte_to_shift&bit5_Mask)<<1)|((byte_to_shift&bit4_Mask)<<3)| ((byte_to_shift&bit3_Mask)>>3)|((byte_to_shift&bit2_Mask)>>1)|((byte_to_shift&bit1_Mask)<<1)|((byte_to_shift&bit0_Mask)<<3);

return U8byte_new;
}



void lcd_write(unsigned char c)
{
   unsigned char data = (unsigned char)(( c >> 4 ) | (LCD_RS << 5)) ;// 0x0F original ||
   
//   delay_70u();
   
   LCD_DATA = data;
   LCD_STROBE();
   data = (unsigned char)((c & 0x0F) | (LCD_RS << 5));
   LCD_DATA = data;
   LCD_STROBE();

   
   
}

/*
*    Clear and home the LCD
*/

void lcd_clear(void)
{
   LCD_RS = 0;
   lcd_write(0x1);
    delay_10u();
}

/* write a string of chars to the LCD */

void lcd_puts(const  char *s)
{
   LCD_RS = 1;   // write characters
   while(*s)
   {
      lcd_write(reverse(*s));
      s++;
   }
}

/* write one character to the LCD */

void lcd_putch(char c)
{
   LCD_RS = 1;   // write characters
   lcd_write( c );
}


/*
* Go to the specified position
*/

void lcd_goto(unsigned char pos)
{
   LCD_RS = 0;
   lcd_write(0x80+pos);
}
   
/* initialise the LCD - put into 4 bit mode */

void lcd_init()
{
   char init_value;

   init_value = 0x3;

   LCD_RS = 0;
   LCD_EN = 0;
   
   delay_70ms(); // delay for 150ms
   delay_70ms();
   delay_10ms();

   LCD_DATA   =0xC;
   LCD_STROBE();
   delay_5ms();

   LCD_DATA   =0xC;
   LCD_STROBE();
   delay_100u();

   LCD_DATA   =0xC;
   LCD_STROBE();
   delay_100u();

   LCD_DATA   =0x4;
   LCD_STROBE();
   delay_100u();

   LCD_DATA   =0x4;
   LCD_STROBE();
   LCD_DATA   =0x1;
   LCD_STROBE();
   delay_100u();

   LCD_DATA   =0x0;
   LCD_STROBE();
   LCD_DATA   =0x1;
   LCD_STROBE();
   delay_100u();

   LCD_DATA   =0x0;
   LCD_STROBE();
   LCD_DATA   =0x8;
   LCD_STROBE();
   delay_5ms();
   

   LCD_DATA   =0x0;
   LCD_STROBE();
   LCD_DATA   =0x6;
   LCD_STROBE();
   delay_100u();

   LCD_DATA   =0x0;
   LCD_STROBE();
   LCD_DATA   =0x3;
   LCD_STROBE();
   delay_100u();
   

LCD_RS = 1;
}


void LCD_STROBE(void)
{
   LCD_EN = 1;
    delay_10u();
   LCD_EN= 0;
}

Автор:  ike [ Сря Авг 07, 2013 3:18 am ]
Заглавие:  Re: Проблем с брояч

Опитай така:
Код:
void izobrazqvane () //
{     
   unsigned char   counter_button[2];
   counter_button[1] = 0;
   counter_button[0] = CNT2+0x30;
        lcd_puts(counter_button); //display on LCD
}

Автор:  bobi13 [ Сря Авг 07, 2013 8:50 am ]
Заглавие:  Re: Проблем с брояч

Направих го, но пак забива след натискане на който и да е от двата бутона.

Автор:  bobi13 [ Сря Авг 07, 2013 6:57 pm ]
Заглавие:  Re: Проблем с брояч

Проблема е решен, в едната подпрограма забранявам прекъсването.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/