ワンチップマイコン PIC16F1705 に 8ビット D/A コンバータが内蔵されていると知り、ファンクションゼネレータを作りました。出力波形は正弦波、矩形波および三角波が選択できます、周波数は10Hz、20Hz、50Hz、100Hz、200Hz、500Hz、1KHz、2KHz、5KHz、10KHzおよび20KHz です周波数精度はクロックに内蔵オシレータを使用して居る為高精度と言う分けではありませんが工場で 1% 以内の誤差に校正されているそうですから実用上は十分だと思います。

外観

基板の下半分が空いていますがここには電池を置く予定でいます。ディスプレイとの間は I2C バスで接続ですので配線は簡単に済みました。LCD モデュールは AQM0802A-RN-GBW という型番で秋月電子でキットが出ていたのでそれを利用しました。
回路図
回路は極簡単です、あとは電池と電源SW を付ければ完成です。D/A コンバータを内蔵オペアンプで受けて出力しています、オペアンプで波形がなまるため高い周波数では波形が滑らかになっています。
出力波形はやはり正弦波が一番問題でしょうから正弦波の波形を2つ掲載します、まず最高周波数 20KHz の波形です。

20KHz-正弦波

20KHz ではサンプル数が 40 で少し少ない為ギザギザしていますがオペアンプでなまった為なめらかになっています。次に 1KHz を掲載します。

1KHz-正弦波

1KHz では 160 サンプルなのでギザギザが少なくなめらかになっています、これなら正弦波と言えると思います。最後にソースリストを載せます。

 ERRORLEVEL      -302

;*********************************************
;  16f1705 でファンクションゼネレータを作る
;  I2C(ディスプレイ) テスト
;*********************************************
        LIST        P=PIC16F1705   ;
        INCLUDE     "P16f1705.inc" ;標準ヘッダ定義ファイル
 __CONFIG    _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _BOREN_OFF
 __CONFIG    _CONFIG2, _WRT_OFF
;*********************************************

ram_start   EQU     h'20'
ram_end     EQU     h'70'
    
data1byte   EQU     h'70'
tmp1     EQU     h'71'
tmp2     EQU     h'72'
;waveform    EQU     h'73'
osc_addr    EQU     h'74'
   
;***********************
;  メインルーチン
;***********************
        ORG     0               ;Reset Start
        GOTO    INIT

 ORG 4
 MOVLP INTERRUPT
 GOTO INTERRUPT
;*********************************************************
;初期処理
INIT
 MOVLB d'2'  ;バンク2
 MOVLW 0
 MOVWF BORCON  ;ブラウンアウトを無効にする
 
 ;OSCCON = h'f0' 32MHz 4xPLL
 ;OSCTUNE= 10 0000B 最小 clk
 ;         00 0000B 工場校正
 ;         01 1111B 最大 clk
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON  ;内部オシレータ32MHz
 MOVLW 0
 MOVWF OSCTUNE

 MOVLB 0  ;バンク0
 MOVLW 0
 MOVWF INTCON  ;割り込み禁止
 
 MOVLB d'1'  ;バンク1
 MOVLW 0
 MOVWF WDTCON  ;ウオッチドッグタイマー無効

 ; TRISA = h'ff' 入力ポート
 ; TRISC = h'ff' 入力ポート
 ; OPTION_REG WPUEN bit クリア、プルアップ有効
 ; WPUA = h'ff' プルアップ有効
 ; WPUC = h'ff' プルアップ有効
 ; RA5 : LCD reset
 ;
 ; MOVLB 0     ;バンク0
 ;LOOP BTFSC PORTC, RC3  ;右 sw 待ち
 ; BRA LOOP
 MOVLB d'1'  ;バンク1
 MOVLW h'ff'
 MOVWF TRISA
 MOVWF TRISC
 BCF OPTION_REG, NOT_WPUEN   ;プルアップ有効
 BCF TRISA, TRISA5 ;LCD reset port を出力ポートにする
 MOVLW d'2'  ;バンク2
 BCF LATA, LATA5 ;LCD reset start
 CALL WAIT30US ;30μs
 BSF LATA, LATA5 ;LCD reset end
 CALL WAIT100MS ;100ms
 CALL WAIT100MS ;100ms
 
 MOVLB d'4'  ;バンク4
 MOVLW h'ff'  ;pull up
 MOVWF WPUA
 MOVWF WPUC

 ; ANSELA = 0 アナログ入力無効
 ; ANSELC = 0 アナログ入力無効
 MOVLB d'3'  ;バンク3
 MOVLW 0
 MOVWF ANSELA
 MOVWF ANSELC
 
 ;RC0PPS = h'10' RC0 は SCL 出力
 ;RC1PPS = h'11' RC1 は SDA 出力
 MOVLB d'29'  ;バンク29
 MOVLW h'10'
 MOVWF RC0PPS
 MOVLW h'11'
 MOVWF RC1PPS
 
 ;OPA1CON = h'92' OP1 enable input=DAC
 MOVLB d'10'  ;バンク10
 MOVLW h'92'
 MOVWF OPA1CON
 
 ;DAC1CON0 = h'88' DAC enable, FVR Buffer2 input
 ;     h'80' VDD input
 ;DAC1R 8bit data
 ;FVRCON = h'c2' FVR BUffer2=2V
 MOVLB d'2'  ;バンク2
 MOVLW h'80'
 MOVWF DAC1CON0
 MOVLW h'c2'
 MOVWF FVRCON

 CALL AQM0802A_INIT ;ディスプレイ関係の初期化
 CALL DISP5  ;"Function generator"
 CALL SW_INPUT ;sw 待ち
RESTART
 CALL SETTING  ;sw 入力で波形や周波数の設定, 出力
INIT_LOOP
 BRA INIT_LOOP
 
;*********************************************************
; INTERRUPT
;*********************************************************
INTERRUPT
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 MOVLW h'00'     ;GIE INTE INTF クリア
 MOVWF INTCON
 GOTO RESTART
;*********************************************************
; SETTING
; sw 入力で波形や周波数の設定 → 出力
; tmp1/tmp2 使用
;
;----   Sine/Triangle
; 20KHz : 32MHz/4/10命令/40サンプル
; 10KHz : 32MHz/4/10命令/80サンプル
;  5KHz : 32MHz/4/10命令/160サンプル
;  2KHz : 32MHz/4/25命令/160サンプル
;  1KHz : 16MHz/4/25命令/160サンプル
; 500Hz :  8MHz/4/25命令/160サンプル
; 200Hz :  4MHz/4/25命令/200サンプル
; 100Hz :  2MHz/4/25命令/200サンプル
;  50Hz :  1MHz/4/25命令/200サンプル
;  20Hz :  500KHz/4/25命令/250サンプル
;  10Hz :  250KHz/4/25命令/250サンプル
;
;----   Square
; 20KHz : 32MHz/4/200命令/2サンプル
; 10KHz : 32MHz/4/400命令/2サンプル
;  5KHz : 32MHz/4/800命令/2サンプル
;  2KHz : 32MHz/4/2000命令/2サンプル
;  1KHz : 16MHz/4/2000命令/2サンプル
; 500Hz :  8MHz/4/2000命令/2サンプル
; 200Hz :  4MHz/4/2500命令/2サンプル
; 100Hz :  2MHz/4/2500命令/2サンプル
;  50Hz :  1MHz/4/2500命令/2サンプル
;  20Hz :  500KHz/4/3125命令/2サンプル
;  10Hz :  250KHz/4/3125命令/2サンプル
;*********************************************************
SETTING
 CALL DISP1     ;SW 機能説明
 CALL SW_INPUT    ;何か SW が押されたら開始

 MOVLW h'01'  ;Clear Display
 CALL SEND_I2C_CMD
 CALL WAIT1MS
 
SETTING1      ;Waveform set
 CALL DISP2     ;"Square  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 GOTO SETTING60   ;周波数 set, square
 CALL DISP3     ;"Sine    "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING10   ;周波数 set, sine
 CALL DISP4     ;"Triangle"
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING40   ;周波数 set, triangle
 BRA SETTING1
 
; Sine
SETTING10      ;周波数 set
 CALL DISP10     ;" 20KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING11   ;20KHz
 CALL DISP11     ;" 10KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING12   ;10KHz
 CALL DISP12     ;"  5KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING13   ;5KHz
 CALL DISP13     ;"  2KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING14   ;2KHz
 CALL DISP14     ;"  1KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING15   ;1KHz
 CALL DISP15     ;" 500Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING16   ;500Hz
 CALL DISP16     ;" 200Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING17   ;200Hz
 CALL DISP17     ;" 100Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING18   ;100Hz
 CALL DISP18     ;"  50Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING19   ;50Hz
 CALL DISP19     ;"  20Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING20   ;20Hz
 CALL DISP20     ;"  10Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING21   ;10Hz
 BRA SETTING10   ;LOOP

SETTING11   ;20KHz
; 20KHz : 32MHz/4/10命令/40サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_20KHZ
 GOTO OSC_SINE_20KHZ
SETTING12   ;10KHz
; 10KHz : 32MHz/4/10命令/80サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_10KHZ
 GOTO OSC_SINE_10KHZ
SETTING13   ;5KHz
;  5KHz : 32MHz/4/10命令/160サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_5KHZ
 GOTO OSC_SINE_5KHZ
SETTING14   ;2KHz
;  2KHz : 32MHz/4/25命令/160サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_2KHZ
 GOTO OSC_SINE_2KHZ
SETTING15   ;1KHz
;  1KHz : 16MHz/4/25命令/160サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'7a' 16MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'7a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_2KHZ
 GOTO OSC_SINE_2KHZ
SETTING16   ;500Hz
; 500Hz :  8MHz/4/25命令/160サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'72' 8MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'72'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_2KHZ
 GOTO OSC_SINE_2KHZ
SETTING17   ;200Hz
; 200Hz :  4MHz/4/25命令/200サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'6a' 4MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'6a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_200HZ
 GOTO OSC_SINE_200HZ
SETTING18   ;100Hz
; 100Hz :  2MHz/4/25命令/200サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'62' 2MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'62'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_200HZ
 GOTO OSC_SINE_200HZ
SETTING19   ;50Hz
;  50Hz :  1MHz/4/25命令/200サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'5a' 1MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'5a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_200HZ
 GOTO OSC_SINE_200HZ
SETTING20   ;20Hz
;  20Hz :  500KHz/4/25命令/250サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'52' 500KHz
 MOVLB d'1'  ;バンク1
 MOVLW h'52'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_20HZ
 GOTO OSC_SINE_20HZ
SETTING21   ;10Hz
;  10Hz :  250KHz/4/25命令/250サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'52' 250KHz
 MOVLB d'1'  ;バンク1
 MOVLW h'4a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SINE_20HZ
 GOTO OSC_SINE_20HZ
 
; Triangle
SETTING40      ;周波数 set
 CALL DISP10     ;" 20KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING41   ;20KHz
 CALL DISP11     ;" 10KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING42   ;10KHz
 CALL DISP12     ;"  5KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING43   ;5KHz
 CALL DISP13     ;"  2KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING44   ;2KHz
 CALL DISP14     ;"  1KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING45   ;1KHz
 CALL DISP15     ;" 500Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING46   ;500Hz
 CALL DISP16     ;" 200Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING47   ;200Hz
 CALL DISP17     ;" 100Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING48   ;100Hz
 CALL DISP18     ;"  50Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING49   ;50Hz
 CALL DISP19     ;"  20Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING50   ;20Hz
 CALL DISP20     ;"  10Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING51   ;10Hz
 BRA SETTING40   ;LOOP
 
