vim-332-dp custom lcd nasıl sürülür?

Başlatan havya, 16 Ocak 2022, 13:41:14

havya

Herkese iyi çalışmalar dilerim...
Proteus programında bulunan vim-332-dp  lcd yi yabancı forumlarda buldugum bir kod ile çalıştırmayı başardım Fakat sadece rakamlar var diğer karakterleri çıkaramıyorum yardımcı olursanız çok memnun olurum

örnek kod aşagıdakı gibidir.

#include <16LF1937.H>
#fuses INTRC_IO, NOWDT, BORV19, NOPUT, PLL_SW
#use delay(clock=32M)

// The LCD digits are numbered in the following way, 
// according to the Varitronix VIM-332-DP data sheet.
//            _    _    _
//        |  |_|  |_|  |_|
//        |  |_|  |_|  |_|
//                    
// Digit  4  3    2    1
//

// The CCS lcd_symbol() function will be used to display digits
// 1, 2, and 3. The following define statements tell the
// lcd_symbol() function which PIC pins are connected to the
// LCD segment pins.
// The connection data was derived from the Microchip file,
// seven_seg.h, which is in the sample code for the F1 board
// on the Microchip website.
//
// Digit segments  A        B        C        D        E        F        G        DP
//                b7      b6      b5      b4      b3      b2      b1      b0
#define DIGIT3  COM0+2,  COM0+4,  COM2+4,  COM3+2,  COM2+2,  COM1+2,  COM1+4,  COM3+1
#define DIGIT2  COM0+5,  COM0+10, COM2+10, COM3+5,  COM2+5,  COM1+5,  COM1+10, COM3+4
#define DIGIT1  COM0+12, COM0+16, COM2+16, COM3+12, COM2+12, COM1+12, COM1+16, COM3+10

// The following array tells the CCS lcd_symbol() function which
// segments to turn on, to display the numbers from 0 to 9.
//                            0    1    2    3    4    5    6    7    8    9
byte const Digit_Map[11] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xE6,0xFF};


#define BLANK 0  // For a blank digit, don't turn on any segments.

#byte LCDDATA6 = 0x7A6
#bit  seg_4bc = LCDDATA6.1  // Controls left-most digit ("1")

int8 lcd_pos; 

//-----------------------------------------------
void lcd_putc(char c)
{
int8 segments;

if(c == '\f')
  {
  lcd_pos = 0;
  }
else
  {
  if((c >= '0') && (c <= '9'))
      segments = Digit_Map[c - '0'];
  else
      segments = BLANK;

  switch(lcd_pos)
    {
      case 1:          // 1000's digit (left-most digit on lcd)
        if(c == '1')        // Is the top digit = 1 ?
          seg_4bc = 1;    // If so, display it
        else                // If it's not = 1, don't display it.
          seg_4bc = 0;  
        break;
  
      case 2: lcd_symbol(segments, DIGIT3); break; // 100's digit
      case 3: lcd_symbol(segments, DIGIT2); break; // 10's digit
      case 4: lcd_symbol(segments, DIGIT1); break; // 1's digit
    }
  }

lcd_pos++;
}


//---------------------------
void clear_lcd(void)
{

#byte LCDDATA0 = 0x7A0;
#byte LCDDATA1 = 0x7A1;
#byte LCDDATA2 = 0x7A2;
#byte LCDDATA3 = 0x7A3;
#byte LCDDATA4 = 0x7A4;
#byte LCDDATA5 = 0x7A5;
#byte LCDDATA6 = 0x7A6;
#byte LCDDATA7 = 0x7A7;
#byte LCDDATA8 = 0x7A8;
#byte LCDDATA9 = 0x7A9;
#byte LCDDATA10 = 0x7AA;
#byte LCDDATA11 = 0x7AB;

LCDDATA0 = 0;
LCDDATA1 = 0;
LCDDATA2 = 0;
LCDDATA3 = 0;
LCDDATA4 = 0;
LCDDATA5 = 0;
LCDDATA6 = 0;
LCDDATA7 = 0;
LCDDATA8 = 0;
LCDDATA9 = 0;
LCDDATA10 = 0;
LCDDATA11 = 0;
}



