#INCLUDE"P16F877.inc" W_TEMP EQU 20H ; 实际上20H、A0H、120H和1A0H STATUS_TEMP EQU 21H ;在体0中建立保护单元 PCLATH_TEMP EQU 22H ;在体0中建立保护单元 ORG 000H GOTO A1 ORG 004H;定时中断入口地址 GOTO ZD01; ORG 0CH Q1 ADDWF PCL,1 RETLW 00C0H ;0 RETLW 00F9H ;1 RETLW 00A4H ;2 RETLW 00B0H ;3 RETLW 0099H ;4 RETLW 0092H ;5 RETLW 0082H ;6 RETLW 00F8H ;7 RETLW 0080H ;8 RETLW 0090H ;9 RETLW 0088H ;A RETLW 0083H ;B RETLW 00C6H ;C RETLW 00A1H ;D RETLW 0086H ;E RETLW 008EH ;F A1 MOVLW 1;位1显示数 MOVWF 50H; MOVLW 2;位2显示数 MOVWF 51H; MOVLW 3;位3显示数 MOVWF 52H; MOVLW 4;位4显示数 MOVWF 53H; CLRF 60H MOVLW 4;显示位数 MOVWF 40H; MOVLW B'00000001';位码 MOVWF 41H; MOVLW 50H; MOVWF FSR ;间接寻址 BSF STATUS,RP0;选择体1 BCF STATUS,RP1; MOVLW 00H;1:2TMRO比例 MOVWF OPTION_REG;分频1/2 BCF STATUS,RP0;体0 BCF STATUS,RP1; MOVLW 0FFH; MOVFW TMR0;初值 BCF INTCON,T0IF;清定时中断标志 BSF INTCON,T0IE;开定时中断 BSF INTCON,GIE;开总中断 ;********************************************************** ; 按键修改数据程序 ;********************************************************** A2 BSF STATUS,RP0 BCF STATUS,RP1;体1 MOVLW 0FFH MOVWF TRISB;设置B口为输入口 BCF STATUS,RP0 BCF STATUS,RP1;体0 BTFSC PORTB,0;判断B口第0位是否按下 GOTO A3;位0则按下按键 MOVLW 1;按下存1到EEPROM MOVWF 61H;数据寄存器 CALL WR1;写数据到EEPROM A3 BCF STATUS,RP0 BCF STATUS,RP1;体0 BTFSC PORTB,1;判断B口第1位是否按下 GOTO A4; MOVLW 2;按下存2到EEPROM MOVWF 61H;数据寄存器 CALL WR1;写数据到寄存器 A4 BCF STATUS,RP0; BCF STATUS,RP1;体0 BTFSC PORTB,2;判断B口第2位是否按下 GOTO A5; MOVLW 3; MOVWF 61H; CALL WR1; A5 BCF STATUS,RP0; BCF STATUS,RP1; BTFSC PORTB,3; GOTO A6; MOVLW 4; MOVWF 61H; CALL WR1; A6 BCF STATUS,RP0; BCF STATUS,RP1; BTFSC PORTB,4; GOTO A7; MOVLW 5; MOVWF 61H; CALL WR1; A7 BCF STATUS,RP0; BCF STATUS,RP1; BTFSC PORTB,5; GOTO A8; MOVLW 6; MOVWF 61H; CALL WR1; A8 BCF STATUS,RP0; BCF STATUS,RP1; BTFSC PORTB,6; GOTO A9; MOVLW 7; MOVWF 61H; CALL WR1; A9 BCF STATUS,RP0; BCF STATUS,RP1; BTFSC PORTB,7; GOTO A10; MOVLW 8; MOVWF 61H; CALL WR1; A10 CALL RD01;调用读数据程序 GOTO A2; ;*********************************************** ; 写数据子程序 ;*********************************************** WR1 BSF STATUS,RP0; BSF STATUS,RP1;体3 BTFSC EECON1,WR;判断是否在写数据 GOTO $-1; BCF STATUS,RP0; BCF STATUS,RP1;体0 MOVFW 60H;EEPROM目标地址 BCF STATUS,RP0 BSF STATUS,RP1;体2 MOVWF EEADR;EEPROM目标地址寄存器 BCF STATUS,RP0 BCF STATUS,RP1;体0 MOVFW 61H;需写入数据 BCF STATUS,RP0 BSF STATUS,RP1;体2 MOVWF EEDATA;EEPROM数据寄存器 BSF STATUS,RP0 BSF STATUS,RP1;体3 BCF EECON1,EEPGD;选择为EEPROM模式 BSF EECON1,WREN;允许使能 ;*************************************************** ; 写数据5指令序列PIC特定没有为什么不允许能改变 MOVLW 55H ; MOVWF EECON2 ;55H送EECON2 MOVLW 0AAH; MOVWF EECON2 ;AAH送EECON2 BSF EECON1,WR ;启动写操作 ; ;************************************************** BTFSC EECON1,WR;判断是否学完成 GOTO $-1; BCF STATUS,RP0;恢复体0 BCF STATUS,RP1; RETURN; ;************************************************** ; 读EEPROM数据子程序 ;************************************************** RD01 BCF STATUS,RP0; BSF STATUS,RP1;体2 MOVLW 0;目标地址 MOVWF EEADR;目标地址寄存器 BSF STATUS,RP0; BSF STATUS,RP0;体3 BCF EECON1,EEPGD;选择EEPROM模式 BSF EECON1,RD;启动读操作 BTFSC EECON1,RD;判断是否读取完 GOTO $-1; BCF STATUS,RP0; BSF STATUS,RP1;体2 MOVFW EEDATA;将数据存到W中 BCF STATUS,RP0; BCF STATUS,RP1;体0 MOVWF 53H ;将读取数存到55H RETURN ;******************************************************** ; 定时中断程序 ;******************************************************** ZD01 BCF INTCON,GIE;关总中断 BTFSS INTCON,T0IF;判断是否产生定时中断 GOTO ZD03;否跳出是继续执行 ;*************************************************** ; 保护现场 MOVWF W_TEMP;W备份到W_TEMP中 SWAPF STATUS,0;STATUS半字交换后送W CLRF STATUS;选择体0为当前体备份 MOVWF STATUS_TEMP;将原来的STATUS送体0上的 MOVF PCLATH,0;PCLATH送W MOVWF PCLATH_TEMP;W送备份寄存器中 CLRF PCLATH ;设置为0页 ;*************************************************** BCF INTCON,T0IF BSF STATUS,RP0;体1 BCF STATUS,RP1; MOVLW 0; MOVWF TRISC;RB口设为输出口 MOVWF TRISD;RD口设为输出口 BCF STATUS,RP0;体0 BCF STATUS,RP1; MOVLW 0FFH; MOVWF PORTC;RB口输出高电平 MOVLW 0 MOVWF PORTD;RD口输出低电平起清屏作用 MOVFW INDF;间接寻址显示数据 CALL Q1;查数据表 MOVWF PORTC;显示断码输出到RB口 INCF FSR,1;间接寻址地址加1 MOVFW 41H ;位码 MOVWF PORTD;位码输出到RD口 RLF 41H,0;处理C RLF 41H,1;左移位码 DECFSZ 40H,1;判断是否显示完4位 GOTO ZD02;否则继续显示 MOVLW 4;显示位数 MOVWF 40H; MOVLW B'00000001';位码 MOVWF 41H; MOVLW 50H; MOVWF FSR ;间接寻址 ZD02 MOVLW 0FFH; MOVFW TMR0;重装初值 ;*************************************************** ; 恢复现场 CLRF STATUS;恢复到体0 MOVF PCLATH_TEMP,0;开始恢复数据 MOVWF PCLATH;恢复PCLATH SWAPF STATUS_TEMP,0 MOVWF STATUS;恢复STATUS SWAPF W_TEMP,1;半字交换后放回 SWAPF W_TEMP,0;再半字交换后送W ;*************************************************** ZD03 BSF INTCON,GIE;开总中断 RETFIE ;中断返回 ;******************************************** ; 数据表 ;******************************************** END