Pic16f627 keyboard display + E2PROM access + analog I2C bus communication module example program

L0504-Murata muRata common mode inductor 90Ω 150mA
>

; pIC16f627 keyboard display + E2PROM access + analog I2C bus communication module example program
Has been debugged and willing to share with all beginners

Listp=16f627;listdirectivetodefineprocessor
#include

;__CONFIG(_INCRC_OSC_NOCLKOUT&_MCLRE_OFF&_LVP_OFF&_PWRTE_ON&_BODEN_ON&_WDT_ON);

; data register and label definition:
SDAEQU2; PA2
SCLEQU3; PA3
DSLEQU4; PA4, LED low
DSHEQU7; PB7, LED high position
S1EQU1; PA1, UP
S2EQU0; PA0, DOWN

LED_LEQU20H; LED low data collector
LED_HEQU21H; LED high data collector
LED_NLEQU22H; LED low counter
LED_NHEQU23H; LED high level counter

CH_XEQU24H; channel value register

ADDREQU25H; EEPROM read and write address
VALUEQU26H; EEPROM write value
REC_EQU27H; EEPROM read count
WRC_EQU28H; EEPROM write count
DATA0EQU29H; EEPROM read value

MD_ADDR_WEQU0C8H; 3050ADDRESS/WRITE
MD_ADDR_REQU0C9H; 3050ADDRESSREAD
DATA1EQU2AH; 3050 register set
DATA2EQU2BH;
DATA3EQU2CH;
DATA4EQU2DH;

SG_S1EQU2FH;SIGN_S1
SG_S2EQU30H;SIGN_S2

W_TEMPEQU31H
;W_TEMPEQU0B1H
STATUS_TEMPEQU32H
;STATUS_TEMPEQU0B2H
WWEQU33H; general purpose register
WW_TEMPEQU34H
SG_DISEQU35H; LED high and low display flag
UVHFEQU36H;

BIT_SGEQU37H;
F0EQU0; OK signal (0) and abnormal (1) flag in I2C communication
KEY_UEQU1
KEY_DEQU2
KEY_UOKEQU3
KEY_DOKEQU4

CUNT1EQU38H
CUNT2EQU39H
TIM_CUNT1EQU3AH;
TIM_CUNT2EQU3BH;
CUNT3EQU3EH
CUNT4EQU3FH


;////////////////////////////////////////////////////// //////////////////////////////
;////////////////////////////////////////////////////// //////////////////////////////
;---------------PROGRAMFILE-------------------

ORG00H;processorresetvector
GOTOSTART

ORG04H
BTFSCPIR1, TMR1IF
GOTOT0_INT
RETFIE


ORG10H

;////////////////////////////////////////////////////// ///////////////
LED_VALU: MOVWFPCL;
LED_TAB: RETLW10H; 0
RETLW73H;1
RETLW44H; 2
RETLW41H;3
RETLW23H;4
RETLW09H;5
RETLW08H;6
RETLW53H;7
RETLW00H;8
RETLW01H;9

;////////////////////////////////////////////////////// /////////////////
CXA_VALU1: MOVWFPCL
CXA_TAB1: DT19H, 24H; CH0DATA2, DATA3
DT19H, 24H; CH1
......

DT38H, 04H; CH12

CXA_VALU2: MOVWFPCL
CXA_TAB2: DT75H, 0C4H; CH21DATA2, DATA3
DT77H, 0C4H; CH22
......

DT0D5H, 0C4H; CH69



CXA_VALU3: MOVWFPCL
CXA_TAB3: DT0ECH, 62H; CH21DATA1, DATA4
DT0ECH, 62H; CH22
......

DT0ECH, 62H; CH69




START:
;CALL3FFH
;MOVWFOSCCAL
CLRWDT
BSFSTATUS, RP0; BANK1
BCFSTATUS, RP1

BSFPCON, OSCF; select internal 4MRC oscillator

BCFSTATUS, RP0; BANK0
CLRFPORTA; I/O port settings
CLRFPORTB
MOVLW07H
MOVWFCMCON
BSFSTATUS, RP0; BANK1
MOVLW0E3H; PA.0.1.5.6.7 is the input, the rest is the output
MOVWFTRISA
MOVLW00H
MOVWFTRISB
BCFSTATUS, RP0; BANK0

MOVLW20H; Register 20H/7FH clear
MOVWFFSR
LOOP: CLRFINDF
INCFFSR
BTFSSFSR, 7
GOTOLOOP


