;pIC16f627键盘显示+E2PROM存取+模拟I2C总线通信等模块示例程序
;已经调试通过,愿与各位初学者共享
list p=16f627 ; list directive to define processor
#include <P16f627.inc>
;__CONFIG (_INCRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF & _PWRTE_ON & _BODEN_ON & _WDT_ON);
;数据寄存器及标号定义:
SDA EQU 2 ;PA2
SCL EQU 3 ;PA3
DSL EQU 4 ;PA4,LED低位
DSH EQU 7 ;PB7,LED高位
S1 EQU 1 ;PA1, UP
S2 EQU 0 ;PA0, DOWN
LED_L EQU 20H ;LED 低位数据积存器
LED_H EQU 21H ;LED 高位数据积存器
LED_NL EQU 22H ;LED 低位计数器
LED_NH EQU 23H ;LED 高位计数器
CH_X EQU 24H ;频道值寄存器
ADDR EQU 25H ;EEPROM 读写地址
VALU EQU 26H ;EEPROM 写入值
REC_ EQU 27H ;EEPROM 读计数
WRC_ EQU 28H ;EEPROM 写计数
DATA0 EQU 29H ;EEPROM 读出值
MD_ADDR_W EQU 0C8H ;3050 ADDRESS /WRITE
MD_ADDR_R EQU 0C9H ;3050 ADDRESS READ
DATA1 EQU 2AH ;3050寄存器组
DATA2 EQU 2BH ;
DATA3 EQU 2CH ;
DATA4 EQU 2DH ;
SG_S1 EQU 2FH ;SIGN_S1
SG_S2 EQU 30H ;SIGN_S2
W_TEMP EQU 31H
;W_TEMP EQU 0B1H
STATUS_TEMP EQU 32H
;STATUS_TEMP EQU 0B2H
WW EQU 33H ;通用寄存器
WW_TEMP EQU 34H
SG_DIS EQU 35H ;LED高低位显示标志
UVHF EQU 36H ;
BIT_SG EQU 37H ;
F0 EQU 0 ;I2C通信中应答信号正常(0)与不正常(1)标志
KEY_U EQU 1
KEY_D EQU 2
KEY_UOK EQU 3
KEY_DOK EQU 4
CUNT1 EQU 38H
CUNT2 EQU 39H
TIM_CUNT1 EQU 3AH ;
TIM_CUNT2 EQU 3BH ;
CUNT3 EQU 3EH
CUNT4 EQU 3FH
;////////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////
;---------------PROGRAM FILE-------------------
ORG 00H ; processor reset vector
GOTO START
ORG 04H
BTFSC PIR1,TMR1IF
GOTO T0_INT
RETFIE
ORG 10H
;////////////////////////////////////////////////////////////////
LED_VALU: MOVWF PCL ;
LED_TAB: RETLW 10H ;0
RETLW 73H ;1
RETLW 44H ;2
RETLW 41H ;3
RETLW 23H ;4
RETLW 09H ;5
RETLW 08H ;6
RETLW 53H ;7
RETLW 00H ;8
RETLW 01H ;9
;/////////////////////////////////////////////////////////////////
CXA_VALU1: MOVWF PCL
CXA_TAB1: DT 19H,24H ;CH0 DATA2, DATA3
DT 19H,24H ;CH1
……
DT 38H,04H ;CH12
CXA_VALU2: MOVWF PCL
CXA_TAB2: DT 75H,0C4H ;CH21 DATA2, DATA3
DT 77H,0C4H ;CH22
……
DT 0D5H,0C4H ;CH69
CXA_VALU3: MOVWF PCL
CXA_TAB3: DT 0ECH,62H ;CH21 DATA1, DATA4
DT 0ECH,62H ;CH22
……
DT 0ECH,62H ;CH69
START:
;CALL 3FFH
;MOVWF OSCCAL
CLRWDT
BSF STATUS,RP0 ;BANK1
BCF STATUS,RP1
BSF PCON,OSCF ;选择内部4M RC 震荡器
BCF STATUS,RP0 ;BANK0
CLRF PORTA ;I/O口设置
CLRF PORTB
MOVLW 07H
MOVWF CMCON
BSF STATUS,RP0 ;BANK1
MOVLW 0E3H ;PA.0.1.5.6.7为输入,其余为输出
MOVWF TRISA
MOVLW 00H
MOVWF TRISB
BCF STATUS,RP0 ;BANK0
MOVLW 20H ;寄存器20H/7FH清零
MOVWF FSR
LOOP: CLRF INDF
INCF FSR
BTFSS FSR,7
GOTO LOOP
;首次开机判别
NOP
NOP
MOVLW 00H ;检测EEPROM地址00H是否为55H
MOVWF ADDR ;EEPROM 地址→ADDR
CALL EEPROM_R ;ADDR 内容读至 DATA0
MOVF DATA0,W
ANDLW 0AAH
BTFSC STATUS,Z
GOTO OLD_CH
NOP ;首次开机 21 频道设定
MOVLW 00H ;EEPROM 的00H地址放首次开机标志
MOVWF ADDR
MOVLW 55H
MOVWF VALU
CALL EEPROM_W
MOVLW 01H ;EEPROM 的01H地址放频道值CH_X
MOVWF ADDR
MOVLW 15H ;05H ;
MOVWF VALU
CALL EEPROM_W
NOP
MOVLW 02H ;02H地址做 CH_X 备份,以防出错
MOVWF ADDR
MOVLW 05H
MOVWF VALU
CALL EEPROM_W
MOVLW 15H ;05H ;首次开机选择 CH5 频道
MOVWF CH_X
GOTO CH_SET
NOP
OLD_CH: MOVLW 01H
MOVWF ADDR
CALL EEPROM_R
MOVWF CH_X
CH_SET: CALL LED_HL
NOP
NOP
CALL CXA
NOP
;定时器1初始化
BSF INTCON,GIE ;总中断使能
BSF INTCON,PEIE ;
BCF PIR1,TMR1IF ;
BSF STATUS,RP0 ;BANK1
上一篇:pic16f84 LED频率计