COUNTER



新BLOG
 
新BBS
MN-BBS
旧BBS
CALENDAR
S M T W T F S
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
<<  2024 - 05  >>
 
LOGIN
現在モード: ゲストモード
USER ID:
PASS:
CATEGORIES
ARCHIVES
PROFILE
OTHERS
    処理時間 0.80632秒
POWERED BY
POWERED BY
ぶろぐん
DESIGN BY
ブログンサポート
          
---Cのプログラムです。---
 冗長なプログラムですが,Cのプログラムです。PICに密接し

 た設定は,本の丸写しです。

 このプログラムは,タイムアップすると,無限ループに入る

 ようにしています。本番では,ここを,変更して,自分自身

 の電源を切るようにします。アセンブラーでは,各種フラグを

 ビット操作でしていますが,本プログラムでは,贅沢にフラグ

 にいint型の整数を使ってます。データーメモリに余裕がある

 のでこの方がすっきりします。ただ,計算スピードやら,コンパイル

 後のメモリ等については,よく分かりません。

 PICに密接した設定や,割り込みの処理のプログラムがまだ,

 よく分からないところがありますが,その他は,PC用のプログラム

 とあんまり変わりません。 

 /******************************************
99タイマーテスト
********************************************/
#include <pic.h>

__CONFIG(UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);

int sw3;
int sw2;
int sw1;

int sw3_data;
int sw2_data;
int sw1_data;
int sw12_data;

int sec1_data;
int sec10_data;
int min1_data;
int min10_data;

int count;
int count1;
int start_stop;
int entyou;

int buzzer;
int dengen;
int sec1_data_w;
int sec10_data_w;
int min1_data_w;
int min10_data_w;

void count_up(void);
void InitInterTimer0 (void);
void WaitTime (int cnt);
void datahozon(void);
void datasaisettei(void);

void main(void){

CMCON=0X07; //1,2,17,18
PORTA=0xFF;
PORTB=0xFF;
TRISA=0x1C;
TRISB=0x00;

RA0=0;//ブザーoff
RA1=0;//電源オフ
RA7=0;//本体操作

sec1_data=0;
sec10_data=0;
min1_data=0;
min10_data=0;

sw3=1;
sw2=1;
sw1=1;

sw3_data=1;
sw2_data=1;
sw1_data=1;
sw12_data=1;

min1_data_w=min1_data;
min10_data_w=min10_data;

start_stop=0;//初期値ストップ
buzzer=0;
dengen=0;
entyou=0;

// タイマ0割込み設定関数の呼び出し

InitInterTimer0();

// 割込み全体の許可

GIE = 1;


for( ; ; ){


//キー入力チェック1

if(RA2==0){
sw3=0;// スタートストップ
}
if(RA3==0){
sw2=0;//SW2 一分
}
if(RA4==0){
sw1=0;//SW1十分
}

//LED表示

PORTB=0xf0 | sec1_data_w;//秒1位表示
RB4=0;
_delay(250);
RB4=1;

PORTB=0xf0 | sec10_data_w;//秒10位表示
RB5=0;
_delay(250);
RB5=1;

PORTB=0xf0 | min1_data_w;//分1位表示
RB6=0;
_delay(250);
RB6=1;

PORTB=0xf0 | min10_data_w;//分10位表示
RB7=0;
_delay(250);
RB7=1;


//キー入力チェック2
//スタートストップチェック
if(RA2==0){
if(sw3==0){
if(sw3_data==1){
sw3_data=0;
if(start_stop==1){
start_stop=0;
}
else{
if(min1_data_w>0 || min10_data_w>0){
datahozon();
}
start_stop=1;
buzzer=0;
}
}
}
}
else{
sw3_data=1;
sw3=1;
}
//**************************************
//1分操作
if(RA3==0){
if(sw2==0){
if(sw2_data==1){
sw2_data=0;
if(start_stop==0){
sec1_data_w=0;
sec10_data_w=0;
if(min1_data_w<9){
min1_data_w++;
}
else{
min1_data_w=0;
}
}
}
}
}
else{
sw2_data=1;
sw2=1;
}
//**************************************
//10分操作
if(RA4==0){
if(sw1==0){
if(sw1_data==1){
sw1_data=0;
if(start_stop==0){
sec1_data_w=0;
sec10_data_w=0;
if(min10_data_w<9){
min10_data_w++;
}
else{
min10_data_w=0;
}
}
}
}
}
else{
sw1_data=1;
sw1=1;
}
//****************************************
//同時操作
if(sw2_data==0){
if(sw1_data==0){
if(sw12_data==1){
sw12_data=0;
if(start_stop==0){
min1_data_w=0;
min10_data_w=0;
}
}
}
else{
sw12_data=1;
}
}
else{
sw12_data=1;
sw1=1;
sw2=1;
}

//*******ブザーオンオフ*********************************
if(buzzer==1){
if(min1_data_w==0 && min10_data_w==0 && sec10_data_w==0 && sec1_data_w==0){
if(RA0==0){RA0=1;}
}
if(min1_data_w>0 || min10_data_w>0 || sec10_data_w>0 || sec1_data_w>0){
if(RA1==0){RA1=1;}//電源オン
}
}
if(buzzer==0){
if(RA0==1){
RA0=0;
entyou=0;
sec1_data_w=0;
sec10_data_w=0;
datasaisettei();
}
}

}

}

// 割込みサービスルーチン
static void interrupt isr(){

//****************延長処理*********************
if(entyou==1){
if(count<1950){
count++;
}
else{
if(sec1_data_w>0){
sec1_data_w--;
buzzer=1;
count=0;
}
else{
if(sec10_data_w>0){
sec10_data_w--;
sec1_data_w=9;
count=0;
}
else{
RA7=1;//******************本体電源もオフ*********************
for( ; ; ){ }
}
}
}
}



//***************カウントダウン**************
if(start_stop==1){
if(count<1950){
count++;
}
else{
if(sec1_data_w>0){
sec1_data_w--;
buzzer=1;
count=0;
}
else{
if(sec10_data_w>0){
sec10_data_w--;
sec1_data_w=9;
count=0;
}
else{
if(min1_data_w>0){
min1_data_w--;
sec10_data_w=5;
sec1_data_w=9;
count=0;
}
else{
if(min10_data_w>0){
min10_data_w--;
min1_data_w=9;
sec1_data_w=9;
sec10_data_w=5;
count=0;
}
else{
count=0;
entyou=1;
start_stop=0;
sec1_data_w=9;
sec10_data_w=5;
}
}
}

}
}
}
//***********************カウントダウン終了********************



// タイマ0割込みフラグをクリア
T0IF = 0;

}


void InitInterTimer0 (void){
// クロック源を内部クロックに設定
T0CS = 0;

// プリスケーラをタイマ0に割り当て
PSA = 0;

// プリスケーラ値を2に設定
PS2 = 0;
PS1 = 0;
PS0 = 0;

// TMR0レジスタをクリア
TMR0 = 0x00;

// タイマ0割込みフラグをクリア
T0IF = 0;

// タイマ0割込みの許可
T0IE = 1;
}

// 待ち時間関数の呼び出し
void WaitTime (int cnt){

while(cnt > 0){
cnt--;}
}

void datahozon(void){
min1_data=min1_data_w;
min10_data=min10_data_w;
}

void datasaisettei(void){
min1_data_w=min1_data;
min10_data_w=min10_data;
}Webはくしゅ

| mabo52 | 19:05 | comments (0) | trackback (0) | DIY |
コメント

コメントする









この記事のトラックバックURL
http://mabo52.sakura.ne.jp/tb.php/429
トラックバック

こんな物欲しいな
CLOCK
NEW ENTRIES
COMMENTS
    ---SPINDLEのPWM制御 (その2) (7)
  • TR >06.18
    ---番外編---
  • TR >06.02
    ---SPINDLEのPWM制御 (その2) (5)
  • mabo >05.30
保留中コメント:10件
LINKS
    相互リンクさせていただいてます。
  • The Rider
Search Box
名言集
メール
   
連絡は下記から
名前:

メールアドレス:

件名:

メッセージ(必須):


TOP PAGE