欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3270|回復: 0
收起左側

汽車傳感器控制儀程序代碼

[復制鏈接]
ID:76127 發表于 2015-4-16 03:03 | 顯示全部樓層 |閱讀模式
  1. ;**************************************************
  2. ;平凡單片機工作室 作者:周堅
  3. ;(c) Copyright 2003 Pingfan's McuStudio
  4. ;All rights Reserved
  5. ;cntrl.asm
  6. ;實驗:姬家寨電子科技實驗室:姬學瑞
  7. ;功能描述:汽車傳感器控制儀程序,具體內容請參考書
  8. ;**************************************************
  9. ;鍵盤緩沖區
  10. FIFO1    DATA    30H
  11. FIFO2    DATA    31H
  12. FIFO3    DATA    32H
  13. ;以下顯示緩沖區
  14. DISP1    DATA    40H
  15. DISP2    DATA    41H
  16. DISP3    DATA    42H
  17. DISPCTRL   DATA    43H
  18. ;顯示控制字
  19. DISP_CTRL  BIT     42H     ;顯示控制字,如果為1顯示,為0不顯示
  20. ;鍵盤有鍵按下標志
  21. K_MARK BIT  41H
  22. ;控制字堆棧
  23. STAC     DATA    50H   
  24. ;由FIFO得到的控制字
  25. CTRL     DATA    33H
  26. ORG     0000H
  27. AJMP    START
  28. ORG     40H  
  29. START:
  30. MOV    SP,#5FH   ; 設置堆棧
  31. MOV   P1,#0FFH   
  32. MOV   P2,#00H  
  33. MOV   P0,#0FFH
  34. SETB    DISP_CTRL   ;調用顯示程序前設置該位,要求顯示出來
  35. MOV    DISP3,#8
  36. MOV    DISP2,#8
  37. MOV    DISP1,#8
  38. ACALL  DISP   ;顯示888
  39. ACALL  D1S        ;延時1S
  40. MOV    DISP3,#16   ;H字符的代碼
  41. MOV    DISP2,#17   ;消隱代碼
  42. MOV   DISP1,#17  
  43. ACALL  DISP   
  44. CLR     A
  45. MOV   DISPCTRL,A ;
  46. MOV   R0,#20H
  47. MOV   R7,#10H
  48. INIT:
  49. MOV   @R0,A
  50. INC     R0
  51. DJNZ   R7,INIT      ;清除20H到2FH單元的內容
  52. SETB   DISP_CTRL      
  53. MOV DISPCTRL,#10
  54. MOV FIFO1,#0
  55. MOV FIFO2,#0
  56. MOV FIFO3,#0
  57. MAIN:
  58. INC    DISPCTRL
  59. MOV   A,DISPCTRL
  60. JZ      RDISP
  61. AJMP   MKEY
  62. RDISP:
  63. MOV DISPCTRL,#10
  64. ACALL  DISP      ;如果計數到255次,則刷新一次顯示
  65. MKEY:  
  66. ACALL  KEY           ;調用鍵盤處理程序
  67. JB      K_MARK,KEY_PROC   ;如果有鍵被按下,則轉去鍵盤處理
  68. ;***************************以下將內存對應內容輸出
  69. MOV   A,20H
  70. NOP
  71. MOV   20H,A     ;取出20H內容,再轉入20H
  72. MOV    P0,A
  73. SETB    P2.3
  74. ACALL  DOUT           
  75. CLR     P2.3   ;延時形成下降沿脈沖
  76. ;*******************************
  77. MOV    A,21H
  78. NOP
  79. MOV   21H,A
  80. MOV    P0,A
  81. SETB    P2.4
  82. ACALL  DOUT
  83. CLR     P2.4
  84. ;*******************************
  85. MOV    A,22H
  86. NOP
  87. MOV    22H,A
  88. MOV    P0,A
  89. SETB    P2.5
  90. ACALL  DOUT
  91. CLR     P2.5
  92. ;*********************************
  93. MOV    A,23H
  94. NOP
  95. MOV    23H,A
  96. MOV P0,A
  97. SETB    P2.6
  98. ACALL  DOUT
  99. CLR    P2.6
  100. MOV   A,24H
  101. ;********************************
  102. MOV   A,24H
  103. NOP
  104. MOV    24H,A
  105. MOV P0,A
  106. SETB    P2.7
  107. ACALL  DOUT
  108. CLR     P2.7
  109. AJMP   MAIN
  110. ;用于輸出的延時程序
  111. DOUT:
  112. PUSH PSW
  113. SETB RS1
  114. MOV R6,#3
  115. DJNZ R6,$
  116. POP  PSW
  117. RET
  118. ;*****************************鍵盤處理
  119. ;數字鍵直接進入鍵值FIFO
  120. ;功能鍵分別處理
  121. ;A:判斷待顯示的是否是合法的代碼,是則接受,并根據代碼作相應動作,顯示閃爍
  122. ;一次,如果不是合法的代碼,則不接受,并不閃爍
  123. ;合法的代碼為: 001-032,使各相位置1,使各繼電器吸合,斷路
  124. ;              033-040,使相應位置1,串入電阻
  125. ;              101-132,使相應位清0,各繼電器觸點吸合
  126. ;注意:
  127. ;     033-040代碼將相應的0-7位清0,以防止繼電器觸點斷路.
  128. ;     101-108代碼在除將相應的0-7位清0外,還要將32-39相應位清0,防止串入電阻
  129. ;B鍵:顯示和消隱的切換開關
  130. ;C鍵:復位開關,按下此鍵,將所有位(00-40)全部清0,使所有繼電器斷電(即全部觸點處
  131. ;于吸合狀態).
  132. KEY_PROC:
  133. CLR  K_MARK  ;清除有鍵按下標志
  134. CLR    C         ;清進位位
  135. MOV    A,B       ;取鍵值
  136. CJNE   A,#10,KEY_NEXT1
  137. AJMP   FUN_PROC     ;如果鍵值等于10轉功能鍵處理
  138. KEY_NEXT1:
  139. JC      DATA_PROC    ;如果小于10,則到數字鍵處理
  140. AJMP   FUN_PROC     ;如果鍵值大于10則轉功能鍵處理      
  141. DATA_PROC:               ;數字鍵處理
  142. MOV   FIFO3,FIFO2
  143. MOV   FIFO2,FIFO1
  144. MOV   FIFO1,B      ;如果是數字鍵,則將數字進入FIFO
  145. MOV   DISP3,FIFO3
  146. MOV   DISP2,FIFO2
  147. MOV   DISP1,FIFO1
  148. ACALL  DISP          ;調用顯示程序
  149. AJMP   MAIN          ;數字程序處理完畢,重新開始循環
  150. ;***************************以下各功能鍵處理部份
  151. A_PROC:                  ;A鍵處理
  152. MOV   A,FIFO3      ;取FIFO的首字節
  153. CLR    C
  154. CJNE    A,#2,A_1
  155. A_ERR:
  156. AJMP   MAIN        
  157. A_1:
  158. JC      A_2
  159. AJMP   MAIN        
  160. A_2:
  161. MOV   A,FIFO3     ;取首字節
  162. MOV   B,#100         
  163. MUL   AB
  164. MOV   R0,A           
  165. MOV   A,FIFO2   
  166. MOV   B,#10
  167. MUL   AB
  168. ADD   A,R0      
  169. ADD   A,FIFO1   
  170. MOV   R0,A      
  171. CJNE   A,#141,A_3
  172. AJMP   MAIN         
  173. A_3:
  174. JC      A_4
  175. AJMP   MAIN         
  176. A_4:
  177. MOV   A,R0         
  178. CJNE   A,#100,A_5     
  179. AJMP   MAIN         
  180. A_5:
  181. JC      A_6            
  182. AJMP   A_ACTION1   
  183. A_6:
  184. MOV   A,R0
  185. CJNE   A,#41,A_7
  186. AJMP   MAIN         
  187. A_7:
  188. JC      A_8           
  189. AJMP   MAIN        
  190. A_ACTION1:               
  191. DEC    R0           
  192. MOV   CTRL,R0     
  193. ACALL  CLR_OUT   
  194. CLR     DISP_CTRL
  195. ACALL  DISP         
  196. ACALL  D1S           
  197. SETB    DISP_CTRL      
  198. ACALL  DISP       ;開顯示并閃爍一次
  199. AJMP   MAIN
  200. A_8:
  201. MOV    A,R0
  202. JNZ     A_ACTION2
  203. AJMP   MAIN
  204. A_ACTION2:               
  205. DEC    R0            
  206. MOV    CTRL,R0
  207. ACALL  SET_OUT      
  208. CLR     DISP_CTRL
  209. ACALL  DISP          ;關顯示
  210. ACALL  D1S            
  211. SETB    DISP_CTRL
  212. ACALL  DISP    ;閃爍一次
  213. AJMP   MAIN
  214. FUN_PROC:                  
  215. MOV   A,B            
  216. SUBB  A,#10           
  217. JZ     A_PROC         
  218. DEC   A              
  219. JZ     B_PROC       ;B鍵處理
  220. DEC   A
  221. JZ     C_PROC         ;C 鍵處理
  222. DEC   A
  223. JZ     D_PROC        ;D鍵處理
  224. DEC   A
  225. JZ     E_PROC        ;E 鍵處理
  226. DEC   A
  227. JZ     F_PROC        ;F鍵處理
  228. KEY_ERR:                ;如果不是以上鍵(可能雙鍵同時按下之類)
  229. NOP                   ;錯誤處理,在此直接返回即可。
  230. AJMP  MAIN
  231. B_PROC:
  232. CPL    DISP_CTRL     ;取反顯示控制
  233. ACALL DISP
  234. LJMP    MAIN
  235. C_PROC:
  236. MOV    20H,#00H
  237. MOV    21H,#00H
  238. MOV   22H,#00H
  239. MOV   23H,#00H
  240. MOV   24H,#00H     ;C鍵是開關重置鍵,將所有位清零
  241. MOV   DISP3,#16     ;'H'
  242. MOV   DISP2,#17     ;消隱
  243. MOV   DISP1,#17     ;消隱
  244. ACALL  DISP
  245. LJMP    MAIN
  246. D_PROC:
  247. LJMP   MAIN
  248. E_PROC:
  249. LJMP   MAIN
  250. F_PROC:
  251. LJMP   MAIN     ;這四個鍵暫不使用
  252. ;**************************************置位
  253. SET_OUT:
  254. CLR    C
  255. MOV   A,CTRL    ;CTRL是要設置的位
  256. CJNE   A,#32,SET1
  257. AJMP   SETPROC     ;等于32要特殊處理
  258. SET1:
  259. JNC    SETPROC     ;大于32要特殊處理
  260. SET2:                     ;是1-32中的一個值
  261. MOV   A,CTRL
  262. ACALL  SETOUT1
  263. SETPROC:                ;如果大于等于32,則作兩個動作:
  264. MOV    A,CTRL     ;1.將相應位置1,以串入電位器
  265. ACALL  SETOUT1     ;將相應的1-8位清0,以接通電路
  266. MOV    A,CTRL
  267. SUBB   A,#31
  268. ADD    A,#100
  269. ACALL  CLROUT1
  270. RET
  271. SETOUT1:
  272. MOV   B,#8       ;先將哪個字節要設置求出
  273. DIV     AB
  274. PUSH   PSW
  275. SETB   RS0      ;選第二工作區
  276. MOV    R0,#1FH   ;用R0作間址尋址
  277. INC    A
  278. MOV   R7,A
  279. LP:
  280. INC    R0
  281. DJNZ   R7,LP      ;確定是哪個字節
  282. ;**************************************
  283. MOV    A,B       ;將除得的結果送A(哪一位)
  284. JZ      LP3         ;如果是0,直接轉,否則會有錯
  285. MOV   A,@R0     ;取這個字節
  286. MOV    R7,#8       ;將這個字節循環右移8次
  287. MOV    R6,B        ;分兩段,一段由R6控制,正好將該位移到ACC.0的位置
  288. LP1:
  289. DEC    R7          ;R7中減去R6已移的次數
  290. RR     A
  291. DJNZ   R6,LP1
  292. SETB   ACC.0       ;由R6控制的移動結束,該位處于ACC.0位置,置該位
  293. LP2:
  294. RR     A      
  295. DJNZ   R7,LP2      ;剩下來該移動的次數由R7中的值決定     
  296. AJMP   LP4
  297. LP3:                     ;這個是用來處理一種特殊情況,即某一字節的最低位
  298. MOV   A,@R0     ;此時B中是0,如果仍用上法處理,會出錯,只要直接將
  299. SETB   ACC.0       ;該位置1即可
  300. LP4:
  301. MOV  @R0,A
  302. POP    PSW
  303. RET
  304. CLR_OUT:
  305. CLR    C
  306. MOV   A,CTRL     ;CTRL是要清的位
  307. CJNE   A,#107,CLR1
  308. AJMP   CLRPROC    ;等于107,轉
  309. CLR1:
  310. JC      CLRPROC    ;小于107,轉
  311. MOV    A,CTRL
  312. ACALL  CLROUT1
  313. CLRPROC:               ;如果輸入的代碼是101-108,則作如下2個動作:
  314. MOV    A,CTRL     ;1.將相應位清0,使繼電器觸點吸合
  315. ACALL  CLROUT1    ;2.將133-140相應位清0,使繼電器觸點吸合
  316. MOV    A,CTRL     ;防止串入電阻
  317. ADD    A,#32
  318. ACALL  CLROUT1   
  319. RET
  320. CLROUT1:
  321. CLR C
  322. SUBB   A,#100     ;先減去100 (因為該位為位數加上100構成)
  323. MOV    B,#8        ;先將要清零的字節求出     
  324. DIV     AB
  325. PUSH   PSW
  326. SETB    RS0         ;選第二工作區
  327. MOV    R0,#1FH     ;用R0作間址尋址
  328. INC     A
  329. MOV    R7,A
  330. CLP:
  331. INC     R0
  332. DJNZ    R7,CLP      ;確定是哪個字節
  333. ;**************************************
  334. MOV    A,B         ;將除得的結果送A(哪一位)
  335. JZ      CLP3         ;如果是0,直接轉,否則會有錯
  336. MOV    A,@R0      ;取這個字節
  337. MOV    R7,#8       ;將這個字節循環右移8次
  338. MOV    R6,B        ;分兩段,一段由R6控制,正好將該位移到ACC.0的位置
  339. CLP1:
  340. DEC    R7          ;R7中減去R6已移的次數
  341. RR     A
  342. DJNZ   R6,CLP1
  343. CLR    ACC.0        ;由R6控制的移動結束,該位處于ACC.0位置,清該位
  344. CLP2:
  345. RR     A      
  346. DJNZ   R7,CLP2     ;剩下來該移動的次數由R7中的值決定     
  347. AJMP   CLP4
  348. CLP3:                     ;這個是用來處理一種特殊情況,即某一字節的最低位
  349. MOV    A,@R0      ;此時B中是0,如果仍用上法處理,會出錯,只要直接將
  350. CLR     ACC.0       ;該位清0即可
  351. CLP4:
  352. MOV    @R0,A
  353. POP    PSW
  354. RET
  355. ;顯示子程序
  356. DISP:
  357. PUSH   DPH
  358. PUSH   DPL
  359. MOV SCON,#00H   ;置串行口工作方式0
  360. JNB     DISP_CTRL,HIDDEN ;如果DISP_CTRL位為0,則消隱處理
  361. AJMP   DISP_NEXT  ;要求消隱,則消隱處理
  362. HIDDEN:
  363. MOV    A,#0FFH    ;消隱代碼
  364. ACALL  DISP_LED
  365. ACALL  DISP_LED
  366. ACALL  DISP_LED    ;三次調用顯示子程序,發出3位
  367. POP     DPL
  368. POP    DPH
  369. RET                  ;消隱處理完畢,直接返回
  370. DISP_NEXT:
  371. MOV    DPTR,#DISP_TAB
  372. MOV    A,DISP3      ;顯示緩沖區的最高位
  373. MOVC  A,@A+DPTR
  374. LCALL  DISP_LED     ;顯示最高位      
  375. MOV    A,DISP2
  376. MOVC  A,@A+DPTR
  377. LCALL  DISP_LED     ;顯示中間位
  378. MOV    A,DISP1
  379. MOV    DPTR,#DISP_TAB
  380. MOVC   A,@A+DPTR
  381. LCALL   DISP_LED     ;顯示低位
  382. POP     DPL
  383. POP     DPH
  384. RET
  385. ;以下顯示子程序
  386. DISP_LED:
  387. MOV  SBUF,A
  388. DISP_L1:
  389. JNB    TI,DISP_L1    ;發送第一位
  390. CLR    TI
  391. RET
  392. DISP_TAB:
  393. DB     88H,   0BEH, 0C4H, 94H,  0B2H,  91H
  394. ;       0       1       2       3       4       5
  395. DB      81H,   0BCH, 80H,  090H,  0A0H, 83H
  396. ;       6       7       8       9       A       B
  397. DB      0C9H,  86H,   0C1H, 0E1H, 0A2H,  0FFH
  398. ;       C       D       E       F       H       消隱
  399. ;鍵盤程序
  400. ;返回的鍵值在B中
  401. KEY:
  402. CLR     K_MARK
  403. MOV    B,#0
  404. MOV    R0,#0
  405. MOV    R1,#0F7H
  406. MOV    R7,#4
  407. MOV    A,R1
  408. K_LOOP:
  409. MOV    P1,A  ;輸出到P1口
  410. MOV    A,P1
  411. ORL    A,#0FH   ;高4位為1
  412. CPL    A        ;如果低4位也為1,取反后為0,無鍵按下
  413. JZ      K_NEXT
  414. AJMP   K_NEXT1
  415. K_NEXT:
  416. INC     R0
  417. MOV    A,R1
  418. RR      A
  419. MOV    R1,A
  420. DJNZ    R7,K_LOOP
  421. AJMP   NO_KEY
  422. K_NEXT1:
  423. JB      ACC.4,K_RET   ;0鍵被按下
  424. INC     B
  425. INC     B
  426. INC     B
  427. INC     B
  428. JB      ACC.5,K_RET  ;4鍵被按下
  429. INC     B
  430. INC     B
  431. INC     B
  432. INC     B
  433. JB      ACC.6,K_RET  ;8
  434. INC     B
  435. INC     B
  436. INC     B
  437. INC     B
  438. JB      ACC.7,K_RET
  439. K_ERR:
  440. AJMP   NO_KEY
  441. MOV    A,R1
  442. RR      A         ;右移(F7--FB)
  443. MOV    R1,A      ;回存
  444. INC     R0
  445. DJNZ    R7,K_LOOP
  446. K_RET:
  447. MOV    P1,#0F0H
  448. NOP
  449. MOV    A,P1
  450. ORL    A,#0FH
  451. CPL    A
  452. JNZ     K_RET    ;循環直到所有按鍵被釋放
  453. SETB   K_MARK   ;置有鍵按下標志
  454. MOV   A,B
  455. ADD    A,R0
  456. MOV    B,A
  457. RET
  458. NO_KEY:
  459. RET
  460. ;1秒延時子程序
  461. D1S:
  462. PUSH   PSW
  463. SETB   RS1
  464. MOV    R7,#7FH
  465. DLP1:
  466. MOV    R6,#8FH
  467. DLP2:
  468. MOV    R5,#3
  469. DJNZ    R5,$
  470. DJNZ    R6,DLP2
  471. DJNZ   R7,DLP1
  472. POP    PSW
  473. RET
  474. ;10毫秒延時子程序
  475. D10MS:
  476. PUSH   PSW
  477. MOV   R7,#20
  478. D1:   
  479. MOV   R6,#250
  480. DJNZ   R6,$
  481. DJNZ    R7,D1
  482. POP    PSW
  483. RET
  484. END
復制代碼


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表