;--------------------------------------------------------------------- ; オイラーの等式(数式用掲示板) ; e^iπ + 1 =0 の表示と、ランダムな数式表示をSWを押すたびに切り替え ; ; 2008.08.09 T.Nakamura ; ; (1). RC0〜7 [out] : 行(データポート) LEDアノード側 ; (2). RA0〜3,RB4〜7 [out] : 列(スキャンポート) LEDカソード側 ; (3). RA3 [in] : タクトスイッチ ; (4). RA5 [out] : 圧電ブザー ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- ; デバイス定義 ;--------------------------------------------------------------------- LIST P=PIC16F689 INCLUDE "P16F689.INC" __CONFIG _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 変数レジスタの定義(BANK0) ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ; 変数レジスタの定義(マトリックスLEDプラットフォーム) ;--------------------------------------------------------------------- DSPBUF EQU 020H ; 表示バッファ 8バイト(20H〜27H, 28H) ; ; 28HはLEDなし(スクロール時の次の列データ) ROWCNT EQU 029H ; マトリックスLEDのROWカウンタ FLAG EQU 02AH ; 各種フラグ 0ビット:LED点灯:1,消灯:0 ; 1ビット:SW-変化:1,変化なし:0 ; 2ビット:SW-ON:1,OFF:0 BKUPW EQU 02BH ; Wレジ待避用 BKUPS EQU 02CH ; STATUSレジ待避用 BKUPFR EQU 02DH ; FSRレジ待避用 BKUPPCL EQU 02EH ; PCLHレジ待避用 BKPORTA EQU 02FH ; PORTA状態(ビープ音用) ; POSX EQU 030H ; LED座標X POSY EQU 031H ; LED座標Y BUFCNT1 EQU 032H ; 表示バッファ作業用 BUFCNT2 EQU 033H ; 表示バッファ作業用 CNT EQU 034H ; カウンタ WCNT1 EQU 035H ; ウェイトカウンタ WCNT2 EQU 036H ; ウェイトカウンタ WCNT3 EQU 037H ; ウェイトカウンタ BCNT1 EQU 038H ; ビープ用 BWCNT1 EQU 039H ; ビープ用 BWCNT2 EQU 03AH ; ビープ用 BWCNT3 EQU 03BH ; ビープ用 CHATCNT EQU 03CH ; チャタリング除去用カウンタ ; MSGCNT EQU 03DH ; メッセージカウンタ MSGPTR EQU 03EH ; メッセージポインタ CHRCNT EQU 03FH ; メッセージカウンタ CHRPTR EQU 040H ; メッセージポインタ ;--------------------------------------------------------------------- ; 変数レジスタの定義(アプリ用) ;--------------------------------------------------------------------- FORMNO EQU 041H ; 数式番号 DSPFLAG EQU 042H ; 表示用フラグ 0ビット √フラグ(1:表示) LOOPCNT EQU 043H ; ; WK1 EQU 044H WK2 EQU 045H WK3 EQU 046H CNT1 EQU 047H CNT2 EQU 048H ; RNDVAL EQU 049H ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える BCF STATUS,RP1 ; ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える BCF STATUS,RP1 ; ENDM BANK2 MACRO BCF STATUS,RP0 ;BANK2に切り替える BSF STATUS,RP1 ; ENDM ;--------------------------------------------------------------------- ; リセットベクタ ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO MAIN ; メイン処理へ ; ORG 04H ; 割り込み時の飛び込み先 GOTO INTRUPT ;--------------------------------------------------------------------- ; メイン処理 ;--------------------------------------------------------------------- MAIN CALL INIT ; EULER MOVLW D'4' MOVWF LOOPCNT CLRF FORMNO EULERLP INCF FORMNO,F CALL DSPFORM BTFSS FLAG,2 ; SWが押されたか確認 GOTO ELUERLP2 BTFSC FLAG,2 ; SWが離されたか確認 GOTO $-1 BCF DSPFLAG,0 ; √フラグクリア CALL CLRDPBUF ; 表示バッファクリア GOTO RNDLOOP ELUERLP2 DECFSZ LOOPCNT,F GOTO EULERLP GOTO EULER ; RNDLOOP CALL RANDOM ANDLW H'0F' ; 1〜15にする BTFSC STATUS,Z ; 0なら再度取り出す GOTO RNDLOOP ; MOVWF FORMNO CALL DSPFORM BTFSS FLAG,2 ; SWが押されたか確認 GOTO RNDLOOP BTFSC FLAG,2 ; SWが離されたか確認 GOTO $-1 BCF DSPFLAG,0 ; √フラグクリア CALL CLRDPBUF ; 表示バッファクリア GOTO EULER ; ;--------------------------------------------------------------------- ; 初期化 ;--------------------------------------------------------------------- INIT BCF INTCON,GIE ;全割込み禁止 BANK2 CLRF ANSEL CLRF ANSELH BANK1 MOVLW B'11001000' MOVWF TRISA ; ポートAはBIT0,1,2,4,5を出力、3を入力端子 CLRF TRISB ; ポートBは全て出力端子 CLRF TRISC ; ポートCは全て出力端子 ;割り込みタイマーセット MOVLW H'82' ;プリスケーラを1:8にする MOVWF OPTION_REG ;約488ヘルツで割り込みが入るはず BANK0 ;clock4MHz -> 1Mcycle ;1Mcycle/256/8 = 488Hz ; CLRF PORTA ; PORTクリア CLRF PORTB ; CLRF ROWCNT ; LED ROWカウンタクリア CALL CLRDPBUF ; LEDバッファクリア CALL RANDINT ; 乱数初期化 CLRF FLAG CLRF DSPFLAG ; BSF INTCON,T0IE ; タイマ0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 ; RETURN ;--------------------------------------------------------------------- ; 割り込み処理でダイナミック表示を行う。 ;--------------------------------------------------------------------- INTRUPT ;レジスタ待避 MOVWF BKUPW ;バックアップ(Wレジ) SWAPF STATUS,W ;バックアップ(STATUSレジ) MOVWF BKUPS MOVF FSR,W ;バックアップ(FSRレジ) MOVWF BKUPFR MOVF PCLATH,W ;バックアップ(PCLATHレジ) MOVWF BKUPPCL ; BCF INTCON,T0IF ;割り込みフラグリセット ; ; タクトスイッチの状態確認 ; BTFSS FLAG,1 ; FLAG:1がONならSWが変化 GOTO CHKSW ; SWの状態確認へ DECFSZ CHATCNT,F ; チャタリングカウンタをデクリメント GOTO DSPLED ; まだ判断には早い ; SW状態確認 BCF FLAG,1 ; 変化フラグクリア BCF FLAG,2 ; FLAGクリア BTFSS PORTA,3 ; Highなら押されていないので次スキップ BSF FLAG,2 ; SWは押された GOTO DSPLED CHKSW BTFSS PORTA,3 GOTO CHKLOW ; Low:押されている ; High 押されていない BTFSS FLAG,2 ; 変化を確認 GOTO DSPLED ; 変化していない GOTO TOGGLE ; 変化した CHKLOW BTFSC FLAG,2 ; 変化を確認 GOTO DSPLED ; 変化していない TOGGLE BSF FLAG,1 ; 変化フラグをON MOVLW D'10' MOVWF CHATCNT ; チャタリング回避カウンタセット DSPLED ; ; 表示バッファの内容を1行分(1行)出力 ; ; 次の行データを出力する前に受け側portをHIGH(消灯になる) MOVLW B'11111111' ; MOVWF PORTB ; PORTB出力 BTFSS PORTA,5 ; PORTA(5) 確認 MOVLW B'11011111' ; PORTA(5) LOW MOVWF PORTA ; PORTA出力 ; MOVF ROWCNT,W ADDLW DSPBUF ; DSPバッファアドレス加算 MOVWF FSR MOVF INDF,W MOVWF PORTC ; PORTCに1行分のデータ出力 ; BTFSC ROWCNT,2 ; 4以上ならPORTBを設定 GOTO SETPRTB ; MOVF ROWCNT,W CALL DECPORTA BTFSS PORTA,5 ; PORTA(5) 確認 ANDLW B'11011111' ; PORTA(5) LOW MOVWF PORTA ; PORTA出力 MOVLW B'11111111' MOVWF PORTB ; PORTB出力 GOTO NXTROW ; 次の行にROWCNT設定 SETPRTB MOVLW D'4' SUBWF ROWCNT,W CALL DECPORTB MOVWF PORTB ; PORTB出力 MOVLW B'11111111' BTFSS PORTA,5 ; PORTA(5) 確認 ANDLW B'11011111' ; PORTA(5) LOW MOVWF PORTA ; PORTA出力 ; NXTROW INCF ROWCNT,W ANDLW H'07' ; ROWCNTは0〜7 MOVWF ROWCNT ; RSTREG ;レジスタ復元 MOVF BKUPPCL,W ;復元(PCLATHレジ) MOVWF PCLATH MOVF BKUPFR,W ;復元(FSRレジ) MOVWF FSR SWAPF BKUPS,W ;復元(STATUSレジ) MOVWF STATUS SWAPF BKUPW,F ;復元(Wレジ) SWAPF BKUPW,W ; RETFIE ;割り込みから復帰 ; DECPORTA CLRF PCLATH ; ADDWF PCL,F RETLW B'11111110' ; 0 RETLW B'11111101' ; 1 RETLW B'11111011' ; 2 RETLW B'11101111' ; 3 ; DECPORTB CLRF PCLATH ; ADDWF PCL,F RETLW B'11101111' ; 4 RETLW B'11011111' ; 5 RETLW B'10111111' ; 6 RETLW B'01111111' ; 7 ; ;--------------------------------------------------------------------- ; 数式を表示する(表示する数式番号はFORMNOに格納(1〜n) ;--------------------------------------------------------------------- DSPFORM CLRF MSGPTR ; 文字カウンタクリア CALL FORMDAT ; 文字数取り出し INCF MSGPTR,F MOVWF MSGCNT ; 文字数 DSPFORMD BTFSC FLAG,2 ; SWが押されたか確認 RETURN CALL FORMDAT ; データ取り出し INCF MSGPTR,F MOVWF WK1 ANDLW H'C0' BTFSC STATUS,Z ; 00〜2F GOTO CDSPCHR ; 3ドット文字 BTFSC WK1,6 ; 40〜4F GOTO CDSPCHRL ; 6ドット文字 BTFSC WK1,7 ; 80〜8F GOTO CDSPCHRS ; 特種文字 ; 特殊文字 ; GOTO NXTCHR CDSPCHR ; 通常文字 MOVF WK1,W ANDLW H'3F' CALL DSPCHR GOTO NXTCHR CDSPCHRL ; 6ドット文字 MOVF WK1,W ANDLW H'0F' CALL DSPCHRL GOTO NXTCHR CDSPCHRS ; 特種文字 MOVF WK1,W ANDLW H'0F' CALL DSPCHRS ; NXTCHR DECFSZ MSGCNT,F GOTO DSPFORMD ; MOVLW D'8' ; 最後に1画面分シフトしてクリア MOVWF WK1 DSPFORMC CALL DSPBUFST ; 表示バッファを1行分シフト CALL WAIT DECFSZ WK1,F GOTO DSPFORMC RETURN ; FORMDAT ; 数式 MOVF FORMNO,W MOVWF WK3 DECF WK3,F BTFSC STATUS,Z CALL EULDAT ; FOMRNO=1 オイラー DECF WK3,F BTFSC STATUS,Z CALL E_DAT ; FOMRNO=2 e DECF WK3,F BTFSC STATUS,Z CALL I_DAT ; FOMRNO=3 i DECF WK3,F BTFSC STATUS,Z CALL PAIDAT ; FOMRNO=4 π DECF WK3,F BTFSC STATUS,Z CALL ROOT2 ; FOMRNO=5 √2 DECF WK3,F BTFSC STATUS,Z CALL ROOT3 ; FOMRNO=6 √3 DECF WK3,F BTFSC STATUS,Z CALL ROOT5 ; FOMRNO=7 √5 DECF WK3,F BTFSC STATUS,Z CALL P2_8 ; FOMRNO=8 2^8 DECF WK3,F BTFSC STATUS,Z CALL P2_16 ; FOMRNO=9 2^16 DECF WK3,F BTFSC STATUS,Z CALL P2_32 ; FOMRNO=10 2^32 DECF WK3,F BTFSC STATUS,Z CALL C2_A2_B2 ; FOMRNO=11 C^2=a^2+b^2 DECF WK3,F BTFSC STATUS,Z CALL FERMAT ; FOMRNO=12 フェルマーの最終定理 DECF WK3,F BTFSC STATUS,Z CALL GOLDRATIO ; FOMRNO=13 黄金比 DECF WK3,F BTFSC STATUS,Z CALL GOLDRAT2 ; FOMRNO=14 黄金比2 DECF WK3,F BTFSC STATUS,Z CALL GAUSS ; FORMNO=15 ガウス RETURN ;--------------------------------------------------------------------- ; 文字コード ; [通常 4ドット幅] ; 0: 0000 0000 : 00 ; 1: 0000 0001 : 01 ; 2: 0000 0010 : 02 ; 〜 ; 9: 0000 1001 : 09 ; .: 0000 1010 : 0a ; +: 0000 1011 : 0b ; -: 0000 1100 : 0c ; =: 0000 1101 : 0d ; *: 0000 1110 : 0e ; /: 0000 1111 : 0f ; :: 0001 0000 : 10 ; a: 0001 0001 : 11 ; b: 0001 0010 : 12 ; c: 0001 0011 : 13 ; i: 0001 0100 : 14 ; n: 0001 0101 : 15 ; x: 0001 0110 : 16 ; y: 0001 0111 : 17 ; z: 0001 1000 : 18 ; (: 0001 1001 : 19 ; ): 0001 1010 : 1a ; <: 0001 1011 : 1b ; >: 0001 1100 : 1c ; !: 0001 1101 : 1d ; ?: 0001 1110 : 1e ; : 0001 1111 : 1f ; ; [冪 4ドット幅] ; 0: 0010 0000 : 20 ; 1: 0010 0001 : 21 ; 2: 0010 0010 : 22 ; 〜 ; 9: 0010 1001 : 29 ; .: 0010 1010 : 2a ; +: 0010 1011 : 2b ; -: 0010 1100 : 2c ; i: 0010 1101 : 2d ; n: 0010 1110 : 2e ; x: 0010 1110 : 2f ; ; [大 6ドット幅] ; π: 0100 0000 : 40 ; π(冪): 0100 0001 : 41 ; e: 0100 0010 : 42 ; √: 0100 0011 : 43 ; . : 0100 0100 : 44 ; + : 0100 0101 : 45 ; , : 0100 0110 : 46 ; φ: 0100 0111 : 47 ; Σ: 0100 1000 : 48 ; ; [特殊] ; √: 1000 0000 : 80 ;√の終わり ; ;--------------------------------------------------------------------- ; Wの値(00〜1F:32種)の数字・文字(3ドット幅)を表示する ;--------------------------------------------------------------------- DSPCHR MOVWF WK2 ; 待避 CLRF CHRPTR ; 列カウンタクリア MOVLW D'3' MOVWF CHRCNT DSPCHR1 BTFSC FLAG,2 ; SWが押されたか確認 RETURN CALL CHRTXT ; 数値の先頭1列分を取り出す MOVWF DSPBUF+8 ; 表示バッファに書き出す BTFSC DSPFLAG,0 BSF DSPBUF+8,0 ; √表示 CALL DSPBUFST ; 表示バッファを1列分シフト CALL WAIT DECFSZ CHRCNT,F GOTO DSPCHR1 CLRF DSPBUF+8 ; 間隙分をクリア BTFSC DSPFLAG,0 BSF DSPBUF+8,0 ; √表示 CALL DSPBUFST ; 次の文字との間隙用に1列分シフト CALL WAIT RETURN ; CHRTXT ;数字の1列分のデータを取り出し MOVF CHRPTR,F ; MSGPTRが0か判断 BTFSS STATUS,Z ; 数字の最初の列のときにPTRを計算(3倍) GOTO CHRTXTD BCF STATUS,C ;キャリークリア RLF WK2,W ; 2倍 ADDWF WK2,W ; +元の数値で3倍 MOVWF CHRPTR ; ORG H'0100' CHRTXTD MOVLW H'01' MOVWF PCLATH MOVF CHRPTR,W INCF CHRPTR,F ; 1列進める ADDWF PCL,F ; digit 0 RETLW B'11111100' RETLW B'10000100' RETLW B'11111100' ; digit 1 RETLW B'10001000' RETLW B'11111100' RETLW B'10000000' ; digit 2 RETLW B'11001100' RETLW B'10100100' RETLW B'10011100' ; digit 3 RETLW B'10010100' RETLW B'10010100' RETLW B'01111000' ; digit 4 RETLW B'00011100' RETLW B'00010000' RETLW B'11111100' ; digit 5 RETLW B'10011100' RETLW B'10010100' RETLW B'01100100' ; digit 6 RETLW B'11111100' RETLW B'10010100' RETLW B'11110100' ; digit 7 RETLW B'00000100' RETLW B'11100100' RETLW B'00011100' ; digit 8 RETLW B'11111100' RETLW B'10010100' RETLW B'11111100' ; digit 9 RETLW B'10011100' RETLW B'10010100' RETLW B'01111100' ; char . RETLW B'00000000' RETLW B'10000000' RETLW B'00000000' ; char + RETLW B'00010000' RETLW B'00111000' RETLW B'00010000' ; char - RETLW B'00010000' RETLW B'00010000' RETLW B'00010000' ; char = RETLW B'00101000' RETLW B'00101000' RETLW B'00101000' ; char * RETLW B'00101000' RETLW B'01111100' RETLW B'00101000' ; char / RETLW B'01100000' RETLW B'00010000' RETLW B'00001100' ; char : RETLW B'00000000' RETLW B'01001000' RETLW B'00000000' ; char a RETLW B'11101000' RETLW B'10101000' RETLW B'11111000' ; char b RETLW B'11111110' RETLW B'10001000' RETLW B'01110000' ; char c RETLW B'01110000' RETLW B'10001000' RETLW B'10001000' ; char i RETLW B'00001000' RETLW B'11111010' RETLW B'10000000' ; char n RETLW B'11111000' RETLW B'00001000' RETLW B'11110000' ; char x RETLW B'11011000' RETLW B'00100000' RETLW B'11011000' ; char y RETLW B'10011000' RETLW B'10100000' RETLW B'01111000' ; char z RETLW B'11001000' RETLW B'10101000' RETLW B'10011000' ; char ( RETLW B'00111000' RETLW B'01000100' RETLW B'10000010' ; char ) RETLW B'10000010' RETLW B'01000100' RETLW B'00111000' ; char < RETLW B'00010000' RETLW B'00101000' RETLW B'01000100' ; char > RETLW B'01000100' RETLW B'00101000' RETLW B'00010000' ; char ! RETLW B'00000000' RETLW B'10111100' RETLW B'00000000' ; char ? RETLW B'00000100' RETLW B'10110010' RETLW B'00001100' ; char 空白 RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; ここから冪 ; digit 0 RETLW B'00011111' RETLW B'00010001' RETLW B'00011111' ; ; digit 1 RETLW B'00010010' RETLW B'00011111' RETLW B'00010000' ; ; digit 2 RETLW B'00011101' RETLW B'00010101' RETLW B'00010111' ; ; digit 3 RETLW B'00010101' RETLW B'00010101' RETLW B'00011111' ; ; digit 4 RETLW B'00000111' RETLW B'00000100' RETLW B'00011111' ; ; digit 5 RETLW B'00010111' RETLW B'00010101' RETLW B'00011101' ; ; digit 6 RETLW B'00011111' RETLW B'00010101' RETLW B'00011101' ; ; digit 7 RETLW B'00000001' RETLW B'00011001' RETLW B'00000111' ; ; digit 8 RETLW B'00011111' RETLW B'00010101' RETLW B'00011111' ; ; digit 9 RETLW B'00010111' RETLW B'00010101' RETLW B'00011111' ; ; digit . RETLW B'00000000' RETLW B'00010000' RETLW B'00000000' ; ; digit + RETLW B'00000100' RETLW B'00001110' RETLW B'00000100' ; ; digit - RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' ; ; digit i RETLW B'00000100' RETLW B'00111101' RETLW B'00100000' ; ; digit n RETLW B'00001111' RETLW B'00000001' RETLW B'00001110' ; ; digit x RETLW B'00010001' RETLW B'00001110' RETLW B'00010001' ; ;--------------------------------------------------------------------- ; Wの値(40〜47:8種)の数字・文字(プロポーショナル)を表示する ;--------------------------------------------------------------------- DSPCHRL MOVWF WK3 ; 待避 MOVWF WK2 ; 待避 CLRF CHRPTR ; 列カウンタクリア CALL CHRLTXT ; 文字のデータ数を取り出す MOVWF CHRCNT DSPCHRLL BTFSC FLAG,2 ; SWが押されたか確認 RETURN CALL CHRLTXT ; 数値の先頭1列分を取り出す MOVWF DSPBUF+8 ; 表示バッファに書き出す BTFSC DSPFLAG,0 BSF DSPBUF+8,0 ; √表示 CALL DSPBUFST ; 表示バッファを1列分シフト CALL WAIT DECFSZ CHRCNT,F GOTO DSPCHRLL ; CALL CHKROOT CLRF DSPBUF+8 ; 間隙分をクリア BTFSC DSPFLAG,0 BSF DSPBUF+8,0 ; √表示 CALL DSPBUFST ; 次の文字との間隙用に1列分シフト CALL WAIT RETURN ; CHRLTXT ;文字の1列分のデータを取り出し MOVF CHRPTR,F ; MSGPTRが0か判断 BTFSS STATUS,Z ; 数字の最初の列のときにPTRを計算(6倍) GOTO CHRLTXTD BCF STATUS,C ;キャリークリア RLF WK2,W ; 2倍 MOVWF WK2 RLF WK2,F ; 4倍 ADDWF WK2,W ; 6倍=2倍+4倍 MOVWF CHRPTR CHRLTXTD MOVLW H'01' MOVWF PCLATH MOVF CHRPTR,W INCF CHRPTR,F ; 1列進める ADDWF PCL,F ; 0 char "π" RETLW D'5' RETLW B'01000100' RETLW B'00111100' RETLW B'00000100' RETLW B'01111100' RETLW B'01000100' ; ; 1 char "π(冪)" RETLW D'5' RETLW B'00010001' RETLW B'00001111' RETLW B'00000001' RETLW B'00011111' RETLW B'00010001' ; ; 2 char "e" RETLW D'5' RETLW B'01111000' RETLW B'10010100' RETLW B'10010100' RETLW B'10010100' RETLW B'10011000' ; ; 3 char "√" RETLW D'4' RETLW B'01000000' RETLW B'10000000' RETLW B'01110000' RETLW B'00001111' RETLW B'00000000' ; ; 4 char "." RETLW D'1' RETLW B'10000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; ; 5 char "+" RETLW D'5' RETLW B'00010000' RETLW B'00010000' RETLW B'01111100' RETLW B'00010000' RETLW B'00010000' ; ; 6 char "," RETLW D'2' RETLW B'10000000' RETLW B'01000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; ; 7 char "φ" RETLW D'5' RETLW B'00111000' RETLW B'01000100' RETLW B'11111110' RETLW B'01000100' RETLW B'00111000' ; ; 8 char "Σ" RETLW D'5' RETLW B'11000110' RETLW B'10101010' RETLW B'10010010' RETLW B'10000010' RETLW B'10000010' ; ;--------------------------------------------------------------------- ; √文字ならフラグセット ;--------------------------------------------------------------------- CHKROOT MOVF WK3,W SUBLW D'3' BTFSC STATUS,Z BSF DSPFLAG,0 ; √フラグON RETURN ; ;--------------------------------------------------------------------- ; Wの値(80〜8F)の特種文字処理 ;--------------------------------------------------------------------- DSPCHRS MOVWF WK2 ; 待避 BTFSC STATUS,Z ; '00'? BCF DSPFLAG,0 ; √表示フラグオフ RETURN ; ;--------------------------------------------------------------------- ; Euler's formula ;--------------------------------------------------------------------- ORG H'0200' EULDAT MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'7' ; 文字数 RETLW H'42' ; e RETLW H'2D' ; i RETLW H'41' ; π RETLW H'45' ; + RETLW H'01' ; 1 RETLW H'0D' ; = RETLW H'00' ; 0 ; ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- PAIDAT MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'11' ; 文字数 RETLW H'40' ; π RETLW H'0D' ; = RETLW H'03' ; 3 RETLW H'44' ; . RETLW H'01' ; 1 RETLW H'04' ; 4 RETLW H'01' ; 1 RETLW H'05' ; 5 RETLW H'09' ; 9 RETLW H'02' ; 2 RETLW H'06' ; 6 ; ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- E_DAT MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'11' ; 文字数 RETLW H'42' ; e RETLW H'0D' ; = RETLW H'02' ; 2 RETLW H'44' ; . RETLW H'07' ; 7 RETLW H'01' ; 1 RETLW H'08' ; 8 RETLW H'02' ; 2 RETLW H'08' ; 8 RETLW H'01' ; 1 RETLW H'08' ; 8 ; ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- I_DAT MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'6' ; 文字数 RETLW H'14' ; i RETLW H'0D' ; = RETLW H'43' ; √ RETLW H'0C' ; - RETLW H'01' ; 1 RETLW H'80' ; √終わり ; ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- ROOT2 MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'14' ; 文字数 RETLW H'43' ; √ RETLW H'02' ; 2 RETLW H'80' ; √終わり RETLW H'0D' ; = RETLW H'01' ; 1 RETLW H'44' ; . RETLW H'04' ; 4 RETLW H'01' ; 1 RETLW H'04' ; 4 RETLW H'02' ; 2 RETLW H'01' ; 1 RETLW H'03' ; 3 RETLW H'05' ; 5 RETLW H'06' ; 6 ; ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- ROOT3 MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'14' ; 文字数 RETLW H'43' ; √ RETLW H'03' ; 3 RETLW H'80' ; √終わり RETLW H'0D' ; = RETLW H'01' ; 1 RETLW H'44' ; . RETLW H'07' ; 7 RETLW H'03' ; 3 RETLW H'02' ; 2 RETLW H'00' ; 0 RETLW H'05' ; 5 RETLW H'00' ; 0 RETLW H'08' ; 8 RETLW H'00' ; 0 ; ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- ROOT5 MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'14' ; 文字数 RETLW H'43' ; √ RETLW H'05' ; 5 RETLW H'80' ; √終わり RETLW H'0D' ; = RETLW H'02' ; 2 RETLW H'44' ; . RETLW H'02' ; 2 RETLW H'03' ; 3 RETLW H'06' ; 6 RETLW H'00' ; 0 RETLW H'06' ; 6 RETLW H'07' ; 7 RETLW H'09' ; 9 RETLW H'07' ; 7 ; ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- P2_8 MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'6' ; 文字数 RETLW H'02' ; 2 RETLW H'28' ; 8 RETLW H'0D' ; = RETLW H'02' ; 2 RETLW H'05' ; 5 RETLW H'06' ; 6 ; ;--------------------------------------------------------------------- ; 2^16 ;--------------------------------------------------------------------- P2_16 MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'9' ; 文字数 RETLW H'02' ; 2 RETLW H'21' ; 1 RETLW H'26' ; 6 RETLW H'0D' ; = RETLW H'06' ; 6 RETLW H'05' ; 5 RETLW H'05' ; 5 RETLW H'03' ; 3 RETLW H'06' ; 6 ; ;--------------------------------------------------------------------- ; 2^32 ;--------------------------------------------------------------------- P2_32 MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'14' ; 文字数 RETLW H'02' ; 2 RETLW H'23' ; 3 RETLW H'22' ; 2 RETLW H'0D' ; = RETLW H'04' ; 4 RETLW H'02' ; 2 RETLW H'09' ; 9 RETLW H'04' ; 4 RETLW H'09' ; 9 RETLW H'06' ; 6 RETLW H'07' ; 7 RETLW H'02' ; 2 RETLW H'09' ; 9 RETLW H'06' ; 6 ; ;--------------------------------------------------------------------- ; c^2 = a^2 + b^2 ;--------------------------------------------------------------------- C2_A2_B2 MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'8' ; 文字数 RETLW H'11' ; a RETLW H'22' ; 2 RETLW H'0B' ; + RETLW H'12' ; b RETLW H'22' ; 2 RETLW H'0D' ; = RETLW H'13' ; c RETLW H'22' ; 2 ; ;--------------------------------------------------------------------- ; フェルマーの最終定理 ;--------------------------------------------------------------------- FERMAT MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'12' ; 文字数 RETLW H'16' ; x RETLW H'2E' ; n RETLW H'45' ; + RETLW H'17' ; y RETLW H'2E' ; n RETLW H'0D' ; = RETLW H'18' ; z RETLW H'2E' ; n RETLW H'46' ; , RETLW H'15' ; n RETLW H'1B' ; < RETLW H'03' ; 3 ; ;--------------------------------------------------------------------- ; 黄金比 ;--------------------------------------------------------------------- GOLDRATIO MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'20' ; 文字数 RETLW H'47' ; φ RETLW H'22' ; 2 RETLW H'0D' ; = RETLW H'47' ; φ RETLW H'45' ; + RETLW H'01' ; 1 RETLW H'1F' ; 空白 RETLW H'46' ; , RETLW H'1F' ; 空白 RETLW H'01' ; 1 RETLW H'10' ; : RETLW H'19' ; ( RETLW H'01' ; 1 RETLW H'45' ; + RETLW H'43' ; √ RETLW H'05' ; 5 RETLW H'80' ; √終わり RETLW H'1A' ; ) RETLW H'0F' ; / RETLW H'02' ; 2 ; GOLDRAT2 MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'11' ; 文字数 RETLW H'47' ; φ RETLW H'0D' ; = RETLW H'01' ; 1 RETLW H'44' ; . RETLW H'06' ; 6 RETLW H'01' ; 1 RETLW H'08' ; 8 RETLW H'00' ; 0 RETLW H'03' ; 3 RETLW H'03' ; 3 RETLW H'09' ; 9 ; ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- GAUSS MOVLW H'02' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'12' ; 文字数 RETLW H'48' ; Σ RETLW H'14' ; i RETLW H'0D' ; = RETLW H'19' ; ( RETLW H'15' ; n RETLW H'0B' ; + RETLW H'01' ; 1 RETLW H'1A' ; ) RETLW H'0E' ; * RETLW H'15' ; n RETLW H'0F' ; / RETLW H'02' ; 2 ; ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- ORG H'0300' ALL_DAT MOVLW H'03' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'32' ; 文字数 RETLW H'00' ; RETLW H'01' ; RETLW H'02' ; RETLW H'03' ; RETLW H'04' ; RETLW H'05' ; RETLW H'06' ; RETLW H'07' ; RETLW H'08' ; RETLW H'09' ; RETLW H'0A' ; RETLW H'0B' ; RETLW H'0C' ; RETLW H'0D' ; RETLW H'0E' ; RETLW H'0F' ; RETLW H'10' ; RETLW H'11' ; RETLW H'12' ; RETLW H'13' ; RETLW H'14' ; RETLW H'15' ; RETLW H'16' ; RETLW H'17' ; RETLW H'18' ; RETLW H'19' ; RETLW H'1A' ; RETLW H'1B' ; RETLW H'1C' ; RETLW H'1D' ; RETLW H'1E' ; RETLW H'1F' ; ; ALL_DATP MOVLW H'03' MOVWF PCLATH MOVF MSGPTR,W ADDWF PCL,F ; DATA RETLW D'20' ; 文字数 RETLW H'20' ; RETLW H'21' ; RETLW H'22' ; RETLW H'23' ; RETLW H'24' ; RETLW H'25' ; RETLW H'26' ; RETLW H'27' ; RETLW H'28' ; RETLW H'29' ; RETLW H'2A' ; RETLW H'2B' ; RETLW H'2C' ; RETLW H'2D' ; RETLW H'2E' ; RETLW H'2F' ; RETLW H'40' ; RETLW H'41' ; RETLW H'42' ; RETLW H'43' ; ; ;--------------------------------------------------------------------- ; M系列乱数(1〜255) ;--------------------------------------------------------------------- RANDINT MOVLW B'00101010' MOVWF RNDVAL RETURN RANDOM MOVF RNDVAL,W MOVWF WK1 RRF WK1,F RRF WK1,F XORWF WK1,W RRF WK1,F RRF WK1,F XORWF WK1,W RRF WK1,F RRF WK1,F RRF WK1,F XORWF WK1,F BCF STATUS,C BTFSC WK1,0 BSF STATUS,C RLF RNDVAL,F MOVF RNDVAL,W XORWF TMR0,W RETURN ; ;--------------------------------------------------------------------- ; 表示バッファシフト ;--------------------------------------------------------------------- DSPBUFST MOVLW DSPBUF MOVWF FSR ; FSRに表示バッファの先頭アドレスセット MOVLW D'8' MOVWF BUFCNT1 DSPBUFS1 INCF FSR,F MOVF INDF,W ; Wレジに読み込み DECF FSR,F ; FSRをデクリメント MOVWF INDF ; 一行シフトして上書き INCF FSR,F DECFSZ BUFCNT1,F GOTO DSPBUFS1 CLRF INDF ; 最後の行をクリアして戻る RETURN ; ;--------------------------------------------------------------------- ; 表示バッファシフトクリア ;--------------------------------------------------------------------- DSFTCLR MOVLW D'8' MOVWF BUFCNT2 DSFTCLR1 CALL DSPBUFST ; 表示バッファを1行分シフト CALL WAIT01S DECFSZ BUFCNT2,F GOTO DSFTCLR1 RETURN ; ;--------------------------------------------------------------------- ; 表示用バッファクリア ;--------------------------------------------------------------------- CLRDPBUF MOVLW D'8' MOVWF CNT ; 8バイト分のクリア MOVLW DSPBUF ; W ← DSPBUFの先頭アドレス MOVWF FSR ; FSR にアドレスをセット CLRDPBUF2 CLRF INDF ;(FSR)クリア INCF FSR,F ; DECFSZ CNT,F ; GOTO CLRDPBUF2 RETURN ; ;--------------------------------------------------------------------- ; BEEP音 ピッ(38KHzの音を0.1秒) ;--------------------------------------------------------------------- BEEP MOVLW H'80' MOVWF BCNT1 BEEP1 MOVF PORTA,W ;現状のポート状態取り込み ANDLW B'11011111' MOVWF PORTA CALL BWAIT MOVF PORTA,W IORLW B'00100000' MOVWF PORTA CALL BWAIT ; DECFSZ BCNT1,F GOTO BEEP1 RETURN ; BWAIT MOVLW D'38' MOVWF BWCNT1 BWAIT1 DECFSZ BWCNT1,F GOTO BWAIT1 RETURN ; B2WAIT MOVLW H'80' MOVWF BWCNT2 B2WAIT0 MOVLW H'FF' MOVWF BWCNT3 B2WAIT1 DECFSZ BWCNT3,F GOTO B2WAIT1 DECFSZ BWCNT2,F GOTO B2WAIT0 RETURN ; CLICK MOVF PORTA,W ANDLW B'11011111' MOVWF PORTA CALL BWAIT MOVF PORTA,W IORLW B'00100000' MOVWF PORTA RETURN ;--------------------------------------------------------------------- ; Waitルーチン(注)割り込みがあるので時間通りにならない ;--------------------------------------------------------------------- WAIT1MS ;約1msec MOVLW D'250' MOVWF WCNT1 W1MSLP NOP DECFSZ WCNT1,F GOTO W1MSLP RETURN ; WAIT01S ;0.1秒 MOVLW D'97' MOVWF WCNT2 W01SLP CALL WAIT1MS DECFSZ WCNT2,F GOTO W01SLP RETURN ; WAIT05S ;0.5秒 MOVLW D'5' MOVWF WCNT3 W05SLP CALL WAIT01S DECFSZ WCNT3,F GOTO W05SLP RETURN ; WAIT1S ;1秒 MOVLW D'10' MOVWF WCNT3 W1SLP CALL WAIT01S DECFSZ WCNT3,F GOTO W1SLP RETURN ; WAIT CALL WAIT01S RETURN ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------