版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
读写24LCxx系列的EEPROM的实例程序读写24LCxx系列的EEPROM的实例程序;********************************************************
;*
*
;*
?PIC16F877A?I2CMaster家Α???﹃?ΑEEPROM?絛ㄒ祘Α
*
;*
*
;*Writtenby:
RichardYang
*
;*
Sr.CorporateApplicationEngineer
*
;*
MicrochipTechnologyInc.
*
;*Date:
Oct.2nd'2002
*
;*Revision:1.00
*
;********************************************************
;*************************************************
;ThissourcecodeprovidesademonstrationoftheMSSPperipheral
;onthePIC16F87xMCU.
;
;
;***********
ThesubroutinesforEEPROM
*****************
;
;EE_Random_Read
;EEPROMRandomaddressReadfromEEPROM
;EE_SEQU_Read
;EEPROMSequentialReadformEEPROM
;EE_Ack_Check
;PollingcurrentstatusofEEPROM
;EE_Page_Write
;PageWritefunctionforEEPROM
;EE_Byte_Write
;WriteabytetoEEPROMwithaddresssetting
;
;***********
ThesubroutinesforI2C
*****************
;
;Init_I2C_Master
;InitialI2CModuleforMasterMode,7-bitaddress
;StartI2C
;SendaSTARTCondition!!
;StopI2C
;SendsSTOPCondition
;RstartI2C
;SendaRepeatStartconditionaltoI2C
;Non_Ack
;SendaNon-acknowledgesignaltoI2C
;An_Ack
;SendaacknowledgesignaltoI2C
;Sebd_Byte
;SendabytetoI2Cbus
;RecI2C
;EnableReadabyteformslavedevice
;I2C_Done
:WaittheI2Ccompletedthecurrectprocess
;
;***************************************************
listp=16f877a
#include;
;***************************************
;
﹚竡跑计?RAM???
;
CBLOCK0x20
I2C_Ctrl
I2C_Addr
I2C_Data
I2C_Page_Length
D_Count
ENDC
cblock0x40
I2C_Page_Buffer:8
I2C_SEQU_Buffer:8
endc
;
;***************************************
;
﹚竡い耞?既?竟??w_temp
EQU0x72
status_tempEQU0x73
pclath_tempEQU0x74
;
;***************************************
;
﹚竡I2C???の竲?
;
EEPROM_CMDequ0xA0
;DeviceadressofSlavePoint
EE_Read
equ.1
EE_Writeequ.0;
#define
SCLPORTC,3
;I2CSCLpin
#define
SDAPORTC,4
;I2CSDApin;;********************************************
;Locatesstartupcode@theresetvector
;********************************************
Reset_Addr
org
0x00
nop
gotoMain_Init
;
org
0x04
gotoISR
;
;*************************************************************
;****TheStartAddressofISRis0x004
;****"PUSH"&"POP"?ㄏノ絛ㄒ:続ノ?钩PIC16F877ΤSHAREBANK?PIC
;**************************************************************
ISR
Push
movwf
w_temp
;saveoffcurrentWregistercontents
movfSTATUS,w
;movestatusregisterintoWregister
movwfstatus_temp
;saveoffcontentsofSTATUSregister
movfPCLATH,W
movwfpclath_temp
;
;
Putyourinterruptcodehere
;
Pop
movfpclath_temp,W
movwfPCLATH
movf
status_temp,w
;retrievecopyofSTATUSregister
movwfSTATUS
;restorepre-isrSTATUSregistercontents
swapf
w_temp,f
swapf
w_temp,w
;restorepre-isrWregistercontents
;
retfie
;returnfrominterrupt
;Main_Init
pageselInit_I2C_Master
;SetPAGEtoPCLATHRegister
call
Init_I2C_Master
;InittheMSSPforI2CMaster
;
bankselI2C_Ctrl
movlwEEPROM_CMD
;LoadEEPROMcommandaddress@0xA0
movwfI2C_Ctrl
;
;
Main
;
;
;
;*???代刚祘Α穦?盢?舱计?(0x40-0x47)糶??RMA0x40-0x47??竚
;*?ノPageWrite?よΑ盢8??じ舱?戈?糶?EEPROM?
;*秈︽?篈?盎代EEPROM琌??ЧΘ糶??笆??程?盢?糶
;*??戈??SequentialRead?よΑ眖EEPROM弄?ㄓ??I2C_SEQU_Bufferい
;Test_Page_RW
movlw0x08
movwfI2C_Page_Length
movlwI2C_Page_Buffer
_Fill_RAMmovwfFSR
movwfINDF
incfFSR,W
decfszI2C_Page_Length,F
goto_Fill_RAM
;
Test_Page_Write
;
bankselI2C_Ctrl
movlwEEPROM_CMD
;LoadEEPROMcommandaddress@0xA0
movwfI2C_Ctrl
movlw0x10
;SelectEEPROMlocationat0x00
movwfI2C_Addr
movlw.8
movwfI2C_Page_Length
callEE_Page_Write
;
callEE_Ack_Check
;
bankselI2C_Ctrl
movlwEEPROM_CMD
;LoadEEPROMcommandaddress@0xA0
movwfI2C_Ctrl
movlw0x10
movwfI2C_Addr
movlw.8
movwfI2C_Page_Length
callEE_SEQU_Read
;
goto$
;
;
;
;*???代刚祘Α穦?糶????じ舱?戈?糶?EEPROMい
;*?秈︽?篈?盎代琌??ЧΘ糶??笆??程?盢?糶
;*??戈??眖EEPROM弄?ㄓ??I2C_Data既?竟い
;
Test_1byte_RW
bankselI2C_Ctrl
movlwEEPROM_CMD
;LoadEEPROMcommandaddress@0xA0
movwfI2C_Ctrl
movlw0x00
;SelectEEPROMlocationat0x00
movwfI2C_Addr
movlw0xAA
;Writedata0x5Atolocation0x00ofEEPROM
movwfI2C_Data
callEE_Byte_Write
;
Test2
callEE_Ack_Check
;PollingAcknowledgefornextaccess
;
bankselI2C_Data
movlw0x00
;ClearI2Cdatabuffer
movwfI2C_Data
;
Test3
bankselI2C_Ctrl
movlwEEPROM_CMD
;LoadEEPROMcommandaddress@0xA0
movwfI2C_Ctrl
movlw0x00
movwfI2C_Addr
callEE_Random_Read
;
goto
$
;;
;******************************************************
;*
RandomReadaBytefromEEPROM
;*
;*Input:
;*
-I2C_Ctrl:ControlByteofEEPROM
;*
-I2C_Addr:LocationofEEPROM
;*Output:
;*
-I2C_Data:ReadDatafromEEPROM
;******************************************************
;
;SendCommandforRANDOMREAD:
;"Start+0xA0+EE_Address+ReStart+0xA1+Read_Data+NAck+Stop"
;EE_Random_Read
callStartI2C
;SetSSPCON2.SEN
;
bcf
I2C_Ctrl,0
;setforwriteCommand
movfI2C_Ctrl,W
;SendSlaveAddresstoI2CBus
callSend_Byte
;
movfI2C_Addr,W
;SendouttheRendomaddressofEEPROM
callSend_Byte
;
callRstartI2C
;SendaRepeatStarttoI2C
;
bsf
I2C_Ctrl,0
;setforReadCommand
movfI2C_Ctrl,W
;SendSlaveAddresstoI2CBus
callSend_Byte
;
callRecI2C
;EnableI2CReceive
;
BANKSELSSPBUF
movfSSPBUF,W;SavetoI2C_DataFirst!!
movwfI2C_Data
callNon_Ack
;InitialNACKResponse!!
callStopI2C
;InitialSTOPCondition
return
;
;***************************************************************
;*
SequentialReadfromEEPROM
;*
;*Input:
;*
-I2C_Ctrl:ControlByteofEEPROM
;*
-I2C_Addr:StartLocationofEEPROM
;*
-I2C_Page_Length:Howmanybyteneedtoread
;*Output:
;*
-I2C_SEQU_Buffer:SequentialReadDatabuffer
;*
;***************************************************************
;
;SendCommandforRANDOMREAD:
;"Start+0xA0+EE_Address+ReStart+0xA1+Read_Data+NAck+Stop"
;
EE_SEQU_Read
callStartI2C
;SetSSPCON2.SEN
;
bcf
I2C_Ctrl,0
;setforwriteCommand
movfI2C_Ctrl,W
;SendSlaveAddresstoI2CBus
callSend_Byte
;
movfI2C_Addr,W
;SendouttheRendomaddressofEEPROM
callSend_Byte
;
callRstartI2C
;SendaRepeatStarttoI2C
;
bsf
I2C_Ctrl,0
;setforReadCommand
movfI2C_Ctrl,W
;SendSlaveAddresstoI2CBus
callSend_Byte
;
movlwI2C_SEQU_Buffer
movwfFSR
;
_Sequ_LoopcallRecI2C
;EnableI2CReceive
BANKSELSSPBUF
movfSSPBUF,W
;SavetoI2C_DataFirst!!
movwfINDF
incfFSR,F
decfszI2C_Page_Length,F
goto_Cont_Read
goto_End_Read
_Cont_ReadcallAn_Ack
goto_Sequ_Loop
;
_End_ReadcallNon_Ack
;InitialNACKResponse!!
callStopI2C
;InitialSTOPCondition
return
;
;******************************************************
;*
EEPROMAcknowledgePolling
;*
;*
--
TheroutinewillpollingtheACK
;*
responsefromEEPROM
;*
--
ACK=0return
;*
--
ACK=1sendRestart&loopcheck
;*
;******************************************************
;
EE_Ack_Check
callStartI2C
;SetSSPCON2.SEN
bcf
I2C_Ctrl,0
;ClearforWriteCommand
movfI2C_Ctrl,W
;SendSlaveAddresstoI2CBus
callSend_Byte
_Ack_Polling
BANKSELSSPCON2
btfssSSPCON2,ACKSTAT;CheckACKSTATbit,0=ACK,1=NACK
gotoACK_Return
;Ack=0;EEPROMisReady
_Ack_Hi
;Ack=1;EEPROMisBusyforWrite
callDelay_mS
;Delay500uSfornextAckpolling
callRstartI2C
;SendaRepeatStarttoI2C
bcf
I2C_Ctrl,0
;ClearforWriteCommand
movfI2C_Ctrl,W
;SendSlaveAddresstoI2CBus
callSend_Byte
goto_Ack_Polling
ACK_Return
callStopI2C
;InitialSTOPCondition
return
;
;**********************************************************
;*
PageWrite1to8BytestoEEPROM
;*
;*
Input:
;*
-I2C_Ctrl:ControlByteofEEPROM
;*
-I2C_Addr:LocationofEEPROM
;*
-I2C_Page_Buffer:RAMlocationofData
;*
-I2C_Page_Length:Datalengthcount
;*
;**********************************************************
;
;SendCommandforPAGEWRITE:
;"Start+0xA0+EE_Address+W_Data0+..+W_DataN+Stop"
;
EE_Page_Write
movfI2C_Page_Length,W
btfscSTATUS,Z
return
;
callStartI2C
;SetSSPCON2.SEN
;
bcf
I2C_Ctrl,0
;ClearforWriteCommand
movfI2C_Ctrl,W
;SendSlaveAddresstoI2CBus
callSend_Byte
;
movfI2C_Addr,W
;SendouttheCommand
callSend_Byte
;
movlwI2C_Page_Buffer
movwfFSR
_W1
movfINDF,W
callSend_Byte
incfFSR,F
decfszI2C_Page_Length,F
goto_W1
;
callStopI2C
;InitialSTOPCondition
return
;
;
;*******************************************************
;*
WriteaBytetoEEPROM
;*
;*Input:
;*
-I2C_Ctrl:ControlByteofEEPROM
;*
-I2C_Addr:LocationofEEPROM
;*
-I2C_Data:DatatoEEPROM
;*
;*******************************************************
;
;SendCommandforBYTEWRITE:
;"Start+0xA0+EE_Address+Write_Data+Stop"
;
EE_Byte_Write
callStartI2C
;SetSSPCON2.SEN
;
bcf
I2C_Ctrl,0
;ClearforWriteCommand
movfI2C_Ctrl,W
;SendSlaveAddresstoI2CBus
callSend_Byte
;
movfI2C_Addr,W
;SendouttheCommand
callSend_Byte
;
movfI2C_Data,W
;SendouttheData
callSend_Byte
;
callStopI2C
;InitialSTOPCondition
return
;
;**********************************************************************
;
;
AsfollowingsubroutinesperformcommonlyusedI2Cfunctions.
;
YoucanusethesesubroutinesforyourI2Caccess
;
;**********************************************************************
;
;***InitialI2Cmodulefot7-bitI2CMasterModewith100Kcps@4MHz
;
Init_I2C_Master
BANKSELTRISC
;InitialPortC,bit3&4asInput
bsf
SCL
;RC3=SCL
,
RC4=SDA
bsf
SDA
;
BANKSELPORTC
bsf
SCL
;SCL=Hi
bsf
SDA
;SDA=Hi
;
movlwb'00101000'
;I2CMasterMode,ClockRate:FOSC/(4*SSPADD+1)
movwfSSPCON
;
;
bankselSSPADD
movlw
.9
;Thisgives100KHzI2Cclock@4MHz
movwf
SSPADD
;(4MHz/4)/(9+1)=100KHz
;
movlw
b'10000000'
;Disableslewratecontrol,
movwf
SSPSTAT
;andclearstatusbits
;
movlw
b'00000000'
;SetSCL,SDAintoReadystatus
movwf
SSPCON2
;
return
;
;******
SendSTARTconditiontobus
*******
;
StartI2C
;InitiatetheI2CSTARTcondition.
bankselSSPCON2
bsf
SSPCON2,SEN
gotoI2C_Done
;
;******
SendSTOPconditiontobus
*******
;
StopI2C
bankselSSPCON2
bsf
SSPCON2,PEN
gotoI2C_Done
;
;******
SendRESTARTconditiontobus
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 锅炉大件热处理工创新方法评优考核试卷含答案
- 送配电线路检修工操作管理强化考核试卷含答案
- 2025-2026学年钓鱼步骤 教学设计
- 2025-2026学年饭店教案
- 2025年边坡与基坑工程复习题及答案
- 2026年安徽省八年级生物下册第10单元生物技术测试卷
- 2025-2026学年连续操作教案
- 2026年山东省平度市高二生物下册期末考试模拟考试卷附答案【B卷】
- 高中政治人教版必修一6.2《股 票、债券和保险》教学设计
- 2026年河南省济源市高二生物上册期末考试考试卷附答案(考试直接用)
- T/CMSGS 001-2025低空无人驾驶航空器起降点气象观测设施建设和维护要求
- 2026年书记员招聘考试公共基础知识专项试题附答案
- 植物源性产品物种鉴别方法 Sanger测序法(征求意见稿)
- 2026年小学英语学科专业知识(含新课标核心素养)测试卷含答案(三套)
- DB37T5312-2025 建筑施工安全防护设施技术标准
- 供热运维管理合同模板(3篇)
- CESA-2024《整机柜服务器用电源模块规范》
- 日本介绍课件
- 感染性伤口的处理原则
- 供应室岗前培训
- 行政应诉实务培训课件
评论
0/150
提交评论