联系方式  客服中心 会员中心 切换到繁體中文

 单片机技术培训基地
 | 网站首页 | 资讯 | 培训中心 | 技术文章 | 软件下载 | 产品展示 | 留言板 | 电子商城 | 供求信息 | 
您现在的位置: 华信单片机 >> 培训中心 >> 教学资源 >> 实验课件 >> 正文 用户登录 新用户注册
[图文]PIC16F877 EEPROM读/写实验       ★★★★★ 【字体:
PIC16F877 EEPROM读/写实验
作者:华信    培训来源:华信单片机工作室    点击数:    更新时间:2009-6-29    

PIC16F877 EEPROM每一个单元的读/写所用时间典型值为:4ms,最大值为8ms。在烧写每个EEPROM单元过程中,需要CPU插入等待时间,既可利用中断功能,也可利用软件查询方式来解决。在此我们利用了软件查询方式,循环检测WR烧写控制位兼烧写完成标志位。

程序如下:

;实战《16F877内部EEPROM/写实验》

;本实战的目的是让大家熟悉PIC16F87X内部EEPROM的读/写方法

;项目实现的功能:对于地址为00H-3FH64EEPROM数据存储单元,分

;别将数据0-63依次烧写进去,然后再循环读出,显示在LED数码管上

 

;程序清单如下:

;************************************

         INCLUDE"P16F877.INC"

        

STATUS   EQU 3H       ;定义状态寄存器地址

RP0      EQU 5H       ;定义页选位RP0的位地址

RP1      EQU 6H       ;定义页选位RP1的位地址

Z        EQU 2H       ;定义0状态位的位地址

PORTC    EQU 7H       ;定义RC口数据寄存器地址

PORTD     EQU 8H

TRISC    EQU 87H      ;定义RC口方向控制寄存器地址

TRISD       EQU 88H

EECON1   EQU 18CH     ;定义写控制寄存器1的地址

EECON2   EQU 18DH     ;定义写控制寄存器2的地址

EEDATA   EQU 10CH     ;定义读/写数据寄存器地址

EEADR    EQU 10DH     ;定义读/写地址寄存器地址

RD       EQU  0       ;定义读启动控制位位地址

WR       EQU  1       ;定义写启动控制位位地址

WREN     EQU  2       ;定义写使能控制位位地址

EEPGD    EQU  7       ;定义访问目标选择控制位位址

F        EQU  1       ;定义目标寄存器为RAM的指示符

W        EQU  0       ;定义目标寄存器为W的指示符

ADDR     EQU  70H     ;定义地址变量

DATA1    EQU  71H     ;定义数据变量

;*************************************

    ORG     0000H        ;

    NOP                  ;放置一条ICD必须的空操作指令

    GOTO    MAIN         ;

    ORG     0008H        ;

MAIN

    BCF     STATUS,RP1   ;选体1为当前体

    BSF     STATUS,RP0   ;

    MOVLW   00H          ;设定RC全部为输出

    MOVWF   TRISC        ;

    BSF     STATUS,RP1   ;3为当前体

    CLRF    ADDR         ;地址变量清0

    CLRF    DATA1        ;数据变量清0

WRITE

    BSF     STATUS,RP1   ;选定体3

    BTFSC   EECON1,WR    ;上一次写操作是否完成

    GOTO    $-1          ;否!返回继续检测

    BCF     STATUS,RP0   ;选定体2

    MOVF    ADDR,W       ;取地址

    MOVWF   EEADR        ;送地址寄存器

    MOVF    DATA1,W      ;取数据

    MOVWF   EEDATA       ;送数据寄存器

    BSF     STATUS,RP0   ;选定体3

    BCF     EECON1,EEPGD ;选定EEPROM为访问对向

    BSF     EECON1,WREN  ;开放写操作使能控制

    MOVLW    55H         ;

    MOVWF   EECON2       ;55H到寄存器EECON2(读写内部EEPROM,这句是固定的)

    MOVLW   0AAH         ;

    MOVWF   EECON2       ;AAH到寄存器EECON2(读写内部EEPROM,这句是固定的)

    BSF     EECON1,WR    ;启动写操作

    BCF     EECON1,WREN  ;禁止写操作发生

    INCF    DATA1,F      ;数据递增

    INCF    ADDR,F       ;地址递增

    MOVF    ADDR,W       ;

    XORLW   D'64'        ;将当前地址与64比较

    BTFSS   STATUS,Z     ;检测=64

    GOTO    WRITE        ;否!继续写后面单元

READ1

    DECF    ADDR,F       ;地址递减

    BCF     STATUS,RP0   ;选体2为当前体

    BSF     STATUS,RP1   ;

    MOVF    ADDR,W       ;取地址

    MOVWF   EEADR        ;送地址寄存器

    BSF     STATUS,RP0   ;选体3为当前体

    BCF     EECON1,EEPGD  ;选定EEPROM为访问对象

    BSF     EECON1,RD     ;启动读操作

    BCF     STATUS,RP0    ;2为当前体

    MOVF    EEDATA,W      ;取数据

    BCF     STATUS,RP1    ;0为当前体

    MOVWF   PORTC         ;送显LED

    CALL    DELAY         ;调用廷时子程序

    MOVF    ADDR,F        ;检测当前地址

    BTFSS   STATUS,Z      ;是否为0?是!跳一步

    GOTO    READ1         ;否!返回继续读出和显示

READ2

    INCF    ADDR,F        ;地址递增

    BCF     STATUS,RP0    ;选体2为当前体

    BSF     STATUS,RP1    ;

    MOVF    ADDR,W        ;取地址

    MOVWF   EEADR         ;送地址寄存器

    BSF     STATUS,RP0     ;选体3为当前体

    BCF     EECON1,EEPGD   ;选定EEPROM为访问对象

    BSF     EECON1,RD      ;启动读操作

    BCF     STATUS,RP0     ;2为当前体

    MOVF    EEDATA,W       ;取数据

    BCF     STATUS,RP1     ;0为当前体

    CALL    LED_SHOW           ;送数码管显示

    CALL    DELAY          ;调用廷时子程序

    MOVF    ADDR,W         ;检测当前地址与64比较

    XORLW   D'64'          ;

    BTFSS   STATUS,Z       ;是否等于64

    GOTO    READ2          ;否!返回继续读出和显示

    GOTO    READ1          ;返回大循环起点

;******************************************

DELAY

    MOVLW    0             ;

    MOVWF    72H           ;将外层循环参数值256送外层循环寄存器

DELAY1

    MOVLW     0            ;将内层循环参数值256送内层循环寄存器

    MOVWF    73H           ;

    DECFSZ   73H,1         ;递减廷时程序

    GOTO     $-1           ;

    DECFSZ   72H,1         ;

    GOTO     DELAY1        ;

    RETURN

;==========================================================

; 2LED共阳数码管显示模块

; 入口: 待显示的数据在W

;----------------------------------------------------------

 

LCD1         EQU 20H            ;定义显示缓存单元

LCD2         EQU 21H

W_TEMP  EQU 22H            ;保护单元

STATUS_TEMP         EQU 23H

COUNT0  EQU 24H

COUNT1  EQU 25H

COUNT2  EQU 26H

 

LED_SHOW

;        MOVLW   7FH  ;;;;;;;

 

         MOVWF   LCD1                  ;现场保护,W的内容暂存于LCD1

         MOVWF   W_TEMP        ;现场保护[W-->W_TEMP]

    SWAPF      STATUS,W      ;SWAPF才不会影响标志位[WSTATUS高低4位交换]

    MOVWF   STATUS_TEMP   ;WSTATUS存入各保护寄存器[STATUS-->STATUS_TEMP]

 

         BCF     STATUS,RP1   ;选体1为当前体

    BSF     STATUS,RP0   ;

         MOVLW   00H

         MOVWF   TRISD                ;RD为输出口

         BCF  STATUS,RP0     ;恢复体0

        

;        MOVWF   LCD1                  ;W-->LCD1

         MOVF       LCD1,W             ;LCD1-->W

         ANDLW    B'11110000'        ;0FHW""后送W

         MOVWF   LCD2                  ;W-->F

         SWAPF   LCD2                  ;F高低4位互换

         MOVF       LCD2,W   

         CALL        CONVERT                   ;绎码

         MOVWF   PORTC

         MOVLW   02H

         MOVWF   PORTD               ;LCD十位

         CALL        DELAY2             ;延时

         MOVLW   0H

         MOVWF   PORTD               ;LCD个位

 

         MOVF       LCD1,W             ;F-->W

         ANDLW    B'00001111'        ;0FHW""后送W

         CALL        CONVERT                   ;绎码

         MOVWF   PORTC

         MOVLW   01H

         MOVWF   PORTD               ;LCD个位    

         CALL        DELAY2             ;延时

         MOVLW   0H

         MOVWF   PORTD               ;LCD个位

 

         SWAPF   STATUS_TEMP,W   ;恢复中断前STATUSW的值

    MOVWF   STATUS

    SWAPF      W_TEMP,F        ;W_TEMP高低4位互换

    SWAPF   W_TEMP,W    ;(用SWAPF才不会影响STATUS的值)

 

         RETURN                     ;子程序返回

;==========================================================

;-------------------- 共阳顺序7段数码管段码 ---------------

CONVERT                        ;取数码管段码

    ADDWF PCL,1             ;地址偏移量加当前PC

TABLE                                                        

         RETLW    0C0H              ;0

         RETLW    0F9H              ;1                                

         RETLW    0A4H              ;2

         RETLW    0B0H              ;3

         RETLW    99H                 ;4

         RETLW    92H                 ;5

         RETLW    82H                 ;6

         RETLW    0F8H                  ;7

         RETLW    80H                 ;8

         RETLW    90H         ;9

         RETLW     88H            ;A

         RETLW     83H            ;b

         RETLW     0C6H                  ;c

         RETLW     0A1H                  ;d

         RETLW     86H            ;E

         RETLW     8EH           ;F

;     RETLW    7FH             ;. 小数点

         RETLW     00H            ;结束符

;----------------------------------------------------------

;--------------------------- 廷时子程序   -----------------

DELAY2     

        MOVLW  .2              ;设置延时常数 [.2--即为2]

         MOVWF  COUNT0

L1                     

        MOVLW  .50            ;

         MOVWF  COUNT1

L2           

        MOVLW  .100           ;

         MOVWF  COUNT2

L3                     

        DECFSZ COUNT2,1        ;递减循环

         GOTO    L3                ;

         DECFSZ  COUNT1,1        ;

         GOTO    L2                ;

         DECFSZ  COUNT0,1        ;

         GOTO    L1                ;

         RETLW   0

;==========================================================

    END

 

培训录入:admin    责任编辑:admin 
  • 上一篇培训:

  • 下一篇培训: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关培训
    PIC16F877 A/D转换器实验
    华信单片机培训班招生简章
    编写PIC单片机源程序应注意的…
    PIC系列单片机基本的专用寄存…
    PIC系列单片机的伪指令
    PIC8位单片机汇编语言常用指…
    PIC 8位单片机的汇编语言
    PIC8位单片机的基本组成
    PIC系列单片机的振荡器配置方…
    PIC 8位单片机的分类和特点
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)