First turn-on discrimination
NOP
NOP
MOVLW00H; Check if the EEPROM address 00H is 55H
MOVWFADDR; EEPROM address → ADDR
CALLEEPROM_R; ADDR content read to DATA0
MOVFDATA0, W
ANDLW0AAH
BTFSCSTATUS, Z
GOTOOLD_CH
NOP; first boot 21 channel settings
MOVLW00H; EEPROM's 00H address puts the first boot flag
MOVWFADDR
MOVLW55H
MOVWFVALU
CALLEEPROM_W
MOVLW01H; EEPROM 01H address put channel value CH_X
MOVWFADDR
MOVLW15H; 05H;
MOVWFVALU
CALLEEPROM_W
NOP
MOVLW02H; 02H address to do CH_X backup to prevent errors
MOVWFADDR
MOVLW05H
MOVWFVALU
CALLEEPROM_W
MOVLW15H; 05H; first boot to select CH5 channel
MOVWFCH_X
GOTOCH_SET
NOP
OLD_CH: MOVLW01H
MOVWFADDR
CALLEEPROM_R
MOVWFCH_X
CH_SET: CALLLED_HL

NOP
NOP
CALLCXA
NOP
; Timer 1 initialization
BSFINTCON, GIE; total interrupt enable
BSFINTCON, PEIE;
BCFPIR1, TMR1IF;
BSFSTATUS, RP0; BANK1
BSFPIE1, TMR1IE; open timer 1 interrupt
BCFSTATUS, RP0; BANK0
MOVLW0D8H; TIM1 interrupt cycle 10ms
MOVWFTMR1H;
MOVLW0EFH
MOVWFTMR1L
CLRFT1CON
BSFT1CON, TMR1ON; timer 1 starts
GOTOMAIN


MAIN: NOP
NOP
CLRWDT
NOP
NOP
;GOTOMAIN
;CALLDELAY; delay 10 milliseconds
NOP
NOP
NOP
NOP
BTFSCBIT_SG, KEY_U
CALLKEY_INC
NOP
NOP
NOP
NOP
BTFSCBIT_SG, KEY_D
CALLKEY_DEC
NOP
NOP
NOP
NOP
BTFSCBIT_SG, KEY_DOK
GOTOKEY_DEC_OK
NOP
NOP
NOP
NOP
BTFSCBIT_SG, KEY_UOK
GOTOKEY_INC_OK
NOP
NOP
NOP
NOP
GOTOMAIN


KEY_DEC_OK: NOP
CALLKEY_DEC; confirm that the DOWN button is pressed and released
NOP
BCFBIT_SG, KEY_DOK
GOTOCH_NEW

KEY_INC_OK: NOP
CALLKEY_INC; confirm that the UP button is pressed and released
NOP
BCFBIT_SG, KEY_UOK
CH_NEW: CLRFSG_S1
CLRFSG_S2
NOP
CALLLED_HL; display new channel
NOP
NOP
CALLCXA; set a new channel
NOP
NOP
MOVFCH_X, W
MOVWFVALU
MOVLW01H
MOVWFADDR
NOP
CALLEEPROM_W; save new channel
NOP
NOP
GOTOMAIN

KEY_INC: MOVFCH_X, W
MOVWFWW
MOVLW0CH;
SUBWFWW, W
BTFSCSTATUS, Z
GOTOCH21; CH_X=CH12 plus 1 turn CH_21
MOVLW45H;
SUBWFWW, W
BTFSCSTATUS, Z
GOTOCH21;CH5;CH_X=CH69 plus 1 turn CH_5
INCFCH_X, F; other normal plus 1
GOTOINC_RET
CH21: MOVLW15H
MOVWFCH_X
GOTOINC_RET
CH5: MOVLW05H
MOVWFCH_X
NOP
INC_RET: NOP
CALLLED_HL
BCFBIT_SG, KEY_U
RETURN

KEY_DEC: NOP
MOVFCH_X, W; confirm that there is a DOWN button pressed
MOVWFWW
MOVLW05H
SUBWFWW, W
BTFSCSTATUS, Z
GOTOCH69; CH_X=CH5 minus 1 to CH_68
MOVLW15H
SUBWFWW, W
BTFSCSTATUS, Z
GOTOCH69;CH12;CH_X=CH21 minus 1 to CH_12
DECFCH_X, F; other normal minus 1
GOTODEC_RET
CH69: MOVLW45H; CH_69
MOVWFCH_X
GOTODEC_RET
CH12: MOVLW0CH; CH_12
MOVWFCH_X
NOP
DEC_RET: CALLLED_HL
BCFBIT_SG, KEY_D
NOP
RETURN



