PIC Basic display negative value on LCD

เนื่องจากไมโครคอนโทรลเลอร์ไม่สามารถแสดงจำนวนติดลบได้โดยตรง ทำให้เราไม่สามารถนำมาใช้แสดงค่าที่ต่ำกว่า 0 เช่น ค่าอุณหภูมิจากเซนเซอร์ เป็นต้น ในความเป็นจริงถ้าหากเรานับทีละ 1 เริ่มจาก 0 จะไปถึงตัวเลขบวกที่ไม่มีสิ้นสุด และถ้านับถอยหลังทีละ 1 เริ่มจาก 0 ก็จะไปถึงตัวเลขลบที่ไม่มีสิ้นสุด แต่สำหรับไมโครคอนโทรลเลอร์เมื่อนับถึงจำนวนสูงสุดแล้วจะกลับมานับ 0 ใหม่ และถ้านับถอยหลังจนถึง 0 แล้วจะกลับเป็นจำนวนสูงสุดอีกครั้งหนึ่งไม่มีทางติดลบได้

ดังนั้น เราจึงกำหนดให้บิทหน้าสุดของชุดตัวเลขเป็นบิทเครื่องหมาย ถ้าเป็น 0 มีค่าบวก ถ้าเป็น 1 มีค่าลบ ซึ่งเป็นตัวระบุว่าต้องอ่านค่าตัวเลขชุดนั้นด้วยวิธีใด ถ้าเป็นค่าบวกให้นำมาแสดงในรูปเลขฐาน 10 ได้เลย แต่ถ้าเป็นค่าลบจะต้องนำมาเข้ากระบวนการ

1’s complement หรือการกลับบิท สามารถทำได้โดยการ XOR กับ 1 ในทุก ๆ บิท

2’s complement การบวก 1 เข้าไปในบิทสุดท้าย

ค่าที่ได้จากกระบวนการเมื่อเติมอักษร “-” ด้านหน้าและแปลงให้อยู่ในรูปเลขฐาน 10 ก็จะอยู่ในรูปของค่าลบ

ตัวอย่างโปรแกรม

 

 

‘****************************************************************
‘*  Name    : negative.BAS
‘*  Author  : HS3UKA
‘*  Notice  : Copyright (c) 2013
‘*          : All Rights Reserved
‘*  Date    : 1/2/2013
‘*  Version : 1.0
‘*  Notes   : http://www.hs3uka.com
‘****************************************************************

 

include “modedefs.bas”
‘** Asigamiento de Pines
define OSC 10
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG  PORTB
DEFINE LCD_EBIT 1

ADCON1=7
TRISA=%11111111
TRISB=%00000000

H1     VAR WORD
H2     VAR WORD
H3     VAR WORD

H1=%0000000000000000

main:        
        lcdout $fe,$1, “BIN:”
        lcdout $fe,$C0,BIN16 H1
        lcdout $fe,$90,”DEC:”
        
        IF H1.15 = 0 then
            H3=H1
            lcdout $fe,$D0,DEC H3
        else
            H2 = H1 ^ %1111111111111111
            H3 = H2+1
            lcdout $fe,$D0,”-“, DEC H3
        endif
        Pause 50
        
        IF PORTA.0 = 0 THEN
            H1=H1+1
        ENDIF
        IF PORTA.1 = 0 THEN
            H1=H1-1      
        ENDIF
        
    GoTo main

negative-value

Facebook Comments