SETTING41   ;20KHz
; 20KHz : 32MHz/4/10命令/40サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_20KHZ
 GOTO OSC_TRI_20KHZ
SETTING42   ;10KHz
; 10KHz : 32MHz/4/10命令/80サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_10KHZ
 GOTO OSC_TRI_10KHZ
SETTING43   ;5KHz
;  5KHz : 32MHz/4/10命令/160サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_5KHZ
 GOTO OSC_TRI_5KHZ
SETTING44   ;2KHz
;  2KHz : 32MHz/4/25命令/160サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_2KHZ
 GOTO OSC_TRI_2KHZ
SETTING45   ;1KHz
;  1KHz : 16MHz/4/25命令/160サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'7a' 16MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'7a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_2KHZ
 GOTO OSC_TRI_2KHZ
SETTING46   ;500Hz
; 500Hz :  8MHz/4/25命令/160サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'72' 8MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'72'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_2KHZ
 GOTO OSC_TRI_2KHZ
SETTING47   ;200Hz
; 200Hz :  4MHz/4/25命令/200サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'6a' 4MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'6a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_200HZ
 GOTO OSC_TRI_200HZ
SETTING48   ;100Hz
; 100Hz :  2MHz/4/25命令/200サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'62' 2MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'62'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_200HZ
 GOTO OSC_TRI_200HZ
SETTING49   ;50Hz
;  50Hz :  1MHz/4/25命令/200サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'5a' 1MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'5a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_200HZ
 GOTO OSC_TRI_200HZ
SETTING50   ;20Hz
;  20Hz :  500KHz/4/25命令/250サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'52' 500KHz
 MOVLB d'1'  ;バンク1
 MOVLW h'52'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_20HZ
 GOTO OSC_TRI_20HZ
SETTING51   ;10Hz
;  10Hz :  250KHz/4/25命令/250サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'52' 250KHz
 MOVLB d'1'  ;バンク1
 MOVLW h'4a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_TRI_20HZ
 GOTO OSC_TRI_20HZ
 
; Square
SETTING60      ;周波数 set
 CALL DISP10     ;" 20KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING61   ;20KHz
 CALL DISP11     ;" 10KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING62   ;10KHz
 CALL DISP12     ;"  5KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING63   ;5KHz
 CALL DISP13     ;"  2KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING64   ;2KHz
 CALL DISP14     ;"  1KHz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING65   ;1KHz
 CALL DISP15     ;" 500Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING66   ;500Hz
 CALL DISP16     ;" 200Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING67   ;200Hz
 CALL DISP17     ;" 100Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING68   ;100Hz
 CALL DISP18     ;"  50Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING69   ;50Hz
 CALL DISP19     ;"  20Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING70   ;20Hz
 CALL DISP20     ;"  10Hz  "
 CALL SW_INPUT    ;SW 入力, 左 W=1、右 W=2
 DECFSZ WREG, W
 BRA SETTING71   ;10Hz
 BRA SETTING60   ;LOOP
 
SETTING61   ;20KHz
; 20KHz : 32MHz/4/200命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_20KHZ
 GOTO OSC_SQU_20KHZ
SETTING62   ;10KHz
; 10KHz : 32MHz/4/400命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_10KHZ
 GOTO OSC_SQU_10KHZ
SETTING63   ;5KHz
;  5KHz : 32MHz/4/800命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_5KHZ
 GOTO OSC_SQU_5KHZ
SETTING64   ;2KHz
;  2KHz : 32MHz/4/2000命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'f0' 32MHz 4xPLL
 MOVLB d'1'  ;バンク1
 MOVLW h'f0'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_2KHZ
 GOTO OSC_SQU_2KHZ
SETTING65   ;1KHz
;  1KHz : 16MHz/4/2000命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'7a' 16MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'7a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_2KHZ
 GOTO OSC_SQU_2KHZ
SETTING66   ;500Hz
; 500Hz :  8MHz/4/2000命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'72' 8MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'72'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_2KHZ
 GOTO OSC_SQU_2KHZ
SETTING67   ;200Hz
; 200Hz :  4MHz/4/2500命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'6a' 4MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'6a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_200HZ
 GOTO OSC_SQU_200HZ
SETTING68   ;100Hz
; 100Hz :  2MHz/4/2500命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'62' 2MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'62'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_200HZ
 GOTO OSC_SQU_200HZ
SETTING69   ;50Hz
;  50Hz :  1MHz/4/2500命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'5a' 1MHz
 MOVLB d'1'  ;バンク1
 MOVLW h'5a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_200HZ
 GOTO OSC_SQU_200HZ
SETTING70   ;20Hz
;  20Hz :  500KHz/4/3125命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'52' 500KHz
 MOVLB d'1'  ;バンク1
 MOVLW h'52'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_20HZ
 GOTO OSC_SQU_20HZ
SETTING71   ;10Hz
;  10Hz :  250KHz/4/3125命令/2サンプル
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
 ;OSCCON = h'52' 250KHz
 MOVLB d'1'  ;バンク1
 MOVLW h'4a'
 MOVWF OSCCON
 
 BCF OPTION_REG, INTEDG  ;int の立下りで割り込み発生
 MOVLW h'90'     ;GIE INTE セット, INTF クリア
 MOVWF INTCON
 
 MOVLP OSC_SQU_20HZ
 GOTO OSC_SQU_20HZ
;*********************************************************
; DISP20
; "  10Hz  "
;*********************************************************
DISP20
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '1'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP19
; "  20Hz  "
;*********************************************************
DISP19
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '2'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP18
; "  50Hz  "
;*********************************************************
DISP18
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '5'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP17
; " 100Hz  "
;*********************************************************
DISP17
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '1'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP16
; " 200Hz  "
;*********************************************************
DISP16
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '2'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP15
; " 500Hz  "
;*********************************************************
DISP15
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '5'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP14
; "  1KHz  "
;*********************************************************
DISP14
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '1'
 CALL SEND_I2C_DATA
 MOVLW 'K'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP13
; "  2KHz  "
;*********************************************************
DISP13
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '2'
 CALL SEND_I2C_DATA
 MOVLW 'K'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP12
; "  5KHz  "
;*********************************************************
DISP12
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '5'
 CALL SEND_I2C_DATA
 MOVLW 'K'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP10
; " 20KHz  "
;*********************************************************
DISP10
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '2'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW 'K'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP11
; " 10KHz  "
;*********************************************************
DISP11
 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW '1'
 CALL SEND_I2C_DATA
 MOVLW '0'
 CALL SEND_I2C_DATA
 MOVLW 'K'
 CALL SEND_I2C_DATA
 MOVLW 'H'
 CALL SEND_I2C_DATA
 MOVLW 'z'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; AQM0802A_INIT
; AQM0802A を初期化する(ディスプレイ)
; tmp1/tmp2 使用する
;*********************************************************
AQM0802A_INIT
 ;SSP1STAT= h'00'
 ;SSP1CON1= h'26' SDA/SCL ピンは I2C で使用、スレーブモード
 ;          h'28' I2C マスターモード, clock=Fosc/(4*(SSPADD+1))
 ;    h'2b' I2C ファームウエア制御マスター
 ;SSP1CON2= h'05' stop/start enable、波形は出ないプログラムも走らない
 ;          h'0f' 波形は出ないプログラムも走らない
 ;          h'00' 波形は出ないプログラムも走らない
 ;          h'0a' で波形は出ないがプログラムは走ってしまう
 ;SSP1CON3= h'08'
 ;SSP1ADD = h'4f' ボーレート 100kHz at 32MHz
 MOVLB d'4'  ;バンク4
 MOVLW h'00'
 MOVWF SSP1STAT
 MOVLW h'28'
 MOVWF SSP1CON1
 MOVLW h'08'
 MOVWF SSP1CON3
 MOVLW h'4f'
 MOVWF SSP1ADD

 ;; ディスプレイの初期化
 MOVLW h'38'  ;Function set
 CALL SEND_I2C_CMD

 MOVLW h'39'  ;Function set
 CALL SEND_I2C_CMD

 MOVLW h'14'  ;Internal OSC frequency
 CALL SEND_I2C_CMD

 MOVLW h'70'  ;contrast set
 CALL SEND_I2C_CMD

 MOVLW h'56'  ;Power/ICON/Contrast control
 CALL SEND_I2C_CMD

 MOVLW h'6c'  ;Follower control
 CALL SEND_I2C_CMD
 ;   200ms wait
; CALL WAIT100MS   ;AAAAA
; CALL WAIT100MS
 
 MOVLW h'38'  ;Function set
 CALL SEND_I2C_CMD

 MOVLW h'0c'  ;Display ON/OFF control
 CALL SEND_I2C_CMD

 MOVLW h'01'  ;Clear Display
 CALL SEND_I2C_CMD
 ;   1ms wait
 CALL WAIT1MS

 MOVLW h'14'  ;shift cursor to the right
 CALL SEND_I2C_CMD
 
 RETURN
 
;*********************************************************
; SEND_BYTE
; I2C で1バイト送信 : W
;*********************************************************
SEND_BYTE
 MOVLB d'4'  ;バンク4
 MOVWF SSP1BUF  ;送信
SEND_BYTE_LOOP
 BTFSC SSP1STAT, BF ;送信終了待ち
 BRA SEND_BYTE_LOOP
SEND_BYTE_LOOP2
 BTFSC SSP1CON2, ACKSTAT   ;ACK 返信待ち
 BRA SEND_BYTE_LOOP2
 CALL IDLE_I2C ;IDLE 待ち
 RETURN
;*********************************************************
; IDLE_I2C
; IDLE 待ち
;*********************************************************
IDLE_I2C
 MOVLB d'4'  ;バンク4
IDLE_I2C_LOOP
 BTFSC SSP1CON2, SEN ;SEN 待ち
 BRA IDLE_I2C_LOOP
 BTFSC SSP1CON2, PEN ;PEN 待ち
 BRA IDLE_I2C_LOOP
 BTFSC SSP1CON2, RCEN ;RCEN 待ち
 BRA IDLE_I2C_LOOP
 BTFSC SSP1CON2, ACKEN ;ACKEN 待ち
 BRA IDLE_I2C_LOOP
 BTFSC SSP1STAT, R_NOT_W   ;R_NOT_W 待ち
 BRA IDLE_I2C_LOOP
 RETURN
;*********************************************************
; SEND_I2C_DATA
; データを1バイト送信 W
; data1byte 使用
;*********************************************************
SEND_I2C_DATA
 MOVWF data1byte ;save
 CALL IDLE_I2C ;IDLE 待ち
 MOVLB d'4'  ;バンク4
 BSF SSP1CON2, SEN ;スタート出力
SEND_I2C_DATA_LOOP
 BTFSC SSP1CON2, SEN ;スタート終了待ち
 BRA SEND_I2C_DATA_LOOP
 
 MOVLW h'7c'  ;スレーブアドレス + 送信
 CALL SEND_BYTE ;送信
 MOVLW h'40'  ;1バイトデータ送信を告げる
 CALL SEND_BYTE ;送信
 MOVF data1byte,W ;送信データ → W
 CALL SEND_BYTE ;送信
 BSF SSP1CON2, PEN ;ストップ出力
