Karakter lcd bargraph?

Başlatan Maxim, 16 Nisan 2014, 17:39:17

Maxim

grafik olmayan lcd de bar şeklinde sağa doğru giden çubuklar çıkarabiliyoruz.
kodu falan herkeste vardır.

fakat bana ortadan başlayan ve sağa sola hareket edeni lazım
aynı müzik setlerindeki balans ayarı gibi

potans ortada iken yani sıfırken 4x20 lcd ekranda cizgiler tam ortada olacak
sola doğru çevirdikçe çizgiler ortadan başlayıp sola doğru hareket edecekler
sağa çevirince gene ortaya gelip daha sağa kayınca çizgiler bu sefer sağa doğru devam edecek.

bu şekilde çalışma yapan veya elinde kodu olan varmıdır? gören duyan ?

sıfır:
|||||||||o|||||||||
yada başka sıfır:
_________o_________

sol -5
|||||o||||||||||||
veya
_____o_____________

veya sıfırda hiç birşey olmasın
sağa sola hareket ettikçe çizgiler çıksın
gibi..

İlyas KAYA

Bu şekilde yaptım. Sen karakterleri istediğin gibi yapabilirsin.
3 sağa 3 sola olacak şekilde ayarladım geri kalanıda bakarak kendin bitirirsin

Kolay gelsin.

adcon1=0


DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0

DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
  DEFINE OSC 4
    PAUSE 500

a var byte
b var byte
c var byte
d var byte
e var byte
f var byte
g var byte
h var byte
i var byte
j var byte
k var byte
l var byte
m var byte
n var byte
o var byte


'a=".":b=".":c=".":d=".":e=".":f=".":g=".":h=".":i=".":j=".":k=".":l=".":m=".":n="."


deger var byte

LCDOUT $FE,1


bas:

adcin 0,deger
LCDOUT $FE,2,"DEGER",#DEGER

LCDOUT $FE,$c0,a,b,c,d,e,f,g,219,h,i,j,k,l,m,n


IF DEGER>=128 THEN
a=".":b=".":c=".":d=".":e=".":f=".":g=".":h=255:i=".":j=".":k=".":l=".":m=".":n="."
endif

IF DEGER>=144 THEN
a=".":b=".":c=".":d=".":e=".":f=".":g=".":h=255:i=255:j=".":k=".":l=".":m=".":n="."
endif

IF DEGER>=160 then
a=".":b=".":c=".":d=".":e=".":f=".":g=".":h=255:i=255:j=255:k=".":l=".":m=".":n="."
endif

if deger>125 and deger<128 then
a=".":b=".":c=".":d=".":e=".":f=".":g=".":h=".":i=".":j=".":k=".":l=".":m=".":n="."
endif


IF DEGER<=125 then
a=".":b=".":c=".":d=".":e=".":f=".":g=255:h=".":i=".":j=".":k=".":l=".":m=".":n="."
endif

IF DEGER<=110 then
a=".":b=".":c=".":d=".":e=".":f=255:g=255:h=".":i=".":j=".":k=".":l=".":m=".":n="."
         endif
         

pause 300
goto bas

end
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

#2
Bende bir şey yaptım bak bakalım.

@ DEVICE PIC16F88             'işlemci 16F88 
@ DEVICE PIC16F88, INTRC_OSC_NOCLKOUT
@ DEVICE PIC16F88, WDT_OFF     'Watch Dog timer
@ DEVICE PIC16F88, PWRT_ON    'Power on timer açık
@ DEVICE PIC16F88, MCLR_OFF
@ DEVICE PIC16F88, BOD_OFF
@ DEVICE PIC16F88, LVP_OFF
@ DEVICE PIC16F88, CPD_OFF
@ DEVICE PIC16F88, WRT_OFF
@ DEVICE PIC16F88, DEBUG_OFF
@ DEVICE PIC16F88, CCPMX_ON  ;'........CCPMX_OFF = RB0, and CCPMX_ON = RB3.
@ DEVICE PIC16F88, PROTECT_OFF
define OSC 4

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2             

DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

OSCCON= %01100000 ' 4MHZ için OSCCON=%01100000, 8Mhz için OSCCON=%01110000

TRISB = %00000000
TRISA = %00000001   ' PORTA input (giriş) yapıldı...
ADCON0=%01000000
ADCON1=%11000000
ANSEL=%00000001

CMCON=7

DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 5     ' ADC clock source  (Fosc/16)
DEFINE ADC_SAMPLEUS 11 ' ADC sampli

BAR VAR WORD
HAM VAR WORD


LCDOUT $FE, $40, $0E, $0E, $0E, $0E, $0E, $0E, $0E, $0E ' ince bar çizgisi için bu satırı aşağıdaki ile yer değiştirin
'LCDOUT $FE, $40, $04, $04, $04, $04, $04, $04, $04, $04
LCDOUT $FE, $48, $04, $0E, $1B, $11, $11, $1B, $0E, $04 '
LCDOUT $FE, $50, $04, $04, $0E, $1B, $0E, $04, $04, $00 '

LCDOUT $FE,1
PAUSE 300

BASLA:
      ADCIN 0,HAM
     
      BAR=((HAM+1)*/475)/100

      LCDOUT $FE,$80,rep 0\BAR,219,rep 0\(19-bar)
      LCDOUT $FE,$C0,rep 0\BAR,"O",rep 0\(19-bar)
      LCDOUT $FE,$94,rep 0\BAR,1,rep 0\(19-bar)
      LCDOUT $FE,$D4,rep 0\BAR,2,rep 0\(19-bar)
      goto basla


Çalışan örnek ektedir.

Ete

Maxim

elinize sağlık teşekkürler
fakat ben biraz daha yüzsüzlük yapsam kızarmısınız?

her bir segment dikine 3 çizgiden oluşsa?
böylece yan yana bütün karakterler yanınca kesiksiz bir bar oluşuyor biliyorsunuz

sıfırdayken ekran boş
sola doğru gittikçe bu şekilde segmentler sol tarafta belirmeye başlasa?
mesela,
sola doğru 20 satırlık ekranda 10 segment var
haliyle sola doğru 10 step eder
ama her segmenti dikine üç çizgi yaparsak sola doğru 30 tane dik çizgimiz olur.
ortaya gelince yani sıfırda ekranda hiç birşey olmaz, aynı şey sağ tarafa doğru 30 çizgi demek.

evet biliyorum abarttım, kızmayın bana bu aralar tembelliğim üzerimde :)
bizden bu kadar derseniz haklısınız, tekrar teşekkürler vakit ayırdınız.

ete

#4
Sanırım , deveye hendek atlatmak bundan daha kolaydır.
İlişiktedir. Bilmem istediğin gibi oldumu?. Sadece anladığımı yapmaya çalıştım.
Zorluk benim yanlış anlamamdan da kaynaklanıyor olabilir. Zira 3 çizgi ile ifade edilenbir değer bana göre tek çizgiden başlamalı değer biraz artınca 2 çizgi biraz daha artınce 3 çizgi olmalı. Biraz daha artınca 3 çizgi (tek karekter) ve yanına tek çizgi gibi devam etmelidir. Bu şekilde yapınca sol taraf hallediliyor ama sağ tarafa bakınca işinsimetrisi bozuluyor. SOldaki 3 den az çizgiler sola yaslı olurken sağdakilerinde sağa yaslı olması gerektiğine karar verdim. Tabiiki bu iş yeni karekter tanımlaması gerektirdi. Sonuçta oldu ama uğraştırdı doğrusu.

Şayet istediğin yalnızca ilk projedki halin 3 çizgi ile gösterilmesi ise karekter tek çizgi yerine 3 çizgi ile gösterilir olur biterdi.
Bunu sende yapabilirsin artık. Ama doğrusu bu son yaptığım olsa gerek.

Ete

Maxim

hocam kusuruma bakmayın sizi uğraştırdım, bu yaptığınız çok daha zor bir iş
sanırım ben anlatamadım o yüzden oldu.
ben birşeyler yapmaya çalışayım teşekkürler tekrardan.
düzgün birşey becerirsem buraya eklerim.

şöyle birşey yapmaya çalışıcam
aynı sizin yaptığınız gibi her segmentte dikine 3 çubuk olacak
fakat bu çubuklar sağa-sola hareket edecek
sizinkinde tüm satırda dikine çubuk var, değere göre ortada sağa sola giden bir işeret var.


0 değerinde ekran boş olacak

+1 ile +30 arasında çubuklar tam ortadan sağa doğru artacak
(her segmentte 3 dik çubuk olduğuna göre sağa 10 segment 30 çubuk eder)

-1 ile -30 arası çubuklar tam ortadan sola doğru artacak


onurinci

Maxim hocam umarım başarırsınız.aynı anlattığınız senaryoda banada gerekli olacak.4 adet elektronik hall effekt pot'um var bunları ekranda görmek istiyorum.atıyorum adc ye 2.5 volt geldiğinde tam ortada belirleyen karakter yada hiç bir şey gözükmeyecek.potumu oyuncak arabaların joysitik'i gibi düşünebilirsiniz,tepki yok iken yaylar potu ortada tutmaya zorluyor.sola yasladığımda barlar ortadan ayrılıp sola doğru aldığı deger kadar yürüsün ,sağada bu senaryonun tersi gibi.heyecanla bekliyorum acelem yok.
Not= ilkel anlatacağım.eski FM radyolarında ortada duran ibe vardı.istasyondan kaçınca sağa yada sola yaslanıyordu.tam frekansın üzerine gelmek demek bunu ortada tutmak anlamındaydı .hocalarım saygılar.

