历史上的今天
返回首页

历史上的今天

今天是:2025年01月12日(星期日)

2020年01月12日 | PIC单片机对9346EEPROM数据的读写

2020-01-12 来源:elecfans

实验目的:熟悉SPI总线以及9346EEPROM的读写

;RBO键按下时把DATA和DATA2写入到EEPROM中以EE—ADDR为地址的单元内,

;完成后,单个数码观显示“9”做为完成标志

;RB1键按下时,读取EEPROM中以EE—ADDR为地址的单元,并送数码管显示

;硬件要求:S3、S5、S6拨码管置ON,S1第7、8位置ON。

PIC单片机对9346EEPROM数据的读写

LIST P=16F877A, R=DEC

include “P16F877A.inc” ;包含头文件

__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC

#DEFINE CS PORTC,2 ;片选信号

#DEFINE CLK PORTC,3 ;时钟信号输入

#DEFINE DI PORTC,5 ;数据输入脚

#DEFINE D0 PORTC,4 ;数据输出脚EE_ADDR EQU 05H ;待写EEPROM单元地址EE_DATA EQU 56H ;待写入的数据

EE_DATA2 EQU 78HTEMP1 EQU 30H ;读EEPROM结果存放单元

TEMP2 EQU 31H

DL1 EQU 77H ;延时用

DL2 EQU 78H ;延时用

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

ORG 000H ;复位地址

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

GOTO MAIN

ORG 0008H

TABLE

ADDWF PCL,1 ;PC值加上偏移地址

RETLW 0C0H ;0

RETLW 0F9H ;1的编码

RETLW 0A4H ;2的编码

RETLW 0B0H ;3的编码

RETLW 99H ;4的编码

RETLW 92H ;5的编码

RETLW 082H ;6

RETLW 0F8H ;7

RETLW 080H ;8

RETLW 090H ;9

RETLW 88H ;A

RETLW 083H ;b

RETLW 0C6H ;c

RETLW 0A1H ;d

RETLW 086H ;E

RETLW 08EH ;F

RETLW 0FFH

;********************主程序***************************

MAIN

MOVLW 0FFH

MOVWF PORTD

CLRF TEMP1

BANKSEL SSPSTAT

MOVLW b‘10000000’

MOVWF SSPSTAT ;SMP=1,CKE=0

MOVLW B‘11010000’

MOVWF TRISC ;D0输入,DI输出,CLK输出

MOVLW 0FFH

MOVWF TRISB

CLRF TRISD

CLRF TRISA

MOVLW 06H

MOVWF ADCON1

CLRF STATUS

CLRF INTCON ;清除所有中断使能位

CLRF PIR1 ;清除SSP中断标志位

BCF CS ;片选禁止

MOVLW B‘00110001’

MOVWF SSPCON ;CKP=1,SSPEN=1,SPI主模式Fosc/16LOOP

CLRF STATUS

BTFSC PORTB,0

GOTO EE_READ

CALL WRITE_EE

MOVLW 90H

MOVWF PORTD

MOVLW 0FEH

MOVWF PORTA

GOTO $

EE_READ

BTFSC PORTB,1

GOTO MAIN

CALL READ_EE

CALL DISPLAY

GOTO $-1

;**********************写使能*********************************

WRITE_EE

BSF CS ;片选使能

MOVLW B‘00000001’ ;发送起始位

; MOVLW

CALL SPI_COMM ;发送

MOVLW B‘00110000’ ;写使能命令代码

CALL SPI_COMM ;发送

BCF CS ;片选禁止

NOP

NOP ;延时一定时间;*********************写数据**********************************

;入口参数:EE_ADDR,EE_DATA,EE_DATA2

;出口参数:无

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

BSF CS ;片选使能

MOVLW B‘00000001’ ;发送起始位

CALL SPI_COMM ;发送

MOVLW EE_ADDR ;发送待写单元的地址

IORLW B‘01000000’ ;地址加上写命令代码

CALL SPI_COMM

MOVLW EE_DATA ;发送待写入的数据