SEND_I2C_DATA_LOOP2
 BTFSC SSP1CON2, PEN ;ストップ終了待ち
 BRA SEND_I2C_DATA_LOOP2
 CALL WAIT30US ;30μs wait
 RETURN
;*********************************************************
; SEND_I2C_CMD
; コマンドを1バイト送信 W
; data1byte 使用
; start 終了後 SDA SCL ともに low になる
;*********************************************************
SEND_I2C_CMD
 MOVWF data1byte ;save
 CALL IDLE_I2C ;IDLE 待ち
 MOVLB d'4'  ;バンク4
 BSF SSP1CON2, SEN ;スタート出力
SEND_I2C_CMD_LOOP
 BTFSC SSP1CON2, SEN ;スタート終了待ち
 BRA SEND_I2C_CMD_LOOP

 MOVLW h'7c'  ;スレーブアドレス + 送信
 CALL SEND_BYTE ;送信

 MOVLW h'00'  ;1バイトコマンド送信を告げる
 CALL SEND_BYTE ;送信
 
 MOVF data1byte,W ;送信コマンド → W
 CALL SEND_BYTE ;送信
 BSF SSP1CON2, PEN ;ストップ出力
SEND_I2C_CMD_LOOP2
 BTFSC SSP1CON2, PEN ;ストップ終了待ち
 BRA SEND_I2C_CMD_LOOP2
 CALL WAIT30US ;30μs wait
 RETURN
;*********************************************************
; WAIT30US
; 30μs wait
;*********************************************************
WAIT30US
 MOVLW d'78'
WAIT30US_LOOP
 DECFSZ WREG, W  ;カウントダウン
 BRA WAIT30US_LOOP
 RETURN
;*********************************************************
; WAIT1MS
; 1ms wait
; tmp1 使用
;*********************************************************
WAIT1MS
 MOVLW d'33'
 MOVWF tmp1
WAIT1MS_LOOP
 CALL WAIT30US ;30μs
 DECFSZ tmp1, F  ;カウントダウン
 BRA WAIT1MS_LOOP
 RETURN
;*********************************************************
; WAIT100MS
; tmp1/tmp2 使用
;*********************************************************
WAIT100MS
 MOVLW d'100'
 MOVWF tmp2
WAIT100MS_LOOP
 CALL WAIT1MS  ;1ms
 DECFSZ tmp2, F  ;カウントダウン
 BRA WAIT100MS_LOOP
 RETURN
;*********************************************************
; SET_DDRAM_ADDR
; DDRAM アドレスとして W を設定する
;*********************************************************
SET_DDRAM_ADDR_TO_40  ;DDRAM アドレス 2行目
 MOVLW h'40'
 BRA SET_DDRAM_ADDR
SET_DDRAM_ADDR_TO_0
 MOVLW 0  ;DDRAM アドレス 1行目
SET_DDRAM_ADDR
 IORLW h'80'  ;Set DDRAM address コマンドにする
 CALL SEND_I2C_CMD
 RETURN
;*********************************************************
; TEST_OUT
; RC2 に矩形波を出力する
; tmp1/tmp2 使用
;*********************************************************
TEST_OUT
 CLRF tmp2  ;tmp2 clear
; MOVLB d'1'  ;バンク1
; BCF TRISC, TRISC2 ;RC2 出力指定
 MOVLB d'2'  ;バンク2
TEST_OUT_LOOP   ;周期10サイクル
 MOVF tmp2, W
 MOVWF DAC1CON1 ;DAC 出力
; MOVWF LATC  ;RC 出力
 CALL WAIT30US
 COMF tmp2, F  ;complement
 BRA TEST_OUT_LOOP
;*********************************************************
; SW_INPUT
; 2つの sw 入力、左 W=1、右 W=2
; tmp1/tmp2 使用
;*********************************************************
SW_INPUT
 CALL WAIT_SW_OFF ;SW が OFF であることを 50ms 確認
SW_INPUT_LOOP
 MOVLB 0     ;バンク0
 BTFSS PORTC, RC3  ;右 SW test
 BRA SW_INPUT_RIGHT ;ON
 BTFSS PORTA, RA2  ;左 SW test
 BRA SW_INPUT_LEFT ;ON
 BRA SW_INPUT_LOOP
 
SW_INPUT_RIGHT
 MOVLW 2
 RETURN
SW_INPUT_LEFT
 MOVLW 1
 RETURN
 
WAIT_SW_OFF
 MOVLW d'200'
 MOVWF tmp2
WAIT_SW_OFF2
 MOVLW d'250'
 MOVWF tmp1
WAIT_SW_OFF_LOOP
 MOVLB 0     ;バンク0
 BTFSS PORTC, RC3  ;右 sw OFF か?
 BRA WAIT_SW_OFF ;OFF でない
 BTFSS PORTA, RA2  ;左 SW OFF か?
 BRA WAIT_SW_OFF ;OFF でない
 
 DECFSZ tmp1, F     ;カウントダウン
 BRA WAIT_SW_OFF_LOOP
 DECFSZ tmp2, F     ;カウントダウン
 BRA WAIT_SW_OFF2
 
 RETURN
;*********************************************************
; DISP_TEST
; ==TEST==  表示
;*********************************************************
DISP_TEST
 CALL SET_DDRAM_ADDR_TO_0 ;1行目
 
 MOVLW '='
 CALL SEND_I2C_DATA
 MOVLW '='
 CALL SEND_I2C_DATA
 MOVLW 'T'
 CALL SEND_I2C_DATA
 MOVLW 'E'
 CALL SEND_I2C_DATA
 MOVLW 'S'
 CALL SEND_I2C_DATA
 MOVLW 'T'
 CALL SEND_I2C_DATA
 MOVLW '='
 CALL SEND_I2C_DATA
 MOVLW '='
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP1
; "L-Select"
; "R-Set   "
;*********************************************************
DISP1
 CALL SET_DDRAM_ADDR_TO_0 ;1行目
 MOVLW 'L'
 CALL SEND_I2C_DATA
 MOVLW '-'
 CALL SEND_I2C_DATA
 MOVLW 'S'
 CALL SEND_I2C_DATA
 MOVLW 'e'
 CALL SEND_I2C_DATA
 MOVLW 'l'
 CALL SEND_I2C_DATA
 MOVLW 'e'
 CALL SEND_I2C_DATA
 MOVLW 'c'
 CALL SEND_I2C_DATA
 MOVLW 't'
 CALL SEND_I2C_DATA

 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 MOVLW 'R'
 CALL SEND_I2C_DATA
 MOVLW '-'
 CALL SEND_I2C_DATA
 MOVLW 'S'
 CALL SEND_I2C_DATA
 MOVLW 'e'
 CALL SEND_I2C_DATA
 MOVLW 't'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP2
; "Square  "
;*********************************************************
DISP2
 CALL SET_DDRAM_ADDR_TO_0 ;1行目
 MOVLW 'S'
 CALL SEND_I2C_DATA
 MOVLW 'q'
 CALL SEND_I2C_DATA
 MOVLW 'u'
 CALL SEND_I2C_DATA
 MOVLW 'a'
 CALL SEND_I2C_DATA
 MOVLW 'r'
 CALL SEND_I2C_DATA
 MOVLW 'e'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP3
; "Sine   "
;*********************************************************
DISP3
 CALL SET_DDRAM_ADDR_TO_0 ;1行目
 MOVLW 'S'
 CALL SEND_I2C_DATA
 MOVLW 'i'
 CALL SEND_I2C_DATA
 MOVLW 'n'
 CALL SEND_I2C_DATA
 MOVLW 'e'
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 MOVLW ' '
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP4
; "Triangle"
;*********************************************************
DISP4
 CALL SET_DDRAM_ADDR_TO_0 ;1行目
 MOVLW 'T'
 CALL SEND_I2C_DATA
 MOVLW 'r'
 CALL SEND_I2C_DATA
 MOVLW 'i'
 CALL SEND_I2C_DATA
 MOVLW 'a'
 CALL SEND_I2C_DATA
 MOVLW 'n'
 CALL SEND_I2C_DATA
 MOVLW 'g'
 CALL SEND_I2C_DATA
 MOVLW 'l'
 CALL SEND_I2C_DATA
 MOVLW 'e'
 CALL SEND_I2C_DATA
 RETURN
;*********************************************************
; DISP5
; "Function"
; "generatr"
;*********************************************************
DISP5
 CALL SET_DDRAM_ADDR_TO_0 ;1行目
 MOVLW 'F'
 CALL SEND_I2C_DATA
 MOVLW 'u'
 CALL SEND_I2C_DATA
 MOVLW 'n'
 CALL SEND_I2C_DATA
 MOVLW 'c'
 CALL SEND_I2C_DATA
 MOVLW 't'
 CALL SEND_I2C_DATA
 MOVLW 'i'
 CALL SEND_I2C_DATA
 MOVLW 'o'
 CALL SEND_I2C_DATA
 MOVLW 'n'
 CALL SEND_I2C_DATA

 CALL SET_DDRAM_ADDR_TO_40 ;2行目
 MOVLW 'g'
 CALL SEND_I2C_DATA
 MOVLW 'e'
 CALL SEND_I2C_DATA
 MOVLW 'n'
 CALL SEND_I2C_DATA
 MOVLW 'e'
 CALL SEND_I2C_DATA
 MOVLW 'r'
 CALL SEND_I2C_DATA
 MOVLW 'a'
 CALL SEND_I2C_DATA
 MOVLW 't'
 CALL SEND_I2C_DATA
 MOVLW 'r'
 CALL SEND_I2C_DATA
 RETURN
 
;*********************************************************
;*********************************************************
;*********************************************************
;*********************************************************
 ORG h'800'

;*********************************************************
;*********************************************************
;*********************************************************
;*********************************************************
 ORG h'1000'

;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
;  20Hz :  500KHz/4/3125命令/2サンプル
;*********************************************************

OSC_SQU_20HZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SQU_20HZ_LOOP
 MOVF osc_addr, W ;   1
 MOVWF DAC1CON1 ;DAC 出力  1
 COMF osc_addr, F ;   1
 
 MOVLW d'31'      ;# 3100+2clk = 3102clk
 MOVWF tmp1      ;#
OSC_SQU_20HZ_LOOP3      ;#
 MOVLW d'32'      ;## 97clk
OSC_SQU_20HZ_LOOP2      ;##
 DECFSZ WREG, W      ;##
 BRA OSC_SQU_20HZ_LOOP2  ;##
 NOP       ;##
 DECFSZ tmp1, F      ;#
 BRA OSC_SQU_20HZ_LOOP3  ;#
 ;後 3125-3102-5 = 18clk
 MOVLW d'6'      ;# 18clk
OSC_SQU_20HZ_LOOP4      ;#
 DECFSZ WREG, W      ;#
 BRA OSC_SQU_20HZ_LOOP4  ;#
 
 BRA OSC_SQU_20HZ_LOOP   ;   2
 
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
; 200Hz :  4MHz/4/2500命令/2サンプル
;*********************************************************
OSC_SQU_200HZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SQU_200HZ_LOOP
 MOVF osc_addr, W ;   1
 MOVWF DAC1CON1 ;DAC 出力  1
 COMF osc_addr, F ;   1
 
 MOVLW d'24'  ;# 2400+1clk = 2401clk
 MOVWF tmp1  ;#
