⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 good.asm

📁 使用51系列单片机操作93c46些列储存器的程序
💻 ASM
字号:
 ;*****************************************************************
 ;*                                                              
 ;*  程序功能 :  93C46的读写实验                                
 ;*                                                         
 ;*  硬    件:  WS803A / WS806 /WS***
 ;*                                                     
 ;*  创建时间 :  2005.06.27
 ;*
 ;*******************************************************************
 ;* 当选择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    ;调用读子程序

;----------------------------------------------
;--------------显示处理子程--------------------

     MOV A,RDM   ;对 RDM 的低四位处理 
     ANL A,#00001111B   ;屏蔽高四位
     MOV 53H,A
     
     MOV A,RDM   ;对 RDM 的高四位处理
     ANL A,#11110000B   ;屏蔽低四位
     SWAP A
     MOV 54H,A
     
     MOV A,ADDR  ;对 ADDR 的低四位处理
     ANL A,#00001111B
     MOV 55H,A
     
     MOV A,ADDR  ;对 ADDR 的高四位处理
     ANL A,#11110000B
     SWAP A
     MOV 56H,A
     
DISP:MOV DPTR,#TABLE
     MOV A,53H
     MOVC A,@A+DPTR
     MOV P0,A   ;显示 RDM 的低位
     CLR P1.3   ;选通第四位数码管
     LCALL DL2MS
     LCALL DL2MS
     SETB P1.3  ;关闭显示

     MOV A,54H
     MOVC A,@A+DPTR
     MOV P0,A   ;显示 RDM 的高位
     CLR P1.2   ;选通第三位数码管
     LCALL DL2MS
     LCALL DL2MS
     SETB P1.2  ;关闭显示
     
     MOV A,55H
     MOVC A,@A+DPTR
     MOV P0,A   ;显示 ADDR的高位
     CLR P1.1   ;选通第二位数码管
     LCALL DL2MS
     LCALL DL2MS
     SETB P1.1  ;关闭显示
     
     MOV A,56H
     MOVC A,@A+DPTR
     MOV P0,A   ;显示 ADDR 的高位
     CLR P1.0   ;选通第一位数码管
     LCALL DL2MS
     LCALL DL2MS
     SETB P1.0  ;关闭显示
     
     LJMP DISP

TABLE:  DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H  ;0~9
        DB 88H,83H,0C6H,0A1H,86H,8EH   ;A~F

;*********************************************************************
;**********************   各功能子程序   *****************************
;*********************************************************************
;----------------------------------------------------
;发送高电平 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -