93C46.asm
上传用户:comjoincn
上传日期:2022-07-25
资源大小:11k
文件大小:5k
源码类别:

汇编语言

开发平台:

Visual C++

  1. NAME WL006
  2. CODE_SEG SEGMENT CODE 
  3. DATA_SEG SEGMENT DATA
  4. STACK_SEG SEGMENT IDATA
  5. RSEG  DATA_SEG
  6. INDATA:    DS    1
  7. ADDR:    DS    1
  8. RSEG STACK_SEG
  9. STACK: DS 20
  10. CS BIT P3.4
  11. SK BIT P3.3
  12. DI BIT P3.5
  13. DO BIT P3.6
  14. ;===============================================================================
  15. CSEG AT 0000H
  16. JMP MAIN
  17. ;===============================================================================
  18. RSEG  CODE_SEG
  19. MAIN:
  20. USING 0
  21. MOV SP,#(STACK-1) ; 设置堆栈
  22. CLR   CS ; 初始化端口
  23. CLR   SK
  24. SETB  DI
  25. SETB  DO
  26. LCALL EWEN ; 使能写入操作
  27. LCALL ERASE ; 擦除全部内容
  28. CLR   A ; 写入显示代码到AT93C46
  29. MOV   ADDR,A
  30. WRITE_LP:
  31. MOV   A,ADDR
  32. MOV   DPTR,#DIS_CODE
  33. MOVC  A,@A+DPTR
  34. MOV   R5,A ; 数据到R5
  35. MOV   R7,ADDR ; 地址到R7
  36. LCALL WRITE
  37. INC   ADDR ; 地址加1
  38. MOV   A,ADDR
  39. CLR   C
  40. SUBB  A,#08H ; 共8个字节,判断是否完成
  41. JC    WRITE_LP
  42. LCALL EWDS ; 禁止写入操作
  43. CLR   A
  44. MOV   ADDR,A
  45. MAIN_LP: ; 循环读取AT93C46内容,并输出到P0口
  46. MOV   R7,ADDR
  47. LCALL READ
  48. MOV   P0,R7
  49. INC   ADDR
  50. ANL   ADDR,#07H ; 循环读取地址为0x00~0x07
  51. MOV   R7,#250
  52. LCALL DELAYMS ; 延时250ms
  53. SJMP  MAIN_LP
  54. ;===============================================================================
  55. RSEG CODE_SEG
  56. WRITE:
  57. ; 定入数据到AT93C46
  58. ; 传入参数:R7 --- 要写入数据的地址
  59. ; 传入参数:R5 --- 要写入的数据
  60. ; 返回值:无
  61. USING 0
  62. MOV   INDATA,R5 ; 暂存要写入的数据
  63. MOV   R5,AR7 ; 地址
  64. MOV   R7,#040H ; 写入指令
  65. LCALL INOP ; 调用INOP子程序,写入指令和地址
  66. MOV   R7,INDATA ; 数据
  67. LCALL SHIN ; 移入数据
  68. CLR   CS
  69. MOV   R7,#10
  70. LJMP  DELAYMS ; 延时10ms,Twp
  71. ; END OF WRITE
  72. ;===============================================================================
  73. RSEG  CODE_SEG
  74. READ:
  75. ; 读取AT93C46内的数据
  76. ; 传入参数:R7 --- 地址
  77. ; 返回值:R7 --- 读取的数据
  78. USING 0
  79. MOV   R5,AR7
  80. MOV   R7,#080H
  81. LCALL INOP ; 调用INOP子程序,写入指令和地址
  82. LCALL SHOUT ; 调用SHOUT,读出数据保存到R7
  83. CLR   CS
  84. RET  
  85. ; END OF READ
  86. ;===============================================================================
  87. RSEG  CODE_SEG
  88. EWEN:
  89. ; 写入使能指令
  90. ; 传入参数:无
  91. ; 返回值:无
  92. USING 0
  93. MOV   R5,#060H
  94. CLR   A
  95. MOV   R7,A
  96. LCALL INOP
  97. CLR   CS
  98. RET  
  99. ; END OF EWEN
  100. ;===============================================================================
  101. RSEG  CODE_SEG
  102. EWDS:
  103. ; 写入禁止指令
  104. ; 传入参数:无
  105. ; 返回值:无
  106. USING 0
  107. CLR   A
  108. MOV   R5,A
  109. MOV   R7,A
  110. LCALL INOP
  111. CLR   CS
  112. RET  
  113. ; END OF EWDS
  114. ;===============================================================================
  115. RSEG  CODE_SEG
  116. ERASE:
  117. ; 擦除所有内容
  118. ; 传入参数:无
  119. ; 返回值:无
  120. USING 0
  121. MOV   R5,#040H
  122. CLR   A
  123. MOV   R7,A
  124. LCALL INOP
  125. MOV   R7,#01EH
  126. LCALL DELAYMS
  127. CLR   CS
  128. RET  
  129. ; END OF ERASE
  130. ;===============================================================================
  131. RSEG  CODE_SEG
  132. INOP:
  133. ; 写入操作码
  134. ; 传入参数:R7高两位 --- 指令码的高两位
  135. ; 传入参数:R5低七位 --- 指令码的低7位或地址
  136. ; 返回值:无
  137. USING 0
  138. CLR   SK ; 开始位
  139. SETB  DI
  140. SETB  CS
  141. NOP  
  142. NOP  
  143. SETB  SK
  144. NOP  
  145. NOP  
  146. CLR   SK ; 开始位结束
  147. MOV   A,R7 ; 先移入指令码高位
  148. RLC   A
  149. MOV   DI,C
  150. SETB  SK
  151. RLC A
  152. CLR   SK
  153. MOV   DI,C ; 移入指令码次高位
  154. SETB  SK
  155. NOP  
  156. NOP  
  157. CLR   SK
  158. MOV   A,R5 ; 移入余下的指令码或地址数据
  159. RLC A
  160. MOV   R5,A ; R5左移一位 
  161. CLR   A
  162. MOV   R7,A
  163. INOP_LP:
  164. MOV   A,R5 ; 移入R5的高7位
  165. RLC   A
  166. MOV   DI,C
  167. SETB  SK
  168. MOV   A,R5
  169. RLC A
  170. MOV   R5,A
  171. CLR   SK
  172. INC   R7
  173. CJNE  R7,#07H,INOP_LP ; 判断是否7位全移完
  174. SETB  DI
  175. RET  
  176. ; END OF INOP
  177. ;===============================================================================
  178. RSEG  CODE_SEG
  179. SHIN:
  180. ; 从MCU移出数据到AT93C46
  181. ; 传入参数:R7 --- 要移入的数据
  182. ; 返回值:无
  183. USING 0
  184. CLR   A
  185. MOV   R6,A
  186. MOV A,R6
  187. MOV   A,R7
  188. SHIN_LP:
  189. RLC   A
  190. MOV   DI,C
  191. SETB  SK
  192. NOP
  193. NOP
  194. CLR   SK
  195. INC   R6
  196. CJNE  R6,#08H,SHIN_LP ; 共8位,判断是否完成
  197. SETB  DI
  198. RET  
  199. ; END OF SHIN
  200. ;===============================================================================
  201. RSEG  CODE_SEG
  202. SHOUT:
  203. ; 从AT93C46移出数据MCU
  204. ; 传入参数:无
  205. ; 返回值:R7 --- 读出的数据
  206. USING 0
  207. CLR   A
  208. MOV   R6,A
  209. SHOUT_LP:
  210. SETB  SK
  211. NOP
  212. NOP
  213. CLR   SK
  214. MOV   C,DO
  215. RLC   A
  216. INC   R6
  217. CJNE  R6,#08H,SHOUT_LP ; 共8位,判断是否完成
  218. MOV AR7,A
  219. RET  
  220. ; END OF SHOUT
  221. ;===============================================================================
  222. RSEG  CODE_SEG
  223. DELAYMS:
  224. ; 延时子程序
  225. ; 传入参数:R7 --- 延时值(MS) 
  226. ; 返回值:无
  227. MOV A,R7
  228. JZ END_DLYMS
  229. DLY_LP1:
  230. MOV R6,#185
  231. DLY_LP2:
  232. NOP
  233. NOP
  234. NOP
  235. DJNZ R6,DLY_LP2
  236. DJNZ R7,DLY_LP1
  237. END_DLYMS:
  238. RET  
  239. ; END OF DELAYMS
  240. ;===============================================================================
  241. RSEG  CODE_SEG
  242. DIS_CODE:
  243. ; 写入到AT93C46的数据串
  244. DB 07EH
  245. DB 0BDH
  246. DB 0DBH
  247. DB 0E7H
  248. DB 0DBH
  249. DB 0BDH
  250. DB 07EH
  251. DB 0FFH
  252. END