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