OSC_SQU_200HZ_LOOP2  ;#
 MOVLW d'32'  ;## 97clk
OSC_SQU_200HZ_LOOP3  ;##
 DECFSZ WREG, W  ;##
 BRA OSC_SQU_200HZ_LOOP3 ;##
 NOP   ;##
 DECFSZ tmp1, F  ;#
 BRA OSC_SQU_200HZ_LOOP2 ;#
 ;後 2500-2401-5 = 94clk
 MOVLW d'31'  ;# 93clk
OSC_SQU_200HZ_LOOP4  ;#
 DECFSZ WREG, W  ;#
 BRA OSC_SQU_200HZ_LOOP4 ;#
 
 BRA OSC_SQU_200HZ_LOOP  ;   2
 
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
;  2KHz : 32MHz/4/2000命令/2サンプル
;*********************************************************
OSC_SQU_2KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SQU_2KHZ_LOOP
 MOVF osc_addr, W ;   1
 MOVWF DAC1CON1 ;DAC 出力  1
 COMF osc_addr, F ;   1

 MOVLW d'19'      ;# 1900+1clk = 1901clk
 MOVWF tmp1      ;#
OSC_SQU_2KHZ_LOOP3      ;#
 MOVLW d'32'      ;## 97clk
OSC_SQU_2KHZ_LOOP2      ;##
 DECFSZ WREG, W      ;##
 BRA OSC_SQU_2KHZ_LOOP2  ;##
 NOP      ;##
 DECFSZ tmp1, F      ;#
 BRA OSC_SQU_2KHZ_LOOP3  ;#
 ;後 2000-1901-5 = 94clk
 MOVLW d'31'      ;# 93clk
OSC_SQU_2KHZ_LOOP4      ;#
 DECFSZ WREG, W      ;#
 BRA OSC_SQU_2KHZ_LOOP4  ;#

 BRA OSC_SQU_2KHZ_LOOP ;  2 (計 11+14 = 25clk)
 
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
;  5KHz : 32MHz/4/800命令/2サンプル
;*********************************************************
OSC_SQU_5KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SQU_5KHZ_LOOP
 MOVF osc_addr, W ;   1
 MOVWF DAC1CON1 ;DAC 出力  1
 COMF osc_addr, F ;   1
 
 MOVLW d'7'      ;# 700+1clk = 701clk
 MOVWF tmp1      ;#
OSC_SQU_5KHZ_LOOP3      ;#
 MOVLW d'32'      ;## 97clk
OSC_SQU_5KHZ_LOOP2      ;##
 DECFSZ WREG, W      ;##
 BRA OSC_SQU_5KHZ_LOOP2  ;##
 NOP      ;##
 DECFSZ tmp1, F      ;#
 BRA OSC_SQU_5KHZ_LOOP3  ;#
 ;後 800-701-5 = 94clk
 MOVLW d'31'      ;# 93clk
OSC_SQU_5KHZ_LOOP4      ;#
 DECFSZ WREG, W      ;#
 BRA OSC_SQU_5KHZ_LOOP4  ;#
 
 BRA OSC_SQU_5KHZ_LOOP ;  2 (計 20/2 = 10clk)
 
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
; 10KHz : 32MHz/4/400命令/2サンプル
;*********************************************************
OSC_SQU_10KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SQU_10KHZ_LOOP
 MOVF osc_addr, W ;   1
 MOVWF DAC1CON1 ;DAC 出力  1
 COMF osc_addr, F ;   1
 
 MOVLW d'131'      ;## 393clk
OSC_SQU_10KHZ_LOOP2      ;##
 DECFSZ WREG, W      ;##
 BRA OSC_SQU_10KHZ_LOOP2  ;##
 ;後 400-393-5 = 2clk
 NOP
 NOP
 
 BRA OSC_SQU_10KHZ_LOOP ;  2 (計 20/2 = 10clk)
 
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
; 20KHz : 32MHz/4/200命令/2サンプル
;*********************************************************
OSC_SQU_20KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SQU_20KHZ_LOOP
 MOVF osc_addr, W ;   1
 MOVWF DAC1CON1 ;DAC 出力  1
 COMF osc_addr, F ;   1
 
 MOVLW d'65'      ;## 195clk
OSC_SQU_20KHZ_LOOP2      ;##
 DECFSZ WREG, W      ;##
 BRA OSC_SQU_20KHZ_LOOP2     ;##

 BRA OSC_SQU_20KHZ_LOOP ;  2 (計 20/2 = 10clk)
 
;#########################################################
 
OSC_TRI_20HZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_TRI_20HZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE250_TRI;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 
 MOVLW 4
OSC_TRI_20Hz_WAIT
 DECFSZ WREG, W
 BRA OSC_TRI_20Hz_WAIT
 NOP
 NOP

 BRA OSC_TRI_20HZ_LOOP
 
GET_TABLE250_TRI
 BRW
 RETLW d'22' ;0
 RETLW d'24' ;1
 RETLW d'26' ;2
 RETLW d'27' ;3
 RETLW d'29' ;4
 RETLW d'31' ;5
 RETLW d'33' ;6
 RETLW d'35' ;7
 RETLW d'36' ;8
 RETLW d'38' ;9
 RETLW d'40' ;10
 RETLW d'42' ;11
 RETLW d'43' ;12
 RETLW d'45' ;13
 RETLW d'47' ;14
 RETLW d'49' ;15
 RETLW d'51' ;16
 RETLW d'52' ;17
 RETLW d'54' ;18
 RETLW d'56' ;19
 RETLW d'58' ;20
 RETLW d'59' ;21
 RETLW d'61' ;22
 RETLW d'63' ;23
 RETLW d'65' ;24
 RETLW d'67' ;25
 RETLW d'68' ;26
 RETLW d'70' ;27
 RETLW d'72' ;28
 RETLW d'74' ;29
 RETLW d'75' ;30
 RETLW d'77' ;31
 RETLW d'79' ;32
 RETLW d'81' ;33
 RETLW d'82' ;34
 RETLW d'84' ;35
 RETLW d'86' ;36
 RETLW d'88' ;37
 RETLW d'90' ;38
 RETLW d'91' ;39
 RETLW d'93' ;40
 RETLW d'95' ;41
 RETLW d'97' ;42
 RETLW d'98' ;43
 RETLW d'100' ;44
 RETLW d'102' ;45
 RETLW d'104' ;46
 RETLW d'106' ;47
 RETLW d'107' ;48
 RETLW d'109' ;49
 RETLW d'111' ;50
 RETLW d'113' ;51
 RETLW d'114' ;52
 RETLW d'116' ;53
 RETLW d'118' ;54
 RETLW d'120' ;55
 RETLW d'122' ;56
 RETLW d'123' ;57
 RETLW d'125' ;58
 RETLW d'127' ;59
 RETLW d'129' ;60
 RETLW d'130' ;61
 RETLW d'132' ;62
 RETLW d'134' ;63
 RETLW d'136' ;64
 RETLW d'137' ;65
 RETLW d'139' ;66
 RETLW d'141' ;67
 RETLW d'143' ;68
 RETLW d'145' ;69
 RETLW d'146' ;70
 RETLW d'148' ;71
 RETLW d'150' ;72
 RETLW d'152' ;73
 RETLW d'153' ;74
 RETLW d'155' ;75
 RETLW d'157' ;76
 RETLW d'159' ;77
 RETLW d'161' ;78
 RETLW d'162' ;79
 RETLW d'164' ;80
 RETLW d'166' ;81
 RETLW d'168' ;82
 RETLW d'169' ;83
 RETLW d'171' ;84
 RETLW d'173' ;85
 RETLW d'175' ;86
 RETLW d'177' ;87
 RETLW d'178' ;88
 RETLW d'180' ;89
 RETLW d'182' ;90
 RETLW d'184' ;91
 RETLW d'185' ;92
 RETLW d'187' ;93
 RETLW d'189' ;94
 RETLW d'191' ;95
 RETLW d'192' ;96
 RETLW d'194' ;97
 RETLW d'196' ;98
 RETLW d'198' ;99
 RETLW d'200' ;100
 RETLW d'201' ;101
 RETLW d'203' ;102
 RETLW d'205' ;103
 RETLW d'207' ;104
 RETLW d'208' ;105
 RETLW d'210' ;106
 RETLW d'212' ;107
 RETLW d'214' ;108
 RETLW d'216' ;109
 RETLW d'217' ;110
 RETLW d'219' ;111
 RETLW d'221' ;112
 RETLW d'223' ;113
 RETLW d'224' ;114
 RETLW d'226' ;115
 RETLW d'228' ;116
 RETLW d'230' ;117
 RETLW d'231' ;118
 RETLW d'233' ;119
 RETLW d'235' ;120
 RETLW d'237' ;121
 RETLW d'239' ;122
 RETLW d'240' ;123
 RETLW d'242' ;124
 RETLW d'244' ;125
 RETLW d'242' ;126
 RETLW d'240' ;127
 RETLW d'239' ;128
 RETLW d'237' ;129
 RETLW d'235' ;130
 RETLW d'233' ;131
 RETLW d'231' ;132
 RETLW d'230' ;133
 RETLW d'228' ;134
 RETLW d'226' ;135
 RETLW d'224' ;136
 RETLW d'223' ;137
 RETLW d'221' ;138
 RETLW d'219' ;139
 RETLW d'217' ;140
 RETLW d'216' ;141
 RETLW d'214' ;142
 RETLW d'212' ;143
 RETLW d'210' ;144
 RETLW d'208' ;145
 RETLW d'207' ;146
 RETLW d'205' ;147
 RETLW d'203' ;148
 RETLW d'201' ;149
 RETLW d'200' ;150
 RETLW d'198' ;151
 RETLW d'196' ;152
 RETLW d'194' ;153
 RETLW d'192' ;154
 RETLW d'191' ;155
 RETLW d'189' ;156
 RETLW d'187' ;157
 RETLW d'185' ;158
 RETLW d'184' ;159
 RETLW d'182' ;160
 RETLW d'180' ;161
 RETLW d'178' ;162
 RETLW d'177' ;163
 RETLW d'175' ;164
 RETLW d'173' ;165
 RETLW d'171' ;166
 RETLW d'169' ;167
 RETLW d'168' ;168
 RETLW d'166' ;169
 RETLW d'164' ;170
 RETLW d'162' ;171
 RETLW d'161' ;172
 RETLW d'159' ;173
 RETLW d'157' ;174
 RETLW d'155' ;175
 RETLW d'153' ;176
 RETLW d'152' ;177
 RETLW d'150' ;178
 RETLW d'148' ;179
 RETLW d'146' ;180
 RETLW d'145' ;181
 RETLW d'143' ;182
 RETLW d'141' ;183
 RETLW d'139' ;184
 RETLW d'137' ;185
 RETLW d'136' ;186
 RETLW d'134' ;187
 RETLW d'132' ;188
 RETLW d'130' ;189
 RETLW d'129' ;190
 RETLW d'127' ;191
 RETLW d'125' ;192
 RETLW d'123' ;193
 RETLW d'122' ;194
 RETLW d'120' ;195
 RETLW d'118' ;196
 RETLW d'116' ;197
 RETLW d'114' ;198
 RETLW d'113' ;199
 RETLW d'111' ;200
 RETLW d'109' ;201
 RETLW d'107' ;202
 RETLW d'106' ;203
 RETLW d'104' ;204
 RETLW d'102' ;205
 RETLW d'100' ;206
 RETLW d'98' ;207
 RETLW d'97' ;208
 RETLW d'95' ;209
 RETLW d'93' ;210
 RETLW d'91' ;211
 RETLW d'90' ;212
 RETLW d'88' ;213
 RETLW d'86' ;214
 RETLW d'84' ;215
 RETLW d'82' ;216
 RETLW d'81' ;217
 RETLW d'79' ;218
 RETLW d'77' ;219
 RETLW d'75' ;220
 RETLW d'74' ;221
 RETLW d'72' ;222
 RETLW d'70' ;223
 RETLW d'68' ;224
 RETLW d'67' ;225
 RETLW d'65' ;226
 RETLW d'63' ;227
 RETLW d'61' ;228
 RETLW d'59' ;229
 RETLW d'58' ;230
 RETLW d'56' ;231
 RETLW d'54' ;232
 RETLW d'52' ;233
 RETLW d'51' ;234
 RETLW d'49' ;235
 RETLW d'47' ;236
 RETLW d'45' ;237
 RETLW d'43' ;238
 RETLW d'42' ;239
 RETLW d'40' ;240
 RETLW d'38' ;241
 RETLW d'36' ;242
 RETLW d'35' ;243
 RETLW d'33' ;244
 RETLW d'31' ;245
 RETLW d'29' ;246
 RETLW d'27' ;247
 RETLW d'26' ;248
 CLRF osc_addr
 RETLW d'24' ;249
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
; 200Hz :  4MHz/4/25命令/200サンプル
;*********************************************************
OSC_TRI_200HZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_TRI_200HZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE200_TRI;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 
 MOVLW 4
OSC_TRI_200Hz_WAIT
 DECFSZ WREG, W
 BRA OSC_TRI_200Hz_WAIT
 NOP
 NOP

 BRA OSC_TRI_200HZ_LOOP
 
GET_TABLE200_TRI
 BRW
 RETLW d'22' ;0
 RETLW d'24' ;1
 RETLW d'27' ;2
 RETLW d'29' ;3
 RETLW d'31' ;4
 RETLW d'33' ;5
 RETLW d'35' ;6
 RETLW d'38' ;7
 RETLW d'40' ;8
 RETLW d'42' ;9
 RETLW d'44' ;10
 RETLW d'47' ;11
 RETLW d'49' ;12
 RETLW d'51' ;13
 RETLW d'53' ;14
 RETLW d'55' ;15
 RETLW d'58' ;16
 RETLW d'60' ;17
 RETLW d'62' ;18
 RETLW d'64' ;19
 RETLW d'67' ;20
 RETLW d'69' ;21
 RETLW d'71' ;22
 RETLW d'73' ;23
 RETLW d'75' ;24
 RETLW d'78' ;25
 RETLW d'80' ;26
 RETLW d'82' ;27
 RETLW d'84' ;28
 RETLW d'86' ;29
 RETLW d'89' ;30
 RETLW d'91' ;31
 RETLW d'93' ;32
 RETLW d'95' ;33
 RETLW d'98' ;34
 RETLW d'100' ;35
 RETLW d'102' ;36
 RETLW d'104' ;37
 RETLW d'106' ;38
 RETLW d'109' ;39
 RETLW d'111' ;40
 RETLW d'113' ;41
 RETLW d'115' ;42
 RETLW d'118' ;43
 RETLW d'120' ;44
 RETLW d'122' ;45
 RETLW d'124' ;46
 RETLW d'126' ;47
 RETLW d'129' ;48
 RETLW d'131' ;49
 RETLW d'133' ;50
 RETLW d'135' ;51
 RETLW d'137' ;52
 RETLW d'140' ;53
 RETLW d'142' ;54
 RETLW d'144' ;55
 RETLW d'146' ;56
 RETLW d'149' ;57
 RETLW d'151' ;58
 RETLW d'153' ;59
 RETLW d'155' ;60
 RETLW d'157' ;61
 RETLW d'160' ;62
 RETLW d'162' ;63
 RETLW d'164' ;64
 RETLW d'166' ;65
 RETLW d'169' ;66
 RETLW d'171' ;67
 RETLW d'173' ;68
 RETLW d'175' ;69
 RETLW d'177' ;70
 RETLW d'180' ;71
 RETLW d'182' ;72
 RETLW d'184' ;73
 RETLW d'186' ;74
 RETLW d'188' ;75
 RETLW d'191' ;76
 RETLW d'193' ;77
 RETLW d'195' ;78
 RETLW d'197' ;79
 RETLW d'200' ;80
 RETLW d'202' ;81
 RETLW d'204' ;82
 RETLW d'206' ;83
 RETLW d'208' ;84
 RETLW d'211' ;85
 RETLW d'213' ;86
 RETLW d'215' ;87
 RETLW d'217' ;88
 RETLW d'220' ;89
 RETLW d'222' ;90
 RETLW d'224' ;91
 RETLW d'226' ;92
 RETLW d'228' ;93
 RETLW d'231' ;94
 RETLW d'233' ;95
 RETLW d'235' ;96
 RETLW d'237' ;97
 RETLW d'239' ;98
 RETLW d'242' ;99
 RETLW d'244' ;100
 RETLW d'242' ;101
 RETLW d'239' ;102
 RETLW d'237' ;103
 RETLW d'235' ;104
 RETLW d'233' ;105
 RETLW d'231' ;106
 RETLW d'228' ;107
 RETLW d'226' ;108
 RETLW d'224' ;109
 RETLW d'222' ;110
 RETLW d'220' ;111
 RETLW d'217' ;112
 RETLW d'215' ;113
 RETLW d'213' ;114
 RETLW d'211' ;115
 RETLW d'208' ;116
 RETLW d'206' ;117
 RETLW d'204' ;118
 RETLW d'202' ;119
 RETLW d'200' ;120
 RETLW d'197' ;121
 RETLW d'195' ;122
 RETLW d'193' ;123
 RETLW d'191' ;124
 RETLW d'188' ;125
 RETLW d'186' ;126
 RETLW d'184' ;127
 RETLW d'182' ;128
 RETLW d'180' ;129
 RETLW d'177' ;130
 RETLW d'175' ;131
 RETLW d'173' ;132
 RETLW d'171' ;133
 RETLW d'169' ;134
 RETLW d'166' ;135
 RETLW d'164' ;136
 RETLW d'162' ;137
 RETLW d'160' ;138
 RETLW d'157' ;139
 RETLW d'155' ;140
 RETLW d'153' ;141
 RETLW d'151' ;142
 RETLW d'149' ;143
 RETLW d'146' ;144
 RETLW d'144' ;145
 RETLW d'142' ;146
 RETLW d'140' ;147
 RETLW d'137' ;148
 RETLW d'135' ;149
 RETLW d'133' ;150
 RETLW d'131' ;151
 RETLW d'129' ;152
 RETLW d'126' ;153
 RETLW d'124' ;154
 RETLW d'122' ;155
 RETLW d'120' ;156
 RETLW d'118' ;157
 RETLW d'115' ;158
 RETLW d'113' ;159
 RETLW d'111' ;160
 RETLW d'109' ;161
 RETLW d'106' ;162
 RETLW d'104' ;163
 RETLW d'102' ;164
 RETLW d'100' ;165
 RETLW d'98' ;166
 RETLW d'95' ;167
 RETLW d'93' ;168
 RETLW d'91' ;169
 RETLW d'89' ;170
 RETLW d'86' ;171
 RETLW d'84' ;172
 RETLW d'82' ;173
 RETLW d'80' ;174
 RETLW d'78' ;175
 RETLW d'75' ;176
 RETLW d'73' ;177
 RETLW d'71' ;178
 RETLW d'69' ;179
 RETLW d'67' ;180
 RETLW d'64' ;181
 RETLW d'62' ;182
 RETLW d'60' ;183
 RETLW d'58' ;184
 RETLW d'55' ;185
 RETLW d'53' ;186
 RETLW d'51' ;187
 RETLW d'49' ;188
 RETLW d'47' ;189
 RETLW d'44' ;190
 RETLW d'42' ;191
 RETLW d'40' ;192
 RETLW d'38' ;193
 RETLW d'35' ;194
 RETLW d'33' ;195
 RETLW d'31' ;196
 RETLW d'29' ;197
 RETLW d'27' ;198
 CLRF osc_addr
 RETLW d'24' ;199
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
;  2KHz : 32MHz/4/25命令/160サンプル
;*********************************************************
OSC_TRI_2KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_TRI_2KHZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE160_TRI;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 
 MOVLW 4
OSC_TRI_2KHz_WAIT
 DECFSZ WREG, W
 BRA OSC_TRI_2KHz_WAIT
 NOP
 NOP
 
 BRA OSC_TRI_2KHZ_LOOP ;  2 (計 11+14 = 25clk)
 
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
;  5KHz : 32MHz/4/10命令/160サンプル
;*********************************************************
OSC_TRI_5KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_TRI_5KHZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE160_TRI;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1

 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE160_TRI;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 BRA OSC_TRI_5KHZ_LOOP ;  2 (計 20/2 = 10clk)
 
