Отговори на тема  [ 4 мнения ] 
Проблем с брояч 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Проблем с брояч
Здравейте, имам проблем с показването на числа на 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;
}


Сря Авг 07, 2013 1:19 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Проблем с брояч
Опитай така:
Код:
void izobrazqvane () //
{     
   unsigned char   counter_button[2];
   counter_button[1] = 0;
   counter_button[0] = CNT2+0x30;
        lcd_puts(counter_button); //display on LCD
}

_________________
Warriors of the Night, ASSEMBLER!!!


Сря Авг 07, 2013 3:18 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с брояч
Направих го, но пак забива след натискане на който и да е от двата бутона.


Сря Авг 07, 2013 8:50 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с брояч
Проблема е решен, в едната подпрограма забранявам прекъсването.


Сря Авг 07, 2013 6:57 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 4 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни