pic16f627鍵盤顯示+E2PROM存取+模擬I2C總線通信等模塊
;pIC16f627鍵盤顯示+E2PROM存取+模擬I2C總線通信等模塊示例程序
;已經(jīng)調(diào)試通過,愿與各位初學(xué)者共享
listp=16f627;listdirectivetodefineprocessor
#include
;__CONFIG(_INCRC_OSC_NOCLKOUT&_MCLRE_OFF&_LVP_OFF&_PWRTE_ON&_BODEN_ON&_WDT_ON);
;數(shù)據(jù)寄存器及標(biāo)號(hào)定義:
SDAEQU2;PA2
SCLEQU3;PA3
DSLEQU4;PA4,LED低位
DSHEQU7;PB7,LED高位
S1EQU1;PA1,UP
S2EQU0;PA0,DOWN
LED_LEQU20H;LED低位數(shù)據(jù)積存器
LED_HEQU21H;LED高位數(shù)據(jù)積存器
LED_NLEQU22H;LED低位計(jì)數(shù)器
LED_NHEQU23H;LED高位計(jì)數(shù)器
CH_XEQU24H;頻道值寄存器
ADDREQU25H;EEPROM讀寫地址
VALUEQU26H;EEPROM寫入值
REC_EQU27H;EEPROM讀計(jì)數(shù)
WRC_EQU28H;EEPROM寫計(jì)數(shù)
DATA0EQU29H;EEPROM讀出值
MD_ADDR_WEQU0C8H;3050ADDRESS/WRITE
MD_ADDR_REQU0C9H;3050ADDRESSREAD
DATA1EQU2AH;3050寄存器組
DATA2EQU2BH;
DATA3EQU2CH;
DATA4EQU2DH;
SG_S1EQU2FH;SIGN_S1
SG_S2EQU30H;SIGN_S2
W_TEMPEQU31H
;W_TEMPEQU0B1H
STATUS_TEMPEQU32H
;STATUS_TEMPEQU0B2H
WWEQU33H;通用寄存器
WW_TEMPEQU34H
SG_DISEQU35H;LED高低位顯示標(biāo)志
UVHFEQU36H;
BIT_SGEQU37H;
F0EQU0;I2C通信中應(yīng)答信號(hào)正常(0)與不正常(1)標(biāo)志
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;選擇內(nèi)部4MRC震蕩器
BCFSTATUS,RP0;BANK0
CLRFPORTA;I/O口設(shè)置
CLRFPORTB
MOVLW07H
MOVWFCMCON
BSFSTATUS,RP0;BANK1
MOVLW0E3H;PA.0.1.5.6.7為輸入,其余為輸出
MOVWFTRISA
MOVLW00H
MOVWFTRISB
BCFSTATUS,RP0;BANK0
MOVLW20H;寄存器20H/7FH清零
MOVWFFSR
LOOP:CLRFINDF
INCFFSR
BTFSSFSR,7
GOTOLOOP
;首次開機(jī)判別
NOP
NOP
MOVLW00H;檢測(cè)EEPROM地址00H是否為55H
MOVWFADDR;EEPROM地址→ADDR
CALLEEPROM_R;ADDR內(nèi)容讀至DATA0
MOVFDATA0,W
ANDLW0AAH
BTFSCSTATUS,Z
GOTOOLD_CH
NOP;首次開機(jī)21頻道設(shè)定
MOVLW00H;EEPROM的00H地址放首次開機(jī)標(biāo)志
MOVWFADDR
MOVLW55H
MOVWFVALU
CALLEEPROM_W
MOVLW01H;EEPROM的01H地址放頻道值CH_X
MOVWFADDR
MOVLW15H;05H;
MOVWFVALU
CALLEEPROM_W
NOP
MOVLW02H;02H地址做CH_X備份,以防出錯(cuò)
MOVWFADDR
MOVLW05H
MOVWFVALU
CALLEEPROM_W
MOVLW15H;05H;首次開機(jī)選擇CH5頻道
MOVWFCH_X
GOTOCH_SET
NOP
OLD_CH:MOVLW01H
MOVWFADDR
CALLEEPROM_R
MOVWFCH_X
CH_SET:CALLLED_HL
NOP
NOP
CALLCXA
NOP
;定時(shí)器1初始化
BSFINTCON,GIE;總中斷使能
BSFINTCON,PEIE;
BCFPIR1,TMR1IF;
BSFSTATUS,RP0;BANK1
BSFPIE1,TMR1IE;開定時(shí)器1中斷
BCFSTATUS,RP0;BANK0
MOVLW0D8H;TIM1中斷周期10ms
MOVWFTMR1H;
MOVLW0EFH
MOVWFTMR1L
CLRFT1CON
BSFT1CON,TMR1ON;定時(shí)器1啟動(dòng)
GOTOMAIN
MAIN:NOP
NOP
CLRWDT
NOP
NOP
;GOTOMAIN
;CALLDELAY;延時(shí)10毫秒
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;確認(rèn)有DOWN鍵按下并放開
NOP
BCFBIT_SG,KEY_DOK
GOTOCH_NEW
KEY_INC_OK:NOP
CALLKEY_INC;確認(rèn)有UP鍵按下并放開
NOP
BCFBIT_SG,KEY_UOK
CH_NEW:CLRFSG_S1
CLRFSG_S2
NOP
CALLLED_HL;顯示新頻道
NOP
NOP
CALLCXA;設(shè)定新頻道
NOP
NOP
MOVFCH_X,W
MOVWFVALU
MOVLW01H
MOVWFADDR
NOP
CALLEEPROM_W;保存新頻道
NOP
NOP
GOTOMAIN
KEY_INC:MOVFCH_X,W
MOVWFWW
MOVLW0CH;
SUBWFWW,W
BTFSCSTATUS,Z
GOTOCH21;CH_X=CH12加1轉(zhuǎn)CH_21
MOVLW45H;
SUBWFWW,W
BTFSCSTATUS,Z
GOTOCH21;CH5;CH_X=CH69加1轉(zhuǎn)CH_5
INCFCH_X,F;其它正常加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;確認(rèn)有DOWN鍵按下
MOVWFWW
MOVLW05H
SUBWFWW,W
BTFSCSTATUS,Z
GOTOCH69;CH_X=CH5減1轉(zhuǎn)CH_68
MOVLW15H
SUBWFWW,W
BTFSCSTATUS,Z
GOTOCH69;CH12;CH_X=CH21減1轉(zhuǎn)CH_12
DECFCH_X,F;其它正常減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中斷周期10ms
MOVWFTMR1H;
MOVLW0EFH
MOVWFTMR1L
CLRWDT
MOVFTIM_CUNT1,W;計(jì)數(shù)器TIM_CUNT1
BTFSCSTATUS,Z
GOTOINT00
DECFTIM_CUNT1,F
INT00:NOP
NOP
MOVFTIM_CUNT2,W;計(jì)數(shù)器TIM_CUNT2
BTFSCSTATUS,Z
GOTOINT01
DECFTIM_CUNT2,F
INT01:NOP
NOP
CALLDISPLAY;顯示LED
NOP
NOP
CALLKEYBOARD;檢測(cè)鍵盤
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
;去抖動(dòng)
DOWN:BTFSSSG_S1,0
GOTODOWN1;第一次有DOWN鍵按下
BTFSCSG_S1,1
GOTODOWN2;長(zhǎng)按鍵
BSFSG_S1,1;確認(rèn)有DOWN鍵按下
GOTOKEY_RET
DOWN1:BSFSG_S1,0;第一次有DOWN鍵按下標(biāo)志
GOTOKEY_RET
NOP
DOWN2:BTFSCSG_S1,2
GOTODOWN3
MOVLW14H;確認(rèn)有長(zhǎng)鍵延時(shí)200ms
MOVWFTIM_CUNT1
BSFSG_S1,2
GOTOKEY_RET
DOWN3:MOVFTIM_CUNT1,W
BTFSSSTATUS,Z
GOTOKEY_RET
BSFBIT_SG,KEY_D;
MOVLW14H;長(zhǎng)按鍵周期200ms
MOVWFTIM_CUNT1
GOTOKEY_RET
UP:BTFSSSG_S2,0
GOTOUP1;第一次有UP鍵按下
BTFSCSG_S2,1
GOTOUP2;長(zhǎng)按鍵
BSFSG_S2,1;確認(rèn)有UP鍵按下
GOTOKEY_RET
UP1:BSFSG_S2,0;第一次有UP鍵按下標(biāo)志
GOTOKEY_RET
NOP
UP2:BTFSCSG_S2,2
GOTOUP3
MOVLW14H;確認(rèn)有長(zhǎng)鍵延時(shí)200ms
MOVWFTIM_CUNT2
BSFSG_S2,2
GOTOKEY_RET
UP3:MOVFTIM_CUNT2,W
BTFSSSTATUS,Z
GOTOKEY_RET
BSFBIT_SG,KEY_U;
MOVLW14H;長(zhǎng)按鍵周期200ms
MOVWFTIM_CUNT2
GOTOKEY_RET
;
KEY_SCH:BTFSSSG_S1,1
GOTOKEY_SCH1
BSFBIT_SG,KEY_DOK;確認(rèn)有DOWN鍵按下并放開
GOTOKEY_RET
KEY_SCH1:BTFSSSG_S2,1
GOTONOKEY
BSFBIT_SG,KEY_UOK;確認(rèn)有UP鍵按下并放開
GOTOKEY_RET
NOKEY:CLRFSG_S1;排除干擾
CLRFSG_S2
KEY_RET:NOP
NOP
RETURN
;////////////////;LED顯示/////////////////////////////////////////////////////////
DISPLAY:NOP
BTFSCSG_DIS,0
GOTODIS_H
DIS_L:BCFPORTB,DSH;顯示低位
MOVFLED_L,W
MOVWFPORTB
BSFPORTA,DSL
BSFSG_DIS,0
GOTODIS_RET
DIS_H:BCFPORTA,DSL;顯示高位
MOVFLED_H,W
MOVWFPORTB
BSFPORTB,DSH
BCFSG_DIS,0
DIS_RET:NOP
RETURN
;////////////////LED顯示值獲取/////////////////////////////////////////////////////////
LED_HL:CLRFLED_NH
CLRFLED_NL
MOVFCH_X,W
MOVWFWW
LED0:MOVLW0AH
SUBWFWW,W
BTFSSSTATUS,C;SKPC
GOTOLED_OK;WW小于10
MOVWFWW
INCFLED_NH;高位加一
GOTOLED0
LED_OK:MOVFWW,W
MOVWFLED_NL;余數(shù)做低位
MOVLWLED_TAB;取表LED_TAB
MOVWFWW
MOVFLED_NL,W
ADDWFWW,W;
CALLLED_VALU
MOVWFLED_L
MOVLWLED_TAB;取表LED_TAB
MOVWFWW
MOVFLED_NH,W
ADDWFWW,W;
CALLLED_VALU
MOVWFLED_H
RETURN
;//////////////////////////////////////////////////////////////////////////////////
;///////////////頻道設(shè)定///////////////////////////////////////////////////////////
CXA:BCFSTATUS,RP0
BCFSTATUS,RP1;BANK0
CLRWDT
MOVFCH_X,W;VHF/UHF判斷
MOVWFUVHF
SUBLW0DH;CH_X是否小于13?
BTFSCSTATUS,C;SKPC
GOTOVHF_GET;小于則轉(zhuǎn)VHF_GET
MOVLW15H;21
SUBWFUVHF,F;頻道值入U(xiǎn)VHF
UHF_GET:MOVLWCXA_TAB2;取表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;取表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;取表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;取表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;發(fā)送4個(gè)字節(jié)
MOVWFCUNT2
CALLSTA;啟動(dòng)I2C總線
MOVLWMD_ADDR_W;I2C地址
MOVWFWW
CALLWRBYT
CALLCACK
BTFSCBIT_SG,F0
GOTOI2C_START;非應(yīng)答位則重發(fā)
MOVLWDATA1;所發(fā)4字節(jié)數(shù)據(jù)的首地址
MOVWFFSR
WRDA:MOVFINDF,W
MOVWFWW
CALLWRBYT
CALLCACK
BTFSCBIT_SG,F0
GOTOI2C_SEND;發(fā)送有誤,重發(fā)
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讀子程序,把地址ADDR中內(nèi)容讀至DATA0
BCFSTATUS,RP1;BANK0
BCFSTATUS,RP0
MOVFADDR,W
BSFSTATUS,RP0;BANK1
MOVWFEEADR
BCFEECON1,WRERR
BSFEECON1,RD
MOVFEEDATA,W
BCFSTATUS,RP0;BANK0
MOVWFDATA0
RETURN;不帶參數(shù)返回
;//////////////////////////////////////////////////////////////////////////
EEPROM_W:;EEPROM寫子程序,把VALU中數(shù)值寫入地址ADDR
CLRWDT
BCFSTATUS,RP1;BANK1
BSFSTATUS,RP0
BTFSCEECON1,WR;等待寫允許
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;寫結(jié)束
BCFEECON1,WREN
BCFSTATUS,RP0;BANK0
RETURN;不帶參數(shù)返回
;////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////
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