| | 网站首页 | 资讯 | 培训中心 | 技术文章 | 软件下载 | 产品展示 | 留言板 | 电子商城 | 供求信息 | |
| 您现在的位置: 华信单片机 >> 培训中心 >> 教学资源 >> 实验课件 >> 正文 |
|
|||||
| PIC16F877 EEPROM读/写实验 | |||||
作者:华信 培训来源:华信单片机工作室 点击数: 更新时间:2009-6-29 ![]() |
|||||
|
PIC16F877 EEPROM每一个单元的读/写所用时间典型值为:4ms,最大值为8ms。在烧写每个EEPROM单元过程中,需要CPU插入等待时间,既可利用中断功能,也可利用软件查询方式来解决。在此我们利用了软件查询方式,循环检测WR烧写控制位兼烧写完成标志位。 程序如下: ;实战《 ;本实战的目的是让大家熟悉PIC ;项目实现的功能:对于地址为00H-3FH的64个EEPROM数据存储单元,分 ;别将数据0-63依次烧写进去,然后再循环读出,显示在LED数码管上 ;程序清单如下: ;************************************ INCLUDE"P 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 ORG 0008H ; 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 ;========================================================== ; 2位LED共阳数码管显示模块 ; 入口: 待显示的数据在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才不会影响标志位[W与STATUS高低4位交换] MOVWF STATUS_TEMP ;将W和STATUS存入各保护寄存器[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' ;0FH与W相"与"后送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' ;0FH与W相"与"后送W CALL CONVERT ;绎码 MOVWF PORTC MOVLW 01H MOVWF PORTD ;开LCD个位 CALL DELAY2 ;延时 MOVLW 0H MOVWF PORTD ;关LCD个位 SWAPF STATUS_TEMP,W ;恢复中断前STATUS,W的值 MOVWF STATUS SWAPF W_TEMP,F ;W_TEMP高低4位互换 SWAPF W_TEMP,W ;(用SWAPF才不会影响STATUS的值) RETURN ;子程序返回 ;========================================================== ;-------------------- 共阳顺序7段数码管段码 --------------- CONVERT ;取数码管段码 ADDWF PCL,1 ;地址偏移量加当前PC值 TABLE RETLW RETLW RETLW RETLW 0B0H ;3 RETLW 99H ;4 RETLW 92H ;5 RETLW 82H ;6 RETLW RETLW 80H ;8 RETLW 90H ;9 RETLW 88H ;A RETLW 83H ;b RETLW RETLW 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条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | | |
![]() |
Copyright © 2004-2012 hx51.com hx51.cn All Rights Reserved |