MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ;************************************************************************** 00002 ; 00003 ; IIC_LCD.ASM 00004 ; 00005 ; PROGRAM: Simple explore of the LCD display see: http://www.robot-electronics.co.uk/htm/Lcd02tech.htm 00006 ; 00007 ; DESCRIPTION: 00008 ; 00009 ; iic_lcd - hack to get PIC16F88 to drive IIC display. 22/03/2011 00010 ; 00011 ; Displays a line of text: 1234 bbbb xx String 00012 ; bbbb is bit map of keys pressed 00013 ; xx is counter incremented 00014 ; String is written by LCDdispStr and is "Start ", "Stop ", or " " 00015 ; 00016 ; Attach keypad to IIC display as described in the web page 00017 ; press keyboard: 00018 ; key 1 - writes "Start " at String 00019 ; key 2 - writes "Stop " at String 00020 ; else - writes " " at String 00021 ; 00022 ; key 4 - decrement xx on press and release 00023 ; key 5 - increment xx on press and release 00024 ; 00025 ; key 7 - decrement xx on press 00026 ; key 8 - increment xx on press 00027 ; 00028 ; 00029 ; Blue LED on PORTB,2 lights if LCD display is not connected. 00030 ; 00031 ; display: 00032 ; http://www.robot-electronics.co.uk/htm/Lcd02tech.htm 00033 ; http://www.robot-electronics.co.uk/htm/Lcd03tech.htm 00034 ; 00035 ; status: working - writes to display, polls keyboard, writes to display then does not repeat 00036 ; added code to display strings and increment / decrement 00037 ; Only works if one key pressed, multiple keys have side effects. 00038 ; 00039 ; Added scope sync pulse to start of IIClcdPollKeyboard so that scope hardcopy can be captured. 00040 ; 00041 ; AUTHOR: Douglas Rice 00042 ; Copyright 2011 00043 ; 00044 ;************************************************************************** 00045 00046 00047 ;-------------------------------------------------------------------------- 00048 ; Sec 0. #Defines for different chips 00049 ;-------------------------------------------------------------------------- 00050 #define pic16F88 1 00051 00052 LIST w=1, R=DEC 00053 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00054 ;-------------------------------------------------------------------------- 00055 ; Sec 0.1 #Defines for 16F88 00056 ;-------------------------------------------------------------------------- 00057 00058 ifdef pic16F88 00059 LIST P=16F88, R=DEC 00060 INCLUDE "p16F88.inc" 00001 LIST 00002 ; P16F88.INC Standard Header File, Version 1.00 Microchip Technology, Inc. 00410 LIST 00061 2000 0000 0000 0008 00062 __idlocs 0x0088 0008 00063 2007 3F30 00064 __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MC LR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO 2008 3FFC 00065 __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF 00066 00067 cblock 0x20 00068 endc 00069 00000002 00070 T0IF EQU TMR0IF 00071 00000004 00072 SCL EQU 4 00000001 00073 SDA EQU 1 00074 00075 endif 00076 00077 ;-------------------------------------------------------------------------- 00078 ; Sec 2.0 Variables 00079 ;-------------------------------------------------------------------------- 00080 ; Variables start 0x0C 00081 ; 00082 00083 ; DoTimeSlice Bits, to schedule, set bit 00084 00085 cblock 00086 ; variables used by IIC routines 00087 00000020 00088 IICloopCnt ; counts 8 bits 00089 00090 ; 00091 ; IIC data 00092 ; 00000021 00093 IICtxTemp ; temporary copy of the character to be transmitted 00000022 00094 IICwaitCnt 00000023 00095 IICflg ; flag to indicate pulse s 00096 00000024 00097 IICbusBits ; temporary copy of SCL and SDA 00098 00099 ; 00100 ; read buffer 00101 ; MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00000025 00102 IICrx1 00000026 00103 IICrx2 00000027 00104 IICrx3 00000028 00105 IICrx4 00106 00107 ; 00108 ; Store inputs to look for edge 00109 ; 00000029 00110 IIClastKeyLSB 0000002A 00111 IIClastKeyMSB 0000002B 00112 IICpressedKeyLSB ; bits set on press, must be reset by ISR 0000002C 00113 IICpressedKeyMSB ; bits set on press, must be reset by ISR 00114 00115 ; 00116 ; pointer into look up table 00117 ; 0000002D 00118 LCDptr ; pointer into look up table 0000002E 00119 LCDcnt ; counter 00120 00121 ENDC 00122 00123 00124 00125 00126 ;-------------------------------------------------------------------------- 00127 ; Sec 3. MACROS 00128 ;-------------------------------------------------------------------------- 00129 00130 00131 TEST_STRADDLE MACRO START 00132 if high( $ ) != high( START ) 00133 Error "Table straddles Page Boundary " + Start 00134 endif 00135 endm 00136 00137 ;-------------------------------------------------------------------------- 00138 ; Sec 4. Program Code 00139 ;-------------------------------------------------------------------------- 0000 00140 ORG 0 00141 00142 0000 2826 00143 GOTO Start 0001 3004 00144 MOVLW 04 00145 0004 00146 ORG 4 0004 0009 00147 RETFIE 0005 2925 00148 GOTO Intrtn 00149 00150 00151 ;-------------------------------------------------------------------------- 00152 ; Sec 4.1 Jump Table keep in bottom segment to keep it easier 00153 ;-------------------------------------------------------------------------- 00154 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 4 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0006 00155 LCDgetByte 00156 00157 ; LCDptr has been set to Absolute position of string in lookup table. 00158 ; 00159 ; we should have set up PCLATH 00160 ; When LCDstrPtr gets to 0xFF 00161 ; MOVLW high $ 00162 ; MOVWF PCLATH 00163 ; 00164 00165 ; use absolute address in LCDptr 0006 018A 00166 clrf PCLATH 0007 082D 00167 movfw LCDptr ; get the pointer 0008 0AAD 00168 incf LCDptr,f ; post increment the pointer 0009 0082 00169 movwf PCL 00170 000A 00171 LCDstr1 000A 3453 3474 3461 00172 DT "Start " 3472 3474 3420 00173 ; need to end string 0010 3400 00174 retlw 0 00175 0011 00176 LCDstr2 0011 3453 3474 346F 00177 DT "Stop " 3470 3420 3420 0017 3400 00178 retlw 0 00179 0018 00180 LCDstr3 0018 3420 3420 3420 00181 DT " " 3420 3420 3420 00182 ; need to end string 001E 3400 00183 retlw 0 00184 00185 00186 ;-------------------------------------------------------------------------- 00187 ; Sec 4.2 LCD procedures LCD string write displayes 00188 ;-------------------------------------------------------------------------- 00189 00190 ; 00191 ; LCDdispStr - function to write bytes from lookup table to IIC display. 00192 ; 00193 ; W contains absolute pointer 00194 ; assumes START,C6 already written 00195 ; does not sent STOP 00196 ; 001F 00197 LCDdispStr 001F 00AD 00198 movwf LCDptr 00199 0020 00200 LCDdispStrLoop 00201 ; output string to display 0020 2006 00202 call LCDgetByte 00203 ; look for NULL at end of the string to terminate it 0021 3A00 00204 xorlw 0 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 5 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0022 1903 00205 skpnz 0023 0008 00206 return 0024 20DE 00207 call IIctxCharW ; send the byte to the IIC buss. 0025 2820 00208 goto LCDdispStrLoop 00209 00210 00211 ;-------------------------------------------------------------------------- 00212 ; Sec 5.1 Start Code 00213 ;-------------------------------------------------------------------------- 00214 00215 0026 00216 Start 00217 ifdef OSCCON 00218 0026 1683 1303 00219 banksel OSCCON 00220 ; set OSC to 4 Mhz 0028 3060 00221 MOVLW 6 << IRCF0 ; 4 Mhz 0029 008F 00222 MOVWF OSCCON 00223 00224 ; don't wait 002A 1283 1303 00225 banksel 0 00226 00227 endif 00228 002C 2051 00229 CALL IICinit 00230 00231 ; 00232 ; Poll keyboard to flush key presses. 00233 ; 002D 2091 00234 call IIClcdPollKeyboard 00235 ; copy new keys to last keys. 002E 01A9 00236 clrf IIClastKeyLSB 002F 01AA 00237 clrf IIClastKeyMSB 0030 01AE 00238 clrf LCDcnt 00239 0031 2065 00240 CALL IICdrawText 0032 01AE 00241 clrf LCDcnt 00242 00243 00244 ;-------------------------------------------------------------------------- 00245 ; Sec 5.2 Main Program 00246 ;-------------------------------------------------------------------------- 00247 ; 00248 ; This is not being used 00249 ; 0033 00250 MainLoop 00251 00252 ; 00253 ; Start Main loop 00254 ; 0033 00255 startLoop 0033 2091 00256 call IIClcdPollKeyboard 00257 ; MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 6 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00258 ; look for key press or release 00259 ; 0034 0826 00260 movfw IICrx2 0035 0629 00261 xorwf IIClastKeyLSB,w 0036 04AB 00262 iorwf IICpressedKeyLSB,f 00263 0037 0827 00264 movfw IICrx3 0038 062A 00265 xorwf IIClastKeyMSB,w 0039 04AC 00266 iorwf IICpressedKeyMSB,f 00267 00268 ; Or IICpressedKeyLSB to see if any new keys pressed. 003A 042B 00269 iorwf IICpressedKeyLSB,w 003B 1903 2833 00270 bz startLoop 00271 00272 ; copy new keys to last keys. 003D 0826 00273 movfw IICrx2 003E 00A9 00274 movwf IIClastKeyLSB 00275 003F 0827 00276 movfw IICrx3 0040 00AA 00277 movwf IIClastKeyMSB 00278 ; a button is pressed 00279 00280 ; poll through IICpressedKeyLSB and IICpressedKeyMSB 00281 00282 ; call any routines to respond to pressed key 00283 ; called on rising and falling edge 00284 00285 ; btfsc IICpressedKeyLSB,3 00286 00287 ; see if key has just been pressed or released 0041 19AB 00288 btfsc IICpressedKeyLSB,3 0042 03AE 00289 decf LCDcnt,f 00290 0043 1A2B 00291 btfsc IICpressedKeyLSB,4 0044 0AAE 00292 incf LCDcnt,f 00293 00294 ; we know a key has been pressed or released, we are only interested in presses. 00295 ; see if key has just been pressed 0045 1B29 00296 btfsc IIClastKeyLSB,6 0046 03AE 00297 decf LCDcnt,f 00298 0047 1BA9 00299 btfsc IIClastKeyLSB,7 0048 0AAE 00300 incf LCDcnt,f 00301 00302 00303 ; poll round keys 0049 2065 00304 CALL IICdrawText 00305 00306 ; clear flags 004A 01AB 00307 clrf IICpressedKeyLSB 004B 01AC 00308 clrf IICpressedKeyMSB 00309 004C 2833 00310 GOTO MainLoop MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 7 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00311 00312 00313 ;-------------------------------------------------------------------------- 00314 ; Sec 6. Subroutines, procedures and functions 00315 ;-------------------------------------------------------------------------- 00316 00317 ;-------------------------------------------------------------------------- 00318 ; Sec 6.1 Clock Chain Routine 00319 ;-------------------------------------------------------------------------- 00320 004D 00321 CLtimeslice 00322 ; 004D 1D0B 00323 BTFSS INTCON,T0IF 004E 0008 00324 RETURN 00325 00326 ; TMR0 timeout 004F 110B 00327 BCF INTCON,T0IF 00328 0050 0008 00329 RETURN 00330 00331 00332 00333 ;-------------------------------------------------------------------------- 00334 ; Sec 6.2 IIC Routines - these do not use the chipps IIC hardware 00335 ;-------------------------------------------------------------------------- 00336 00337 0051 00338 IICinit 0051 30FF 00339 MOVLW 0xFF 0052 1683 1303 00340 banksel TRISB 0054 0086 00341 MOVWF TRISB 0055 1106 00342 BCF TRISB,2 ; enable BLUE LED 00343 00344 00345 ; 00346 ; not sure about these 00347 ; 0056 3010 00348 MOVLW 0x10 0057 1683 1303 00349 banksel SSPADD 0059 0093 00350 MOVWF SSPADD 00351 005A 3036 00352 MOVLW 0x36 005B 1283 1303 00353 banksel SSPCON 005D 0094 00354 MOVWF SSPCON 00355 005E 0008 00356 return 00357 00358 ; 00359 ; http://www.robot-electronics.co.uk/htm/Lcd02tech.htm 00360 ; 00361 ;(for both I2C and Serial) 00362 ; 00363 ;decimal command MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 8 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00364 ; description 00365 ; 0 null (ignored) Ignored as a no operation 00366 ; 1 Cursor Home Sets the cursor to the home position (top left) 00367 ; 2 Set cursor (1-80) Cursor to a position specified by the next byte, where 1 is the top left and 80 is the bottom right 00368 ; 3 set cursor (line, column) Sets cursor using two bytes, where first byte is the line and the second b yte is the column 00369 ; 4 Hide cursor stops the position cursor from appearing on the display 00370 ; 5 Show underline cursor Changes the cursor to the underline type 00371 ; 6 Show blinking cursor Changes the cursor to the blinking type 00372 ; 8 Backspace deletes the preceding character from the current position on the display 00373 ; 9 Horizontal tab (by tab set) Moves the current position across by the tab space set by command 18 (d efault tab space 4) 00374 ;10 Smart line feed Moves the cursor down one line to the position beneath in the same column 00375 ;11 Vertical tab Moves the cursor up one line to the position above in the same column 00376 ;12 Clear screen Clears the screen and sets cursor to the home position 00377 ;13 Carriage Return Moves the cursor to the start of the next line 00378 ;17 Clear Column Clears the contents of the current column and moves cursor right by one column 00379 ;18 Tab set Sets the required tab size, the following byte can be a size of between 1 and 10 00380 ;27 Custom char generator allows 8 custom chars to be built. See custom char generator below 00381 ;32-255 ASCII chars Writes ASCII chars straight to the display 00382 005F 00383 IICwrtHexNibble ; currently only displays 0..9, A..F 005F 390F 00384 ANDLW 0x0F 0060 3E06 00385 ADDLW 0x06 ; is it A..F, if so trigger a digit overflow 0061 1883 00386 SKPNDC 0062 3E07 00387 ADDLW 7; subtract 10, then add 'A'-'0' 0063 3E2A 00388 ADDLW 0x30-6 ; Subtract extra 6 added to cause DC 0064 28DE 00389 goto IIctxCharW 00390 00391 00392 ;-------------------------------------------------------------------------- 00393 ; Sec 6.3 IIC Routines - Draw a line of text ion the display 00394 ;-------------------------------------------------------------------------- 00395 0065 00396 IICdrawText 00397 0065 20CC 00398 call IIcStart 00399 00400 ; send Address 0xC6 0066 30C6 00401 movlw 0xC6 0067 20DE 00402 call IIctxCharW 00403 00404 ; send to register 0x00 0068 3000 00405 movlw 0x00 0069 20DE 00406 call IIctxCharW 00407 00408 ; 00409 ; send characters. 006A 300C 00410 movlw 0x0c 006B 20DE 00411 call IIctxCharW 00412 00413 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 9 LOC OBJECT CODE LINE SOURCE TEXT VALUE 006C 3031 00414 movlw 0x31 006D 20DE 00415 call IIctxCharW 00416 006E 3032 00417 movlw 0x32 006F 20DE 00418 call IIctxCharW 00419 0070 3033 00420 movlw 0x33 0071 20DE 00421 call IIctxCharW 00422 0072 3034 00423 movlw 0x34 0073 20DE 00424 call IIctxCharW 00425 00426 0074 3020 00427 movlw 0x20 0075 20DE 00428 call IIctxCharW 00429 00430 ; banksel TRISA 00431 ; BCF TRISA,1 00432 ; banksel PORTB 00433 ; BSF PORTA,1 00434 00435 0076 0E27 00436 swapf IICrx3,w 0077 205F 00437 call IICwrtHexNibble 00438 0078 0827 00439 movf IICrx3,w 0079 205F 00440 call IICwrtHexNibble 00441 00442 007A 0E26 00443 swapf IICrx2,w 007B 205F 00444 call IICwrtHexNibble 00445 007C 0826 00446 movf IICrx2,w 007D 205F 00447 call IICwrtHexNibble 00448 00449 00450 ; 00451 ; disply 8 bit counter dec/incremented by button 7,8 and double dec/increments when 4,5 00452 ; 00453 007E 3020 00454 movlw 0x20 007F 20DE 00455 call IIctxCharW 00456 0080 0E2E 00457 swapf LCDcnt,w 0081 205F 00458 call IICwrtHexNibble 00459 0082 082E 00460 movf LCDcnt,w 0083 205F 00461 call IICwrtHexNibble 00462 00463 0084 3020 00464 movlw 0x20 0085 20DE 00465 call IIctxCharW 00466 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 10 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00467 ; 00468 ; disply "start" or "stop" when button 1,2 pressed 00469 ; 00470 00471 ; We must set W to a valid string as there is no validation in LCDdispStr 0086 3018 00472 movlw LCDstr3 00473 0087 182B 00474 btfsc IICpressedKeyLSB,0 0088 300A 00475 movlw LCDstr1 ; "start " 00476 0089 18AB 00477 btfsc IICpressedKeyLSB,1 008A 3011 00478 movlw LCDstr2 ; "stop " 00479 00480 00481 ; display Str 008B 201F 00482 call LCDdispStr 00483 00484 008C 20D2 00485 call IIcStop 00486 008D 1283 1303 00487 banksel PORTB 008F 1085 00488 BCF PORTA,1 00489 0090 0008 00490 return 00491 00492 00493 00494 ;-------------------------------------------------------------------------- 00495 ; Sec 6.4 IIC Routines - poll Keyboard on IIC display. 00496 ;------------------------------------------------------------- 00497 0091 00498 IIClcdPollKeyboard 00499 00500 ; 00501 ; read four bytes as these have a bit map of keys pressed. 00502 ; 00503 ; 00504 00505 ; output a debug sync pulse for a scope 0091 1683 1303 00506 banksel TRISA 0093 1085 00507 BCF TRISA,1 0094 1283 1303 00508 banksel PORTB 0096 1485 00509 BSF PORTA,1 00510 0097 0000 00511 nop 0098 0000 00512 nop 0099 0000 00513 nop 00514 009A 1683 1303 00515 banksel TRISA 009C 1085 00516 BCF TRISA,1 009D 1283 1303 00517 banksel PORTB 009F 1085 00518 BCF PORTA,1 00519 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 11 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00520 00521 00522 ; 00523 ; Set the Start Address 00524 ; 00A0 20CC 00525 call IIcStart 00526 00527 ; send Address 0xC6 00A1 30C6 00528 movlw 0xC6 00A2 20DE 00529 call IIctxCharW 00530 00531 ; send to register 0x00 00A3 3000 00532 movlw 0x00 00A4 20DE 00533 call IIctxCharW 00534 00535 ; 00A5 20D6 00536 call IIcReStart 00537 00538 ; send Address 0xC6 +R 00A6 30C7 00539 movlw 0xC7 00A7 20DE 00540 call IIctxCharW 00541 00A8 2105 00542 call IIcrxChar 00A9 211A 00543 call IIcrxAck 00AA 00A5 00544 movwf IICrx1 00545 00AB 2105 00546 call IIcrxChar 00AC 211A 00547 call IIcrxAck 00AD 00A6 00548 movwf IICrx2 00549 00AE 2105 00550 call IIcrxChar 00AF 211A 00551 call IIcrxAck 00B0 00A7 00552 movwf IICrx3 00553 00B1 2105 00554 call IIcrxChar 00B2 2120 00555 call IIcrxNAck 00B3 00A8 00556 movwf IICrx4 00557 00B4 20D2 00558 call IIcStop 00559 00B5 0008 00560 return 00561 00562 00563 00564 00565 ;--------------------------------------------------------------------------------------- 00566 ; Sec 6.5 IIC Routines - low level routines to do wired Or 00567 ;--------------------------------------------------------------------------------------- 00568 00569 ; 00570 ; The IIC buss should have 4k7 ohm pull ups from SDA and SCL to +5V 00571 ; 00572 ; Use TRIS to do wired OR MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 12 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00573 ; set TRIS bit to 0 to assert 0 00574 ; set TRIS bit to 1 to let buss float high 00575 ; 00576 ; 00577 00B6 00578 IICtris 00B6 3000 00579 MOVLW 0x00 00B7 28BE 00580 goto IICwriteTris 00581 00B8 00582 IICtrisSDA 00B8 3002 00583 MOVLW 0x00 | 1 << SDA 00B9 28BE 00584 goto IICwriteTris 00585 00BA 00586 IICtrisSDASCL 00BA 3012 00587 MOVLW 0x00 | 1 << SDA | 1 << SCL 00BB 28BE 00588 goto IICwriteTris 00589 00BC 00590 IICtrisSCL 00BC 3010 00591 MOVLW 1 << SCL 00BD 28BE 00592 goto IICwriteTris 00593 00594 00595 00BE 00596 IICwriteTris 00597 ; 00598 ; 00599 ; save bits 00600 ; 00BE 00A4 00601 movwf IICbusBits 00BF 30ED 00602 movlw ~ ( 1 << SDA | 1 << SCL ) 00603 ;iorlw 0xED 00604 ; 00605 ; force PORTB bits lows 00606 ; 00C0 1283 1303 00607 banksel PORTB 00608 ; clrf PORTB 00C2 0586 00609 ANDWF PORTB,f 00610 00611 00612 ; 00613 ; Do Wired Or in IIC bus using TRIS 00614 ; 00C3 0824 00615 movfw IICbusBits 00616 ; force TRISB bits, leaving other bits unaffected 00617 ; W = want 00C4 1683 1303 00618 banksel TRISB 00C6 0606 00619 xorwf TRISB,w 00620 ; want xor TRISB 00621 ; mask off bits needing changing 00C7 3912 00622 andlw 1 << SDA | 1 << SCL ; 00623 ; for masked bits are zero and will not change bits 00624 ; for unmasked bits ( want xor TRISB xor TRISB ) equals want 00C8 0686 00625 xorwf TRISB,f MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 13 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00C9 1283 1303 00626 banksel PORTB 00CB 0008 00627 return 00628 00629 00630 00631 00632 ;--------------------------------------------------------------------------------------- 00633 ; Sec 6.6 IIC Routines - low level routines - start,stop,restart, tx , rx , ack, nack 00634 ;--------------------------------------------------------------------------------------- 00635 00636 00CC 00637 IIcStart 00CC 3000 00638 movlw 0 00CD 0086 00639 movwf PORTB 00640 ; Apply IIC start 00641 ; SCL on RB4 00642 ; SDA on RB1 00643 ; SCL ----\______ 00644 ; SDA --\___ 00645 00646 ; MOVLW 0x00 | 1 << SCL | 1 << SDA 00647 ; CALL IICwriteTris 00CE 20BA 00648 call IICtrisSDASCL 00649 00650 ; MOVLW 0x00 | 1 << SCL 00651 ; CALL IICwriteTris 00CF 20BC 00652 call IICtrisSCL 00653 00654 ; MOVLW 0x00 00655 ; CALL IICwriteTris 00D0 20B6 00656 call IICtris 00657 00658 00D1 0008 00659 RETURN 00660 00D2 00661 IIcStop 00662 ; Apply IIC start 00663 ; SCL on RB4 00664 ; SDA on RB1 00665 ; SCL ____/------- 00666 ; SDA ______/----- 00667 00668 ; MOVLW 0x00 00669 ; CALL IICwriteTris 00670 00D2 20B6 00671 call IICtris 00672 00673 00674 ; MOVLW 0x00 | 1 << SCL 00675 ; CALL IICwriteTris 00676 00D3 20BC 00677 call IICtrisSCL 00678 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 14 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00679 00680 ; MOVLW 0x00 | 1 << SCL | 1 << SDA 00681 ; CALL IICwriteTris 00D4 20BA 00682 call IICtrisSDASCL 00683 00D5 0008 00684 RETURN 00685 00686 00D6 00687 IIcReStart 00D6 3000 00688 movlw 0 00D7 0086 00689 movwf PORTB 00690 ; Apply IIC start 00691 ; SCL on RB4 00692 ; SDA on RB1 00693 ; SCL ___/----\___ 00694 ; SDA _/----\_____ 00695 00696 00697 ; MOVLW 0x00 00698 ; CALL IICwriteTris 00D8 20B6 00699 call IICtris 00700 00701 00702 ; MOVLW 0x00 | 1 << SDA 00703 ; CALL IICwriteTris 00D9 20B8 00704 call IICtrisSDA 00705 00706 ; MOVLW 0x00 | 1 << SCL | 1 << SDA 00707 ; CALL IICwriteTris 00DA 20BA 00708 call IICtrisSDASCL 00709 00710 00711 ; MOVLW 0x00 | 1 << SCL 00712 ; CALL IICwriteTris 00DB 20BC 00713 call IICtrisSCL 00714 00715 00716 ; MOVLW 0x00 00717 ; CALL IICwriteTris 00DC 20B6 00718 call IICtris 00719 00DD 0008 00720 RETURN 00721 00722 00723 00724 00725 00726 00DE 00727 IIctxCharW 00DE 00728 IIctxChar 00729 ; 00730 ; Output One Byte which is in W 00731 ; MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 15 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00DE 00A1 00732 movwf IICtxTemp 00733 00DF 3008 00734 movlw 8 00E0 00A0 00735 movwf IICloopCnt 00736 00E1 1283 1303 00737 BANKSEL IICflg 00E3 01A3 00738 clrf IICflg 00739 00E4 00740 IIctxChar0 00741 00742 ; set SDA and SCL low 00E4 20B6 00743 call IICtris 00744 00E5 1FA1 00745 BTFSS IICtxTemp,7 00E6 28EF 00746 goto IIctxChar1 00747 00748 ; clock out ONE , set data high 00749 ; MOVLW 0x00 | 1 << SDA 00750 ; CALL IICwriteTris 00E7 20B8 00751 call IICtrisSDA 00752 00753 ; clock out ONE , set clock high 00754 ; MOVLW 0x00 | 1 << SDA | 1 << SCL 00755 ; CALL IICwriteTris 00E8 20BA 00756 call IICtrisSDASCL 00757 00758 00759 ; is clock high as requested? 00E9 1283 1303 00760 BANKSEL PORTB 00EB 1E06 00761 BTFSS PORTB,SCL 00EC 1423 00762 BSF IICflg,0 00763 00764 ; clock out ONE , set clock high 00765 ; MOVLW 0x00 | 1 << SDA 00766 ; CALL IICwriteTris 00ED 20B8 00767 call IICtrisSDA 00768 00EE 28F7 00769 GOTO IIctxChar2 00770 00EF 00771 IIctxChar1 00772 ; clock out ZERO 00773 00774 ; set CLK 00775 ; MOVLW 0x00 | 1 << SCL 00776 ; CALL IICwriteTris 00EF 20BC 00777 call IICtrisSCL 00778 00779 ; 00780 ; 00781 ; 00F0 1283 1303 00782 BANKSEL PORTB 00F2 1E06 00783 BTFSS PORTB,SCL 00F3 1423 00784 BSF IICflg,0 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 16 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00785 00F4 1E06 00786 BTFSS PORTB,SCL 00F5 1506 00787 BSF PORTB,2 00788 00789 00790 ; MOVLW 0x00 00791 ; CALL IICwriteTris 00F6 20B6 00792 call IICtris 00793 00F7 00794 IIctxChar2 00795 00F7 1283 1303 00796 banksel IICtxTemp 00F9 0DA1 00797 rlf IICtxTemp,f 00798 00FA 0BA0 00799 DECFSZ IICloopCnt,f 00FB 28E4 00800 GOTO IIctxChar0 00801 00802 ; Clock out ACK 00803 ; This is not tested 00804 ; MOVLW 0x00 | 1 << SDA 00805 ; CALL IICwriteTris 00FC 20B8 00806 call IICtrisSDA 00807 00808 ; set clock high 00809 ; MOVLW 0x00 | 1 << SDA | 1 << SCL 00810 ; CALL IICwriteTris 00FD 20BA 00811 call IICtrisSDASCL 00812 00813 ; 00814 ; output + for ACK and - for NACK and _ for SCL clamped 00815 ; 00FE 1283 1303 00816 banksel PORTB 00817 0100 302B 00818 MOVLW '+' 00819 ; test if SDA has been pulled low by other end 0101 1886 00820 BTFSC PORTB,SDA 0102 302D 00821 MOVLW '-' 00822 00823 ; we don't do any thing here 00824 ; NACK indicates slave has not ACK'd byte, may not be listeneing. 00825 00826 00827 ; no SCL pulse was clamped by SCL stretching to hold back clocking 00828 00829 00830 00831 ; take clock low. 00832 ; MOVLW 0x00 | 1 << SDA 00833 ; CALL IICwriteTris 0103 20B8 00834 call IICtrisSDA 00835 0104 0008 00836 return 00837 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 17 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00838 0105 00839 IIcrxChar 00840 ; 00841 ; 00842 ; Start bit is low, data bits are inverted 00843 ; 0105 1106 00844 BCF PORTB,2 0106 3008 00845 movlw 8 0107 00A0 00846 movwf IICloopCnt 00847 00848 ; SCL ____ 00849 ; SDA ____ 00850 ; MOVLW 0x00 00851 ; CALL IICwriteTris 0108 20B6 00852 call IICtris 00853 00854 ; allow data to rise 00855 ; MOVLW 0x00 | 1 << SDA 00856 ; CALL IICwriteTris 0109 20B8 00857 call IICtrisSDA 00858 00859 010A 00860 IIcrxChar0 00861 ; test if SCL line has gone high, if not loop until it does 010A 01A2 00862 clrf IICwaitCnt 00863 010B 00864 IIcrxChar0a 00865 00866 ; now Allow clock to goto 1 00867 ; MOVLW 0x00 | 1 << SDA | 1 << SCL 00868 ; CALL IICwriteTris 010B 20BA 00869 call IICtrisSDASCL 00870 00871 ; decrement counter 010C 00872 IIcrxChar1 010C 0BA2 00873 decfsz IICwaitCnt 010D 2910 00874 goto IIcrxChar2 00875 00876 ; 00877 ; CLK not gone high timeout 00878 ; 00879 ; turn on Blue LED if CLK does not go high. 010E 1506 00880 BSF PORTB,2 010F 0008 00881 return 00882 00883 0110 00884 IIcrxChar2 0110 1E06 00885 BTFSS PORTB,SCL 0111 290B 00886 goto IIcrxChar0a 00887 00888 00889 ; test bit; 0112 1003 00890 BCF STATUS,C MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 18 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0113 1886 00891 BTFSC PORTB,SDA 0114 1403 00892 BSF STATUS,C 0115 0DA1 00893 rlf IICtxTemp,f 00894 00895 ; reset clock 00896 ; MOVLW 0x00 | 1 << SDA 00897 ; CALL IICwriteTris 0116 20B8 00898 call IICtrisSDA 00899 00900 0117 0BA0 00901 DECFSZ IICloopCnt,f 0118 290B 00902 GOTO IIcrxChar0a 00903 0119 0008 00904 return 00905 011A 00906 IIcrxAck 00907 00908 00909 ; 00910 ; ACK 00911 ; 00912 00913 ; assert data for ACK 011A 3000 00914 MOVLW 0x00 011B 20BE 00915 CALL IICwriteTris 00916 00917 00918 ; now clock ACK 00919 ; MOVLW 0x00 | 1 << SCL 00920 ; CALL IICwriteTris 011C 20BC 00921 call IICtrisSCL 00922 00923 00924 ; 00925 ; MOVLW 0x00 00926 ; CALL IICwriteTris 011D 20B6 00927 call IICtris 00928 011E 0821 00929 movfw IICtxTemp 011F 0008 00930 return 00931 0120 00932 IIcrxNAck 00933 ; 00934 ; ACK 00935 ; 00936 00937 ; assert data for ACK 00938 ;MOVLW 0x00 | 1 << SDA 00939 ;CALL IICwriteTris 0120 20B8 00940 call IICtrisSDA 00941 00942 ; now clock ACK 00943 ;MOVLW 0x00 | 1 << SDA | 1 << SCL MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 19 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00944 ;CALL IICwriteTris 0121 20BA 00945 call IICtrisSDASCL 00946 00947 ;MOVLW 0x00 | 1 << SDA 00948 ;CALL IICwriteTris 0122 20B8 00949 call IICtrisSDA 00950 00951 0123 0821 00952 movfw IICtxTemp 00953 0124 0008 00954 return 00955 00956 00957 00958 ;-------------------------------------------------------------------------- 00959 ; Sec 7.0 Interrupt Routines - 00960 ;-------------------------------------------------------------------------- 00961 0125 00962 Intrtn 0125 0009 00963 RETFIE 00964 00965 ;-------------------------------------------------------------------------- 00966 ; Sec 9.0 Program End 00967 ;-------------------------------------------------------------------------- 00968 0126 00969 LastProgWord 00970 00971 ;-------------------------------------------------------------------------- 00972 ; Sec 9.0 EEPROM data 00973 ;-------------------------------------------------------------------------- 2100 00974 ORG 0x2100 00975 00976 cblock 0000002F 00977 LastVar 00978 endc 00979 END MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 20 SYMBOL TABLE LABEL VALUE ADCON0 0000001F ADCON1 0000009F ADCS0 00000006 ADCS1 00000007 ADCS2 00000006 ADDEN 00000003 ADFM 00000007 ADIE 00000006 ADIF 00000006 ADON 00000000 ADRESH 0000001E ADRESL 0000009E ANS0 00000000 ANS1 00000001 ANS2 00000002 ANS3 00000003 ANS4 00000004 ANS5 00000005 ANS6 00000006 ANSEL 0000009B BF 00000000 BRGH 00000002 C 00000000 C1INV 00000004 C1OUT 00000006 C2INV 00000005 C2OUT 00000007 CCP1CON 00000017 CCP1IE 00000002 CCP1IF 00000002 CCP1M0 00000000 CCP1M1 00000001 CCP1M2 00000002 CCP1M3 00000003 CCP1X 00000005 CCP1Y 00000004 CCPR1H 00000016 CCPR1L 00000015 CHS0 00000003 CHS1 00000004 CHS2 00000005 CIS 00000003 CKE 00000006 CKP 00000004 CLtimeslice 0000004D CM0 00000000 CM1 00000001 CM2 00000002 CMCON 0000009C CMIE 00000006 CMIF 00000006 CREN 00000004 CSRC 00000007 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 21 SYMBOL TABLE LABEL VALUE CVR0 00000000 CVR1 00000001 CVR2 00000002 CVR3 00000003 CVRCON 0000009D CVREN 00000007 CVROE 00000006 CVRR 00000005 D 00000005 DATA_ADDRESS 00000005 DC 00000001 D_A 00000005 EEADR 0000010D EEADRH 0000010F EECON1 0000018C EECON2 0000018D EEDATA 0000010C EEDATH 0000010E EEIE 00000004 EEIF 00000004 EEPGD 00000007 F 00000001 FERR 00000002 FREE 00000004 FSR 00000004 GIE 00000007 GO 00000002 GO_DONE 00000002 I2C_DATA 00000005 I2C_READ 00000002 I2C_START 00000003 I2C_STOP 00000004 IICbusBits 00000024 IICdrawText 00000065 IICflg 00000023 IICinit 00000051 IIClastKeyLSB 00000029 IIClastKeyMSB 0000002A IIClcdPollKeyboard 00000091 IICloopCnt 00000020 IICpressedKeyLSB 0000002B IICpressedKeyMSB 0000002C IICrx1 00000025 IICrx2 00000026 IICrx3 00000027 IICrx4 00000028 IICtris 000000B6 IICtrisSCL 000000BC IICtrisSDA 000000B8 IICtrisSDASCL 000000BA IICtxTemp 00000021 IICwaitCnt 00000022 IICwriteTris 000000BE MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 22 SYMBOL TABLE LABEL VALUE IICwrtHexNibble 0000005F IIcReStart 000000D6 IIcStart 000000CC IIcStop 000000D2 IIcrxAck 0000011A IIcrxChar 00000105 IIcrxChar0 0000010A IIcrxChar0a 0000010B IIcrxChar1 0000010C IIcrxChar2 00000110 IIcrxNAck 00000120 IIctxChar 000000DE IIctxChar0 000000E4 IIctxChar1 000000EF IIctxChar2 000000F7 IIctxCharW 000000DE INDF 00000000 INTCON 0000000B INTE 00000004 INTEDG 00000006 INTF 00000001 IOFS 00000002 IRCF0 00000004 IRCF1 00000005 IRCF2 00000006 IRP 00000007 Intrtn 00000125 LCDcnt 0000002E LCDdispStr 0000001F LCDdispStrLoop 00000020 LCDgetByte 00000006 LCDptr 0000002D LCDstr1 0000000A LCDstr2 00000011 LCDstr3 00000018 LastProgWord 00000126 LastVar 0000002F MainLoop 00000033 NOT_A 00000005 NOT_ADDRESS 00000005 NOT_BO 00000000 NOT_BOR 00000000 NOT_DONE 00000002 NOT_PD 00000003 NOT_POR 00000001 NOT_RBPU 00000007 NOT_RC8 00000006 NOT_T1SYNC 00000002 NOT_TO 00000004 NOT_TX8 00000006 NOT_W 00000002 NOT_WRITE 00000002 OERR 00000001 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 23 SYMBOL TABLE LABEL VALUE OPTION_REG 00000081 OSCCON 0000008F OSCTUNE 00000090 OSFIE 00000007 OSFIF 00000007 OSTS 00000003 P 00000004 PCL 00000002 PCLATH 0000000A PCON 0000008E PEIE 00000006 PIE1 0000008C PIE2 0000008D PIR1 0000000C PIR2 0000000D PORTA 00000005 PORTB 00000006 PR2 00000092 PS0 00000000 PS1 00000001 PS2 00000002 PSA 00000003 R 00000002 RBIE 00000003 RBIF 00000000 RC8_9 00000006 RC9 00000006 RCD8 00000000 RCIE 00000005 RCIF 00000005 RCREG 0000001A RCSTA 00000018 RD 00000000 READ_WRITE 00000002 RP0 00000005 RP1 00000006 RX9 00000006 RX9D 00000000 R_W 00000002 S 00000003 SCL 00000004 SCS0 00000000 SCS1 00000001 SDA 00000001 SMP 00000007 SPBRG 00000099 SPEN 00000007 SREN 00000005 SSPADD 00000093 SSPBUF 00000013 SSPCON 00000014 SSPEN 00000005 SSPIE 00000003 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 24 SYMBOL TABLE LABEL VALUE SSPIF 00000003 SSPM0 00000000 SSPM1 00000001 SSPM2 00000002 SSPM3 00000003 SSPOV 00000006 SSPSTAT 00000094 STATUS 00000003 SWDTE 00000000 SWDTEN 00000000 SYNC 00000004 Start 00000026 T0CS 00000005 T0IF 00000002 T0SE 00000004 T1CKPS0 00000004 T1CKPS1 00000005 T1CON 00000010 T1INSYNC 00000002 T1OSCEN 00000003 T1RUN 00000006 T2CKPS0 00000000 T2CKPS1 00000001 T2CON 00000012 TEST_STRADDLE TMR0 00000001 TMR0IE 00000005 TMR0IF 00000002 TMR1CS 00000001 TMR1H 0000000F TMR1IE 00000000 TMR1IF 00000000 TMR1L 0000000E TMR1ON 00000000 TMR2 00000011 TMR2IE 00000001 TMR2IF 00000001 TMR2ON 00000002 TOUTPS0 00000003 TOUTPS1 00000004 TOUTPS2 00000005 TOUTPS3 00000006 TRISA 00000085 TRISB 00000086 TRMT 00000001 TUN0 00000000 TUN1 00000001 TUN2 00000002 TUN3 00000003 TUN4 00000004 TUN5 00000005 TX8_9 00000006 TX9 00000006 MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 25 SYMBOL TABLE LABEL VALUE TX9D 00000000 TXD8 00000000 TXEN 00000005 TXIE 00000004 TXIF 00000004 TXREG 00000019 TXSTA 00000098 UA 00000001 VCFG0 00000004 VCFG1 00000005 W 00000000 WCOL 00000007 WDTCON 00000105 WDTPS0 00000001 WDTPS1 00000002 WDTPS2 00000003 WDTPS3 00000004 WR 00000001 WREN 00000002 WRERR 00000003 Z 00000002 _BODEN_OFF 00003FBF _BODEN_ON 00003FFF _CCP1_RB0 00003FFF _CCP1_RB3 00002FFF _CONFIG1 00002007 _CONFIG2 00002008 _CPD_OFF 00003FFF _CPD_ON 00003EFF _CP_ALL 00001FFF _CP_OFF 00003FFF _DEBUG_OFF 00003FFF _DEBUG_ON 000037FF _EXTCLK 00003FEF _EXTRC_CLKOUT 00003FFF _EXTRC_IO 00003FFE _FCMEN_OFF 00003FFE _FCMEN_ON 00003FFF _HS_OSC 00003FEE _IESO_OFF 00003FFD _IESO_ON 00003FFF _INTRC_CLKOUT 00003FFD _INTRC_IO 00003FFC _LP_OSC 00003FEC _LVP_OFF 00003F7F _LVP_ON 00003FFF _MCLR_OFF 00003FDF _MCLR_ON 00003FFF _PWRTE_OFF 00003FFF _PWRTE_ON 00003FF7 _WDT_OFF 00003FFB _WDT_ON 00003FFF _WRT_PROTECT_2048 00003BFF MPASM 5.33 IIC_LCD.ASM 4-2-2011 8:50:49 PAGE 26 SYMBOL TABLE LABEL VALUE _WRT_PROTECT_256 00003DFF _WRT_PROTECT_ALL 000039FF _WRT_PROTECT_OFF 00003FFF _XT_OSC 00003FED __16F88 00000001 pic16F88 1 startLoop 00000033 MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : XX--XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXX---------- ---------------- 2000 : XXXX---XX------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 292 Program Memory Words Free: 3804 Errors : 0 Warnings : 0 reported, 0 suppressed Messages : 0 reported, 9 suppressed