; list p=16C74, st=off
; PORTC PIN DESCRIPTION
; SCK bit 3, SDI bit 4, SDO bit 5, CS bit 7
; Fosc = 10.0 MHz, thus each instr. cycle = 400ns
;***************Ram Register Definitions*******************************
rxdata equ 25h
addr equ 26h
loops equ 27h
;***************Bit Definitions****************************************
;#define CS PORTC,7 ; SPI chip select bit definition
;**********************************************************************
;***************25Cxxx command definitions
;#define WREN 6 ;write enable latch
;#define WRDI 4 ;reset the write enable latch
;#define RDSR 5 ;read status register
;#define WRSR 1 ;write status register
;#define READ 3 ;read data from memory
;#define WRITE 2 ;write data to memory
; Bit defines within status register
;#define WIP 0 ;write in progress
;#define WEL 1 ;write enable latch
;#define BP0 2 ;block protection bit
;#define BP1 3 ;block protection bit
;**********************************************************************
; include "p16c74.inc" ; 16C74 include file
; __CONFIG _WDT_OFF & _CP_OFF & _HS_OSC & _PWRTE_ON
;**********************************************************************
page
org 0000 ; Reset Vector
clrf PCLATH ; ensure PCLATH bit 3 is cleared
clrf INTCON ; ensure all interrupts are disabled
goto start ; jump to the beginning of the program
org 004 ; interrupt vector, do nothing
isr: goto isr ; do nothing, location just
; identified in code
;***************BEGIN MAIN PROGRAM*************************************
;
start: bcf STATUS,5 ; need to set bank 0
clrf PORTC ; initialize port c
bsf CS ; make sure cs is set
bsf STATUS,5 ; need to set bank 1
movlw 0x10 ; all bits are outputs except SDI
movwf TRISC ; for SPI setup
bcf STATUS,RP0 ; need to set bank 0
movlw 0x31 ; SPI master, clk/16, ckp=1
movwf SSPCON ; SSPEN enabled
movlw 0x10 ; *** put beginning address in addr**
movwf addr ; for later use
loop
;The first thing we will do is the WREN
call wren ; call the write enable routine
;Next write status reg. to clear the block protect bits
call wrsr ; call the write status routine
;Next do a busy test
call busy_test ; test WIP bit in status register
;Then do the WREN before writing to the array
call wren ; call the write enable command
;Next write 0xA5 (or any other value) to 0x10
bcf CS ; set chip select line low
movlw WRITE ; WRITE control byte
call output ; call the output subroutine
movlw b'00000000' ; high addr byte is all 0's
call output ; call the output subroutine
movf addr,w ; low addr byte
call output ; call the output subroutine
movlw b'10100101' ; load 0xA5 as data to be sent out
call output ; call the output subroutine
bcf SSPCON,CKP ; set clock idle low, mode 0,1
bsf CS ; set chip select, begin write cycle
bsf SSPCON,CKP ; set clock idle high, mode 1,1
call busy_test
call rdsr ; call the read status subroutine
;Now, read location 0x10h and store in rxdata. With Picmaster a
;user can break, read that memory location to see if the read worked
bcf CS ; set chip select line low
movlw READ ; READ control byte
call output ; call the output subroutine
movlw b'00000000' ; high addr byte is all 0's
call output ; call the output subroutine
movf addr,w ; get ready to send next byte
call output ; call the output subroutine
movlw b'01011010' ; move don't care byte of 0x5A into
call output ; call the output subroutine
bsf CS ; bring chip select high end
; terminate read command
;While program is continuously looping, the user may halt (if using an
;emulator), and look at the data in rxdata. If it is 0xA5, the
;read/write worked.
call wait ; little delay between SPI sequence
goto loop ; do it all over again
; loop can be used to evaluate SPI
; signals on oscilloscope
;********************* BEGIN SUBROUTINES*******************************
;*** DELAY ROUTINE - 400uS ***
;
wait movlw .200 ; timing adjustment variable
movwf loops ; move variable into loops
top nop ; sit and wait
nop ; no operation
decfsz loops,f ; loop complete?
goto top ; no, go again
return ; yes, return from sub
;****** This is the OUTPUT transmit/receive subroutine. ***************
output movwf SSPBUF ; place data in buffer to send
loop1 bsf STATUS,RP0 ; specify bank 1
btfss SSPSTAT,BF ; has data been received (xmit done)?
goto loop1 ; not done yet, keep trying
bcf STATUS,RP0 ; specify bank 0
movf SSPBUF,W ; empty receive buffer
movwf rxdata ; put received byte into rxdata
return ; return from subroutine
;*******Write Enable Subroutine****************************************
wren bcf CS ; set chip select line low
movlw WREN ; WREN control byte
call output ; Call the output subroutine
bcf SSPCON,CKP ; set clock idle low, mode 0,1
bsf CS ; set chip select, begin write
bsf SSPCON,CKP ; set clock idle high, mode 1,1
return ; return from subroutine
;*******Read Status Register Subroutine********************************
rdsr movlw RDSR ; RDSR control byte
call output ; Call the output subroutine
movlw b'00000101' ; this byte is a don't care byte
call output ; status reg data will be in rxdata
bsf CS ; set chip select
return ; return from subroutine
;*******Write Status Register Subroutine*******************************
wrsr bcf CS ; set chip select line low
movlw WRSR ; WRSR control byte
call output ; Call the output subroutine
movlw b'00001000' ; set BP1 bit in status register
call output ; this will clear block protect bits
bcf SSPCON,CKP ; set clock idle low, mode 0,1
bsf CS ; set chip select
bsf SSPCON,CKP ; set clock idle high, mode 1,1
return ; return from subroutine
;*******Busy Test - WIP bit in Status Register*************************
busy_test
bcf CS ; set chip select line low
movlw RDSR ; RDSR control byte
call output ; Call the output subroutine
movlw b'00000000' ; send dummy byte
call output ; to initiate clock sequence for read
bsf CS ; else, set chip select high
btfsc rxdata,WIP ; test WIP bit read from status register
goto busy_test ; repeat busy test
return ; return from subroutine
end
上一篇:PIC单片机定时器中断源程序
下一篇:PIC16C63单片机串口通信程序
推荐阅读
史海拾趣
为了满足不同客户的多样化需求,GHI Electronics不断拓展其产品线。除了传统的电子元件和模块外,公司还开始涉足智能家居、物联网等新兴领域。通过不断引入新技术、新产品,GHI Electronics成功实现了从单一产品向多元化产品线的转变。这种转变不仅丰富了公司的产品线结构,也提高了公司的综合竞争力。
2013年,ASM公司深圳工厂发生了一次大规模的工人罢工。这次罢工持续了22天,对公司的生产和经营造成了不小的影响。然而,这次罢工也暴露出公司在员工待遇和管理方面存在的问题。为了平息罢工并改善员工关系,ASM公司进行了一系列的改革措施,包括提高员工工资和福利、改善工作环境等。这些改革不仅缓解了员工的不满情绪,也提高了公司的凝聚力和竞争力。
这些故事只是ASM公司发展过程中的一部分,它们反映了公司在不同历史阶段所面临的挑战和机遇,以及公司如何不断调整和创新以适应市场的变化。通过这些故事,我们可以看到ASM公司在电子行业中的成长和发展是一个充满艰辛和奋斗的过程,也是一个不断追求创新和卓越的过程。
在稳步发展国内市场的同时,CST积极拓展国际市场。公司建立了分布世界各地的销售渠道,与多家国际知名企业建立了长期稳定的合作关系。通过不断的市场拓展和品牌建设,CST在国际市场上树立了良好的企业形象和品牌形象。
町洋公司创立于1983年,由一群志同道合的电子工程师创立。创业初期,町洋专注于接线端子及相关产品的研发与生产,凭借其独特的设计理念和精湛的生产工艺,逐渐在台湾市场上崭露头角。公司创始人深知产品质量的重要性,因此始终坚持严格的品质控制,赢得了客户的信赖。
町洋注重企业文化建设,倡导以人为本的管理理念。公司为员工提供了良好的工作环境和福利待遇,并积极开展各种培训和学习活动,帮助员工提升自身素质和专业技能。这种关注员工成长和发展的企业文化使得町洋的凝聚力不断增强,为公司的持续发展提供了有力保障。
在稳固国内市场的同时,HI Microwave积极开拓国际市场,与全球多家知名企业建立了长期稳定的合作关系。公司凭借优质的产品和服务,赢得了国内外客户的广泛赞誉。此外,HI Microwave还积极参与国际展览和交流活动,不断提升品牌知名度和影响力。通过与国际同行的交流与合作,公司不断吸收先进的管理理念和技术成果,为企业的持续发展注入了新的活力。
振荡器 IIBLC测量器的关键就是如图1所示的振荡电路。LM311是一个电压比较器,当电源被加上时,LM311的第2脚因为分压电路的存在为2.5V,引起比较器输出端为5V(此时由于C4的存在,末充电时等于短路).比较器的5V输出电压通过R4给C4充电,直 ...… 查看全部问答∨ |
|
um0427FWLibexamplesTIMTimeBase 例程中,是用TIM2作为定时器 ,然后从TIM3的4根GPIO管脚输出不同频率的波形。我现在有个问题:不能从TIM2的4根GPIO管脚输出吗? (我把例程的输出管脚改为TIM2上的 PA0,PA1,P ...… 查看全部问答∨ |
|
大家有在用STM32L152系列的MCU吗?想咨询个问题,我现在想做低功耗,需要进入Stop模式,但是看了下书,书上说进入STOP模式会关闭HSE,HSI,MSI等,只用LSE,我的外设和定时器,Uart都是用HSI的,那我进去后我的定时器是不是不能用了?我有两个管脚是 ...… 查看全部问答∨ |
说起来,很少正儿八经读别人的源程序。经常是喜欢直接看时序,看电路图,然后直接写程序,当然写的都是简单程序。后来工作所需,写串口,网络通信程序,当然没办法完全自己写,就参考例程,在原基础上调试增减API。虽说要改首先要看懂。但那些基本 ...… 查看全部问答∨ |
c=sizeof(USB_CONFIGURATION_DESCRIPTOR) + sizeof(USB_INTERFACE_DESCRIPTOR) + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DES ...… 查看全部问答∨ |
C2000晒晒 + TMS320F28035 experimenter kits (海量资料,肯定有你需要的!!) 秀秀刚刚买到手的28035开发板,呵呵,64pin的,P板非常简洁、做工很好,我喜欢!上电试了一下,工作正常,呵呵可惜没有光盘资料,去TI的网站上查了半天也没查到,有点郁闷。没办法,自己找吧,呵呵,EEWORLD非常好,资料很多啊,有待挖掘啊。下面是 ...… 查看全部问答∨ |