CALL SPI_COMM

MOVLW EE_DATA2

CALL SPI_COMM ;再次发送8位数据,组成16位数据

BCF CS ;片选禁止

NOP

NOP

NOP ;延时一定时间

BSF CS ;片选使能

NOP

NOP

BTFSS D0 ;判断内部写操作是否完成

GOTO $-1 ;正在操作,等待完成

BCF CS ;片选禁止

NOP

NOP ;延时一定时间

RETURN;*********************读数据***********************************

;入口参数:EE_ADDR

;出口参数:TEMP1,TEMP2

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

READ_EE

BSF CS ;片选使能

NOP

NOP ;延时一定时间

MOVLW B‘00000001’ ;发送起始位

CALL SPI_COMM

MOVLW EE_ADDR ;发送待读单元地址

IORLW B‘10000000’ ;地址加上读命令代码

CALL SPI_COMM

MOVLW 00H

CALL SPI_COMM ;读取EEPROM中指定单元高8位数据

MOVWF TEMP1 ;保存到结果存放单元

MOVLW 00H

CALL SPI_COMM ;读取EEPROM中指定单元低8位数据

MOVWF TEMP2

NOP

BCF CS ;片选禁止

NOP

NOP

MOVLW 0FH

ANDWF TEMP1,0

MOVWF 61H

SWAPF TEMP1,0

ANDLW 0FH

MOVWF 60H

MOVLW 0FH

ANDWF TEMP2,0

MOVWF 63H

SWAPF TEMP2,0

ANDLW 0FH

MOVWF 62H

RETURN

;*****************发送命令/数据和读取数据子程序*************

SPI_COMM

MOVWF SSPBUF ;SSPBUF中写入数据,启动发送接收过程

BTFSS PIR1,SSPIF ;判断是否发送/接收完成

GOTO $-1 ;等待完成

BCF PIR1,SSPIF ;清除中断标志位

MOVF SSPBUF,W ;清空SSPBUF,以便下一次通信

RETURN ;子程序返回;**********************延时程序******************************

DELAY10MS

MOVLW 0CH

MOVWF DL1

DELAY2

MOVLW 0FFH

MOVWF DL2

DELAY1

DECFSZ DL2,1

GOTO DELAY1

DECFSZ DL1,1

GOTO DELAY2

RETURN

;**********************显示程序******************************

;入口参数:60H-63H

;无

;***********************************************************DISPLAY

MOVFW 60H

CALL TABLE

MOVWF PORTD

BCF PORTA,0

CALL DELAY10MS

BSF PORTA,0 MOVFW 61H

CALL TABLE

MOVWF PORTD

BCF PORTA,1

CALL DELAY10MS

BSF PORTA,1 MOVFW 62H

CALL TABLE

MOVWF PORTD

BCF PORTA,2

CALL DELAY10MS

BSF PORTA,2 MOVFW 63H

CALL TABLE

MOVWF PORTD

BCF PORTA,3

CALL DELAY10MS

BSF PORTA,3

RETURN;********************************************

end ;源程序结束


推荐阅读

史海拾趣

Everett Charles Technologies (ECT)公司的发展小趣事

ECT一直致力于技术创新和研发,不断推出具有竞争力的新产品。多年来,ECT成功拥有了100多项专利,这些专利不仅涵盖了电子测试系统的各个方面,也体现了公司在技术上的领先地位。通过不断的技术创新,ECT赢得了众多世界知名电子公司及其代工厂的长期合作伙伴关系,进一步巩固了其在行业中的主导地位。

ABCO公司的发展小趣事

在技术创新的基础上,ABCO公司开始积极拓展市场。公司通过与大型电子设备制造商建立合作关系,将产品应用于汽车、医疗、工业等多个领域。同时,ABCO公司还加强了品牌建设,通过参加国际电子展会、举办技术研讨会等方式,提升了品牌知名度和影响力。

HAHN - Elektrobau GmbH & Co KG公司的发展小趣事

1991年,高通的CDMA技术首次被商用于美国卫星通信公司的无线电话网,标志着高通在移动通信领域的重大突破。与此同时,高通开始向智能手机芯片方向转型,目标是利用芯片技术使手机具备更强大的计算能力。随着技术的不断成熟,高通推出了多款性能卓越的移动应用处理器,如Snapdragon系列,迅速占据了智能手机芯片市场的主导地位。这一转型不仅巩固了高通在移动通信领域的地位,也为公司的长期发展奠定了坚实基础。

GREEGOO公司的发展小趣事
通过调整时钟信号的延迟来修正时序偏差,使时钟信号与数据采样时刻精确匹配。
Fairchild公司的发展小趣事

随着科技的不断进步和市场环境的变化,Fairchild公司也面临着转型和创新的挑战。为了保持竞争力和市场地位,Fairchild公司不断加大对新技术和新产品的研发投入。同时,公司也积极寻求与其他企业和研究机构的合作,共同推动半导体技术的创新和发展。通过这些努力,Fairchild公司成功实现了从传统半导体制造商向创新型科技企业的转型。

以上五个故事简要概述了Fairchild公司在电子行业发展的历程和成就。作为半导体行业的领军企业之一,Fairchild公司凭借其卓越的技术实力、创新能力和市场洞察力,为电子行业的发展做出了重要贡献。

Emmoco公司的发展小趣事

在追求经济效益的同时,Emmoco也注重环保和可持续发展。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。同时,Emmoco还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了Emmoco的社会责任感,也为公司的长期发展奠定了坚实的基础。

问答坊 | AI 解惑

有需要电感、变压器样品的工程师请进来,可能会有您用到的产品。

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 我工厂位于深圳观澜,是一家专业电感、贴片变压器生产商.在品质、交期、单价各方面都有一定的优势.有需要这方面样品的工程师敬请联络索样,我会尽快免费提供给大家,谢谢! 美登一电子(深圳)有 ...…

查看全部问答>

智能电子钟程序

学习单片机十天,编写的智能电子钟程序。…

查看全部问答>

50Mhz分频的问题

怎么将50M的时钟分频成153600hz? 用普通的方法好像不能解决,因为除不尽。 我设想用一个pll,倍频后,再分 高手指教…

查看全部问答>

有操作系统的嵌入式设备和没有操作系统的嵌入式设备之间的区别

有操作系统的嵌入式设备和没有操作系统的嵌入式设备之间的区别,以及有操作系统的嵌入式设备的优点是什么??…

查看全部问答>

初学者问几个问题,关于wince与arm,望高人指教

首先,我用的是微芯力科的ws-430评估板,cpu为at91rm9200,要求用wince开发。 评估板附带的资料只有linux以及ucos系统的,没有wince的资料,打电话到微芯力科公司,被告知该板不支持wince,因为wince要求某尺寸的真彩屏幕,而我的板子上是一个128 ...…

查看全部问答>

如何验证下位机的串行发送程序

我现在没有芯片,只是在keilc中写的串行通信程序,我想验证一下它能不能实现发送字节,只有一台的情况下该如何做?其中发送字节程序是? void sendbyte(unsigned char word) { SBUF=word; while(TI==0);   TI=0; } …

查看全部问答>

到底怎么才算嵌入式编程?

会C语言就算是会嵌入式编程了吗?…

查看全部问答>

原以为写个usb驱动很简单

DOS下的usb storage驱动一个比一个不好用,我一急就决定自己写一个,结果搞了20天了,还一头浆糊,怎么办。想来想去还是原始社会好啊…

查看全部问答>

AD快捷键大全

挺全的,ad6的快捷键大全,很实用的…

查看全部问答>

如何使用MSP430外部计数信号TACLK

急求高手指点,我的做法是引脚TACLK连接外部频率信号,对外部信号直接计数,不知道为什么总是得不到计数值。 MSP430F2274 P1SEL |= BIT0; P1DIR &= ~BIT0; TACTL = TASSEL_0 + ID_0 + MC_2;…

查看全部问答>