Maxim

dün bayaa uğraştım
ortadan sağa doğru olanda sorun yok
sorun, grafiği sol tarafa doğru ilerletmek, onu beceremedim henüz
yani ortadan sola doğru kısımda sorun var

ete

#8
Aşağıdaki programı deneyin sanırım istediğiniz budur.

@ DEVICE PIC16F88             'işlemci 16F88 
@ DEVICE PIC16F88, INTRC_OSC_NOCLKOUT
@ DEVICE PIC16F88, WDT_OFF     'Watch Dog timer
@ DEVICE PIC16F88, PWRT_ON    'Power on timer açık
@ DEVICE PIC16F88, MCLR_OFF
@ DEVICE PIC16F88, BOD_OFF
@ DEVICE PIC16F88, LVP_OFF
@ DEVICE PIC16F88, CPD_OFF
@ DEVICE PIC16F88, WRT_OFF
@ DEVICE PIC16F88, DEBUG_OFF
@ DEVICE PIC16F88, CCPMX_ON  ;'........CCPMX_OFF = RB0, and CCPMX_ON = RB3.
@ DEVICE PIC16F88, PROTECT_OFF
define OSC 4

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2             

DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

OSCCON= %01100000 ' 4MHZ için OSCCON=%01100000, 8Mhz için OSCCON=%01110000

TRISB = %00000000
TRISA = %00000011   ' PORTA input (giriş) yapıldı...
ADCON0=%01000000
ADCON1=%11000000
ANSEL=%00000011

CMCON=7

DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 5     ' ADC clock source  (Fosc/16)
DEFINE ADC_SAMPLEUS 11 ' ADC sampli

SOLBAR VAR WORD
HAM  VAR WORD
SAGBAR   VAR BYTE


LCDOUT $FE, $40, $15, $15, $15, $15, $15, $15, $15, $15 '  üçlü


LCDOUT $FE,1
PAUSE 300

BASLA:
      ADCIN 0,HAM
     
      IF HAM<511 THEN
          solbar=10-((ham*/55)/10)
      ELSE
         SOLBAR=0
      ENDIF     
      IF HAM>511 THEN
        SAGBAR=((ham-511)*/50)/10
      ELSE
        SAGBAR=0
      ENDIF

       LCDOUT $FE,$80,REP 32\(10-SOLBAR),REP 0\SOLBAR,REP 0\SAGBAR,REP 32\(10-SAGBAR)
       lcdout $fe,$c0,"ham=",dec ham,"  "
       lcdout $fe,$94,"solbar=",dec solbar,"  "
       lcdout $fe,$d4,"sagbar=",dec sagbar,"  "
goto basla


Edit-1: Ufak bir değişiklik yaptım şimdi daha lineer çalışıyor
Edit-2: Orta konum biraz daha geniş olsun diye bir kere daha değiştirdim. Bu sefer tamamdır

Ete


onurinci

hocam olmuş gibi fakat diğer uygulamalarınız.titreşmeden,ekran Flicker olmadan çalışır iken.bu son verdiğiniz kod parçası simulasyonda izlenemiyor.
saygılar.

Maxim

en son satıra GOTO BASLA yazın ete usta eklemeyi unutmuş.

ete usta eline sağlık tekrardan
fakat dikine çubukları tek tek ilerletmek mümkün
siz 3lü olarak yürütüyorsunuz

sağa doğru olan kodu düzenleyip yazarım şu an elimde acil bir iş var abi

ete

Goto satırını düzeltme yaparken silmişim demekki ekledim.
Çubukları 3 lü yürüttüm öyle istiyorsunuz sandım. Elbette 1-2-3 geriyede 3-2-1 şeklinde ayarlanabilir.
Onuda siz yapın artık.

Ete

onurinci

Ete hocam harika olmuş.elinize sağlık gerisinle oynarım artık.

Maxim hocam tek tek gitmeyin benide alın.bende öğreniyim.kalın sağlıcakla.

ete

Tek - çift ve üçlü çizgi olarak ilerleyip geri gelen sistemide hazırladım. İlişikte veriyorum.

Ete

Maxim

ete usta kıyamadı bize, eline sağlık.
süper usta ete :)


ben daha önce başka bir arkadaşın protonda yaptığı yazılımdan faydalanmaya çalıştım
fakat sol tarafa istediğim şekilde yani 3lü olarak beceremedim.

genede dökümanı vereyim, bunda sağa 3lü olarak var
ve ortadan sola-sağa 2li olarak var.

(kodu yazan arkadaşın ismi bas dosyası içinde yazmaktadır)

Powered by EzPortal