この前作った正弦波のプログラムを約束どおりにLED用ホタル点灯に改造したよ。
LED用出力と点灯周期を変更する押しボタンを高速、低速の2つ付けたのだ。
これは押し続けると周期がだんだん高速または低速になっていくものだ。
5V電源の場合、LEDには抵抗200Ωぐらいを直列にしてね。
3Vの場合は100Ωぐらいでいいよ。
押しボタンのピンは5VとPICの足の間に10kΩ抵抗。プルアップって接続だね。
んでPICの足とGNDの間に押しボタンだ。これをGP1,GP2同様に作るのだ。
まあ 一般的な配線なのでわからないときはHPのいろんな回路図を見て気が付いてくれ。
ではプログラムだ 例によってコピペしてASMファイルを作ってちょーだい。
前のプログラムとどこが違うかよーく見てお勉強してね。
勉強しなくても遊べるから安心するよーに。
; PIC12F675 SIN波形LED
; _____________
; VDD 5V =1; ;8= 0V VSS
; =2;(GP5) (GP0);7=LED
; =3;(GP4) (GP1);6=PB LOW
; =4;(GP3) (GP2);5=PB HIGH
; ______________
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
list p=12f675 ; 翻訳時にリストファイルを作ります
#include <p12f675.inc> ; 12F675用定義ファイルを読み込みます
;ASMファイルでは「;」より右側は読み取りませんので注意書きなり落書きが可能です。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
__CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _MCLRE_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT ;4MHz
;_HS_OSC ;10MHz
;↑↑動かす条件です。機種によっていろいろ取り決めはありますが、これらは理屈抜きに覚えてください。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
errorlevel -302 ; 翻訳時に302エラーが出ないようにします
radix dec ; 省略時の数値表現を10進数にします。
ORG 000H
GOTO INIT
DATA_0 EQU 20H ;
DATA_1 EQU 21H ;
DATA_1A EQU 22H ;
CNT EQU 23H ;
SPEED_1 EQU 24H ;
SPEED_2 EQU 25H ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;<<<初期化ルーチン>>>
INIT:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;プログラムは「GOTO」などの命令がない限り下へ下へと降りて行きます。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BSF STATUS,RP0 ;BANK1に切り替え STATUS,RP0を1にするという意味
MOVLW B'00000110'
MOVWF TRISIO ;GPIO
MOVLW B'10000111'
MOVWF OPTION_REG ;
CLRF ANSEL
BCF STATUS,RP0 ;BANK0に切り替え STATUS,RP0を0にするという意味
MOVLW B'00000111' ;GP2,GP1,GP0,
MOVWF CMCON
CLRF DATA_0
CLRF DATA_1
CLRF DATA_1A
CLRF CNT
MOVLW D'128'
MOVWF SPEED_1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN0
CALL PTN_DATA ;データパターンへ
MOVWF DATA_1 ;<<PWM分子入力>>
INCF CNT,F ;データカウント更新
MOVLW D'64' ;データ総数
SUBWF CNT,W
BTFSC STATUS,C ;データ総数カウント完了?
CLRF CNT ;YES
;NO
MAIN1 ;<<PWM分母入力>>
MOVLW D'64'
MOVWF DATA_0
;<<PWM分母入力>>
MOVF DATA_1,W
MOVWF DATA_1A
;<<データ値0チェック>>
MOVF DATA_1,F ;DATA_1=0?
BTFSS STATUS,Z ;
GOTO MAIN2 ;NO
BCF GPIO,0 ;YES
GOTO MAIN3
MAIN2 ;<<分子減少>>
BSF GPIO,0
DECFSZ DATA_1A ;分子-1=0?
GOTO MAIN3 ;NO
BCF GPIO,0 ;YES
MAIN3 ;<<分母減少>>
DECFSZ DATA_0,F ;分母-1=0?
GOTO MAIN4 ;NO
;YES
;<<SPEED_1値0チェック>>
DECFSZ SPEED_2,F ;SPEED_2-1=0?
GOTO MAIN1 ;N0
;YES
BTFSC GPIO,1 ;GP1 ON?
GOTO MAIN3_1 ;NO
INCF SPEED_1,F ;YES
GOTO MAIN3_2
MAIN3_1
BTFSC GPIO,2 ;GP2 ON?
GOTO MAIN3_2 ;NO
DECF SPEED_1,F ;YES
GOTO MAIN3_2
MAIN3_2
MOVF SPEED_1,W
MOVWF SPEED_2
GOTO MAIN0
MAIN4 ;<<GP0オフチェック >>
BTFSC GPIO,0 ;GP0 ON?
GOTO MAIN2 ;YES
NOP ;NO
NOP
NOP
GOTO MAIN3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PTN_DATA
MOVF CNT,W
ADDWF PCL,F
RETLW D'32'
RETLW D'35'
RETLW D'38'
RETLW D'41'
RETLW D'44'
RETLW D'47'
RETLW D'50'
RETLW D'52'
RETLW D'55'
RETLW D'57'
RETLW D'59'
RETLW D'60'
RETLW D'62'
RETLW D'63'
RETLW D'63'
RETLW D'64'
RETLW D'64'
RETLW D'64'
RETLW D'63'
RETLW D'63'
RETLW D'62'
RETLW D'60'
RETLW D'59'
RETLW D'57'
RETLW D'55'
RETLW D'52'
RETLW D'50'
RETLW D'47'
RETLW D'44'
RETLW D'41'
RETLW D'38'
RETLW D'35'
RETLW D'32'
RETLW D'29'
RETLW D'26'
RETLW D'23'
RETLW D'20'
RETLW D'17'
RETLW D'14'
RETLW D'12'
RETLW D'9'
RETLW D'7'
RETLW D'5'
RETLW D'4'
RETLW D'2'
RETLW D'1'
RETLW D'1'
RETLW D'0'
RETLW D'0'
RETLW D'0'
RETLW D'1'
RETLW D'1'
RETLW D'2'
RETLW D'4'
RETLW D'5'
RETLW D'7'
RETLW D'9'
RETLW D'12'
RETLW D'14'
RETLW D'17'
RETLW D'20'
RETLW D'23'
RETLW D'26'
RETLW D'29'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
今日は PICらしい話題だっただろ?
んじゃ またね~~~~。