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 1ADCON1=7
TRISA=%11111111
TRISB=%00000000H1 VAR WORD
H2 VAR WORD
H3 VAR WORDH1=%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