| C:\Users\macks\MPLABXProjects\clock.X\newpic_8b_general.asm |
1 ;******************************************************************************* 2 ; * 3 ; Microchip licenses this software to you solely for use with Microchip * 4 ; products. The software is owned by Microchip and/or its licensors, and is * 5 ; protected under applicable copyright laws. All rights reserved. * 6 ; * 7 ; This software and any accompanying information is for suggestion only. * 8 ; It shall not be deemed to modify Microchip?s standard warranty for its * 9 ; products. It is your responsibility to ensure that this software meets * 10 ; your requirements. * 11 ; * 12 ; SOFTWARE IS PROVIDED "AS IS". MICROCHIP AND ITS LICENSORS EXPRESSLY * 13 ; DISCLAIM ANY WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING * 14 ; BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS * 15 ; FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL * 16 ; MICROCHIP OR ITS LICENSORS BE LIABLE FOR ANY INCIDENTAL, SPECIAL, * 17 ; INDIRECT OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, HARM TO * 18 ; YOUR EQUIPMENT, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR * 19 ; SERVICES, ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY * 20 ; DEFENSE THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER * 21 ; SIMILAR COSTS. * 22 ; * 23 ; To the fullest extend allowed by law, Microchip and its licensors * 24 ; liability shall not exceed the amount of fee, if any, that you have paid * 25 ; directly to Microchip to use this software. * 26 ; * 27 ; MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF * 28 ; THESE TERMS. * 29 ; * 30 ;******************************************************************************* 31 ; * 32 ; Filename: * 33 ; Date: * 34 ; File Version: * 35 ; Author: * 36 ; Company: * 37 ; Description: * 38 ; * 39 ;******************************************************************************* 40 ; * 41 ; Notes: In the MPLAB X Help, refer to the MPASM Assembler documentation * 42 ; for information on assembly instructions. * 43 ; * 44 ;******************************************************************************* 45 ; * 46 ; Known Issues: This template is designed for relocatable code. As such, * 47 ; build errors such as "Directive only allowed when generating an object * 48 ; file" will result when the 'Build in Absolute Mode' checkbox is selected * 49 ; in the project properties. Designing code in absolute mode is * 50 ; antiquated - use relocatable mode. * 51 ; * 52 ;******************************************************************************* 53 ; * 54 ; Revision History: * 55 ; * 56 ;******************************************************************************* 57 58 59 60 ;******************************************************************************* 61 ; Processor Inclusion 62 ; 63 ; TODO Step #1 Open the task list under Window > Tasks. Include your 64 ; device .inc file - e.g. #include <device_name>.inc. Available 65 ; include files are in C:\Program Files\Microchip\MPLABX\mpasmx 66 ; assuming the default installation path for MPLAB X. You may manually find 67 ; the appropriate include file for your device here and include it, or 68 ; simply copy the include generated by the configuration bits 69 ; generator (see Step #2). 70 ; 71 ;******************************************************************************* 72 73 ; TODO INSERT INCLUDE CODE HERE 74 #INCLUDE "P16F84A.INC" 75 76 ;******************************************************************************* 77 ; 78 ; TODO Step #2 - Configuration Word Setup 79 ; 80 ; The 'CONFIG' directive is used to embed the configuration word within the 81 ; .asm file. MPLAB X requires users to embed their configuration words 82 ; into source code. See the device datasheet for additional information 83 ; on configuration word settings. Device configuration bits descriptions 84 ; are in C:\Program Files\Microchip\MPLABX\mpasmx\P<device_name>.inc 85 ; (may change depending on your MPLAB X installation directory). 86 ; 87 ; MPLAB X has a feature which generates configuration bits source code. Go to 88 ; Window > PIC Memory Views > Configuration Bits. Configure each field as 89 ; needed and select 'Generate Source Code to Output'. The resulting code which 90 ; appears in the 'Output Window' > 'Config Bits Source' tab may be copied 91 ; below. 92 ; 93 ;******************************************************************************* 94 95 ; TODO INSERT CONFIG HERE 96 ; Window > PIC Memory Views > Configuration Bits.で生成 97 __CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _CP_OFF 98 ;******************************************************************************* 99 ; 100 ; TODO Step #3 - Variable Definitions 101 ; 102 ; Refer to datasheet for available data memory (RAM) organization assuming 103 ; relocatible code organization (which is an option in project 104 ; properties > mpasm (Global Options)). Absolute mode generally should 105 ; be used sparingly. 106 ; 107 ; Example of using GPR Uninitialized Data 108 ; 109 ; GPR_VAR UDATA 110 ; MYVAR1 RES 1 ; User variable linker places 111 ; MYVAR2 RES 1 ; User variable linker places 112 ; MYVAR3 RES 1 ; User variable linker places 113 ; 114 ; ; Example of using Access Uninitialized Data Section (when available) 115 ; ; The variables for the context saving in the device datasheet may need 116 ; ; memory reserved here. 117 ; INT_VAR UDATA_ACS 118 ; W_TEMP RES 1 ; w register for context saving (ACCESS) 119 ; STATUS_TEMP RES 1 ; status used for context saving 120 ; BSR_TEMP RES 1 ; bank select used for ISR context saving 121 ; 122 ;******************************************************************************* 123 124 ; TODO PLACE VARIABLE DEFINITIONS GO HERE 125 save_st EQU 0x0E 126 save_w EQU 0x0F 127 time_d EQU 0x10 128 time_h EQU 0x11 129 time_m EQU 0x12 130 time_s EQU 0x13 131 s_byte EQU 0x14 132 tmp0 EQU 0x15 133 tmp1 EQU 0x16 134 rslt0 EQU 0x17 135 rslt1 EQU 0x18 136 parm0 EQU 0x19 137 parm1 EQU 0x1A 138 parm2 EQU 0x1B 139 parm3 EQU 0x1C 140 dmode EQU 0x1D 141 evflg EQU 0x1E 142 irsts EQU 0x1F 143 amode EQU 0x20 144 145 ; 9600bpsのタイミング生成用 146 _UWAIT_TIME EQU 0x34 147 148 ;PORTAピン番号 149 P_FPGA EQU 0x01 150 P_ATP EQU 0x00 151 P_IR EQU 0x02 152 153 ;PORTBピン番号 154 P_BTN0 EQU 0x05 155 P_BTN1 EQU 0x06 156 P_BTN2 EQU 0x07 157 158 ;イベントフラグ 159 EV_BTN_DOWN EQU 0x00 160 EV_TMUP_MIN EQU 0x01 161 EV_IR_ON EQU 0x02 162 163 ;IR入力状態フラグ 164 IRSTS_ON EQU 0x00 165 166 ;******************************************************************************* 167 ; Reset Vector 168 ;******************************************************************************* 169 170 RES_VECT CODE 0x0000 ; processor reset vector 171 GOTO START ; go to beginning of program 172 173 ;******************************************************************************* 174 ; TODO Step #4 - Interrupt Service Routines 175 ; 176 ; There are a few different ways to structure interrupt routines in the 8 177 ; bit device families. On PIC18's the high priority and low priority 178 ; interrupts are located at 0x0008 and 0x0018, respectively. On PIC16's and 179 ; lower the interrupt is at 0x0004. Between device families there is subtle 180 ; variation in the both the hardware supporting the ISR (for restoring 181 ; interrupt context) as well as the software used to restore the context 182 ; (without corrupting the STATUS bits). 183 ; 184 ; General formats are shown below in relocatible format. 185 ; 186 ;------------------------------PIC16's and below-------------------------------- 187 ; 188 ; ISR CODE 0x0004 ; interrupt vector location 189 ; 190 ; <Search the device datasheet for 'context' and copy interrupt 191 ; context saving code here. Older devices need context saving code, 192 ; but newer devices like the 16F#### don't need context saving code.> 193 ; 194 ; RETFIE 195 ; 196 ;----------------------------------PIC18's-------------------------------------- 197 ; 198 ; ISRHV CODE 0x0008 199 ; GOTO HIGH_ISR 200 ; ISRLV CODE 0x0018 201 ; GOTO LOW_ISR 202 ; 203 ; ISRH CODE ; let linker place high ISR routine 204 ; HIGH_ISR 205 ; <Insert High Priority ISR Here - no SW context saving> 206 ; RETFIE FAST 207 ; 208 ; ISRL CODE ; let linker place low ISR routine 209 ; LOW_ISR 210 ; <Search the device datasheet for 'context' and copy interrupt 211 ; context saving code here> 212 ; RETFIE 213 ; 214 ;******************************************************************************* 215 216 ; TODO INSERT ISR HERE 217 ISR CODE 0x0004 ; interrupt vector location 218 MOVWF save_w ;Wレジスタの保存 219 SWAPF STATUS,W 220 MOVWF save_st ;ステータスレジスタの保存 221 222 ; 各割り込みの処理の振り分け 223 BTFSS INTCON,T0IF ; TIMER0割り込み判定 224 GOTO ISRRBC 225 ISRTMR0 226 ; 時刻を1秒進める 227 INCF time_s,F 228 MOVLW 0x3C 229 XORWF time_s,W 230 BTFSS STATUS,Z 231 GOTO ISRTMR0_FINISH 232 BSF evflg,EV_TMUP_MIN 233 CLRF time_s 234 INCF time_m,F 235 MOVLW 0x3C 236 XORWF time_m,W 237 BTFSS STATUS,Z 238 GOTO ISRTMR0_FINISH 239 CLRF time_m 240 INCF time_h,F 241 MOVLW 0x18 242 XORWF time_h,W 243 BTFSS STATUS,Z 244 GOTO ISRTMR0_FINISH 245 CLRF time_h 246 INCF time_d,F 247 MOVLW 0x07 248 XORWF time_d,W 249 BTFSS STATUS,Z 250 GOTO ISRTMR0_FINISH 251 CLRF time_d 252 ISRTMR0_FINISH 253 BCF INTCON,T0IF ; 割り込みフラグをクリアする 254 CLRF TMR0 ; カウンタを0に初期化する 255 256 ISRRBC 257 BTFSS INTCON,RBIF ; RBポート変更割り込み判定 258 GOTO ISR_FINISH 259 ; RBポート変更(ボタン押し下げ、上げ) 260 ; どれかひとつが押されたか、全部押されていない状態になったものとして処理する 261 BTFSC PORTB,P_BTN0 262 GOTO ISRRBC_BTN1 263 ; 曜日を進める 264 MOVLW 0x01 265 MOVWF dmode 266 INCF time_d,F 267 MOVFW time_d 268 SUBLW 0x06 269 BTFSS STATUS,C 270 CLRF time_d 271 GOTO ISRRBC_FINISH_WITH_FLAGON 272 ISRRBC_BTN1 273 BTFSC PORTB,P_BTN1 274 GOTO ISRRBC_BTN2 275 ; 時を進める 276 MOVLW 0x00 277 MOVWF dmode 278 INCF time_h,F 279 MOVFW time_h 280 SUBLW 0x017 281 BTFSS STATUS,C 282 CLRF time_h 283 GOTO ISRRBC_FINISH_WITH_FLAGON 284 ISRRBC_BTN2 285 BTFSC PORTB,P_BTN2 286 GOTO ISRRBC_FINISH 287 ; 分を進める 288 MOVLW 0x00 289 MOVWF dmode 290 INCF time_m,F 291 MOVFW time_m 292 SUBLW 0x03B 293 BTFSS STATUS,C 294 CLRF time_m 295 ; 秒もゼロに変更 296 CLRF time_s 297 CLRF TMR0 298 ISRRBC_FINISH_WITH_FLAGON 299 BSF evflg,EV_BTN_DOWN 300 ISRRBC_FINISH 301 BCF INTCON,RBIF ; 割り込みフラグをオフする 302 303 ISR_FINISH 304 ;復帰処理 305 SWAPF save_st,W 306 MOVWF STATUS 307 SWAPF save_w,F 308 SWAPF save_w,W 309 RETFIE ; 割り込み復帰 310 311 ;******************************************************************************* 312 ; MAIN PROGRAM 313 ;******************************************************************************* 314 315 MAIN_PROG CODE ; let linker place main program 316 317 START 318 319 ; TODO Step #5 - Insert Your Program Here 320 ;I/O設定 321 BSF STATUS,RP0 ; バンク1に切り替え 322 ; PORTAはRA4はクロック入力、RA2はフォトトランジスタ入力、それ以外は出力(RA1はFPGA,RA0はATPへのUART出力) 323 MOVLW 0x14 324 MOVWF TRISA 325 ; PORTBは上位3ビット(RB5,6,7)がFPGAからのボタン入力、それ以外は全部出力(未使用) 326 MOVLW 0xE0 327 MOVWF TRISB 328 ; 割り込み設定 329 ; TMR0を外部クロックにする 330 ; RBPU 0 : PORTBのPullUp = あり 331 ; INTEDGE 1 : INT割り込み信号のエッジ=立ち上がり 332 ; T0CS 1 : 入力の選択 = RA4ピン指定 333 ; T0SE 1 : インクリメントするタイミング = RA4の入力がHからL 334 ; PSA 0 : プリスケーラ有無 = 有り 335 ; PS1~3 110 : プリスケーラ値 = 128 336 MOVLW 0x76 337 MOVWF OPTION_REG 338 BCF STATUS,RP0 ; バンク0に切り替え 339 ; グローバル変数のリセット 340 CLRF time_s 341 CLRF time_m 342 CLRF time_h 343 CLRF time_d 344 CLRF dmode 345 CLRF irsts 346 CLRF evflg 347 CLRF amode 348 ; STOPビット 349 BSF PORTA,P_FPGA 350 BSF PORTA,P_ATP 351 ; タイマのカウンタをリセット 352 CLRF TMR0 353 ; TMR0割り込みとRBポート変化割り込みを許可 354 MOVLW 0xA8 355 MOVWF INTCON 356 357 LOOP 358 ; イベントハンドラの呼び出し 359 BTFSC evflg,EV_BTN_DOWN 360 CALL HANDLE_BTN_DOWN 361 BTFSC evflg,EV_TMUP_MIN 362 CALL HANDLE_TMUP_MIN 363 BTFSC evflg,EV_IR_ON 364 CALL HANDLE_IR_ON 365 ; イベント生成 366 CALL GENERATE_EVENT 367 GOTO LOOP ; loop forever 368 369 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; 370 ;; イベント関連 371 372 GENERATE_EVENT 373 ; IR入力ONによるイベントトリガ 374 BTFSS PORTA,P_IR 375 GOTO GE_IR_OFF 376 BTFSC irsts,IRSTS_ON 377 RETURN 378 BSF irsts,IRSTS_ON 379 BSF evflg,EV_IR_ON 380 RETURN 381 GE_IR_OFF 382 BCF irsts,IRSTS_ON 383 RETURN 384 385 HANDLE_IR_ON 386 BCF evflg,EV_IR_ON 387 ; アラームモード中? 388 MOVFW amode 389 XORLW 0x01 390 BTFSC STATUS,Z 391 GOTO HANDLE_IR_ON_ALARM_OFF 392 ; 現在時刻音声発話 393 CALL SEND_VOICE_CURTIME 394 RETURN 395 HANDLE_IR_ON_ALARM_OFF 396 ; アラームモードを解除 397 MOVLW 0x00 398 MOVWF amode 399 ; アラーム解除音声発話 400 CALL SEND_VOICE_ALARM_OFF 401 RETURN 402 403 HANDLE_BTN_DOWN 404 BCF evflg,EV_BTN_DOWN 405 CALL DISP_UPDATE 406 RETURN 407 408 HANDLE_TMUP_MIN 409 BCF evflg,EV_TMUP_MIN 410 ; LED表示更新 411 CALL DISP_UPDATE 412 ; アラーム処理 413 ; アラームモード中? 414 MOVFW amode 415 XORLW 0x01 416 BTFSS STATUS,Z 417 GOTO HANDLE_TMUP_MIN_AMODE_0 418 ; 偶数分? 419 BTFSS time_m,0 420 CALL SEND_VOICE_ALARM 421 RETURN 422 HANDLE_TMUP_MIN_AMODE_0 423 ; 設定時刻になった? 424 ; tmp0:シフト量(0~6) tmp1:曜日ビット 425 MOVFW time_d 426 MOVWF tmp0 427 MOVLW 0x01 428 MOVWF tmp1 429 HANDLE_TMUP_MIN_DBIT_LOOP 430 MOVF tmp0,F 431 BTFSC STATUS,Z 432 GOTO HANDLE_TMUP_MIN_CHK_D 433 BCF STATUS,C 434 RLF tmp1,F 435 DECF tmp0,F 436 GOTO HANDLE_TMUP_MIN_DBIT_LOOP 437 HANDLE_TMUP_MIN_CHK_D 438 MOVLW 0x00 439 CALL READ_EEPROM 440 ANDWF tmp1,W 441 BTFSC STATUS,Z 442 RETURN 443 MOVLW 0x01 444 CALL READ_EEPROM 445 XORWF time_h,W 446 BTFSS STATUS,Z 447 RETURN 448 MOVLW 0x02 449 CALL READ_EEPROM 450 XORWF time_m,W 451 BTFSS STATUS,Z 452 RETURN 453 ; アラームモードに設定 454 MOVLW 0x01 455 MOVWF amode 456 ; アラーム音声発話 457 CALL SEND_VOICE_ALARM 458 RETURN 459 460 DISP_UPDATE 461 ; 表示の更新(設定ツール用) 462 MOVFW dmode 463 XORLW 0x00 464 BTFSS STATUS,Z 465 GOTO CHK_DMODE1 466 ; 現在時刻の表示 467 MOVF time_m,W 468 MOVWF parm0 469 CALL TRANS2BCD 470 MOVF rslt0,W 471 MOVWF parm0 472 CALL UPDATE_LED0 473 MOVF rslt1,W 474 MOVWF parm0 475 CALL UPDATE_LED1 476 MOVF time_h,W 477 MOVWF parm0 478 CALL TRANS2BCD 479 MOVF rslt0,W 480 MOVWF parm0 481 CALL UPDATE_LED2 482 MOVF rslt1,W 483 MOVWF parm0 484 CALL UPDATE_LED3 485 RETURN 486 CHK_DMODE1 487 MOVFW dmode 488 XORLW 0x01 489 BTFSS STATUS,Z 490 RETURN 491 ; 曜日の表示 492 MOVF time_d,W 493 MOVWF parm0 494 CALL TRANS2BCD 495 MOVF rslt0,W 496 MOVWF parm0 497 CALL UPDATE_LED0 498 MOVLW 0x3F 499 MOVWF parm0 500 CALL UPDATE_LED1 501 CALL UPDATE_LED2 502 CALL UPDATE_LED3 503 RETURN 504 505 UPDATE_LED0 506 ; 7segLED0にUARTで表示する数値(6bit長)を送る 507 ; 入力 parm0 508 MOVF parm0,W 509 MOVWF s_byte 510 BCF s_byte, 6 511 BCF s_byte, 7 512 CALL UAPUTB2FPGA 513 RETURN 514 515 UPDATE_LED1 516 ; 7segLED1にUARTで表示する数値(6bit長)を送る 517 ; 入力 parm0 518 MOVF parm0,W 519 MOVWF s_byte 520 BSF s_byte, 6 521 BCF s_byte, 7 522 CALL UAPUTB2FPGA 523 RETURN 524 525 UPDATE_LED2 526 ; 7segLED2にUARTで表示する数値(6bit長)を送る 527 ; 入力 parm0 528 MOVF parm0,W 529 MOVWF s_byte 530 BCF s_byte, 6 531 BSF s_byte, 7 532 CALL UAPUTB2FPGA 533 RETURN 534 535 UPDATE_LED3 536 ; 7segLED3にUARTで表示する数値(6bit長)を送る 537 ; 入力 parm0 538 MOVF parm0,W 539 MOVWF s_byte 540 BSF s_byte, 6 541 BSF s_byte, 7 542 CALL UAPUTB2FPGA 543 RETURN 544 545 TRANS2BCD 546 ; 1バイトの値(0-99)を2バイトのBCDに変換 547 ; 入力 parm0 出力 rslt0, rslt1 548 ; tmp0:入力値のシフト演算バッファ 549 ; tmp1:残りシフト実行回数 550 ; 初期化 551 MOVF parm0,W 552 MOVWF tmp0 553 CLRF rslt0 554 MOVLW 0x08 555 MOVWF tmp1 556 TB_LOOP 557 RLF tmp0, F 558 RLF rslt0, F 559 ; 終了判定 560 ; 全部シフトしたら終了 561 DECFSZ tmp1,F 562 GOTO TB_CONTINUE 563 ; rlt0の上位4bitをrlt1,下位4bitをrlt0に代入 564 MOVF rslt0, W 565 MOVWF rslt1 566 SWAPF rslt1, F 567 MOVLW 0x0F 568 ANDWF rslt0, F 569 ANDWF rslt1, F 570 RETURN 571 TB_CONTINUE 572 ; rslt & 0x0F > 4ならばrslt=rslt+3 573 MOVLW 0x0F 574 ANDWF rslt0, W 575 SUBLW 0x04 576 BTFSC STATUS, C 577 GOTO TB_LOOP 578 INCF rslt0,F 579 INCF rslt0,F 580 INCF rslt0,F 581 GOTO TB_LOOP 582 583 UAPUTB2FPGA 584 ;FPGAに1バイト送信(入力はs_byte) 585 ;STARTビット生成 586 BCF PORTA,P_FPGA 587 CALL UWAIT 588 589 BTFSS s_byte, 0 590 BCF PORTA,P_FPGA 591 BTFSC s_byte, 0 592 BSF PORTA,P_FPGA 593 CALL UWAIT 594 595 BTFSS s_byte, 1 596 BCF PORTA,P_FPGA 597 BTFSC s_byte, 1 598 BSF PORTA,P_FPGA 599 CALL UWAIT 600 601 BTFSS s_byte, 2 602 BCF PORTA,P_FPGA 603 BTFSC s_byte, 2 604 BSF PORTA,P_FPGA 605 CALL UWAIT 606 607 BTFSS s_byte, 3 608 BCF PORTA,P_FPGA 609 BTFSC s_byte, 3 610 BSF PORTA,P_FPGA 611 CALL UWAIT 612 613 BTFSS s_byte, 4 614 BCF PORTA,P_FPGA 615 BTFSC s_byte, 4 616 BSF PORTA,P_FPGA 617 CALL UWAIT 618 619 BTFSS s_byte, 5 620 BCF PORTA,P_FPGA 621 BTFSC s_byte, 5 622 BSF PORTA,P_FPGA 623 CALL UWAIT 624 625 BTFSS s_byte, 6 626 BCF PORTA,P_FPGA 627 BTFSC s_byte, 6 628 BSF PORTA,P_FPGA 629 CALL UWAIT 630 631 BTFSS s_byte, 7 632 BCF PORTA,P_FPGA 633 BTFSC s_byte, 7 634 BSF PORTA,P_FPGA 635 CALL UWAIT 636 637 ;STOPビット生成 638 BSF PORTA,P_FPGA 639 CALL UWAIT 640 641 RETURN 642 643 644 UWAIT 645 ;ビジーウエイト(UARTのタイミング生成用) 646 MOVLW _UWAIT_TIME 647 MOVWF tmp0 648 UWAIT_LOOP 649 ; 4CLK/1命令で、12MHzなので、4命令+GOTO/LOOPで2μsec 650 NOP 651 NOP 652 NOP 653 DECFSZ tmp0, F 654 GOTO UWAIT_LOOP 655 656 RETURN 657 658 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 659 ; 以降は音声発話関連 660 SEND_VOICE_CURTIME 661 ; 現在の時刻を発話する 662 CALL SEND_VOICE_DAY 663 CALL SEND_VOICE_PAUSE 664 CALL SEND_VOICE_HOUR 665 CALL SEND_VOICE_KUGIRI 666 CALL SEND_VOICE_MIN 667 CALL SEND_VOICE_BUNEND 668 CALL SEND_VOICE_FINISH 669 RETURN 670 671 SEND_VOICE_ALARM 672 ; おはよう 673 MOVLW 'o' 674 CALL UAPUTB2ATP 675 MOVLW 'h' 676 CALL UAPUTB2ATP 677 MOVLW 'a' 678 CALL UAPUTB2ATP 679 MOVLW 'y' 680 CALL UAPUTB2ATP 681 MOVLW 'o' 682 CALL UAPUTB2ATP 683 MOVLW '-' 684 CALL UAPUTB2ATP 685 CALL SEND_VOICE_BUNEND 686 ; 現在の時刻を発話する 687 CALL SEND_VOICE_DAY 688 CALL SEND_VOICE_PAUSE 689 CALL SEND_VOICE_HOUR 690 CALL SEND_VOICE_KUGIRI 691 CALL SEND_VOICE_MIN 692 MOVLW 'd' 693 CALL UAPUTB2ATP 694 MOVLW 'e' 695 CALL UAPUTB2ATP 696 MOVLW '_' 697 CALL UAPUTB2ATP 698 MOVLW 's' 699 CALL UAPUTB2ATP 700 MOVLW 'u' 701 CALL UAPUTB2ATP 702 CALL SEND_VOICE_BUNEND 703 ; 起きてください 704 MOVLW 'o' 705 CALL UAPUTB2ATP 706 MOVLW '\'' 707 CALL UAPUTB2ATP 708 MOVLW 'k' 709 CALL UAPUTB2ATP 710 MOVLW 'i' 711 CALL UAPUTB2ATP 712 MOVLW 't' 713 CALL UAPUTB2ATP 714 MOVLW 'e' 715 CALL UAPUTB2ATP 716 MOVLW 'n' 717 CALL UAPUTB2ATP 718 MOVLW 'e' 719 CALL UAPUTB2ATP 720 CALL SEND_VOICE_BUNEND 721 CALL SEND_VOICE_FINISH 722 RETURN 723 724 SEND_VOICE_ALARM_OFF 725 ; ka'ijo+shima'_shita. 726 MOVLW 'k' 727 CALL UAPUTB2ATP 728 MOVLW 'a' 729 CALL UAPUTB2ATP 730 MOVLW '\'' 731 CALL UAPUTB2ATP 732 MOVLW 'i' 733 CALL UAPUTB2ATP 734 MOVLW 'j' 735 CALL UAPUTB2ATP 736 MOVLW 'o' 737 CALL UAPUTB2ATP 738 MOVLW '+' 739 CALL UAPUTB2ATP 740 MOVLW 's' 741 CALL UAPUTB2ATP 742 MOVLW 'h' 743 CALL UAPUTB2ATP 744 MOVLW 'i' 745 CALL UAPUTB2ATP 746 MOVLW 'm' 747 CALL UAPUTB2ATP 748 MOVLW 'a' 749 CALL UAPUTB2ATP 750 MOVLW '\'' 751 CALL UAPUTB2ATP 752 MOVLW '_' 753 CALL UAPUTB2ATP 754 MOVLW 's' 755 CALL UAPUTB2ATP 756 MOVLW 'h' 757 CALL UAPUTB2ATP 758 MOVLW 'i' 759 CALL UAPUTB2ATP 760 MOVLW 't' 761 CALL UAPUTB2ATP 762 MOVLW 'a' 763 CALL UAPUTB2ATP 764 CALL SEND_VOICE_BUNEND 765 CALL SEND_VOICE_FINISH 766 RETURN 767 768 SEND_VOICE_FINISH 769 ; 発話終了 770 MOVLW 0x0D 771 CALL UAPUTB2ATP 772 RETURN 773 774 SEND_VOICE_BUNEND 775 ; 文の終わり 776 MOVLW '.' 777 CALL UAPUTB2ATP 778 RETURN 779 780 SEND_VOICE_KUGIRI 781 ; アクセント区の区切り(ポーズなし) 782 MOVLW '/' 783 CALL UAPUTB2ATP 784 RETURN 785 786 SEND_VOICE_PAUSE 787 ; ポーズ 788 MOVLW ' ' 789 CALL UAPUTB2ATP 790 RETURN 791 792 SEND_VOICE_DAY 793 MOVLW 0x00 794 XORWF time_d,W 795 BTFSS STATUS,Z 796 GOTO SEND_VOICE_DAY_CHECK_1 797 ; 日 798 MOVLW 'n' 799 CALL UAPUTB2ATP 800 MOVLW 'i' 801 CALL UAPUTB2ATP 802 MOVLW 'c' 803 CALL UAPUTB2ATP 804 MOVLW 'h' 805 CALL UAPUTB2ATP 806 MOVLW 'i' 807 CALL UAPUTB2ATP 808 GOTO SEND_VOICE_DAY_YOUBI 809 SEND_VOICE_DAY_CHECK_1 810 MOVLW 0x01 811 XORWF time_d,W 812 BTFSS STATUS,Z 813 GOTO SEND_VOICE_DAY_CHECK_2 814 ; 月 815 MOVLW 'g' 816 CALL UAPUTB2ATP 817 MOVLW 'e' 818 CALL UAPUTB2ATP 819 MOVLW 't' 820 CALL UAPUTB2ATP 821 MOVLW 's' 822 CALL UAPUTB2ATP 823 MOVLW 'u' 824 CALL UAPUTB2ATP 825 GOTO SEND_VOICE_DAY_YOUBI 826 SEND_VOICE_DAY_CHECK_2 827 MOVLW 0x02 828 XORWF time_d,W 829 BTFSS STATUS,Z 830 GOTO SEND_VOICE_DAY_CHECK_3 831 ; 火 832 MOVLW 'k' 833 CALL UAPUTB2ATP 834 MOVLW 'a' 835 CALL UAPUTB2ATP 836 GOTO SEND_VOICE_DAY_YOUBI 837 SEND_VOICE_DAY_CHECK_3 838 MOVLW 0x03 839 XORWF time_d,W 840 BTFSS STATUS,Z 841 GOTO SEND_VOICE_DAY_CHECK_4 842 ; 水 843 MOVLW 's' 844 CALL UAPUTB2ATP 845 MOVLW 'u' 846 CALL UAPUTB2ATP 847 MOVLW 'i' 848 CALL UAPUTB2ATP 849 GOTO SEND_VOICE_DAY_YOUBI 850 SEND_VOICE_DAY_CHECK_4 851 MOVLW 0x04 852 XORWF time_d,W 853 BTFSS STATUS,Z 854 GOTO SEND_VOICE_DAY_CHECK_5 855 ; 木 856 MOVLW 'm' 857 CALL UAPUTB2ATP 858 MOVLW 'o' 859 CALL UAPUTB2ATP 860 MOVLW 'k' 861 CALL UAPUTB2ATP 862 MOVLW 'u' 863 CALL UAPUTB2ATP 864 GOTO SEND_VOICE_DAY_YOUBI 865 SEND_VOICE_DAY_CHECK_5 866 MOVLW 0x05 867 XORWF time_d,W 868 BTFSS STATUS,Z 869 GOTO SEND_VOICE_DAY_CHECK_6 870 ; 金 871 MOVLW 'k' 872 CALL UAPUTB2ATP 873 MOVLW 'i' 874 CALL UAPUTB2ATP 875 MOVLW 'n' 876 CALL UAPUTB2ATP 877 MOVLW 'n' 878 CALL UAPUTB2ATP 879 GOTO SEND_VOICE_DAY_YOUBI 880 SEND_VOICE_DAY_CHECK_6 881 MOVLW 0x06 882 XORWF time_d,W 883 BTFSS STATUS,Z 884 RETURN 885 ; 土 886 MOVLW 'd' 887 CALL UAPUTB2ATP 888 MOVLW 'o' 889 CALL UAPUTB2ATP 890 SEND_VOICE_DAY_YOUBI 891 ; 曜日 892 MOVLW 'y' 893 CALL UAPUTB2ATP 894 MOVLW 'o' 895 CALL UAPUTB2ATP 896 MOVLW '\'' 897 CALL UAPUTB2ATP 898 MOVLW '-' 899 CALL UAPUTB2ATP 900 MOVLW 'b' 901 CALL UAPUTB2ATP 902 MOVLW 'i' 903 CALL UAPUTB2ATP 904 RETURN 905 906 907 SEND_VOICE_HOUR 908 ; 桁読みタグを送る 909 ; <NUMK VAL=23 COUNTER=ji> 910 CALL SEND_VOICE_NUMK_0 911 ; 数字文字列を作る 912 MOVF time_h,W 913 MOVWF parm0 914 CALL TRANS2BCD 915 CLRW 916 XORWF rslt1,W 917 BTFSC STATUS,Z 918 GOTO SEND_VOICE_HOUR_1 919 MOVF rslt1,W 920 ADDLW '0' 921 CALL UAPUTB2ATP 922 SEND_VOICE_HOUR_1 923 MOVF rslt0,W 924 ADDLW '0' 925 CALL UAPUTB2ATP 926 CALL SEND_VOICE_NUMK_1 927 ; 単位文字列を送る 928 MOVLW 'j' 929 CALL UAPUTB2ATP 930 MOVLW 'i' 931 CALL UAPUTB2ATP 932 CALL SEND_VOICE_NUMK_2 933 RETURN 934 935 SEND_VOICE_MIN 936 ; 桁読みタグを送る 937 ; <NUMK VAL=23 COUNTER=funn> 938 CALL SEND_VOICE_NUMK_0 939 ; 数字文字列を作る 940 MOVF time_m,W 941 MOVWF parm0 942 CALL TRANS2BCD 943 CLRW 944 XORWF rslt1,W 945 BTFSC STATUS,Z 946 GOTO SEND_VOICE_MIN_1 947 MOVF rslt1,W 948 ADDLW '0' 949 CALL UAPUTB2ATP 950 SEND_VOICE_MIN_1 951 MOVF rslt0,W 952 ADDLW '0' 953 CALL UAPUTB2ATP 954 CALL SEND_VOICE_NUMK_1 955 ; 単位文字列を送る 956 MOVLW 'f' 957 CALL UAPUTB2ATP 958 MOVLW 'u' 959 CALL UAPUTB2ATP 960 MOVLW 'n' 961 CALL UAPUTB2ATP 962 MOVLW 'n' 963 CALL UAPUTB2ATP 964 CALL SEND_VOICE_NUMK_2 965 RETURN 966 967 SEND_VOICE_NUMK_0 968 MOVLW '<' 969 CALL UAPUTB2ATP 970 MOVLW 'N' 971 CALL UAPUTB2ATP 972 MOVLW 'U' 973 CALL UAPUTB2ATP 974 MOVLW 'M' 975 CALL UAPUTB2ATP 976 MOVLW 'K' 977 CALL UAPUTB2ATP 978 MOVLW ' ' 979 CALL UAPUTB2ATP 980 MOVLW 'V' 981 CALL UAPUTB2ATP 982 MOVLW 'A' 983 CALL UAPUTB2ATP 984 MOVLW 'L' 985 CALL UAPUTB2ATP 986 MOVLW '=' 987 CALL UAPUTB2ATP 988 RETURN 989 990 SEND_VOICE_NUMK_1 991 MOVLW ' ' 992 CALL UAPUTB2ATP 993 MOVLW 'C' 994 CALL UAPUTB2ATP 995 MOVLW 'O' 996 CALL UAPUTB2ATP 997 MOVLW 'U' 998 CALL UAPUTB2ATP 999 MOVLW 'N' 1000 CALL UAPUTB2ATP 1001 MOVLW 'T' 1002 CALL UAPUTB2ATP 1003 MOVLW 'E' 1004 CALL UAPUTB2ATP 1005 MOVLW 'R' 1006 CALL UAPUTB2ATP 1007 MOVLW '=' 1008 CALL UAPUTB2ATP 1009 RETURN 1010 1011 SEND_VOICE_NUMK_2 1012 MOVLW '>' 1013 CALL UAPUTB2ATP 1014 RETURN 1015 1016 1017 UAPUTB2ATP 1018 ;ATPに1バイト送信(入力はWreg) 1019 MOVWF s_byte 1020 ;STARTビット生成 1021 BCF PORTA,P_ATP 1022 CALL UWAIT 1023 1024 BTFSS s_byte, 0 1025 BCF PORTA,P_ATP 1026 BTFSC s_byte, 0 1027 BSF PORTA,P_ATP 1028 CALL UWAIT 1029 1030 BTFSS s_byte, 1 1031 BCF PORTA,P_ATP 1032 BTFSC s_byte, 1 1033 BSF PORTA,P_ATP 1034 CALL UWAIT 1035 1036 BTFSS s_byte, 2 1037 BCF PORTA,P_ATP 1038 BTFSC s_byte, 2 1039 BSF PORTA,P_ATP 1040 CALL UWAIT 1041 1042 BTFSS s_byte, 3 1043 BCF PORTA,P_ATP 1044 BTFSC s_byte, 3 1045 BSF PORTA,P_ATP 1046 CALL UWAIT 1047 1048 BTFSS s_byte, 4 1049 BCF PORTA,P_ATP 1050 BTFSC s_byte, 4 1051 BSF PORTA,P_ATP 1052 CALL UWAIT 1053 1054 BTFSS s_byte, 5 1055 BCF PORTA,P_ATP 1056 BTFSC s_byte, 5 1057 BSF PORTA,P_ATP 1058 CALL UWAIT 1059 1060 BTFSS s_byte, 6 1061 BCF PORTA,P_ATP 1062 BTFSC s_byte, 6 1063 BSF PORTA,P_ATP 1064 CALL UWAIT 1065 1066 BTFSS s_byte, 7 1067 BCF PORTA,P_ATP 1068 BTFSC s_byte, 7 1069 BSF PORTA,P_ATP 1070 CALL UWAIT 1071 1072 ;STOPビット生成 1073 BSF PORTA,P_ATP 1074 CALL UWAIT 1075 1076 RETURN 1077 1078 READ_EEPROM 1079 ; 指定アドレスから1バイト取得する 1080 ; 入力 Wreg:アドレス 出力 Wreg:1バイトの読みだしたデータ 1081 MOVWF EEADR 1082 BSF STATUS,RP0 1083 BSF EECON1, RD 1084 BCF STATUS,RP0 1085 MOVF EEDATA,W 1086 RETURN 1087 1088 1089 END