key.asm
上传用户:sdjqgc
上传日期:2022-08-06
资源大小:2404k
文件大小:6k
开发平台:

Asm

  1. //========================================================================================
  2. // Progarm: The head file for key.asm in assembly view
  3. // Arranged by: Andy Hsu
  4. // Modified by Arthur Shieh
  5. // Last modified date: 
  6. //  2000/06/23: first version
  7. // 2000/07/20: modified
  8. //      2002/5/31 : Modified by Arthur Shieh to use IOA8~IOA15 for keyscan
  9. //
  10. // Functions:
  11. //  F_Key_Scan_Initial;
  12. //  F_Key_Scan_ServiceLoop;
  13. //  F_Key_DebounceCnt_Down;
  14. //
  15. // call F_SP_GetCh;
  16. //========================================================================================
  17. .INCLUDE SPCE061A.inc;
  18. .public _F_Key_Scan_Initial
  19. .PUBLIC F_Key_Scan_Initial;
  20. .public _F_Key_Scan_ServiceLoop
  21. .PUBLIC F_Key_Scan_ServiceLoop;
  22. .PUBLIC _SP_GetCh;
  23. .PUBLIC _SP_GetCh_1;
  24. .PUBLIC F_SP_GetCh;
  25. .PUBLIC R_KeyStrobe;
  26. .public _F_KeyScan;
  27. .define Port_Key P_IOA_Data
  28. .define Port_Key_Dir P_IOA_Dir
  29. .define Port_Key_Attrib P_IOA_Attrib
  30. .define Port_Key_Buffer P_IOA_Buffer
  31. .define M_MASK 0x00ff
  32. .define M_ScanBegin 0x0001
  33. .define M_KeyNumber 0x0008
  34. //////////////////////////////////////////////////////////////////
  35. // RAM Define Area
  36. //////////////////////////////////////////////////////////////////
  37. .RAM
  38. .VAR R_DebounceReg; //for keyboard scan
  39. //.DEFINE C_DebounceCnt 0x0008;
  40. .DEFINE C_DebounceCnt 0x0006;
  41. .VAR R_KeyStrobe; //for keyboard scan
  42. .var R_KeyCounter //key down counter
  43. .var R_Keyflag //save the key flag
  44. .var R_Keyoll //save the oll data of key
  45. .CODE
  46. //////////////////////////////////////////////////////////////////
  47. // Function: Initialization for F_Key_Scan_ServiceLoop
  48. //////////////////////////////////////////////////////////////////    
  49. _F_Key_Scan_Initial: 
  50. F_Key_Scan_Initial:
  51. r1 = 0x0000; //
  52. [R_KeyCounter] = r1; //
  53. [R_Keyflag] = r1;  //
  54. [R_Keyoll] = r1; //
  55. [R_KeyStrobe] = r1;
  56. r1 = [Port_Key_Dir]
  57. r2 = 0xffff
  58. r2^=M_MASK
  59. r1 = r1|r2
  60. [Port_Key_Dir] = r1
  61. r1 = [Port_Key_Attrib]
  62. r1 = r1|r2
  63. [Port_Key_Attrib] = r1
  64. r1 = [Port_Key_Buffer]
  65. r1 = r1|r2
  66. [Port_Key] = r1 
  67. // r1 = C_DebounceCnt; //
  68. // [R_DebounceCnt] = r1; //reset debounce counter
  69. retf;
  70. //////////////////////////////////////////////////////////////////
  71. // Function: Get Key code from key pad(8 x 1 key pad)
  72. // Input: Port IOA b15-b8
  73. // Output: R_KeyStrobe b7-b0
  74. //          |    |     |     | 
  75. // +Vcc --- x --- x ... x --- x ---   
  76. //          |     |     |     |
  77. //          IOA.15            IOA.8
  78. // Note: 1)link F_DebounceCntDown is necessary 
  79. // Destory register: r1, r2                                            
  80. ////////////////////////////////////////////////////////////////// 
  81. _F_Key_Scan_ServiceLoop:
  82. F_Key_Scan_ServiceLoop:
  83. r1 = [P_IOA_Data]; // get key data from IOA 
  84. // r1 ^= 0xff00//M_MASK
  85. r2 = M_MASK
  86. r1 &= R2
  87. jnz H_KeyHight //非零转
  88. r2 = [R_Keyoll]
  89. jnz L_KeyLow //上一次的键值非零,则转
  90. r1 = 0
  91. jmp L_KS_Exit2 //退出
  92. L_KeyLow:
  93. r2 = [R_Keyflag]
  94. test r2,0x0001
  95. jnz L_KeyLow_1 //标志位非零则转
  96. r2 = 0
  97. [R_KeyCounter] = r2
  98. [R_Keyflag] = r2
  99. [R_Keyoll] = r1
  100. r1 = 0
  101. jmp L_KS_Exit2 //退出
  102. L_KeyLow_1:
  103. r2 = 0
  104. [R_KeyCounter] = r2
  105. [R_Keyflag] = r2
  106. r1 = [R_Keyoll] //取上一次的键值
  107. r2 = 0
  108. [R_Keyoll] = r2
  109. jmp L_KeyGet //到判断优先级的程序
  110. H_KeyHight: //当次按键非零处理
  111. r2 = [R_KeyCounter]
  112. cmp r2,C_DebounceCnt  //比较
  113. ja H_KeyHight_1 //大于规定数,转
  114. r2+=1 //Counter++
  115. [R_KeyCounter] = r2
  116. jmp H_KeyHight_2
  117. H_KeyHight_1:
  118. r2 = [R_Keyflag] //flag 置位
  119. r2 |= 0x0001
  120. [R_Keyflag] = r2
  121. H_KeyHight_2:
  122. [R_Keyoll] = r1
  123. r1 = 0
  124. jmp L_KS_Exit2 //退出    
  125. //L_KeyGet:
  126. // r2 = r1 //键盘优先级而做的 begin....
  127. // r3 = 0x0080 //Edit by xinqiang 2004.12.21
  128. //L_KS_Renews2: //xinqiang@sunnorth.com.cn
  129. // r3 = r3 lsl 1 //tel:010-62981668-2916
  130. // test r3,0x2000 //
  131. // jz L_KS_Renews12 //
  132. // r1 = 0 //
  133. // jmp L_KS_Exit2 //
  134. //L_KS_Renews12: //
  135. // r1 = r1&r3 //
  136. // jnz L_KS_Exit2 //
  137. L_KeyGet:
  138. jmp L_KS_Exit2
  139. r1 = r2 //
  140. // jmp L_KS_Renews2 //....end
  141. L_KS_Exit2:
  142. [R_KeyStrobe] = r1; //save stable key code to R_KeyStrobe
  143. retf; //
  144. //****************************************************************
  145. // Function: Get Keycode for I/O Port                                 
  146. // Destory register: r1, r2                          
  147. //****************************************************************
  148. _SP_GetCh:
  149. F_SP_GetCh:
  150. push r2 to [SP];   
  151. r1 = [R_KeyStrobe]; // Get Key code
  152.         r2 = 0x0000; // Clear KeyStrobe for next key
  153.         [R_KeyStrobe] = r2; //
  154.         pop r2 from [SP];
  155.         retf;
  156. //****************************************************************
  157. // Function: Get Keycode for I/O 8 Port  Just for RECORD_KEY                                 
  158. // Destory register: r1                        
  159. //****************************************************************
  160. _SP_GetCh_1:
  161. F_SP_GetCh_1:
  162. r1 = [P_IOA_Data]; // Get Key code
  163.         r1 &= 0x0200
  164.         retf;
  165. //=================================================================//
  166. //name:F_KeyScan
  167. //for user: C function unsigned int F_KeyScan(void)
  168. //output:Key Sand data from Key1~5    Key1>>Key2>>Key3>>Key4>>Key5
  169. //note: noll
  170. //=================================================================//
  171. _F_KeyScan:.proc
  172. F_KeyScan:
  173. push r2,r5 to [sp]
  174. r1 = [Port_Key]
  175. r1 ^= M_MASK
  176. jnz F_KeyScan_Get1
  177. r1 = 0
  178. jmp F_KeyScan_Exit
  179. F_KeyScan_Get1:
  180. call F_Delay //call key Scan delay 10~18ms
  181. r1 = [Port_Key]
  182. r1 ^= M_MASK
  183. jnz F_KeyScan_Get2 //check the key again
  184. r1 = 0
  185. jmp F_KeyScan_Exit
  186. F_KeyScan_Get2:
  187. r2 = r1
  188. r3 = r1
  189. r1 = 0
  190. r4 = M_ScanBegin  //0x0001
  191. F_KeyScan_loop1:
  192. r1+=1
  193. r3 = r3&r4
  194. jnz F_KeyScan_Exit1
  195. cmp r1,M_KeyNumber  //8
  196. je F_KeyScan_Exit1
  197. r4 = r4 lsl 1
  198. r3 = r2
  199. jmp F_KeyScan_loop1
  200. F_KeyScan_Exit1:
  201. // r1 = r3
  202. F_KeyScan_Exit2:
  203. r3 = 0x0001
  204. [P_Watchdog_Clear] = r3
  205. r2 = [Port_Key]
  206. r2 ^= M_MASK
  207. jnz F_KeyScan_Exit2
  208. F_KeyScan_Exit:
  209. pop r2,r5 from [sp]
  210. retf
  211. .endp
  212. F_Delay:
  213. push r3 ,r5 to [sp]
  214. r3=0x6e6d//0xDCDB
  215. Dely_L:
  216. r4 = 0x0001
  217. [P_Watchdog_Clear] = r4
  218. r3-=1
  219. jnz Dely_L
  220. pop r3,r5 from [sp]
  221. retf
  222. //========================================================================================        
  223. // End of key.asm
  224. //========================================================================================