GET_TABLE160_TRI
 BRW
 RETLW d'22' ;0
 RETLW d'25' ;1
 RETLW d'28' ;2
 RETLW d'30' ;3
 RETLW d'33' ;4
 RETLW d'36' ;5
 RETLW d'39' ;6
 RETLW d'42' ;7
 RETLW d'44' ;8
 RETLW d'47' ;9
 RETLW d'50' ;10
 RETLW d'53' ;11
 RETLW d'55' ;12
 RETLW d'58' ;13
 RETLW d'61' ;14
 RETLW d'64' ;15
 RETLW d'67' ;16
 RETLW d'69' ;17
 RETLW d'72' ;18
 RETLW d'75' ;19
 RETLW d'78' ;20
 RETLW d'80' ;21
 RETLW d'83' ;22
 RETLW d'86' ;23
 RETLW d'89' ;24
 RETLW d'91' ;25
 RETLW d'94' ;26
 RETLW d'97' ;27
 RETLW d'100' ;28
 RETLW d'103' ;29
 RETLW d'105' ;30
 RETLW d'108' ;31
 RETLW d'111' ;32
 RETLW d'114' ;33
 RETLW d'116' ;34
 RETLW d'119' ;35
 RETLW d'122' ;36
 RETLW d'125' ;37
 RETLW d'128' ;38
 RETLW d'130' ;39
 RETLW d'133' ;40
 RETLW d'136' ;41
 RETLW d'139' ;42
 RETLW d'141' ;43
 RETLW d'144' ;44
 RETLW d'147' ;45
 RETLW d'150' ;46
 RETLW d'152' ;47
 RETLW d'155' ;48
 RETLW d'158' ;49
 RETLW d'161' ;50
 RETLW d'164' ;51
 RETLW d'166' ;52
 RETLW d'169' ;53
 RETLW d'172' ;54
 RETLW d'175' ;55
 RETLW d'177' ;56
 RETLW d'180' ;57
 RETLW d'183' ;58
 RETLW d'186' ;59
 RETLW d'188' ;60
 RETLW d'191' ;61
 RETLW d'194' ;62
 RETLW d'197' ;63
 RETLW d'200' ;64
 RETLW d'202' ;65
 RETLW d'205' ;66
 RETLW d'208' ;67
 RETLW d'211' ;68
 RETLW d'213' ;69
 RETLW d'216' ;70
 RETLW d'219' ;71
 RETLW d'222' ;72
 RETLW d'225' ;73
 RETLW d'227' ;74
 RETLW d'230' ;75
 RETLW d'233' ;76
 RETLW d'236' ;77
 RETLW d'238' ;78
 RETLW d'241' ;79
 RETLW d'244' ;80
 RETLW d'241' ;81
 RETLW d'238' ;82
 RETLW d'236' ;83
 RETLW d'233' ;84
 RETLW d'230' ;85
 RETLW d'227' ;86
 RETLW d'225' ;87
 RETLW d'222' ;88
 RETLW d'219' ;89
 RETLW d'216' ;90
 RETLW d'213' ;91
 RETLW d'211' ;92
 RETLW d'208' ;93
 RETLW d'205' ;94
 RETLW d'202' ;95
 RETLW d'200' ;96
 RETLW d'197' ;97
 RETLW d'194' ;98
 RETLW d'191' ;99
 RETLW d'188' ;100
 RETLW d'186' ;101
 RETLW d'183' ;102
 RETLW d'180' ;103
 RETLW d'177' ;104
 RETLW d'175' ;105
 RETLW d'172' ;106
 RETLW d'169' ;107
 RETLW d'166' ;108
 RETLW d'164' ;109
 RETLW d'161' ;110
 RETLW d'158' ;111
 RETLW d'155' ;112
 RETLW d'152' ;113
 RETLW d'150' ;114
 RETLW d'147' ;115
 RETLW d'144' ;116
 RETLW d'141' ;117
 RETLW d'139' ;118
 RETLW d'136' ;119
 RETLW d'133' ;120
 RETLW d'130' ;121
 RETLW d'128' ;122
 RETLW d'125' ;123
 RETLW d'122' ;124
 RETLW d'119' ;125
 RETLW d'116' ;126
 RETLW d'114' ;127
 RETLW d'111' ;128
 RETLW d'108' ;129
 RETLW d'105' ;130
 RETLW d'103' ;131
 RETLW d'100' ;132
 RETLW d'97' ;133
 RETLW d'94' ;134
 RETLW d'91' ;135
 RETLW d'89' ;136
 RETLW d'86' ;137
 RETLW d'83' ;138
 RETLW d'80' ;139
 RETLW d'78' ;140
 RETLW d'75' ;141
 RETLW d'72' ;142
 RETLW d'69' ;143
 RETLW d'67' ;144
 RETLW d'64' ;145
 RETLW d'61' ;146
 RETLW d'58' ;147
 RETLW d'55' ;148
 RETLW d'53' ;149
 RETLW d'50' ;150
 RETLW d'47' ;151
 RETLW d'44' ;152
 RETLW d'42' ;153
 RETLW d'39' ;154
 RETLW d'36' ;155
 RETLW d'33' ;156
 RETLW d'30' ;157
 RETLW d'28' ;158
 CLRF osc_addr
 RETLW d'25' ;159
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
; 10KHz : 32MHz/4/10命令/80サンプル
;*********************************************************
OSC_TRI_10KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_TRI_10KHZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE80_TRI ;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1

 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE80_TRI ;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 BRA OSC_TRI_10KHZ_LOOP ;  2 (計 20/2 = 10clk)
 
GET_TABLE80_TRI
 BRW
 RETLW d'22' ;0
 RETLW d'28' ;1
 RETLW d'33' ;2
 RETLW d'39' ;3
 RETLW d'44' ;4
 RETLW d'50' ;5
 RETLW d'55' ;6
 RETLW d'61' ;7
 RETLW d'67' ;8
 RETLW d'72' ;9
 RETLW d'78' ;10
 RETLW d'83' ;11
 RETLW d'89' ;12
 RETLW d'94' ;13
 RETLW d'100' ;14
 RETLW d'105' ;15
 RETLW d'111' ;16
 RETLW d'116' ;17
 RETLW d'122' ;18
 RETLW d'128' ;19
 RETLW d'133' ;20
 RETLW d'139' ;21
 RETLW d'144' ;22
 RETLW d'150' ;23
 RETLW d'155' ;24
 RETLW d'161' ;25
 RETLW d'166' ;26
 RETLW d'172' ;27
 RETLW d'177' ;28
 RETLW d'183' ;29
 RETLW d'188' ;30
 RETLW d'194' ;31
 RETLW d'200' ;32
 RETLW d'205' ;33
 RETLW d'211' ;34
 RETLW d'216' ;35
 RETLW d'222' ;36
 RETLW d'227' ;37
 RETLW d'233' ;38
 RETLW d'238' ;39
 RETLW d'244' ;40
 RETLW d'238' ;41
 RETLW d'233' ;42
 RETLW d'227' ;43
 RETLW d'222' ;44
 RETLW d'216' ;45
 RETLW d'211' ;46
 RETLW d'205' ;47
 RETLW d'200' ;48
 RETLW d'194' ;49
 RETLW d'188' ;50
 RETLW d'183' ;51
 RETLW d'177' ;52
 RETLW d'172' ;53
 RETLW d'166' ;54
 RETLW d'161' ;55
 RETLW d'155' ;56
 RETLW d'150' ;57
 RETLW d'144' ;58
 RETLW d'139' ;59
 RETLW d'133' ;60
 RETLW d'128' ;61
 RETLW d'122' ;62
 RETLW d'116' ;63
 RETLW d'111' ;64
 RETLW d'105' ;65
 RETLW d'100' ;66
 RETLW d'94' ;67
 RETLW d'89' ;68
 RETLW d'83' ;69
 RETLW d'78' ;70
 RETLW d'72' ;71
 RETLW d'67' ;72
 RETLW d'61' ;73
 RETLW d'55' ;74
 RETLW d'50' ;75
 RETLW d'44' ;76
 RETLW d'39' ;77
 RETLW d'33' ;78
 CLRF osc_addr
 RETLW d'28' ;79
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
; 20KHz : 32MHz/4/10命令/40サンプル
;*********************************************************
OSC_TRI_20KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_TRI_20KHZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE40_TRI;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1

 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE40_TRI;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 BRA OSC_TRI_20KHZ_LOOP ;  2 (計 20/2 = 10clk)
 
GET_TABLE40_TRI
 BRW
 RETLW d'22' ;0
 RETLW d'33' ;1
 RETLW d'44' ;2
 RETLW d'55' ;3
 RETLW d'67' ;4
 RETLW d'78' ;5
 RETLW d'89' ;6
 RETLW d'100' ;7
 RETLW d'111' ;8
 RETLW d'122' ;9
 RETLW d'133' ;10
 RETLW d'144' ;11
 RETLW d'155' ;12
 RETLW d'166' ;13
 RETLW d'177' ;14
 RETLW d'188' ;15
 RETLW d'200' ;16
 RETLW d'211' ;17
 RETLW d'222' ;18
 RETLW d'233' ;19
 RETLW d'244' ;20
 RETLW d'233' ;21
 RETLW d'222' ;22
 RETLW d'211' ;23
 RETLW d'200' ;24
 RETLW d'188' ;25
 RETLW d'177' ;26
 RETLW d'166' ;27
 RETLW d'155' ;28
 RETLW d'144' ;29
 RETLW d'133' ;30
 RETLW d'122' ;31
 RETLW d'111' ;32
 RETLW d'100' ;33
 RETLW d'89' ;34
 RETLW d'78' ;35
 RETLW d'67' ;36
 RETLW d'55' ;37
 RETLW d'44' ;38
 CLRF osc_addr
 RETLW d'33' ;39

;#########################################################

;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
;  20Hz :  500KHz/4/25命令/250サンプル
;*********************************************************
OSC_SINE_20HZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SINE_20HZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE250_SINE;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 
 MOVLW 4
OSC_SINE_20Hz_WAIT
 DECFSZ WREG, W
 BRA OSC_SINE_20Hz_WAIT
 NOP
 NOP

 BRA OSC_SINE_20HZ_LOOP
 