;////////////////////////////////////////////////////// /////////////////////////
T0_INT:
MOVWFW_TEMP
SWAPFSTATUS, W
MOVWFSTATUS_TEMP
MOVFWW, W
MOVWFWW_TEMP
BCFSTATUS, RP0
BCFPIR1, TMR1IF

MOVLW0D8H; TIM1 interrupt cycle 10ms
MOVWFTMR1H;
MOVLW0EFH
MOVWFTMR1L
CLRWDT

MOVFTIM_CUNT1, W; counter TIM_CUNT1
BTFSCSTATUS, Z
GOTOINT00
DECFTIM_CUNT1, F
INT00: NOP
NOP
MOVFTIM_CUNT2, W; counter TIM_CUNT2
BTFSCSTATUS, Z
GOTOINT01
DECFTIM_CUNT2, F
INT01: NOP
NOP
CALLDISPLAY; display LED
NOP
NOP
CALLKEYBOARD; detection keyboard
NOP
NOP
NOP
NOP;
MOVFWW_TEMP, W
MOVWFWW
SWAPFSTATUS_TEMP, W
MOVWFSTATUS
SWAPFW_TEMP, F
SWAPFW_TEMP, W
RETFIE
;////////////////////////////////////////////////////// /////////////////////////
KEYBOARD:
BCFSTATUS, RP0
BCFSTATUS, RP1; BANK0
BTFSSPORTA, S1
GOTODOWN
NOP
BTFSSPORTA, S2
GOTOUP
GOTOKEY_SCH
Debounce
DOWN: BTFSSSG_S1, 0
GOTODOWN1; the first time there is a DOWN button press
BTFSCSG_S1,1
GOTODOWN2; long button
BSFSG_S1, 1; confirm that there is a DOWN button pressed
GOTOKEY_RET
DOWN1:BSFSG_S1,0; the first time there is a DOWN button press mark
GOTOKEY_RET
NOP
DOWN2: BTFSCSG_S1, 2
GOTODOWN3
MOVLW14H; confirm that there is a long key delay of 200ms
MOVWFTIM_CUNT1
BSFSG_S1, 2
GOTOKEY_RET
DOWN3: MOVFTIM_CUNT1, W
BTFSSSTATUS, Z
GOTOKEY_RET
BSFBIT_SG, KEY_D;
MOVLW14H; long key cycle 200ms
MOVWFTIM_CUNT1
GOTOKEY_RET



UP: BTFSSSG_S2, 0
GOTOUP1; the first time there is an UP button press
BTFSCSG_S2,1
GOTOUP2; long button
BSFSG_S2, 1; confirm that there is an UP button pressed
GOTOKEY_RET
UP1: BSFSG_S2, 0; the first time there is an UP button press mark
GOTOKEY_RET
NOP
UP2: BTFSCSG_S2, 2
GOTOUP3
MOVLW14H; confirm that there is a long key delay of 200ms
MOVWFTIM_CUNT2
BSFSG_S2, 2
GOTOKEY_RET
UP3: MOVFTIM_CUNT2, W
BTFSSSTATUS, Z
GOTOKEY_RET
BSFBIT_SG, KEY_U;
MOVLW14H; long key cycle 200ms
MOVWFTIM_CUNT2
GOTOKEY_RET
;
KEY_SCH: BTFSSSG_S1, 1
GOTOKEY_SCH1
BSFBIT_SG, KEY_DOK; confirm that the DOWN button is pressed and released
GOTOKEY_RET


KEY_SCH1: BTFSSSG_S2, 1
GOTONOKEY
BSFBIT_SG, KEY_UOK; confirm that the UP button is pressed and released
GOTOKEY_RET

NOKEY: CLRFSG_S1; eliminate interference
CLRFSG_S2

KEY_RET: NOP
NOP
RETURN

;/////////////////; LED display ////////////////////////////////////// //////////////////////////////
DISPLAY: NOP
BTFSCSG_DIS, 0
GOTODIS_H
DIS_L: BCFPORTB, DSH; display low position
MOVFLED_L, W
MOVWFPORTB
BSFPORTA, DSL
BSFSG_DIS, 0
GOTODIS_RET
DIS_H: BCFPORTA, DSL; display high position
MOVFLED_H, W
MOVWFPORTB
BSFPORTB, DSH
BCFSG_DIS, 0
DIS_RET: NOP
RETURN



;/////////////////LED display value acquisition ///////////////////////////////// ///////////////////////////////
LED_HL: CLRFLED_NH
CLRFLED_NL
MOVFCH_X, W
MOVWFWW
LED0: MOVLW0AH
SUBWFWW, W
BTFSSSTATUS, C; SKPC
GOTOLED_OK; WW is less than 10
MOVWFWW
INCFLED_NH; high plus one
GOTOLED0
LED_OK: MOVFWW, W
MOVWFLED_NL; remainder is low

