×
单片机 > 单片机程序设计 > 详情

93C46的读写实验程序

发布时间:2020-05-28 发布时间:
|

;*******************************************************************
 ;* 当选择8 位结构时93C46 有7 条10 位的指令
 ;* 指令、地址和写入的数据在时钟信号SK 的上升沿时由DI 引脚输入
 ;* DO 引脚除了从器件读取据或在进行了写操作后查询准备/繁忙ready/busy 的器件工作状态外平常是高阻态的

 ;******************************************************************************************
 ;程序首先从89S51的 ADDR,WDM 读出欲写入93C46的地址和数据,然后再把写入的数据读出来
 ;存放在 RDM ,再把ADDR , RDM 同过四位数码管显示出来.
 
;-------------端口和存储单元的定义---------------
 CS EQU P3.5 ;片选端
 SK EQU P2.6 ;模拟时钟信号输出端
 DI EQU P2.5 ;串行数据输出端
 DO EQU P2.4 ;串行数据输入端


 WDM EQU 51H   ;欲写入数据存储单元
 RDM EQU 50H   ;读出存放于 89S51 RAM 的存储单元
 ADDR EQU 42H   ;欲写入93C46的地址
;------------------------------------------------
 ORG 0000H
 LJMP MAIN
 ORG 0100H    ;主程序
MAIN:
        MOV ADDR,#20H  ;欲写入的地址设置(可根据需要自行修改)
        MOV WDM,#0ffH ;要写入的数据(可根据需要自行修改)
        LCALL EWEN46  ;调用写允许子程序,93C46每次上电后在进行写操作前都要先写允许
        LCALL WRITE   ;调用写入子程序
        LCALL READ    ;调用读子程序
        SJMP $

;*********************************************************************
;**********************   各功能子程序   *****************************
;*********************************************************************
;----------------------------------------------------
;发送高电平 1 
;-----------------------------------------------------
HIGH46:
       SETB DI
       SETB SK
       NOP
       CLR SK
       NOP
       RET

;-----------------------------------------------------
;发送低电平 0 
;-----------------------------------------------------
LOW46:
      CLR DI
      SETB SK
      NOP
      CLR SK
      NOP
      RET

;-------------------------------------------
;---------------------延时-------------------
DL2MS: 
  MOV R4,#8;
DD3:
  MOV R5,#124
        DJNZ R5,$
        DJNZ R4,DD3
        RET
;--------------------------------------------

;----------------------------------------------------- 
;-------------------写操作允许子程序--------------------
;-----------------------------------------------------
EWEN46:      ;  ( 10011*****  )
 SETB CS    ;启动93C46
 NOP
 LCALL HIGH46  ;1
 LCALL LOW46   ;0
 LCALL LOW46   ;0
 LCALL HIGH46  ;1
 LCALL HIGH46  ;1
 LCALL LOW46   ;0
 LCALL LOW46   ;0
 LCALL LOW46   ;0
 LCALL LOW46   ;0
 LCALL LOW46   ;0
 NOP
 CLR CS   ;93C46 进入休眠,降低功耗 
 RET

;-----------------------------------------------------------------
;------------向指定的地址中写入一个字节数据(八位)子程序---------
;-----------------------------------------------------------------
WRITE:   ;101
      
        SETB CS   ;启动93C46
        NOP
        MOV A,ADDR  ;把欲写入的数据的地址
        LCALL HIGH46   ;1
        LCALL LOW46    ;0
        LCALL HIGH46   ;1

WR_ADDR:      ;欲写入地址的设置,93C46的地址为 7 位
  MOV C,ACC.6
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.5
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.4
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.3
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.2
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.1
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.0
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP

WR_DAT:  ;写入一个字节数据(8位)
  MOV A,WDM
  MOV C,ACC.7
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.6
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.5
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.4
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.3
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.2
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.1
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.0
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
        LCALL DL2MS  ;调用延时,等待DO空闲!!!
        LCALL DL2MS
        LCALL DL2MS

LLK:    CLR CS  ;93C46 进入休眠,降低功耗 
        RET
;-----------------------------------------------------------------

;-----------------------------------------------------
;----------从指定的地址中读出一个字节数据(八位)子程序
;-----------------------------------------------------
READ:           ;110
        SETB CS   ;启动93C46
        NOP
        MOV A,ADDR  ;把欲读出的数据的地址送给A
        LCALL HIGH46
        LCALL HIGH46
        CLR DI
        SETB SK
        NOP
        CLR SK
        NOP

RD_ADDR:    ;读出地址设置(7位地址)
  MOV C,ACC.6
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.5
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.4
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.3
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.2
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.1
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
  MOV C,ACC.0
  MOV DI,C
 SETB SK
 NOP
 CLR SK
 NOP
RD_DAT:     ;读出一个字节的数据
 SETB SK
 NOP
  MOV C,DO
  MOV ACC.7,C
 CLR SK
 NOP

 SETB SK
 NOP
  MOV C,DO
  MOV ACC.6,C
 CLR SK
 NOP
 SETB SK
 NOP
  MOV C,DO
  MOV ACC.5,C
 CLR SK
 NOP
 SETB SK
 NOP
  MOV C,DO
  MOV ACC.4,C
 CLR SK
 NOP
 SETB SK
 NOP
  MOV C,DO
  MOV ACC.3,C
 CLR SK
 NOP
 SETB SK
 NOP
  MOV C,DO
  MOV ACC.2,C
 CLR SK
 NOP
 SETB SK
 NOP
  MOV C,DO
  MOV ACC.1,C
 CLR SK
 NOP
 SETB SK
 NOP
  MOV C,DO
  MOV ACC.0,C
 CLR SK
 NOP

  MOV RDM,A   ;保存读出的数据到 RDM(22H)
 CLR CS    ;93C46 进入休眠,降低功耗 
 RET

;---------------------------------------------------------------------------      
;-----------------------------------------------------
;-----------擦除所有单元子程序--------------------------
;-----------------------------------------------------
EARASE:
       SETB CS   ;启动93C46
       NOP
       LCALL HIGH46
       LCALL LOW46      
       CLR DI
       SETB SK
       NOP
       CLR SK
       NOP       
       SETB DI
       SETB SK
       NOP
       CLR SK
       NOP       
       CLR DI
       SETB SK
       NOP
       CLR SK
       NOP      
       CLR DI
       SETB SK
       NOP
       CLR SK
       NOP      
       CLR DI
       SETB SK
       NOP
       CLR SK
       NOP      
       CLR DI
       SETB SK
       NOP
       CLR SK
       NOP       
       CLR DI
       SETB SK
       NOP
       CLR SK
       NOP       
       SETB DI
       SETB SK
       NOP
       CLR SK
       NOP
       LCALL DL2MS  ;调用延时,等待DO空闲!!!
       LCALL DL2MS
       LCALL DL2MS
       
LLL:   CLR CS  ;93C46 进入休眠,降低功耗 
       RET
;----------------------------------------------------------------------
       END


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
LCD驱动-JZ2440