//===================================
void main()
{
int16 number;

setup_adc_ports(NO_ANALOGS); // This fixes a bug in CCS start-up code

setup_oscillator(OSC_INTRC | OSC_PLL_ON | OSC_8MHZ);

setup_timer_1(T1_EXTERNAL_SYNC | T1_ENABLE_T1OSC  | T1_DIV_BY_1);
//delay_ms(5000);  // What is the start-up delay time for T1OSC ?

clear_lcd();

// Setup for a 1:4 mux LCD and enable 10 specific segment pins.
setup_lcd(LCD_TYPE_B | LCD_MUX14 | LCD_BIAS13 | LCD_REF_ENABLED
          | LCD_B_HIGH_POWER | LCD_TIMER1,
          0, 0x131437);

lcd_contrast(7);

number = 1876;


printf(lcd_putc,"\f%4lu",number);  // Always send 4 digits

while(1);
} 






#include <16LF1937.H>
#fuses INTRC_IO, NOWDT, BORV19, NOPUT, PLL_SW
#use delay(clock=32M)

#byte LCDPS = 0x792
#bit WFT = LCDPS.7

struct
{
int8 LP : 4;
int8 WA : 1;
int8 LCDA: 1;
int8 BIASMD: 1;
int8 WFT: 1;
}LCDPSbits;
#locate LCDPSbits = LCDPS

#byte T1CON = 0x18
#bit T1OSCEN=T1CON.3

#byte LCDSE0 = 0x798
#byte LCDSE1 = 0x799
#byte LCDSE2 = 0x79A

//-------------------------------------
void lcd_init(void)
{

    // Configure LCDPS
    // Wave form type A or B
    // Bias Mode
    // Prescaler
    // 1:16 - 1:1
    LCDPS = 0;
    WFT = 1;        // B type
    LCDPSbits.LP = 0;

    T1OSCEN = 1;    // activate the 32khz oscillator for our clock source

    /**********************************************/

    /* User is responsible to enable the needed segments   */

    /* Replace the code in the next 3 lines for your glass */

    /******************************************/
    LCDSE0 = 0x37;
    LCDSE1 = 0x14;
    LCDSE2 = 0x13;
.
.
.
// etc.
}

//==========================
void main()
{
lcd_init(); 

while(1);
}


birde böyle bir kod var istenilen karakterleri kullanıcıya bırakmış ama ne yazmamgerektiğini bilmiyorum

MC_Skywalker

#1
Diğer uçlar içinde çıkış tanımlaman gerekiyor. tabi önce LCD'nin veri kağıdından hangi segmentin hangi COM ile bağlı olduğunu bulman gerekli.
Daha sonra hangi COM ile bağlıysa onun registerine tanımla yapıpı kullanacaksın.
Ben daha önce static LCD ile çalıştım bu tür matrix+bias modelini kullanmadım.

havya

Hocam cevabınız için çok teşekkür ederim . #define DİGİT bölümüne yeni bi define atadım com uçlarını yazdım fakat daha sonra ne yapmam gerektiğini bilmiyorum . Teşekkürler

yahya70

Daha önce çalıştığım bi konu değil ama kodunuzu incelediğimde lcd_symbol(); fonksiyonunu kullanmak gerekiyor sanırım. öyle tahmin ediyorum. İlk etapta LCD nin ortak uçlarını ve yansıtmak istediğiniz simgelerin pinlerini tespit etmelisin. Daha sonra register tanımlamalarını yapmalısın ve simgeleri dizi içinde tanımlamalısın. Daha sonra dediğim gibi lcd_symbol(); fonksiyonunu kullanarak istediğiniz sembolü yansıtacağını düşünüyorum. Kolay gelsin iyi çalışmalar.

havya

Hocam çok teşekkür ederim cevabınız için . Fonksiyonu tam olarak nereye ve nasıl yazmam gerekiyor onu bilmiyorum .C dilini yeni öğreniyorum . Teşekkür ederim iyi çalışmalar .