MOVLWLED_TAB; take the table LED_TAB
MOVWFWW
MOVFLED_NL, W
ADDWFWW, W;
CALLLED_VALU
MOVWFLED_L

MOVLWLED_TAB; take the table LED_TAB
MOVWFWW
MOVFLED_NH, W
ADDWFWW, W;
CALLLED_VALU
MOVWFLED_H

RETURN



;////////////////////////////////////////////////////// /////////////////////////////////////
;////////////////channel setting ////////////////////////////////////// ///////////////////////////////
CXA: BCFSTATUS, RP0
BCFSTATUS, RP1; BANK0
CLRWDT
MOVFCH_X, W; VHF/UHF judgment
MOVWFUVHF
SUBLW0DH; Is CH_X less than 13?
BTFSCSTATUS, C; SKPC
GOTOVHF_GET; less than VHF_GET
MOVLW15H; 21
SUBWFUVHF, F; channel value into UVHF
UHF_GET: MOVLWCXA_TAB2; take the table CXA_TAB2
MOVWFWW
BCFSTATUS, C; CLRC
RLFUVHF, F
MOVFUVHF, W
ADDWFWW, W;
CALLCXA_VALU2
MOVWFDATA2
INCFUVHF
MOVFUVHF, W
ADDWFWW, W;
CALLCXA_VALU2
MOVWFDATA3
GOTOI2C_SEND


DECFUVHF; DATA1, DATA4
MOVLWCXA_TAB3; take the table CXA_TAB3
MOVWFWW
;BCFSTATUS,C;CLRC
;RLFUVHF,F
MOVFUVHF, W
ADDWFWW, W;
CALLCXA_VALU3
MOVWFDATA1
INCFUVHF
MOVFUVHF, W
ADDWFWW, W;
CALLCXA_VALU3
MOVWFDATA4
GOTOI2C_SEND

;////////////////////////////////////////////////////// ///////////

VHF_GET: MOVLWCXA_TAB1; take the table CXA_TAB1
MOVWFWW
BCFSTATUS, C; CLRC
RLFUVHF, F
MOVFUVHF, W
ADDWFWW, W;
CALLCXA_VALU1
MOVWFDATA2
INCFUVHF
MOVFUVHF, W
ADDWFWW, W;
CALLCXA_VALU1
MOVWFDATA3
GOTOI2C_SEND

DECFUVHF; DATA1, DATA4
MOVLWCXA_TAB3; take the table CXA_TAB4
MOVWFWW
;BCFSTATUS,C;CLRC
;RLFUVHF,F
MOVFUVHF, W
ADDWFWW, W;
CALLCXA_VALU3
MOVWFDATA1
INCFUVHF
MOVFUVHF, W
ADDWFWW, W;
CALLCXA_VALU3
MOVWFDATA4
GOTOI2C_SEND


;////////////////////////////////////////////////////// ///////////////////////////////
I2C_SEND: NOP
MOVLWB'11101100'
MOVWFDATA1
MOVLW00H; B'01100010'
MOVWFDATA4
I2C_START: NOP
CLRWDT
BCFINTCON, GIE
MOVLW04H; send 4 bytes
MOVWFCUNT2
CALLSTA; start the I2C bus
MOVLWMD_ADDR_W; I2C address
MOVWFWW
CALLWRBYT
CALLCACK
BTFSCBIT_SG, F0
GOTOI2C_START; non-acknowledgement is resent
MOVLWDATA1; the first address of the 4 bytes of data sent
MOVWFFSR
WRDA: MOVFINDF, W
MOVWFWW
CALLWRBYT
CALLCACK
BTFSCBIT_SG, F0
GOTOI2C_SEND; sent incorrectly, resend
INCFFSR
DECFSZCUNT2, F
GOTOWRDA
CALLSTOP
BSFINTCON, GIE
RETURN

STA: BSFPORTA, SDA
BSFPORTA, SCL
NOP
NOP
NOP
NOP
BCFPORTA, SDA
NOP
NOP
NOP
NOP
BCFPORTA, SCL
RETURN

STOP: BCFPORTA, SDA
BSFPORTA, SCL
NOP
NOP
NOP
NOP
BSFPORTA, SDA
NOP
NOP
NOP
NOP
BCFPORTA, SDA
BCFPORTA, SCL
RETURN