GET_TABLE250_SINE
 BRW
 RETLW d'133' ;0
 RETLW d'136' ;1
 RETLW d'139' ;2
 RETLW d'141' ;3
 RETLW d'144' ;4
 RETLW d'147' ;5
 RETLW d'150' ;6
 RETLW d'152' ;7
 RETLW d'155' ;8
 RETLW d'158' ;9
 RETLW d'161' ;10
 RETLW d'163' ;11
 RETLW d'166' ;12
 RETLW d'169' ;13
 RETLW d'171' ;14
 RETLW d'174' ;15
 RETLW d'176' ;16
 RETLW d'179' ;17
 RETLW d'182' ;18
 RETLW d'184' ;19
 RETLW d'186' ;20
 RETLW d'189' ;21
 RETLW d'191' ;22
 RETLW d'194' ;23
 RETLW d'196' ;24
 RETLW d'198' ;25
 RETLW d'200' ;26
 RETLW d'203' ;27
 RETLW d'205' ;28
 RETLW d'207' ;29
 RETLW d'209' ;30
 RETLW d'211' ;31
 RETLW d'213' ;32
 RETLW d'215' ;33
 RETLW d'217' ;34
 RETLW d'218' ;35
 RETLW d'220' ;36
 RETLW d'222' ;37
 RETLW d'224' ;38
 RETLW d'225' ;39
 RETLW d'227' ;40
 RETLW d'228' ;41
 RETLW d'230' ;42
 RETLW d'231' ;43
 RETLW d'232' ;44
 RETLW d'233' ;45
 RETLW d'235' ;46
 RETLW d'236' ;47
 RETLW d'237' ;48
 RETLW d'238' ;49
 RETLW d'238' ;50
 RETLW d'239' ;51
 RETLW d'240' ;52
 RETLW d'241' ;53
 RETLW d'241' ;54
 RETLW d'242' ;55
 RETLW d'242' ;56
 RETLW d'243' ;57
 RETLW d'243' ;58
 RETLW d'243' ;59
 RETLW d'244' ;60
 RETLW d'244' ;61
 RETLW d'244' ;62
 RETLW d'244' ;63
 RETLW d'244' ;64
 RETLW d'244' ;65
 RETLW d'243' ;66
 RETLW d'243' ;67
 RETLW d'243' ;68
 RETLW d'242' ;69
 RETLW d'242' ;70
 RETLW d'241' ;71
 RETLW d'241' ;72
 RETLW d'240' ;73
 RETLW d'239' ;74
 RETLW d'238' ;75
 RETLW d'238' ;76
 RETLW d'237' ;77
 RETLW d'236' ;78
 RETLW d'235' ;79
 RETLW d'233' ;80
 RETLW d'232' ;81
 RETLW d'231' ;82
 RETLW d'230' ;83
 RETLW d'228' ;84
 RETLW d'227' ;85
 RETLW d'225' ;86
 RETLW d'224' ;87
 RETLW d'222' ;88
 RETLW d'220' ;89
 RETLW d'218' ;90
 RETLW d'217' ;91
 RETLW d'215' ;92
 RETLW d'213' ;93
 RETLW d'211' ;94
 RETLW d'209' ;95
 RETLW d'207' ;96
 RETLW d'205' ;97
 RETLW d'203' ;98
 RETLW d'200' ;99
 RETLW d'198' ;100
 RETLW d'196' ;101
 RETLW d'194' ;102
 RETLW d'191' ;103
 RETLW d'189' ;104
 RETLW d'186' ;105
 RETLW d'184' ;106
 RETLW d'182' ;107
 RETLW d'179' ;108
 RETLW d'176' ;109
 RETLW d'174' ;110
 RETLW d'171' ;111
 RETLW d'169' ;112
 RETLW d'166' ;113
 RETLW d'163' ;114
 RETLW d'161' ;115
 RETLW d'158' ;116
 RETLW d'155' ;117
 RETLW d'152' ;118
 RETLW d'150' ;119
 RETLW d'147' ;120
 RETLW d'144' ;121
 RETLW d'141' ;122
 RETLW d'139' ;123
 RETLW d'136' ;124
 RETLW d'133' ;125
 RETLW d'130' ;126
 RETLW d'127' ;127
 RETLW d'125' ;128
 RETLW d'122' ;129
 RETLW d'119' ;130
 RETLW d'116' ;131
 RETLW d'114' ;132
 RETLW d'111' ;133
 RETLW d'108' ;134
 RETLW d'105' ;135
 RETLW d'103' ;136
 RETLW d'100' ;137
 RETLW d'97' ;138
 RETLW d'95' ;139
 RETLW d'92' ;140
 RETLW d'90' ;141
 RETLW d'87' ;142
 RETLW d'85' ;143
 RETLW d'82' ;144
 RETLW d'80' ;145
 RETLW d'77' ;146
 RETLW d'75' ;147
 RETLW d'72' ;148
 RETLW d'70' ;149
 RETLW d'68' ;150
 RETLW d'66' ;151
 RETLW d'63' ;152
 RETLW d'61' ;153
 RETLW d'59' ;154
 RETLW d'57' ;155
 RETLW d'55' ;156
 RETLW d'53' ;157
 RETLW d'51' ;158
 RETLW d'49' ;159
 RETLW d'48' ;160
 RETLW d'46' ;161
 RETLW d'44' ;162
 RETLW d'43' ;163
 RETLW d'41' ;164
 RETLW d'39' ;165
 RETLW d'38' ;166
 RETLW d'37' ;167
 RETLW d'35' ;168
 RETLW d'34' ;169
 RETLW d'33' ;170
 RETLW d'32' ;171
 RETLW d'30' ;172
 RETLW d'29' ;173
 RETLW d'28' ;174
 RETLW d'28' ;175
 RETLW d'27' ;176
 RETLW d'26' ;177
 RETLW d'25' ;178
 RETLW d'25' ;179
 RETLW d'24' ;180
 RETLW d'24' ;181
 RETLW d'23' ;182
 RETLW d'23' ;183
 RETLW d'23' ;184
 RETLW d'22' ;185
 RETLW d'22' ;186
 RETLW d'22' ;187
 RETLW d'22' ;188
 RETLW d'22' ;189
 RETLW d'22' ;190
 RETLW d'23' ;191
 RETLW d'23' ;192
 RETLW d'23' ;193
 RETLW d'24' ;194
 RETLW d'24' ;195
 RETLW d'25' ;196
 RETLW d'25' ;197
 RETLW d'26' ;198
 RETLW d'27' ;199
 RETLW d'28' ;200
 RETLW d'28' ;201
 RETLW d'29' ;202
 RETLW d'30' ;203
 RETLW d'32' ;204
 RETLW d'33' ;205
 RETLW d'34' ;206
 RETLW d'35' ;207
 RETLW d'37' ;208
 RETLW d'38' ;209
 RETLW d'39' ;210
 RETLW d'41' ;211
 RETLW d'43' ;212
 RETLW d'44' ;213
 RETLW d'46' ;214
 RETLW d'48' ;215
 RETLW d'49' ;216
 RETLW d'51' ;217
 RETLW d'53' ;218
 RETLW d'55' ;219
 RETLW d'57' ;220
 RETLW d'59' ;221
 RETLW d'61' ;222
 RETLW d'63' ;223
 RETLW d'66' ;224
 RETLW d'68' ;225
 RETLW d'70' ;226
 RETLW d'72' ;227
 RETLW d'75' ;228
 RETLW d'77' ;229
 RETLW d'80' ;230
 RETLW d'82' ;231
 RETLW d'85' ;232
 RETLW d'87' ;233
 RETLW d'90' ;234
 RETLW d'92' ;235
 RETLW d'95' ;236
 RETLW d'97' ;237
 RETLW d'100' ;238
 RETLW d'103' ;239
 RETLW d'105' ;240
 RETLW d'108' ;241
 RETLW d'111' ;242
 RETLW d'114' ;243
 RETLW d'116' ;244
 RETLW d'119' ;245
 RETLW d'122' ;246
 RETLW d'125' ;247
 RETLW d'127' ;248
 CLRF osc_addr
 RETLW d'130' ;249
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
; 200Hz :  4MHz/4/25命令/200サンプル
;*********************************************************
OSC_SINE_200HZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SINE_200HZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE200_SINE;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 
 MOVLW 4
OSC_SINE_200Hz_WAIT
 DECFSZ WREG, W
 BRA OSC_SINE_200Hz_WAIT
 NOP
 NOP

 BRA OSC_SINE_200HZ_LOOP
 
GET_TABLE200_SINE
 BRW
 RETLW d'133' ;0
 RETLW d'137' ;1
 RETLW d'140' ;2
 RETLW d'143' ;3
 RETLW d'147' ;4
 RETLW d'150' ;5
 RETLW d'154' ;6
 RETLW d'157' ;7
 RETLW d'161' ;8
 RETLW d'164' ;9
 RETLW d'167' ;10
 RETLW d'171' ;11
 RETLW d'174' ;12
 RETLW d'177' ;13
 RETLW d'180' ;14
 RETLW d'183' ;15
 RETLW d'186' ;16
 RETLW d'189' ;17
 RETLW d'192' ;18
 RETLW d'195' ;19
 RETLW d'198' ;20
 RETLW d'201' ;21
 RETLW d'204' ;22
 RETLW d'206' ;23
 RETLW d'209' ;24
 RETLW d'211' ;25
 RETLW d'214' ;26
 RETLW d'216' ;27
 RETLW d'218' ;28
 RETLW d'221' ;29
 RETLW d'223' ;30
 RETLW d'225' ;31
 RETLW d'227' ;32
 RETLW d'228' ;33
 RETLW d'230' ;34
 RETLW d'232' ;35
 RETLW d'233' ;36
 RETLW d'235' ;37
 RETLW d'236' ;38
 RETLW d'237' ;39
 RETLW d'238' ;40
 RETLW d'240' ;41
 RETLW d'240' ;42
 RETLW d'241' ;43
 RETLW d'242' ;44
 RETLW d'243' ;45
 RETLW d'243' ;46
 RETLW d'243' ;47
 RETLW d'244' ;48
 RETLW d'244' ;49
 RETLW d'244' ;50
 RETLW d'244' ;51
 RETLW d'244' ;52
 RETLW d'243' ;53
 RETLW d'243' ;54
 RETLW d'243' ;55
 RETLW d'242' ;56
 RETLW d'241' ;57
 RETLW d'240' ;58
 RETLW d'240' ;59
 RETLW d'238' ;60
 RETLW d'237' ;61
 RETLW d'236' ;62
 RETLW d'235' ;63
 RETLW d'233' ;64
 RETLW d'232' ;65
 RETLW d'230' ;66
 RETLW d'228' ;67
 RETLW d'227' ;68
 RETLW d'225' ;69
 RETLW d'223' ;70
 RETLW d'221' ;71
 RETLW d'218' ;72
 RETLW d'216' ;73
 RETLW d'214' ;74
 RETLW d'211' ;75
 RETLW d'209' ;76
 RETLW d'206' ;77
 RETLW d'204' ;78
 RETLW d'201' ;79
 RETLW d'198' ;80
 RETLW d'195' ;81
 RETLW d'192' ;82
 RETLW d'189' ;83
 RETLW d'186' ;84
 RETLW d'183' ;85
 RETLW d'180' ;86
 RETLW d'177' ;87
 RETLW d'174' ;88
 RETLW d'171' ;89
 RETLW d'167' ;90
 RETLW d'164' ;91
 RETLW d'161' ;92
 RETLW d'157' ;93
 RETLW d'154' ;94
 RETLW d'150' ;95
 RETLW d'147' ;96
 RETLW d'143' ;97
 RETLW d'140' ;98
 RETLW d'137' ;99
 RETLW d'133' ;100
 RETLW d'130' ;101
 RETLW d'126' ;102
 RETLW d'123' ;103
 RETLW d'119' ;104
 RETLW d'116' ;105
 RETLW d'112' ;106
 RETLW d'109' ;107
 RETLW d'105' ;108
 RETLW d'102' ;109
 RETLW d'99' ;110
 RETLW d'95' ;111
 RETLW d'92' ;112
 RETLW d'89' ;113
 RETLW d'86' ;114
 RETLW d'83' ;115
 RETLW d'80' ;116
 RETLW d'77' ;117
 RETLW d'74' ;118
 RETLW d'71' ;119
 RETLW d'68' ;120
 RETLW d'65' ;121
 RETLW d'62' ;122
 RETLW d'60' ;123
 RETLW d'57' ;124
 RETLW d'55' ;125
 RETLW d'52' ;126
 RETLW d'50' ;127
 RETLW d'48' ;128
 RETLW d'45' ;129
 RETLW d'43' ;130
 RETLW d'41' ;131
 RETLW d'39' ;132
 RETLW d'38' ;133
 RETLW d'36' ;134
 RETLW d'34' ;135
 RETLW d'33' ;136
 RETLW d'31' ;137
 RETLW d'30' ;138
 RETLW d'29' ;139
 RETLW d'28' ;140
 RETLW d'27' ;141
 RETLW d'26' ;142
 RETLW d'25' ;143
 RETLW d'24' ;144
 RETLW d'24' ;145
 RETLW d'23' ;146
 RETLW d'23' ;147
 RETLW d'22' ;148
 RETLW d'22' ;149
 RETLW d'22' ;150
 RETLW d'22' ;151
 RETLW d'22' ;152
 RETLW d'23' ;153
 RETLW d'23' ;154
 RETLW d'24' ;155
 RETLW d'24' ;156
 RETLW d'25' ;157
 RETLW d'26' ;158
 RETLW d'27' ;159
 RETLW d'28' ;160
 RETLW d'29' ;161
 RETLW d'30' ;162
 RETLW d'31' ;163
 RETLW d'33' ;164
 RETLW d'34' ;165
 RETLW d'36' ;166
 RETLW d'38' ;167
 RETLW d'39' ;168
 RETLW d'41' ;169
 RETLW d'43' ;170
 RETLW d'45' ;171
 RETLW d'48' ;172
 RETLW d'50' ;173
 RETLW d'52' ;174
 RETLW d'55' ;175
 RETLW d'57' ;176
 RETLW d'60' ;177
 RETLW d'62' ;178
 RETLW d'65' ;179
 RETLW d'68' ;180
 RETLW d'71' ;181
 RETLW d'74' ;182
 RETLW d'77' ;183
 RETLW d'80' ;184
 RETLW d'83' ;185
 RETLW d'86' ;186
 RETLW d'89' ;187
 RETLW d'92' ;188
 RETLW d'95' ;189
 RETLW d'99' ;190
 RETLW d'102' ;191
 RETLW d'105' ;192
 RETLW d'109' ;193
 RETLW d'112' ;194
 RETLW d'116' ;195
 RETLW d'119' ;196
 RETLW d'123' ;197
 RETLW d'126' ;198
 CLRF osc_addr
 RETLW d'130' ;199
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
;  2KHz : 32MHz/4/25命令/160サンプル
;*********************************************************
OSC_SINE_2KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SINE_2KHZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE160_SINE;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 
 MOVLW 4
