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

Проблем с LCD 16Х01 и едно въпросче за MPLAB
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=9255
Страница 1 от 1

Автор:  spas92 [ Съб Авг 06, 2011 8:32 pm ]
Заглавие:  Проблем с LCD 16Х01 и едно въпросче за MPLAB

Имам едно LCD, 16 символа едноредово но като се опитах да си напиша програмата за един ПИК16Ф628А изскочи един странен проблем ..... когато започна да пиша по дисплея ОК първите 8 символа са добре след 8-мия нищо, като го конфигурирам като двуредов първите 8 символа си ги пише после трябва да мина на 2 ред и да напиша другите 8 О_о
Компилатора е CCS

main.c
Код:
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=4000000)

#include "C:\mcu_projects\628_lcd\user_lcd.c"

#use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B6,bits=8)

void main()
{
   char temp;
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   LCD_Init();
   // delay_ms(500);
   printf(LCD_PutChar,"TEST TEST TEST");
   do{
      temp=getc();
      putc(temp);
      if(temp=='D'){
      LCD_PutCmd ( 0x01 );    // clear display
      LCD_PutCmd ( 0x80 );
      goto end;
       }
   
     if(temp=='1'){
        LCD_PutCmd ( 0x80 );
        goto end;
      }
      if(temp=='2'){
        LCD_PutCmd ( 0xC0 );
        goto end;
      }
   
     LCD_PutChar(temp);
     end:
   }while(1);
}


user_lcd.c
Код:
#define LCD_D4          PIN_A3
#define LCD_D5          PIN_A2
#define LCD_D6          PIN_A1
#define LCD_D7          PIN_A0

#define LCD_EN          PIN_B1
#define LCD_RS          PIN_B3

#define LINE_1          0x00
#define LINE_2          0x40
#define CLEAR_DISP      0x01

#separate void LCD_Init ( void );
#separate void LCD_SetPosition ( unsigned int cX );
#separate void LCD_PutChar ( unsigned int cX );
#separate void LCD_PutCmd ( unsigned int cX );
#separate void LCD_PulseEnable ( void );
#separate void LCD_SetData ( unsigned int cX );

#use standard_io ( A )
#use standard_io ( B )



#separate void LCD_Init ( void )
    {
    LCD_SetData ( 0x00 );
    delay_ms ( 200 );       
    output_low ( LCD_RS );
    LCD_SetData ( 0x03 );   
    LCD_PulseEnable();
    LCD_PulseEnable();
    LCD_PulseEnable();
    LCD_SetData ( 0x02 ); 
    LCD_PulseEnable();     
    LCD_PutCmd ( 0x2C );   
    LCD_PutCmd ( 0x0C ); 
    LCD_PutCmd ( 0x01 ); 
    LCD_PutCmd ( 0x06 ); 
    }

#separate void LCD_SetPosition ( unsigned int cX )
    {
    LCD_SetData ( swap ( cX ) | 0x08 );
    LCD_PulseEnable();
    LCD_SetData ( swap ( cX ) );
    LCD_PulseEnable();
    }

#separate void LCD_PutChar ( unsigned int cX )
    {
        output_high ( LCD_RS );
        LCD_SetData ( swap ( cX ) );
        LCD_PulseEnable();
        LCD_SetData ( swap ( cX ) );     
        LCD_PulseEnable();
        output_low ( LCD_RS );
    }

#separate void LCD_PutCmd ( unsigned int cX )
    {
    LCD_SetData ( swap ( cX ) );   
    LCD_PulseEnable();
    LCD_SetData ( swap ( cX ) );     
    LCD_PulseEnable();
    }

#separate void LCD_PulseEnable ( void )
    {
    output_high ( LCD_EN );
    delay_us ( 3 );       
    output_low ( LCD_EN );
    delay_ms ( 3 );
    }

#separate void LCD_SetData ( unsigned int cX )
    {
    output_bit ( LCD_D4, cX & 0x01 );
    output_bit ( LCD_D5, cX & 0x02 );
    output_bit ( LCD_D6, cX & 0x04 );
    output_bit ( LCD_D7, cX & 0x08 );
    }


Кода за управление на LCD-то не е мой но беше направен за двуредов, а аз като се водих по това http://joshuagalloway.com/lcd.html го преправих за едноредов но уви :/

А има и втори въпрос. Поогледах се за литература по тази тема на българския пазар и единственото което немерих бе на издателство Млад конструктор.... Интересува ме специално за MPLAB,има ли нещо добро на пазара, понеже се помъчих с разни уроци от Интернет и т.н. но неможе да ми се получат нещата ...

Автор:  ike [ Съб Авг 06, 2011 8:54 pm ]
Заглавие:  Re: Проблем с LCD 16Х01 и едно въпросче за MPLAB

Дисплея си е наред. Просто така са му разположени сегментите и ти не си човека дето да му каже как да си ги разполага.
Така впрочем са повечето 16х1 дисплеи. Научи английския и почвай да тиърсиш литература по интернет, не си губи времето да търсиш на български.

Автор:  Zeus [ Нед Авг 07, 2011 6:14 pm ]
Заглавие:  Re: Проблем с LCD 16Х01 и едно въпросче за MPLAB

В CCS си има драйвер за управление. В пака /drivers. Файла е LCD.C Разгледай го, в него си е показано как да го използваш.

Автор:  valioman [ Пон Авг 08, 2011 9:41 am ]
Заглавие:  Re: Проблем с LCD 16Х01 и едно въпросче за MPLAB

Оригиналния LCD.C е малко сложно написан за начинаещи и трудно би могъл примерно да си преместиш пиновете на такива каквито иска човек ... аз ползвам flex_lcd.c напиши това в гугъл или си го намери във форумите на CCS-a .. файлчето е направено като за блондинки и си работи ;)

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