CACK: BSFSTATUS, RP0
BSFTRISA, SDA
BCFSTATUS, RP0
BSFPORTA, SCL
NOP
NOP
NOP
NOP
BCFBIT_SG, F0
BTFSCPORTA, SDA
BSFBIT_SG, F0
CEND: BCFPORTA, SCL
BSFSTATUS, RP0
BCFTRISA, SDA
BCFSTATUS, RP0
RETURN

WRBYT: MOVLW08H
MOVWFCUNT1
WLP: RLFWW, F
BTFSSSTATUS, C; SKPC
GOTOWR0
GOTOWR1
WLP1: DECFSZCUNT1, F
GOTOWLP
RETURN
WR1: BSFPORTA, SDA
BSFPORTA, SCL
NOP
NOP
NOP
NOP
BCFPORTA, SCL
BCFPORTA, SDA
GOTOWLP1
WR0: BCFPORTA, SDA
BSFPORTA, SCL
NOP
NOP
NOP
NOP
BCFPORTA, SCL
GOTOWLP1

;////////////////////////////////////////////////////// ////////////////////////////
;////////////////////////////////////////////////////// ////////////////////////////
EEPROM_R:; EEPROM read subroutine, read the contents of address ADDR to DATA0
BCFSTATUS, RP1; BANK0
BCFSTATUS, RP0
MOVFADDR, W
BSFSTATUS, RP0; BANK1
MOVWFEEADR
BCFEECON1, WRERR
BSFEECON1, RD
MOVFEEDATA, W
BCFSTATUS, RP0; BANK0
MOVWFDATA0
RETURN; return without parameters
;////////////////////////////////////////////////////// ////////////////////////////
EEPROM_W:; EEPROM write subroutine, write the value in VALU to address ADDR
CLRWDT
BCFSTATUS, RP1; BANK1
BSFSTATUS, RP0
BTFSCEECON1, WR; waiting for write permission
GOTO$-1
BCFSTATUS, RP0; BANK0
MOVFADDR, W
BSFSTATUS, RP0; BANK1
MOVWFEEADR
BCFSTATUS, RP0; BANK0
MOVFVALU, W
BSFSTATUS, RP0; BANK1
MOVWFEEDATA
BCFEECON1, WRERR
BSFEECON1, WREN
BCFINTCON, GIE
MOVLW55H
MOVWFEECON2
MOVLW0AAH
MOVWFEECON2
BSFEECON1, WR
BTFSCEECON1, WR
GOTO$-1
BSFINTCON, GIE; end of writing
BCFEECON1, WREN
BCFSTATUS, RP0; BANK0
RETURN; return without parameters
;////////////////////////////////////////////////////// /////////////////////////
;////////////////////////////////////////////////////// /////////////////////////
DELAY: MOVLW05H
MOVWFCUNT3
DELAY1: NOP; 2ms
CLRWDT
MOVLW0FFH
MOVWFCUNT4
DELAY2: NOP
MOVFCUNT4, W
NOP
BTFSCSTATUS, Z
GOTODELAY3
NOP
DECFCUNT4, F
NOP
GOTODELAY2
DELAY3: NOP
MOVFCUNT3, W
BTFSCSTATUS, Z
GOTODELAY_RET
NOP
DECFCUNT3, F
NOP
GOTODELAY1
NOP
DELAY_RET: RETURN
;////////////////////////////////////////////////////// /////////////////////////
;////////////////////////////////////////////////////// /////////////////////////
FILL(GOTO$), NEXT_BLOCK-$
ORG03FFH
NEXT_BLOCK:
END

Pic16f627 keyboard display + E2PROM access + analog I2C bus communication module example program

915MHZ Antenna

However, due to technical and cost reasons, it is not widely used. In recent years, RFID technology has developed by leaps and bounds. With the development of large-scale integrated circuit and network communication technology, RFID technology has entered the commercial application field, and began to develop from the initial low frequency (125kHz) and high frequency (13.56mhz) to uHF (860 ~ 960MHz) and microwave. RFID technology has become one of the most promising information technologies in the new era because of its unique advantages showing great development potential and application space. In both low and high frequency bands, China has independently developed RFID chips in accordance with ISO14443 A, B and ISO15693 standards, which have been successfully applied in major projects such as city bus all-in-one card and second-generation resident ID card. However, in the uHF and microwave field, China started late, technology and products are still relatively short. In this context, this paper studies the design of 915MHz rf card reader. The system can be applied to vehicle monitoring, remote control, telemetry, access control system, identity identification, non-contact radio frequency smart card, wireless 485/232 data communication, safety and fire prevention and other fields.

915MHZ Rubber Antenna,915MHZ Antenna with magnetic base,915MHZ fiberglass antenna

Yetnorson Antenna Co., Ltd. , https://www.yetnorson.com

Posted on