⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mark3lcd.bsc

📁 Mark III robot (PIC Version) - CH Basic http://www.junun.org/MarkIII/Info.jsp?item=1 Autorun + LC
💻 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 + -