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

📄 93c46.asm

📁 单片机杭州天煌教仪自带例程单片机杭州天煌教仪自带例程
💻 ASM
字号:
  CS_93C46  BIT   P1.0
  SK_93C46  BIT   P1.1
  DI_93C46  BIT   P1.2
  DO_93C46  BIT   P1.3


  BIT_CNT   DATA  10H     ;移位次数
  BIT_SEND  DATA  11H     ;发送Bit数
  DATSEND   DATA  12H     ;待发送数据缓存


 ORG    0000H
 LJMP   MAIN
 ORG    0030H
MAIN:	MOV	R7,#0
	MOV	R6,#0
 LCALL  ERAL         ;把芯片的内容全部擦除
 MOV    R7,#10H      ;读进10H的内容查看
 LCALL  READ
 MOV    A,R5
 MOV    P0,A         ;显示R5的值
 MOV    A,R6
 MOV    P2,A         ;显示R6的值
 NOP            ;在这里设置断点,查看读入内容应为R6=0FFH和R5=0FFH
;SJMP   $

 MOV    R7,#10H      ;把1234H写到10H中
 MOV    R6,#12H
 MOV    R5,#34H
 LCALL  WRITE
 MOV    R6,#00H
 MOV    R5,#00H      ;改变R5、R6的值,以变和后面比较
 MOV    R7,#10H      ;读进10H的内容查? ;sjMP   $
 LCALL  READ
 MOV    A,R5
 MOV    P0,A         ;显示R5的值
 MOV    A,R6
 MOV    P2,A         ;显示R6的值
 NOP            ;在这里设置断点,查看读入内容应为R6=12H和R5=34H
;SJMP   $
 MOV    R7,#10H      ;把10H内容擦除
 LCALL  ERASE
 MOV    R7,#10H      ;读进10H的内容查看
 LCALL  READ
 MOV    A,R5
 MOV    P0,A         ;显示R5的值
 MOV    A,R6
 MOV    P2,A         ;显示R6的值
 NOP            ;在这里设置断点,查看读入内容应为R6=0FFH和R5=0FFH
 ;SJMP   $

 MOV    R6,#56H      ;把5678H写到全部内存中
 MOV    R5,#78H
 LCALL  WRAL
 MOV    R6,#00H
 MOV    R5,#00H      ;改变R5、R6的值,以变和后面比较
 MOV    R7,#10H      ;读进10H的内容查看
 LCALL  READ
 MOV    A,R5
 MOV    P0,A         ;显示R5的值
 MOV    A,R6
 MOV    P2,A         ;显示R6的值
 NOP            ;在这里设置断点,查看读入内容应为R6=56H和R5=78H
 SJMP   $


;******************************************************************
;名称:读指令(READ指令)
;功能:把93C46中R7所指向的内存的资料读到R6(H),R5(L)
;******************************************************************
READ:
 LCALL  START_93C46
 MOV    DATSEND,#06H   ;发送读操作指令
 MOV    BIT_SEND,#03H
 LCALL  SEND_DATA
 MOV    DATSEND,R7     ;发送写入地址
 MOV    BIT_SEND,#06H
 LCALL  SEND_DATA
 SETB   DO_93C46       ;准备读入资料
 MOV    BIT_CNT,#16
READ1:
 SETB   SK_93C46       ;产生一个时钟信号
 SETB   SK_93C46
 CLR    SK_93C46
 CLR    SK_93C46
 NOP
 MOV    C,DO_93C46     ;读取DO的信息
 MOV    A,R5           ;移位保存
 RLC    A
 MOV    R5,A
 MOV    A,R6
 RLC    A
 MOV    R6,A
 DJNZ   BIT_CNT,READ1
 LCALL  STOP_93C46
 RET

;******************************************************************
;名称:写指令(WRITE指令)
;功能:把R6(H),R5(L)的资料写到93C46中R7所指向的内存中
;******************************************************************
WRITE:
 LCALL  WEN_93C46
 LCALL  START_93C46
 MOV    DATSEND,#05H   ;发送写入操作指令
 MOV    BIT_SEND,#03H
 LCALL  SEND_DATA
 MOV    DATSEND,R7     ;发送写入地址
 MOV    BIT_SEND,#06H
 LCALL  SEND_DATA
 MOV    DATSEND,R6     ;发送写入资料
 MOV    BIT_SEND,#08H
 LCALL  SEND_DATA
 MOV    DATSEND,R5
 MOV    BIT_SEND,#08H
 LCALL  SEND_DATA
 LCALL  STOP_93C46
 LCALL  WDS_93C46
 RET

;******************************************************************
;名称:写全部(WRAL指令)
;功能:把R6(H),R5(L)的资料写到93C46的全部内存中
;******************************************************************
WRAL:
 LCALL  WEN_93C46
 LCALL  START_93C46
 MOV    DATSEND,#11H    ;发送写全部操作指令
 MOV    BIT_SEND,#05H
 LCALL  SEND_DATA
 MOV    DATSEND,#00H
 MOV    BIT_SEND,#04H
 LCALL  SEND_DATA
 MOV    DATSEND,R6      ;发送写全部资料(高位)
 MOV    BIT_SEND,#08H
 LCALL  SEND_DATA
 MOV    DATSEND,R5      ;发送写全部资料(低位)
 MOV    BIT_SEND,#08H
 LCALL  SEND_DATA
 LCALL  STOP_93C46
 LCALL  WDS_93C46
 RET

;******************************************************************
;名称:START_93C46
;功能:片选93C46做好读/写资料的准备
;******************************************************************
START_93C46:
 SETB  DO_93C46
 SETB  DI_93C46
 CLR   SK_93C46
 SETB  CS_93C46
 JNB   DO_93C46,$        ;查询器件是否繁忙
 SETB  SK_93C46
 CLR   SK_93C46
 CLR   CS_93C46
 CLR   SK_93C46
 CLR   DI_93C46
 SETB  CS_93C46
 RET


;******************************************************************
;名称:STOP_93C46
;功能:停止对93C46操作
;******************************************************************
STOP_93C46:
 CLR   SK_93C46
 CLR   DI_93C46
 CLR   CS_93C46
 SETB  DO_93C46
 RET

;******************************************************************
;名称:WEN_93C46(EWEN指令)
;功能:93C46写允许
;******************************************************************
WEN_93C46:
 LCALL  START_93C46
 MOV    DATSEND,#04H     ;发送开始位和写允许操作码,共3位
 MOV    BIT_SEND,#03H
 LCALL  SEND_DATA        ;调用发送子程序
 MOV    DATSEND,#30H     ;发送6位的指令操作码
 MOV    BIT_SEND,#06H
 LCALL  SEND_DATA
 LCALL  STOP_93C46
 RET

;******************************************************************
;名称:WDS_93C46(EWDS指令)
;功能:93C46写禁止
;******************************************************************
WDS_93C46:
 LCALL  START_93C46
 MOV    DATSEND,#04H      ;发送开始位和写禁止操作码,共3位
 MOV    BIT_SEND,#03H
 LCALL  SEND_DATA         ;调用发送子程序
 MOV    DATSEND,#00H      ;发送6位的指令操作码
 MOV    BIT_SEND,#06H
 LCALL  SEND_DATA
 LCALL  STOP_93C46
 RET

;******************************************************************
;名称:ERASE(ERASE指令)
;功能:擦除93C46中R7所指向的地址的内容
;******************************************************************
ERASE:
 LCALL  WEN_93C46
 LCALL  START_93C46
 MOV    DATSEND,#07H      ;发送擦除指令
 MOV    BIT_SEND,#03H
 LCALL  SEND_DATA
 MOV    DATSEND,R7
 MOV    BIT_SEND,#06H
 LCALL  SEND_DATA
 LCALL  STOP_93C46
 LCALL  WDS_93C46
 RET

;******************************************************************
;名称:ERAL(ERAL指令)
;功能:擦除93C46所有内容
;******************************************************************
ERAL:
 LCALL  WEN_93C46
 LCALL  START_93C46
 MOV    DATSEND,#04H      ;发送全部擦除指令
 MOV    BIT_SEND,#03H
 LCALL  SEND_DATA
 MOV    DATSEND,#20H
 MOV    BIT_SEND,#06H
 LCALL  SEND_DATA
 LCALL  STOP_93C46
 LCALL  WDS_93C46
 RET

;******************************************************************
;名称:SEND_DATA
;功能:资料发送子程序,把待发送资料DATSEND的低BIT_SEND位送到DI上
;******************************************************************
SEND_DATA:
                          ;因为为了使程序容易读懂,前面把要发送的内容
                          ;直接送给DATSEND,而现在就要把DATSEND中无用
                          ;的位去掉,把要发送的内容移到最高位来
 MOV    BIT_CNT,BIT_SEND
 MOV    A,#08H            ;计算要移位的个数
 CLR    C
 SUBB   A,BIT_CNT
 MOV    BIT_CNT,A
 JZ     SEND_DATA2        ;如果发送的位数为8位,则不用移位,跳转
 MOV    A,DATSEND         ;把要送出资料的移到DATSEND的最高位
SEND_DATA1:
 RL     A
 DJNZ   BIT_CNT,SEND_DATA1
 JMP    SEND_DATA3
SEND_DATA2:
 MOV    A,DATSEND         ;把要送出的8位资料DATSEND传给A
                          ;(只有8位资料都要送出时才执行这条指令)
SEND_DATA3:
 MOV    BIT_CNT,BIT_SEND
SEND_DATA4:
 RLC    A                 ;移位元送出BIT_SEND位资料
 JC     SEND_DATA5
 CLR    DI_93C46          ;发送0码
 JMP    SEND_DATA6
SEND_DATA5:
 SETB   DI_93C46          ;发送1码
 NOP
 NOP
SEND_DATA6:
 SETB   SK_93C46          ;产生移位元时钟信号
 CLR    SK_93C46
 DJNZ   BIT_CNT,SEND_DATA4
 RET

 END


⌨️ 快捷键说明

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