?? mark3lcd.bsc
字號:
PIC 16F877
FREQ 20
OSCILLATOR CRYSTAL
BYTE mCount,CountDown,x,y,Hex,Dec,ch,bout,aa,bb,cc
BYTE cmd,dat,address
SBYTE i,servoR,servoL,servoValue,LR,Inc
SWORD wVar,Leye,Reye,RLineR,CLine,LLine
'
IR_Timer_Begin
PinHigh B , 1
CALL DoDutyDelay(servoR)
PinLow B , 1
PinLow B , 1
'
PinHigh B , 2
CALL DoDutyDelay(servoL)
PinLow B , 2
PinLow B , 2
'
IF CountDown > 0 THEN
CountDown = CountDown -1
END IF
IR_Timer_End
'
PROC DoDutyDelay(servoValue)
FOR i = 1 TO servoValue
Delay 0.1, 0
NEXT
END PROC
'
' ****** Init all PORTS ******
SetPort A , %111111
SetPort B , %000000
SetPort C , %000000
SetPort D , %00000000
SetPort E , %111
' ****************************
'
CALL LCD_Init()
Timer_Config 20.00, 1
Timer_Start
LR = 1
Inc = 0
servoR = 12
servoL = 18
Interrupt_Enable
USART_Config TX, 8, 38.4, 0
'CALL Forward()
'
Main :
'
CALL ReadSensors()
CALL LCD_Cmd($01)
CALL SendChar(10)
CALL SendChar(13)
CALL SendChar(76)
CALL SendChar(61)
CALL SendNum(Leye_L)
'CALL HexOut(Leye_L)
CALL SendChar(32)
CALL SendChar(82)
CALL SendChar(61)
CALL SendNum(Reye_L)
'CALL HexOut(Reye_L)
CALL SendChar(32)
'
CALL LCD_Char(0,0,76)
CALL LCD_Char(1,0,61)
CALL LCD_DecOut(Leye_L)
CALL LCD_Char(6,0,82)
CALL LCD_Char(7,0,61)
CALL LCD_DecOut(Reye_L)
'
IF CLine < 200 THEN
CALL Backward()
CALL Wait(20)
CALL UTurn()
CALL Wait(35)
ELSE
IF Reye < 80 & Leye < 80 THEN
CALL Forward()
CALL Wait(5)
ELSE
IF Reye < 80 & Leye > Reye THEN
CALL Right()
CALL Wait(5)
ELSE
IF Leye < 80 & Reye > Leye THEN
CALL Left()
CALL Wait(5)
ELSE
IF Leye < 110 & Reye < 110 THEN
Inc = Inc + LR
IF LR = 1 THEN
CALL RTurn()
ELSE
CALL LTurn()
END IF
IF Inc = 10 THEN
Inc = 0
LR = -1
ELSE
IF Inc = -10 THEN
Inc = 0
LR = 1
END IF
END IF
CALL Wait(10)
END IF
END IF
END IF
END IF
END IF
CALL Wait(1)
GOTO Main
'
PROC Forward()
servoR = 11
servoL = 19
CALL SendChar(70)
' 94 = "^"
CALL LCD_Char(14,0,94)
CALL LCD_Char(0,1,70)
CALL LCD_Char(1,1,111)
CALL LCD_Char(2,1,114)
CALL LCD_Char(3,1,119)
CALL LCD_Char(4,1,97)
CALL LCD_Char(5,1,114)
CALL LCD_Char(6,1,100)
CALL LCD_Char(7,1,32)
END PROC
'
PROC Backward()
servoR = 18
servoL = 12
CALL SendChar(66)
' 95 = "_"
CALL LCD_Char(14,0,95)
CALL LCD_Char(0,1,66)
CALL LCD_Char(1,1,97)
CALL LCD_Char(2,1,99)
CALL LCD_Char(3,1,107)
CALL LCD_Char(4,1,119)
CALL LCD_Char(5,1,97)
CALL LCD_Char(6,1,114)
CALL LCD_Char(7,1,100)
END PROC
'
PROC Left()
servoR = 13
servoL = 13
CALL SendChar(76)
' 60 = "<"
CALL LCD_Char(14,0,60)
CALL LCD_Char(0,1,76)
CALL LCD_Char(1,1,101)
CALL LCD_Char(2,1,102)
CALL LCD_Char(3,1,116)
CALL LCD_Char(4,1,32)
CALL LCD_Char(5,1,32)
CALL LCD_Char(6,1,32)
CALL LCD_Char(7,1,32)
END PROC
'
PROC Right()
servoR = 16
servoL = 16
CALL SendChar(82)
' 62 = ">"
CALL LCD_Char(14,0,62)
CALL LCD_Char(0,1,82)
CALL LCD_Char(1,1,105)
CALL LCD_Char(2,1,103)
CALL LCD_Char(3,1,104)
CALL LCD_Char(4,1,116)
CALL LCD_Char(5,1,32)
CALL LCD_Char(6,1,32)
CALL LCD_Char(7,1,32)
END PROC
'
PROC RTurn()
servoR = 19
servoL = 19
CALL SendChar(125)
' 85 = "}"
CALL LCD_Char(14,0,125)
CALL LCD_Char(0,1,82)
CALL LCD_Char(1,1,45)
CALL LCD_Char(2,1,116)
CALL LCD_Char(3,1,117)
CALL LCD_Char(4,1,114)
CALL LCD_Char(5,1,110)
CALL LCD_Char(6,1,32)
CALL LCD_Char(7,1,32)
END PROC
'
PROC LTurn()
servoR = 11
servoL = 11
CALL SendChar(123)
' 85 = "{"
CALL LCD_Char(14,0,123)
CALL LCD_Char(0,1,76)
CALL LCD_Char(1,1,45)
CALL LCD_Char(2,1,116)
CALL LCD_Char(3,1,117)
CALL LCD_Char(4,1,114)
CALL LCD_Char(5,1,110)
CALL LCD_Char(6,1,32)
CALL LCD_Char(7,1,32)
END PROC
'
PROC UTurn()
servoR = 19
servoL = 19
CALL SendChar(85)
' 85 = "U"
CALL LCD_Char(14,0,85)
CALL LCD_Char(0,1,85)
CALL LCD_Char(1,1,45)
CALL LCD_Char(2,1,116)
CALL LCD_Char(3,1,117)
CALL LCD_Char(4,1,114)
CALL LCD_Char(5,1,110)
CALL LCD_Char(6,1,32)
CALL LCD_Char(7,1,32)
END PROC
'
PROC Wait(mCount)
CountDown = mCount
WaitCount :
IF CountDown > 0 THEN
GOTO WaitCount
END IF
END PROC
'
PROC ReadA2D()
' Read the A2D and store the answer in wVar
Delay 0.01, 0
ADC_Start
Delay 0.04, 0
ADC_Wait
ADC_Store wVar
RETURN
END PROC
'
PROC ReadSensors()
ADC_Config 2, 1, 0, 0, 0
CALL ReadA2D()
Reye_L = wVar_H
Reye_H = 0
ADC_Off
'
ADC_Config 3, 1, 0, 0, 0
CALL ReadA2D()
Leye_L = wVar_H
Leye_H = 0
ADC_Off
'
ADC_Config 6, 1, 0, 0, 0
CALL ReadA2D()
Cline_L = wVar_H
Cline_H = 0
ADC_Off
END PROC
'
PROC SendChar(x)
' *** Send Character to USART ***
TX_Load x
Wait_TX
END PROC
'
PROC SendNum(Dec)
aa = Dec / 100
ch = aa
CALL Cout(ch)
'
bb = (Dec - aa * 100) / 10
ch = bb
CALL Cout(ch)
'
cc = Dec - aa*100 - bb*10
ch = cc
CALL Cout(ch)
END PROC
'
PROC HexOut(Hex)
ch = Hex / 16
CALL Cout(ch)
ch = Hex - ch * 16
CALL Cout(ch)
END PROC
'
PROC Cout(ch)
IF ch < 10 THEN
ch = 48 + ch
ELSE
ch = 55 + ch
END IF
CALL SendChar(ch)
END PROC
'
PROC LCD_DecOut(Dec)
aa = Dec / 100
ch = aa
CALL LCD_Cout(ch)
'
bb = (Dec - aa * 100) / 10
ch = bb
CALL LCD_Cout(ch)
'
cc = Dec - aa*100 - bb*10
ch = cc
CALL LCD_Cout(ch)
END PROC
'
PROC LCD_HexOut(Hex)
ch = Hex / 16
CALL LCD_Cout(ch)
ch = Hex - ch * 16
CALL LCD_Cout(ch)
END PROC
'
PROC LCD_Cout(ch)
IF ch < 10 THEN
ch = 48 + ch
ELSE
ch = 55 + ch
END IF
CALL LCD_Data(ch)
END PROC
'
PROC LCD_Init()
' $28 = 4 bits, 2 lines, 5x7 font
' $0C = Display On, Cursor Off, Cursor No Flash
' $06 = Char No move, Cursor auto right move one step
' $01 = Clear LCD
CALL LCD_Cmd($28)
CALL LCD_Cmd($0c)
'CALL LCD_Cmd($06)
CALL LCD_Cmd($01)
Delay 0.2, 0
END PROC
'
PROC LCD_En(i)
IF i = 0 THEN
PinLow C , 1
ELSE
PinHigh C , 1
END IF
END PROC
'
PROC LCD_RS(i)
IF i = 0 THEN
PinLow C , 0
ELSE
PinHigh C , 0
END IF
END PROC
'
PROC LCD_Cmd(cmd)
Interrupt_Disable
Delay 0.16, 0
CALL LCD_RS(0)
Delay 0.02, 0
CALL LCD_En(0)
Delay 0.02, 0
'
PortOut D , %00001111
PortOut D , cmd
Delay 0.02, 0
CALL LCD_En(1)
Delay 0.02, 0
CALL LCD_En(0)
'
PortOut D , %00001111
Delay 0.02, 0
Shift cmd, Left, 4
PortOut D , cmd
CALL LCD_En(1)
Delay 0.02, 0
CALL LCD_En(0)
Interrupt_Enable
END PROC
'
PROC LCD_Data(dat)
Interrupt_Disable
Delay 0.16, 0
CALL LCD_RS(1)
Delay 0.02, 0
CALL LCD_En(0)
Delay 0.02, 0
'
PortOut D , %00001111
PortOut D , dat
Delay 0.02, 0
CALL LCD_En(1)
Delay 0.02, 0
CALL LCD_En(0)
'
PortOut D , %00001111
Delay 0.02, 0
Shift dat, Left, 4
PortOut D , dat
CALL LCD_En(1)
Delay 0.02, 0
CALL LCD_En(0)
Interrupt_Enable
END PROC
'
PROC LCD_XY(x,y)
IF y = 0 THEN
address = $80 + x
ELSE
address = $C0 + x
END IF
CALL LCD_Cmd(address)
END PROC
'
PROC LCD_Char(x,y,ch)
CALL LCD_XY(x,y)
CALL LCD_Data(ch)
END PROC
'
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -