娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

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

2018年03月01日 | 基于pic單片機(jī)的模擬I2C通信

發(fā)布者:中原讀書客 來(lái)源: eefocus關(guān)鍵字:pic單片機(jī)  模擬I2C 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;    File Name: i2c_low.asm
;      Author: Alan G. Smith
;      Purpose: This code is borrowed from MICroChip with all of the fancy
;              stuff taken out.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

InitI2CBusMaster

;************************************************************
TxmtStartBit
  bsf    Bus_Busy                      ; on a start condition bus is busy
  bsf    STATUS, RP0                    ; Select page 1
  bsf    _SDA                          ; set SDA high
  bsf    _SCL                          ; cLOCk is high
  call  Delay40uSec                    ; This is necessary for setup time
  bcf    _SDA                          ; This gives a falling edge on SDA while clock is high
  call  Delay47uSec                    ; Necessary for START HOLD time
  return
;************************************************************
TxmtStopBit
  bsf    STATUS, RP0                    ; Select page 1
  bcf    _SCL                          ; clock is low
  bcf    _SDA                          ; set SDA low
  bsf    _SCL                          ; clock is pulLED up
  call  Delay40uSec                    ; Setup time for STOP condition
  bsf    _SDA                          ; rising edge on SDA while CLOCK is high
  call  Delay47uSec                    ; makes sure a START isn‘t sent immediately after a STOP
  bcf    Bus_Busy                      ; The bus isn‘t busy anymore
  return
;************************************************************
AbortI2C
  call  TxmtStopBit                    ; Send a stop bit
  bsf    Abort                          ; set the abort bit
  return
;************************************************************
TxmtSlaveAddr
  movf  SlaveAddr, w                  ; Move slave address to W
  bcf    ACK_Error                      ; reset Acknowledge error bit
  movwf  I2CData                        ; move W to I2C Data
  bcf    I2CData, LSB                  ; Set for write
  btfsc  Slave_RW                      ; If skip then write operation
  bsf    I2CData, LSB                  ; Clear for read
  call  SendData                      ; send the address
  btfss  Txmt_SuCCess                  ; skip if successful
  goto  AddrSendFail                  ; Oops, we failed
  retlw  TRUE                          ; return true
AddrSendFail
  btfss  ACK_Error                      ; was there an error acknowledging
  retlw  FALSE                          ; No, so return 0
  call  TxmtStopBit                    ; Address not acknowleged, so send STOP bit
  retlw  FALSE                          ; Unsuccessful, so return 0

;************************************************************
SendData
; We might should make a copy of the data here, the example does but I don‘t see why!!!
  bsf    Txmt_Progress                  ; We are in the middle of transmitting
  bcf    Txmt_Success                  ; reset success bit
  movlw  0x08
  movwf  I2CBitCount                    ; Set I2C Bit Count to 8
  bsf    STATUS, RP0                    ; Select page 1
TxmtNextBit:
  bcf    _SCL                          ; Set clock Low
  rlf    I2CData, F                    ; MSB First, Note that I2CData is Destroyed
  bcf    _SDA                          ; Set clock based on what the MSB is
  btfsc  STATUS,C                      ; Was the MSB a 1
  bsf    _SDA                          ; Nope set it high
  call  Delay47uSec                    ; guarantee min LOW TIME tLOW & Setup time
  bsf    _SCL                          ; set clock high
  call  Delay40uSec                    ; guarantee min HIGH TIME tHIGH
  decfsz I2CBitCount, F                ; are we done yet
  goto  TxmtNextBit                    ; nope, send the next bit
;
; Check For Acknowledge
;
  bcf    _SCL                          ; reset clock
  bsf    _SDA                          ; Release SDA line for Slave to pull down
  call  Delay47uSec                    ; guarantee min LOW TIME tLOW & Setup time
  bsf    _SCL                          ; clock for slave to ACK
  call  Delay40uSec                    ; guarantee min HIGH TIME tHIGH
  bcf    STATUS, RP0                    ; Select PAGE 0 to test SDA PIN
  btfsc  SdaPin                        ; SDA should be pulled low by slave if OK
  goto  TxmtErrorAck                  ; Uh oh, slave isn‘t behaving (or isn‘t there)
  bsf    STATUS, RP0                    ; Select PAGE 1
  bcf    _SCL                          ; reset clock
  bcf    Txmt_Progress                  ; reset progress bit in Bus Status
  bsf    Txmt_Success                  ; Transmission successful
  bcf    ACK_Error                      ; ACK OK
  return
TxmtErrorAck
  bsf    STATUS,RP0                    ; select page 1
  bsf    _SDA                          ; tristate SDA
  bsf    _SCL                          ; tristate SCL
  bcf    Txmt_Progress                  ; reset progress bit in Bus Status
  bcf    Txmt_Success                  ; Transmission NOT successful
  bsf    ACK_Error                      ; No ACK From Slave
  return

;************************************************************
GetData
  bsf    Rcv_Progress                  ; set Bus status for txmt progress
  bcf    Rcv_Success                    ; reset status bit
  movlw  0x08
  movwf  I2CBitCount
RcvNextBit
  bsf    STATUS, RP0                    ; page 1 for TRIS manipulation
  bcf    _SCL                          ; lower clock
  bcf    _SDA                          ; lower data line
  call  Delay47uSec                    ; guarantee min LOW TIME tLOW & setup time
  bsf    _SCL                          ; clock high, data sent by slave
  call  Delay40uSec                    ; guarantee min HIGH TIME tHIGH
  bcf    STATUS, RP0                    ; select page 0 to read Ports
  bcf    STATUS, C                      ; 0 out Status
  btfsc  SdaPin                        ; Check state of pin
  bsf    STATUS, C                      ; Pin was high, set status
  rlf    I2CData, F                    ; left Shift data (MSB first)
  decfsz I2CBitCount, F                ; Are we done yet
  goto  RcvNextBit                    ; Nope, go get the next one
;
; Generate ACK bit if not last byte to be read,
; if last byte Gennerate NACK ; do not send ACK on last byte, main routine will send a STOP bit
;
  bsf    STATUS, RP0                    ; Page 1 for TRIS manipulation
  bcf    _SCL                          ; pull SCL low
  bcf    _SDA                          ; ACK by pulling SDA low
  btfsc  Last_Byte_Rcv                  ; Is it the last byte to receive
  bsf    _SDA                          ; If so, send NACK by setting SDA high
  call  Delay47uSec                    ; guarantee min LOW TIME tLOW & Setup time
  bsf    _SCL                          ; Raise Clock back up
  call  Delay40uSec                    ; guarantee min HIGH TIME tHIGH
RcvEnd:
  bcf    _SCL                          ; reset clock
  bcf    Rcv_Progress                  ; reset bit in Bus Status
  bsf    Rcv_Success                    ; transmission successful
  bcf    ACK_Error                      ; ACK OK
  return

Delay47uSec:
  movlw ((_47uS_Delay-5)/3 + 1)        ; move delay into W
DlyK
  movwf DelayCount                      ; move what is in W to DelayCount
  decfsz  DelayCount, F                ; Decrement DelayCount
  goto  $-1                            ; Loop until 0
  return                                ; return

Delay40uSec:
  movlw ((_40uS_Delay-8)/3 + 1)        ; move delay into W
  goto  DlyK                            ; goto DlyK loop


以下為測(cè)試程序(pIC16f84)

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;                  Copyright (C) 1997 by Innovatus
;                        All Rights Reserved.
; This code may be distributed and used freely provided that this
; copyright notice stays intact and that any modifications are noted.
; For more information about Innovatus: http://www.innovatu.com
s;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;    File Name: testI2C.asm
;      Author: Alan G. Smith
;      Purpose: This is testing out the I2C code.
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    LIST P=16f84, F=INHX8M, C=100, N=59

#include "p16f84.inc"

XTAL_FREQ      equ    10000000        ; the crystal Frequency we are using
ClkOut          equ    XTAL_FREQ / 4  ; the number of cycles per second

_40uS_Delay set  (ClkOut/250000)
_47uS_Delay set  (ClkOut/212766)
_50uS_Delay set  (ClkOut/200000)

#define SclPIN  PORTA, 0                ; Pin for SCL (I2C)
#define SdaPin  PORTA, 1                ; Pin for SDA (I2C)

#define _SCL    TRISA, 0                ; How do we toggle SCL
#define _SDA    TRISA, 1                ; How do we toggle SDA

#define MSB  7
#define LSB  0
#define TRUE  1
#define FALSE 0

InitTrisA      equ    0x07            ; The Initial state to TRIS port A.

#define  Bus_Busy      BusStatus,0
#define  Abort        BusStatus,1
#define  Txmt_Progress BusStatus,2
#define  Rcv_Progress  BusStatus,3
#define  Txmt_SuCCess  BusStatus,4
#define  Rcv_Success  BusStatus,5
#define  Fatal_Error  BusStatus,6
#define  ACK_Error    BusStatus,7

#define  Slave_RW      BusControl,0
#define  Last_Byte_Rcv BusControl,1
#define  SlaveActive  BusControl,2

CBLOCK    0x0C                        ; I2C Ram needed
  BusStatus                            ; The I2C Status register
  BusControl                          ; The I2C Control register
  I2CBitCount                          ; Number of bits left to send (or receive)
  I2CData                              ; Data (note: This is DESTROYED when sending)
  SlaveAddr                            ; Slave Address
ENDC

CBLOCK
  DelayCount                          ; used to figure out precise time delays
ENDC


  org 0                                ; Reset Vector
  goto  start                          ; Goto Start

start
  bcf    INTCON, GIE                    ; Turn off interrupts in this critical part of code!
  bcf    STATUS, RP0                    ; Select Page 0 of registers
  movlw  0x0C                          ; Make sure there are 0‘s on SCL and SDA
  movwf  PORTA                          ; We write 1‘s to TX since 0 is a start bit
  bsf    STATUS, RP0                    ; Select Page 1 of registers
  movlw  InitTrisA                      ; Load W with the value for TRIS A
  movwf  TRISA                          ; movw the value from W into TRIS A
;*************** DEBUG CODE (let us use LEDs) *******************
  clrf  TRISB
;****************************************************************
  clrf  BusStatus                      ; Let‘s clear out busStatus before we start
  clrf  BusControl                    ; Let‘s clear out busControl before we start
;*************** TEST CODE *******************
  clrf  PORTB
main
  movlw  0xB0                          ; address of EEPROM
  movwf  SlaveAddr                      ; move into SlaveAddress register
  call  IsSlaveActive                  ; Check and see if the slave is active
  movlw  0xFF                          ; move FF into w (turn all LED‘s on)
  btfss  SlaveActive                    ; If the slave is active, leave it
  movlw  0xAA                          ; We didn‘t find it, turn off half.
  bcf    STATUS, RP0                    ; Select page 0 of registers
  movwf  PORTB                          ; move W to PortB

done                                    ; Game over man!
  goto  done                          ; endless loop

IsSlaveActive
  bcf    Slave_RW                      ; set for write operation
  call  TxmtStartBit                  ; Transmit Start Bit
  call  TxmtSlaveAddr                  ; Transmit Slave Address
  bcf    SlaveActive                    ; Assume not present
  btfss  ACK_Error                      ; skip if NACK, device is not present or not responding
  bsf    SlaveActive                    ; ACK received, device present & listening
  call  TxmtStopBit
  return

#include "i2c_low.asm"


關(guān)鍵字:pic單片機(jī)  模擬I2C 引用地址:基于pic單片機(jī)的模擬I2C通信

上一篇:基于PIC16F73單片機(jī)和ADS8341的SPI通信軟硬件實(shí)現(xiàn)方法
下一篇:一種0-24小時(shí)的時(shí)鐘源程序

0

推薦閱讀

不久前,高通宣布未來(lái)集成5G基帶的驍龍芯片將基于三星的7nm制造,具體來(lái)說(shuō)是7nm LPP,使用EUV(極紫外)技術(shù)。緊接著,三星就在華誠(chéng)破土動(dòng)工了一座新的7nm EUV工藝制造工廠,2020年之前要投產(chǎn)??此骑L(fēng)風(fēng)火火,但其實(shí)7nm EUV依然面臨著不少技術(shù)難題。據(jù)EETimes披露,在最近的芯片制造商會(huì)議上,有廠商就做了犀利地說(shuō)明。比如,GlobalFoundries研究副總裁...
3月1號(hào),iQOO旗艦級(jí)手機(jī)新品將于深圳正式亮相,發(fā)布會(huì)整體進(jìn)入倒計(jì)時(shí)。作為vivo全新子品牌,iQOO定位于互聯(lián)網(wǎng)新一代的對(duì)科技、極致性能在意的人群,配置全面、性能強(qiáng)悍是iQOO的最大特點(diǎn)。采用驍龍855處理器、12G運(yùn)存的iQOO旗艦手機(jī)運(yùn)行流暢不卡頓,44W快充和4000毫安超大鋰電池為iQOO保駕護(hù)航,Super HDR、4D震動(dòng)、NFC等配置進(jìn)一步提升用戶體驗(yàn)。處理器,...
STM32中斷非常強(qiáng)大,每個(gè)外設(shè)都能產(chǎn)生中斷中斷的優(yōu)先級(jí)數(shù)值越小,說(shuō)明他的中斷優(yōu)先級(jí)越高配置中斷需要了解NVIC寄存器: NVIC是嵌套向量中斷控制寄存器,控制中斷的相關(guān)功能;它與內(nèi)核緊密結(jié)合,是內(nèi)核里的一個(gè)外設(shè)。管理著包括內(nèi)核和片上的所有外設(shè)的中斷相關(guān)功能。因此配置中斷需要參考下面兩個(gè)頭文件:core_cm3.h 和 misc.h在配置中斷的時(shí)候我們...
據(jù)外媒報(bào)道,日前,Cybellum推出了首款汽車網(wǎng)絡(luò)數(shù)字雙胞胎(Cyber Digital Twins)平臺(tái),以應(yīng)對(duì)不斷上升的聯(lián)網(wǎng)汽車網(wǎng)絡(luò)風(fēng)險(xiǎn)。該風(fēng)險(xiǎn)評(píng)估平臺(tái)使制造商能夠定位和追蹤汽車運(yùn)行軟件中的數(shù)十萬(wàn)個(gè)潛在網(wǎng)絡(luò)漏洞,并提供軟件修復(fù),以在整個(gè)生命周期中保證安全性。(圖片來(lái)源:Cybellum)隨著聯(lián)網(wǎng)汽車相關(guān)的潛在威脅急劇上升,汽車安全行業(yè)技術(shù)也在不斷發(fā)展。行...

史海拾趣

問(wèn)答坊 | AI 解惑

AVR單片機(jī)新書下載

http://www.mcuol.com/other/20070904/ 以上是avr單片機(jī)電子書下載鏈接…

查看全部問(wèn)答∨

labview error 50103

最近編labview程序遇到一個(gè)錯(cuò)誤,在此于大家分享一下。 NI-DAQmx運(yùn)行出錯(cuò),代碼為50103,錯(cuò)誤原因是指定的資源被預(yù)留了 主要軟件: Driver Software>>NI-DAQmx 主要軟件版本: 7.0 主要軟件修正版本: 次要軟件: N/A 問(wèn)題: 為什么在運(yùn)行過(guò) ...…

查看全部問(wèn)答∨

SetSystemPowerState困惑

想用SetSystemPowerState(NULL,POWER_STATE_IDLE,POWER_FORCE)讓電話接通3秒后鎖屏,不過(guò)發(fā)現(xiàn)鎖屏后不能讓屏幕亮起來(lái)而且電話仍不掛斷就不行了,這時(shí)候再按鍵盤一點(diǎn)用都沒(méi)有,當(dāng)然除非按掛機(jī)鍵…… 問(wèn)問(wèn)大俠們?cè)趺唇鉀Q這個(gè)問(wèn)題。就是如何在鎖屏后 ...…

查看全部問(wèn)答∨

帶異步預(yù)置功能的D發(fā)器的verilog描述,求助

這種D觸發(fā)器應(yīng)該是很常見(jiàn),功能也很簡(jiǎn)單的一種單元,但最近用verilog描述的時(shí)候卻遇到了不少麻煩。 因?yàn)槲覍?duì)VHDL比較熟悉,所以用VHDL描述起來(lái)很簡(jiǎn)單,但我應(yīng)用的地方必須用verilog寫,對(duì)它又不太熟,所以請(qǐng)大家?guī)蛡€(gè)忙。 vhdl代碼如下: librar ...…

查看全部問(wèn)答∨

解決電腦不讀盤直接進(jìn)入CMOS

本人因?yàn)橹匮b系統(tǒng)失誤,重新啟動(dòng)的時(shí)候直接進(jìn)入CMOS,不能從硬盤或光盤啟動(dòng),現(xiàn)在該怎么辦?請(qǐng)各位老大救救我啊。。。 我已經(jīng)嘗試過(guò) Advanced BIOS Features / First Boot Device 設(shè)置了。。。…

查看全部問(wèn)答∨

提個(gè)中斷的問(wèn)題

建議ST將各個(gè)中斷向量的中斷源寫清楚:例如: TIM1有好多個(gè)中斷源,但分配的中斷向量確只有4個(gè)!  但沒(méi)有任何一份文檔里列出這些中斷是如何分配到4個(gè)中斷向量的.也許有人會(huì)說(shuō),中斷向里不是寫明白了那個(gè)中斷向量是分配到何種性的么. ...…

查看全部問(wèn)答∨

瑞薩杯--2011全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽新聞發(fā)布會(huì)

   昨天下午(6月7日)“瑞薩杯2011全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽”新聞發(fā)布會(huì)在競(jìng)賽秘書處單位北京理工大學(xué)舉行,從而拉開了本屆大賽的序幕。教育部高等教育司、工業(yè)和信息化部電子信息司相關(guān)領(lǐng)導(dǎo),全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽組委會(huì)主任、兩院院 ...…

查看全部問(wèn)答∨

IAR 下載方法及其注冊(cè)機(jī)

本帖來(lái)自中國(guó)電子開發(fā)網(wǎng),為大家共享!   打開IAR官方網(wǎng)站www.iar.com,點(diǎn)擊“Dowmloads”,找到STM8的30天試用版的鏈接并點(diǎn)擊,然后會(huì)出來(lái)一個(gè)注冊(cè)的界面, 注冊(cè)其實(shí)很簡(jiǎn)單,只要郵箱你填個(gè)正確的就行了,其他的隨便填,選擇的項(xiàng)也是 ...…

查看全部問(wèn)答∨

為什么會(huì)出現(xiàn)ERROR?

  怎么會(huì)有這樣的error?  我的空間還有啊 …

查看全部問(wèn)答∨
小廣播
添点儿料...
无论热点新闻、行业分析、技术干货……
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 阆中市| 新建县| 右玉县| 连城县| 勃利县| 河曲县| 新和县| 南平市| 林周县| 牡丹江市| 革吉县| 迁西县| 蕉岭县| 大城县| 浦北县| 绥中县| 麻城市| 西充县| 封开县| 余庆县| 麟游县| 巩留县| 玉田县| 台南县| 无为县| 舞钢市| 老河口市| 黄平县| 盐亭县| 乡城县| 重庆市| 富川| 彰化县| 于田县| 泊头市| 山西省| 巨鹿县| 民和| 泾阳县| 栾川县| 涞源县|