OSC_SINE_2KHz_WAIT
 DECFSZ WREG, W
 BRA OSC_SINE_2KHz_WAIT
 NOP
 NOP
 
 BRA OSC_SINE_2KHZ_LOOP ;  2 (計 11+14 = 25clk)
 
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
;  5KHz : 32MHz/4/10命令/160サンプル
;*********************************************************
OSC_SINE_5KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SINE_5KHZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE160_SINE;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1

 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE160_SINE;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 BRA OSC_SINE_5KHZ_LOOP ;  2 (計 20/2 = 10clk)
 
GET_TABLE160_SINE
 BRW
 RETLW d'133' ;0
 RETLW d'137' ;1
 RETLW d'142' ;2
 RETLW d'146' ;3
 RETLW d'150' ;4
 RETLW d'155' ;5
 RETLW d'159' ;6
 RETLW d'163' ;7
 RETLW d'167' ;8
 RETLW d'171' ;9
 RETLW d'175' ;10
 RETLW d'179' ;11
 RETLW d'183' ;12
 RETLW d'187' ;13
 RETLW d'191' ;14
 RETLW d'195' ;15
 RETLW d'198' ;16
 RETLW d'202' ;17
 RETLW d'205' ;18
 RETLW d'208' ;19
 RETLW d'211' ;20
 RETLW d'214' ;21
 RETLW d'217' ;22
 RETLW d'220' ;23
 RETLW d'223' ;24
 RETLW d'225' ;25
 RETLW d'228' ;26
 RETLW d'230' ;27
 RETLW d'232' ;28
 RETLW d'234' ;29
 RETLW d'235' ;30
 RETLW d'237' ;31
 RETLW d'238' ;32
 RETLW d'240' ;33
 RETLW d'241' ;34
 RETLW d'242' ;35
 RETLW d'243' ;36
 RETLW d'243' ;37
 RETLW d'244' ;38
 RETLW d'244' ;39
 RETLW d'244' ;40
 RETLW d'244' ;41
 RETLW d'244' ;42
 RETLW d'243' ;43
 RETLW d'243' ;44
 RETLW d'242' ;45
 RETLW d'241' ;46
 RETLW d'240' ;47
 RETLW d'238' ;48
 RETLW d'237' ;49
 RETLW d'235' ;50
 RETLW d'234' ;51
 RETLW d'232' ;52
 RETLW d'230' ;53
 RETLW d'228' ;54
 RETLW d'225' ;55
 RETLW d'223' ;56
 RETLW d'220' ;57
 RETLW d'217' ;58
 RETLW d'214' ;59
 RETLW d'211' ;60
 RETLW d'208' ;61
 RETLW d'205' ;62
 RETLW d'202' ;63
 RETLW d'198' ;64
 RETLW d'195' ;65
 RETLW d'191' ;66
 RETLW d'187' ;67
 RETLW d'183' ;68
 RETLW d'179' ;69
 RETLW d'175' ;70
 RETLW d'171' ;71
 RETLW d'167' ;72
 RETLW d'163' ;73
 RETLW d'159' ;74
 RETLW d'155' ;75
 RETLW d'150' ;76
 RETLW d'146' ;77
 RETLW d'142' ;78
 RETLW d'137' ;79
 RETLW d'133' ;80
 RETLW d'129' ;81
 RETLW d'124' ;82
 RETLW d'120' ;83
 RETLW d'116' ;84
 RETLW d'111' ;85
 RETLW d'107' ;86
 RETLW d'103' ;87
 RETLW d'99' ;88
 RETLW d'95' ;89
 RETLW d'91' ;90
 RETLW d'87' ;91
 RETLW d'83' ;92
 RETLW d'79' ;93
 RETLW d'75' ;94
 RETLW d'71' ;95
 RETLW d'68' ;96
 RETLW d'64' ;97
 RETLW d'61' ;98
 RETLW d'58' ;99
 RETLW d'55' ;100
 RETLW d'52' ;101
 RETLW d'49' ;102
 RETLW d'46' ;103
 RETLW d'43' ;104
 RETLW d'41' ;105
 RETLW d'39' ;106
 RETLW d'36' ;107
 RETLW d'34' ;108
 RETLW d'32' ;109
 RETLW d'31' ;110
 RETLW d'29' ;111
 RETLW d'28' ;112
 RETLW d'26' ;113
 RETLW d'25' ;114
 RETLW d'24' ;115
 RETLW d'24' ;116
 RETLW d'23' ;117
 RETLW d'23' ;118
 RETLW d'22' ;119
 RETLW d'22' ;120
 RETLW d'22' ;121
 RETLW d'23' ;122
 RETLW d'23' ;123
 RETLW d'24' ;124
 RETLW d'24' ;125
 RETLW d'25' ;126
 RETLW d'26' ;127
 RETLW d'28' ;128
 RETLW d'29' ;129
 RETLW d'31' ;130
 RETLW d'32' ;131
 RETLW d'34' ;132
 RETLW d'36' ;133
 RETLW d'39' ;134
 RETLW d'41' ;135
 RETLW d'43' ;136
 RETLW d'46' ;137
 RETLW d'49' ;138
 RETLW d'52' ;139
 RETLW d'55' ;140
 RETLW d'58' ;141
 RETLW d'61' ;142
 RETLW d'64' ;143
 RETLW d'68' ;144
 RETLW d'71' ;145
 RETLW d'75' ;146
 RETLW d'79' ;147
 RETLW d'83' ;148
 RETLW d'87' ;149
 RETLW d'91' ;150
 RETLW d'95' ;151
 RETLW d'99' ;152
 RETLW d'103' ;153
 RETLW d'107' ;154
 RETLW d'111' ;155
 RETLW d'116' ;156
 RETLW d'120' ;157
 RETLW d'124' ;158
 CLRF osc_addr
 RETLW d'129' ;159
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
; 10KHz : 32MHz/4/10命令/80サンプル
;*********************************************************
OSC_SINE_10KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SINE_10KHZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE80_SINE;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1

 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE80_SINE;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 BRA OSC_SINE_10KHZ_LOOP ;  2 (計 20/2 = 10clk)
 
GET_TABLE80_SINE
 BRW
 RETLW d'133' ;0
 RETLW d'142' ;1
 RETLW d'150' ;2
 RETLW d'159' ;3
 RETLW d'167' ;4
 RETLW d'175' ;5
 RETLW d'183' ;6
 RETLW d'191' ;7
 RETLW d'198' ;8
 RETLW d'205' ;9
 RETLW d'211' ;10
 RETLW d'217' ;11
 RETLW d'223' ;12
 RETLW d'228' ;13
 RETLW d'232' ;14
 RETLW d'235' ;15
 RETLW d'238' ;16
 RETLW d'241' ;17
 RETLW d'243' ;18
 RETLW d'244' ;19
 RETLW d'244' ;20
 RETLW d'244' ;21
 RETLW d'243' ;22
 RETLW d'241' ;23
 RETLW d'238' ;24
 RETLW d'235' ;25
 RETLW d'232' ;26
 RETLW d'228' ;27
 RETLW d'223' ;28
 RETLW d'217' ;29
 RETLW d'211' ;30
 RETLW d'205' ;31
 RETLW d'198' ;32
 RETLW d'191' ;33
 RETLW d'183' ;34
 RETLW d'175' ;35
 RETLW d'167' ;36
 RETLW d'159' ;37
 RETLW d'150' ;38
 RETLW d'142' ;39
 RETLW d'133' ;40
 RETLW d'124' ;41
 RETLW d'116' ;42
 RETLW d'107' ;43
 RETLW d'99' ;44
 RETLW d'91' ;45
 RETLW d'83' ;46
 RETLW d'75' ;47
 RETLW d'68' ;48
 RETLW d'61' ;49
 RETLW d'55' ;50
 RETLW d'49' ;51
 RETLW d'43' ;52
 RETLW d'39' ;53
 RETLW d'34' ;54
 RETLW d'31' ;55
 RETLW d'28' ;56
 RETLW d'25' ;57
 RETLW d'24' ;58
 RETLW d'23' ;59
 RETLW d'22' ;60
 RETLW d'23' ;61
 RETLW d'24' ;62
 RETLW d'25' ;63
 RETLW d'28' ;64
 RETLW d'31' ;65
 RETLW d'34' ;66
 RETLW d'39' ;67
 RETLW d'43' ;68
 RETLW d'49' ;69
 RETLW d'55' ;70
 RETLW d'61' ;71
 RETLW d'68' ;72
 RETLW d'75' ;73
 RETLW d'83' ;74
 RETLW d'91' ;75
 RETLW d'99' ;76
 RETLW d'107' ;77
 RETLW d'116' ;78
 CLRF osc_addr
 RETLW d'124' ;79

 
 
;*********************************************************
; OSC
; osc_addr データを取ってくる番号
;
; 20KHz : 32MHz/4/10命令/40サンプル
;*********************************************************
OSC_SINE_20KHZ
 CLRF osc_addr ;テーブル先頭アドレス
 MOVLB d'2'  ;バンク2
OSC_SINE_20KHZ_LOOP
 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE40_SINE;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1

 MOVF osc_addr, W ;   1
 INCF osc_addr, F ;   1
 CALL GET_TABLE40_SINE;W ← テーブル内容 6
 MOVWF DAC1CON1 ;DAC 出力  1
 BRA OSC_SINE_20KHZ_LOOP ;  2 (計 20/2 = 10clk)
 
GET_TABLE40_SINE
 BRW
 RETLW d'133' ;0
 RETLW d'150' ;1
 RETLW d'167' ;2
 RETLW d'183' ;3
 RETLW d'198' ;4
 RETLW d'211' ;5
 RETLW d'223' ;6
 RETLW d'232' ;7
 RETLW d'238' ;8
 RETLW d'243' ;9
 RETLW d'244' ;10
 RETLW d'243' ;11
 RETLW d'238' ;12
 RETLW d'232' ;13
 RETLW d'223' ;14
 RETLW d'211' ;15
 RETLW d'198' ;16
 RETLW d'183' ;17
 RETLW d'167' ;18
 RETLW d'150' ;19
 RETLW d'133' ;20
 RETLW d'116' ;21
 RETLW d'99' ;22
 RETLW d'83' ;23
 RETLW d'68' ;24
 RETLW d'55' ;25
 RETLW d'43' ;26
 RETLW d'34' ;27
 RETLW d'28' ;28
 RETLW d'24' ;29
 RETLW d'22' ;30
 RETLW d'24' ;31
 RETLW d'28' ;32
 RETLW d'34' ;33
 RETLW d'43' ;34
 RETLW d'55' ;35
 RETLW d'68' ;36
 RETLW d'83' ;37
 RETLW d'99' ;38
 CLRF osc_addr
 RETLW d'116' ;39
 

;*********************************************************
;*********************************************************
;*********************************************************
;*********************************************************
 ORG h'1800'

;*********************************************************
 
 END