📄 clock.rmh
字号:
// #729: ;// #730: ; normal_mode: INPUT s0, switch_port ;Read switches and buttons and directly drive LEDs// #731: ; OUTPUT s0, LED_port// #732: ; RETURN// #733: ;// #734: ;// #735: ;// #736: ;This procedure will poll the status of the rotary encoder.// #737: ;If rotation occurs, then the LED pattern will adjust appropriately.// #738: ;// #739: ; rotate_mode: FETCH sA, LED_pattern ;last known position// #740: ; FETCH s0, rotary_status ;check status of rotation// #741: ; TEST s0, 80 ;test flag// #742: ; JUMP Z, update_pattern// #743: ; AND s0, 7F ;clear flag// #744: ; STORE s0, rotary_status// #745: ; TEST s0, rotary_left ;event occurred so update pattern// #746: ; JUMP Z, move_right// #747: ; RL sA// #748: ; JUMP update_pattern// #749: ; move_right: RR sA// #750: ; update_pattern: STORE sA, LED_pattern// #751: ; OUTPUT sA, LED_port ;drive LEDs with current pattern// #752: ; RETURN// #753: ; ;// #754: ;// #755: ;// #756: ;// #757: ;**************************************************************************************// #758: ;LCD text messages// #759: ;**************************************************************************************// #760: ;// #761: ;// #762: ;Display 'SPARTAN-3E STARTER KIT' on LCD at current cursor position// #763: ;// #764: ;// @1d9 #765: [disp_msg1]302a0 // @1d9 #766: CALL(disp_space)00541 // @1da #767: LOAD(s5,character_A)302d4 // @1db #768: CALL(LCD_write_data)302a0 // @1dc #769: CALL(disp_space)00543 // @1dd #770: LOAD(s5,character_C)302d4 // @1de #771: CALL(LCD_write_data)0056c // @1df #772: LOAD(s5,character_l)302d4 // @1e0 #773: CALL(LCD_write_data)0056f // @1e1 #774: LOAD(s5,character_o)302d4 // @1e2 #775: CALL(LCD_write_data)00563 // @1e3 #776: LOAD(s5,character_c)302d4 // @1e4 #777: CALL(LCD_write_data)0056b // @1e5 #778: LOAD(s5,character_k)302d4 // @1e6 #779: CALL(LCD_write_data)302a0 // @1e7 #780: CALL(disp_space)00542 // @1e8 #781: LOAD(s5,character_B)302d4 // @1e9 #782: CALL(LCD_write_data)00561 // @1ea #783: LOAD(s5,character_a)302d4 // @1eb #784: CALL(LCD_write_data)00573 // @1ec #785: LOAD(s5,character_s)302d4 // @1ed #786: CALL(LCD_write_data)00565 // @1ee #787: LOAD(s5,character_e)302d4 // @1ef #788: CALL(LCD_write_data)00564 // @1f0 #789: LOAD(s5,character_d)302d4 // @1f1 #790: CALL(LCD_write_data)302a0 // @1f2 #791: CALL(disp_space)2a000 // @1f3 #792: RETURN// #793: ;// #794: ;// #795: ;// @1f4 #796: [disp_msg2]00553 // @1f4 #796: LOAD(s5,character_S)302d4 // @1f5 #797: CALL(LCD_write_data)00533 // @1f6 #798: LOAD(s5,character_3)302d4 // @1f7 #799: CALL(LCD_write_data)00545 // @1f8 #800: LOAD(s5,character_E)302d4 // @1f9 #801: CALL(LCD_write_data)302a0 // @1fa #802: CALL(disp_space)00553 // @1fb #803: LOAD(s5,character_S)302d4 // @1fc #804: CALL(LCD_write_data)00574 // @1fd #805: LOAD(s5,character_t)302d4 // @1fe #806: CALL(LCD_write_data)00561 // @1ff #807: LOAD(s5,character_a)302d4 // @200 #808: CALL(LCD_write_data)00572 // @201 #809: LOAD(s5,character_r)302d4 // @202 #810: CALL(LCD_write_data)00574 // @203 #811: LOAD(s5,character_t)302d4 // @204 #812: CALL(LCD_write_data)00565 // @205 #813: LOAD(s5,character_e)302d4 // @206 #814: CALL(LCD_write_data)00572 // @207 #815: LOAD(s5,character_r)302d4 // @208 #816: CALL(LCD_write_data)302a0 // @209 #817: CALL(disp_space)0054b // @20a #818: LOAD(s5,character_K)302d4 // @20b #819: CALL(LCD_write_data)00569 // @20c #820: LOAD(s5,character_i)302d4 // @20d #821: CALL(LCD_write_data)00574 // @20e #822: LOAD(s5,character_t)302d4 // @20f #823: CALL(LCD_write_data)00533 // @210 #824: LOAD(s5,character_3)302d4 // @211 #825: CALL(LCD_write_data)2a000 // @212 #826: RETURN// @213 #827: [disp_msg3]302a0 // @213 #827: CALL(disp_space)302a0 // @214 #828: CALL(disp_space)302a0 // @215 #829: CALL(disp_space)302a0 // @216 #830: CALL(disp_space)302a0 // @217 #831: CALL(disp_space)00558 // @218 #832: LOAD(s5,character_X)302d4 // @219 #833: CALL(LCD_write_data)00569 // @21a #834: LOAD(s5,character_i)302d4 // @21b #835: CALL(LCD_write_data)0056c // @21c #836: LOAD(s5,character_l)302d4 // @21d #837: CALL(LCD_write_data)00569 // @21e #838: LOAD(s5,character_i)302d4 // @21f #839: CALL(LCD_write_data)0056e // @220 #840: LOAD(s5,character_n)302d4 // @221 #841: CALL(LCD_write_data)00578 // @222 #842: LOAD(s5,character_x)302d4 // @223 #843: CALL(LCD_write_data)302a0 // @224 #844: CALL(disp_space)302a0 // @225 #845: CALL(disp_space)302a0 // @226 #846: CALL(disp_space)302a0 // @227 #847: CALL(disp_space)302a0 // @228 #848: CALL(disp_space)2a000 // @229 #849: RETURN// @22a #850: [disp_msg4]00550 // @22a #850: LOAD(s5,character_P)302d4 // @22b #851: CALL(LCD_write_data)00569 // @22c #852: LOAD(s5,character_i)302d4 // @22d #853: CALL(LCD_write_data)00563 // @22e #854: LOAD(s5,character_c)302d4 // @22f #855: CALL(LCD_write_data)0056f // @230 #856: LOAD(s5,character_o)302d4 // @231 #857: CALL(LCD_write_data)00542 // @232 #858: LOAD(s5,character_B)302d4 // @233 #859: CALL(LCD_write_data)0056c // @234 #860: LOAD(s5,character_l)302d4 // @235 #861: CALL(LCD_write_data)00561 // @236 #862: LOAD(s5,character_a)302d4 // @237 #863: CALL(LCD_write_data)0057a // @238 #864: LOAD(s5,character_z)302d4 // @239 #865: CALL(LCD_write_data)00565 // @23a #866: LOAD(s5,character_e)302d4 // @23b #867: CALL(LCD_write_data)302a0 // @23c #868: CALL(disp_space)00554 // @23d #869: LOAD(s5,character_T)302d4 // @23e #870: CALL(LCD_write_data)00565 // @23f #871: LOAD(s5,character_e)302d4 // @240 #872: CALL(LCD_write_data)00573 // @241 #873: LOAD(s5,character_s)302d4 // @242 #874: CALL(LCD_write_data)00574 // @243 #875: LOAD(s5,character_t)302d4 // @244 #876: CALL(LCD_write_data)302a0 // @245 #877: CALL(disp_space)2a000 // @246 #878: RETURN// @247 #879: [disp_msg5]00550 // @247 #879: LOAD(s5,character_P)302d4 // @248 #880: CALL(LCD_write_data)00572 // @249 #881: LOAD(s5,character_r)302d4 // @24a #882: CALL(LCD_write_data)00565 // @24b #883: LOAD(s5,character_e)302d4 // @24c #884: CALL(LCD_write_data)00573 // @24d #885: LOAD(s5,character_s)302d4 // @24e #886: CALL(LCD_write_data)00573 // @24f #887: LOAD(s5,character_s)302d4 // @250 #888: CALL(LCD_write_data)302a0 // @251 #889: CALL(disp_space)00526 // @252 #890: LOAD(s5,38)302d4 // @253 #891: CALL(LCD_write_data)302a0 // @254 #892: CALL(disp_space)00554 // @255 #893: LOAD(s5,character_T)302d4 // @256 #894: CALL(LCD_write_data)00575 // @257 #895: LOAD(s5,character_u)302d4 // @258 #896: CALL(LCD_write_data)00572 // @259 #897: LOAD(s5,character_r)302d4 // @25a #898: CALL(LCD_write_data)0056e // @25b #899: LOAD(s5,character_n)302d4 // @25c #900: CALL(LCD_write_data)302a0 // @25d #901: CALL(disp_space)00574 // @25e #902: LOAD(s5,character_t)302d4 // @25f #903: CALL(LCD_write_data)00568 // @260 #904: LOAD(s5,character_h)302d4 // @261 #905: CALL(LCD_write_data)00565 // @262 #906: LOAD(s5,character_e)302d4 // @263 #907: CALL(LCD_write_data)2a000 // @264 #908: RETURN// @265 #909: [disp_msg6]302a0 // @265 #909: CALL(disp_space)00545 // @266 #910: LOAD(s5,character_E)302d4 // @267 #911: CALL(LCD_write_data)0056e // @268 #912: LOAD(s5,character_n)302d4 // @269 #913: CALL(LCD_write_data)00563 // @26a #914: LOAD(s5,character_c)302d4 // @26b #915: CALL(LCD_write_data)0056f // @26c #916: LOAD(s5,character_o)302d4 // @26d #917: CALL(LCD_write_data)00564 // @26e #918: LOAD(s5,character_d)302d4 // @26f #919: CALL(LCD_write_data)00565 // @270 #920: LOAD(s5,character_e)302d4 // @271 #921: CALL(LCD_write_data)00572 // @272 #922: LOAD(s5,character_r)302d4 // @273 #923: CALL(LCD_write_data)302a0 // @274 #924: CALL(disp_space)00574 // @275 #925: LOAD(s5,character_t)302d4 // @276 #926: CALL(LCD_write_data)0056f // @277 #927: LOAD(s5,character_o)302d4 // @278 #928: CALL(LCD_write_data)302a0 // @279 #929: CALL(disp_space)00553 // @27a #930: LOAD(s5,character_S)302d4 // @27b #931: CALL(LCD_write_data)00565 // @27c #932: LOAD(s5,character_e)302d4 // @27d #933: CALL(LCD_write_data)00574 // @27e #934: LOAD(s5,character_t)302d4 // @27f #935: CALL(LCD_write_data)302a0 // @280 #936: CALL(disp_space)2a000 // @281 #937: RETURN// @282 #938: [disp_msg7]00548 // @282 #938: LOAD(s5,character_H)302d4 // @283 #939: CALL(LCD_write_data)00561 // @284 #940: LOAD(s5,character_a)302d4 // @285 #941: CALL(LCD_write_data)00570 // @286 #942: LOAD(s5,character_p)302d4 // @287 #943: CALL(LCD_write_data)00570 // @288 #944: LOAD(s5,character_p)302d4 // @289 #945: CALL(LCD_write_data)00579 // @28a #946: LOAD(s5,character_y)302d4 // @28b #947: CALL(LCD_write_data)302a0 // @28c #948: CALL(disp_space)00542 // @28d #949: LOAD(s5,character_B)302d4 // @28e #950: CALL(LCD_write_data)00569 // @28f #951: LOAD(s5,character_i)302d4 // @290 #952: CALL(LCD_write_data)00572 // @291 #953: LOAD(s5,character_r)302d4 // @292 #954: CALL(LCD_write_data)00574 // @293 #955: LOAD(s5,character_t)302d4 // @294 #956: CALL(LCD_write_data)00568 // @295 #957: LOAD(s5,character_h)302d4 // @296 #958: CALL(LCD_write_data)00564 // @297 #959: LOAD(s5,character_d)302d4 // @298 #960: CALL(LCD_write_data)00561 // @299 #961: LOAD(s5,character_a)302d4 // @29a #962: CALL(LCD_write_data)00579 // @29b #963: LOAD(s5,character_y)302d4 // @29c #964: CALL(LCD_write_data)00521 // @29d #965: LOAD(s5,33)302d4 // @29e #966: CALL(LCD_write_data)2a000 // @29f #967: RETURN// #968: ;// #969: ;Display a space on LCD at current cursor position// #970: ;// #971: ;// @2a0 #972: [disp_space]00520 // @2a0 #972: LOAD(s5,character_space)302d4 // @2a1 #973: CALL(LCD_write_data)2a000 // @2a2 #974: RETURN// #975: ;// #976: ;// #977: ;// #978: ;// #979: ;**************************************************************************************// #980: ;Software delay routines// #981: ;**************************************************************************************// #982: ;// #983: ;// #984: ;// #985: ;Delay of 1us.// #986: ;// #987: ;Constant value defines reflects the clock applied to KCPSM3. Every instruction// #988: ;executes in 2 clock cycles making the calculation highly predictable. The '6' in// #989: ;the following equation even allows for 'CALL delay_1us' instruction in the initiating code.// #990: ;// #991: ; delay_1us_constant = (clock_rate - 6)/4 Where 'clock_rate' is in MHz// #992: ;// #993: ;Registers used s0// #994: ;// @2a3 #995: [delay_1us]0000b // @2a3 #995: LOAD(s0,delay_1us_constant)// @2a4 #996: [wait_1us]1c001 // @2a4 #996: SUB(s0,1)356a4 // @2a5 #997: JUMP(NZ,wait_1us)2a000 // @2a6 #998: RETURN// #999: ;// #1000: ;Delay of 40us.// #1001: ;// #1002: ;Registers used s0, s1// #1003: ;// @2a7 #1004: [delay_40us]00128 // @2a7 #1004: LOAD(s1,40) ;40 x 1us = 40us// @2a8 #1005: [wait_40us]302a3 // @2a8 #1005: CALL(delay_1us)1c101 // @2a9 #1006: SUB(s1,1)356a8 // @2aa #1007: JUMP(NZ,wait_40us)2a000 // @2ab #1008: RETURN// #1009: ;// #1010: ;// #1011: ;Delay of 1ms.// #1012: ;// #1013: ;Registers used s0, s1, s2// #1014: ;// @2ac #1015: [delay_1ms]00219 // @2ac #1015: LOAD(s2,25) ;25 x 40us = 1ms// @2ad #1016: [wait_1ms]302a7 // @2ad #1016: CALL(delay_40us)1c201 // @2ae #1017: SUB(s2,1)356ad // @2af #1018: JUMP(NZ,wait_1ms)2a000 // @2b0 #1019: RETURN// #1020: ;// #1021: ;Delay of 20ms.// #1022: ;// #1023: ;Delay of 20ms used during initialisation.// #1024: ;// #1025: ;Registers used s0, s1, s2, s3// #1026: ;// @2b1 #1027: [delay_20ms]00314 // @2b1 #1027: LOAD(s3,20) ;20 x 1ms = 20ms// @2b2 #1028: [wait_20ms]302ac // @2b2 #1028: CALL(delay_1ms)1c301 // @2b3 #1029: SUB(s3,1)356b2 // @2b4 #1030: JUMP(NZ,wait_20ms)2a000 // @2b5 #1031: RETURN// #1032: ;// #1033: ;Delay of approximately 1 second.// #1034: ;// #1035: ;Registers used s0, s1, s2, s3, s4// #1036: ;// @2b6 #1037: [delay_1s]00432 // @2b6 #1037: LOAD(s4,50) ;50 x 20ms = 1000ms// @2b7 #1038: [wait_1s]302b1 // @2b7 #1038: CALL(delay_20ms)1c401 // @2b8 #1039: SUB(s4,1)356b7 // @2b9 #1040: JUMP(NZ,wait_1s)2a000 // @2ba #1041: RETURN// #1042: ;// #1043: ;// #1044: ;// #1045: ;**************************************************************************************// #1046: ;LCD Character Module Routines// #1047: ;**************************************************************************************// #1048: ;// #1049: ;LCD module is a 16 character by 2 line display but all displays are very similar// #1050: ;The 4-wire data interface will be used (DB4 to DB7).// #1051: ;// #1052: ;The LCD modules are relatively slow and software delay loops are used to slow down// #1053: ;KCPSM3 adequately for the LCD to communicate. The delay routines are provided in// #1054: ;a different section (see above in this case).// #1055: ;// #1056: ;// #1057: ;Pulse LCD enable signal 'E' high for greater than 230ns (1us is used).// #1058: ;// #1059: ;Register s4 should define the current state of the LCD output port.// #1060: ;// #1061: ;Registers used s0, s4// #1062: ;// @2bb #1063: [LCD_pulse_E]0e401 // @2bb #1063: XOR(s4,LCD_E) ;E=12c440 // @2bc #1064: OUTPUT(s4,LCD_output_port)302a3 // @2bd #1065: CALL(delay_1us)0e401 // @2be #1066: XOR(s4,LCD_E) ;E=02c440 // @2bf #1067: OUTPUT(s4,LCD_output_port)2a000 // @2c0 #1068: RETURN// #1069: ;// #1070: ;Write 4-bit instruction to LCD display.// #1071: ;// #1072: ;The 4-bit instruction should be provided in the upper 4-bits of register s4.// #1073: ;Note that this routine does not release the master enable but as it is only// #1074: ;used during initialisation and as part of the 8-bit instruction write it// #1075: ;should be acceptable.// #1076: ;// #1077: ;Registers used s4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -