' ' ********************************************** ' * * ' * AVR & BASCOM-AVR トレーニング・ボード * ' * 初期設定 Ver.1.01 * ' * * ' * AVR is using ATmega88P * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2010.10.29 * ' ********************************************** ' $regfile = "m88pdef.dat" '使用するAVRを設定。 $crystal = 16000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Sw_1 Alias Pind.0 'スイッチ[1]の接続ポート。 Sw_2 Alias Pind.1 'スイッチ[2]の接続ポート。 Sw_3 Alias Pind.2 'スイッチ[3]の接続ポート。 Sw_4 Alias Pind.3 'スイッチ[4]の接続ポート。 ' Led_1r Alias Portd.4 'LED1[赤]の接続ポート。 Led_2g Alias Portd.5 'LED2[緑]の接続ポート。 Led_3y Alias Portd.6 'LED3[黄]の接続ポート。 Led_4b Alias Portd.7 'LED4[青]の接続ポート。 Sp_out Alias Portc.5 'スピーカーの接続ポート。 ' Ad_photo Alias 0 '光センサーのA/Dコンバータ・チャネル番号。 Ad_thermo Alias 1 '温度センサーのA/Dコンバータ・チャネル番号。 Ad_ain1 Alias 2 '測定入力[1]のA/Dコンバータ・チャネル番号。 Ad_ain2 Alias 3 '測定入力[2]のA/Dコンバータ・チャネル番号。 Ad_ain3 Alias 4 '測定入力[3]のA/Dコンバータ・チャネル番号。 Ad_spin Alias 5 'スピーカー入力のA/Dコンバータ・チャネル番号。 ' ' * ポートの初期設定 * ' Config Led_1r = Output 'LED1の接続ポートを出力に設定する。 Config Led_2g = Output 'LED2の接続ポートを出力に設定する。 Config Led_3y = Output 'LED3の接続ポートを出力に設定する。 Config Led_4b = Output 'LED4の接続ポートを出力に設定する。 Config Sp_out = Output 'スピーカーの接続ポートを出力に設定する。 ' Set Portd.0 'スイッチ[1]の接続ポートをプルアップする。 Set Portd.1 'スイッチ[2]の接続ポートをプルアップする。 Set Portd.2 'スイッチ[3]の接続ポートをプルアップする。 Set Portd.3 'スイッチ[4]の接続ポートをプルアップする。 Didr0 = &B00111111 'デジタル入力禁止レジスタの設定。 ' ' * LCDの初期設定 * ' Config Lcdmode = Port 'LCDを4ビットのポートモードに設定。 Config Lcdbus = 4 'LCDデータバスを4bitに設定。 Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 'LCDのポート割り当て。 Config Lcdpin = Pin , Db6 = Portb.1 , Db7 = Portb.0 Config Lcdpin = Pin , E = Portb.4 , Rs = Portb.5 Config Lcd = 16 * 2 'LCD表示を16文字2行に設定。 Cls 'LCD表示をすべて消去。 ' ' * A/Dコンバータの初期設定 * ' Config Adc = Single , Prescaler = Auto , Reference = Avcc 'A/Dコンバータの設定。 Start Adc 'A/Dコンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' ' ' *********************************** ' * PCF8574 外部スイッチ増設 テスト * ' * 2021. 2.26 * ' *********************************** ' ' ' * 変数の宣言 * ' Dim Swflag As Byte 'スイッチのOFF確認中フラグ。 Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 ' ' * PCF8574のI2C設定 * ' Const Pcf8574adr = &H40 'PCF8574のスレーブ・アドレスを選択。(&H40,&H42,&H44,&H46,&H48,&H4A,&H4C,&H4E) ' Config I2cdelay = 10 'SCLのクロック周波数 = 約42KHz。(AVRクロック16MHz時) (*最大100KHz) Config Scl = Portd.2 'I2CバスのSCLラインを接続するポートピンを設定。 Config Sda = Portd.3 'I2CバスのSDAラインを接続するポートピンを設定。 I2cinit 'I2CバスのSCL,SDAラインを初期化する。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Cursor Off 'LCDのカーソルをオフにする。 Lcd "PCF8574" ' Main: Gosub Pcf8574read 'PCF8574のポートからデータを読み出す。 Locate 1 , 9 Lcd Bin(temp1) 'ポートの状態をLCDにバイナリー表示する。 ' ' * スイッチに対応したLEDを点灯させる * ' Temp2 = Temp1 Shift Temp1 , Left , 4 'スイッチの状態を上位4ビットに移す。 Temp1 = Temp1 Or &B0000_1111 'スイッチの接続ポートを入力に保つ。 Gosub Pcf8574write 'PCF8574のポートへデータを出力する。 ' ' * 押されたスイッチの情報をLCDに表示する * ' Temp1 = Temp2 And &B0000_1111 'スイッチの接続ポート以外をマスクする。 If Temp1 <> &B0000_1111 Then 'If いずれかのスイッチが押されたか? Then If Swflag = 0 Then 'If スイッチのOFF確認中ではないか? Then If Temp1.0 = 0 Then 'If [SW1]が押されているか? Then Locate 2 , 2 Lcd "SW1" End If ' If Temp1.1 = 0 Then 'If [SW2]が押されているか? Then Locate 2 , 6 Lcd "SW2" End If ' If Temp1.2 = 0 Then 'If [SW3]が押されているか? Then Locate 2 , 10 Lcd "SW3" End If ' If Temp1.3 = 0 Then 'If [SW4]が押されているか? Then Locate 2 , 14 Lcd "SW4" End If ' Sound Sp_out , 200 , 333 '4000Hzの音を50mS鳴らす。 Waitms 30 'チャタリングの除去時間。 Swflag = 1 'スイッチのOFF確認中にする。 End If Else 'スイッチが離された場合。 If Swflag = 1 Then 'If スイッチのOFF確認中か? Then Locate 2 , 1 Lcd Spc(16) 'LCDの2行目を消去する。 Waitms 30 'チャタリングの除去時間。 Swflag = 0 'スイッチのOFF確認中をクリアする。 End If End If ' Goto Main '-------------------------------------------------------------------------------------------------- ' ' ************************************************* ' * PCF8574のポートへデータを出力するサブルーチン * (Temp1 = ポートへ出力するデータ) ' ************************************************* ' Pcf8574write: I2cstart '[スタート・コンディション] の状態にする。 I2cwbyte Pcf8574adr '8bitスレーブ・アドレス(書き込み)を送信。 I2cwbyte Temp1 'データを書き込む。 I2cstop '[ストップ・コンディション] の状態にする。 Return ' ' *************************************************** ' * PCF8574のポートからデータを読み出すサブルーチン * (Temp1 = 読み出したポートの状態) ' *************************************************** ' Pcf8574read: I2cstart '[スタート・コンディション] の状態にする。 I2cwbyte Pcf8574adr + 1 '8bitスレーブ・アドレス(読み出し)を送信。 I2crbyte Temp1 , Nack 'データを読み出す。 I2cstop '[ストップ・コンディション] の状態にする。 Return ' ' End