アプリ版:「スタンプのみでお礼する」機能のリリースについて

H8/3052Fマイコンで時計を作ろうとしているのですが、時間をセットするプログラムがどうしても書けません。
4つのボタンを使って時刻設定するプログラムを教えてもらえませんか?

ちなみに時・分・秒を一秒ずつ刻むことはできます。

A 回答 (10件)

まったく書けないの、それとも途中まで書いたの?



どちらにしても、どのような構造にするかまでは決まっていますか?

クロックは25MHz?
時計はタイマーの割り込みで時間を加算しているのですか?

時刻を刻むことができるなら、なにか構造体を定義して、そこに時間をセットしているんですよね、それとも別な機能を使っていますか?

この回答への補足

まったく書けません。
1つ目のスイッチで設定できるようにし、
2つ目でアップ、3つ目でセットできるようにできたらいいかと思います。
クロックは25MHzです。
割り込みを使って時間を加算しています。
このような感じです↓
/*メイン関数*/
int main(void)
{
lcd_init();
lcd_puts(str);
start_itu0();
EI;
for(;;) {
if (cnt >=100) {
cnt = 0;
sec++;
if (sec >=60) {
sec = 0;
min++;
if (min >= 60) {
min = 0;
hour++;
if (hour >= 24) hour = 0;
}
str[6] = '0' + hour /10;
str[7] = '0' + hour %10;
str[9] = '0' + min /10;
str[10] = '0' + min %10;
str[12] = '0' + sec /10;
str[13] = '0' + sec %10;
lcd_home();
lcd_puts(str);
}
}
}
return 0;
}
/*IMIA0割り込み処理関数*/
void int_imia0(void)
{
DI; /*割り込み禁止*/
TSR0 &=0xfe;
cnt++;
EI; /*割り込み許可*/
}

補足日時:2006/02/28 12:44
    • good
    • 0

こんにちは。



実現方法は何パターンか存在しますが、簡単(?)な方法を記述します。
まず10~20ms定周期処理を作りボタンの入力処理を作る。
ボタン入力に関してですが、内部プルアップで未入力時はHi、入力時は
LOがポートに入るものとして話を進めます。

まず入力ポートがHiからLOに切り替わった地点から3回10~20ms
間隔でポートサンプリングし3回Loを検出した段階で入力確定とします。
(チャタリングによる誤入力防止)
入力が確定したら単純に時間バッファをインクリメントしてやる。

単純になにも考えなければ上記で良いと思います。
ボタンも4つではなく3つ(時間、分、秒)でいけると思います。
どうしても4つ使わなければいけないのであれば、ボタンAを
モード切替ボタン(入力の度に設定モードと時計モードを切り替える)
ボタンB、C、Dを時間設定ボタンとし設定モード以外の入力は無効
といった感じに仕様を考えていって下さい。
(私なら2ボタン仕様にしますが・・・)

簡単ですが参考にして下さい。
また何か有れば回答しますので、補足下さい。

この回答への補足

ご丁寧にありがとうございます。
しかし,言葉ではわかるのですがそれをプログラムに直すことができないのですがどうしたらいいのでしょうか。

補足日時:2006/02/28 12:42
    • good
    • 0

こんにちは#2です。



>1つ目のスイッチで設定できるようにし、
>2つ目でアップ、3つ目でセットできるようにできたらいいかと思います。
ということは1つめのスイッチで設定個所の切替(時間→分→秒)
スイッチ2,3で設定個所の時間表示をUP or Downすると
いうことですね。

それじゃぁまず100ms毎にタイマ割込みを発生させる為に
別タイマ割込み処理を作りましょう。
今回は入力処理を簡単にする為にノイズに関しては特に考えない仕様
にします。100ms間隔でポートをサンプリングしポートがHI→LO
またはLO→HIになった段階で入力確定とします。

(例)ポート入力判定処理(設定切替SW)
void Sel_Swin(void)
{
□□if((ポート前回値 == HI)&&
□□□(ポート取得値 == LO))/* HI→LO検出? */
□□{
□□□□++時間データテーブルの添え字;
□□□□if( 時間データテーブルの添え字 == テーブル終端? )
□□□□{
□□□□□□時間データテーブルの添え字 = 0;
□□□□}
□□}
□□ポート前回値バッファ = ポート取得値;
}

(例)ポート入力判定処理(時間UPSW)
void Up_Swin(void)
{
□□if((ポート前回値 == HI)&&
□□□(ポート取得値 == LO))/* HI→LO検出? */
□□{
□□□□++時間データテーブル[時間データテーブルの添え字];/* オーバーフロー対策すること */
□□}
□□ポート前回値バッファ = ポート取得値;
}

□は半角スペースです。
時間データは配列変数に格納します。
[0]が時間、[1]が秒といった感じ。
上記の処理のままだと、表示の更新タイミングは1秒毎のまま
なのでちょっと違和感ありますね。
その辺も意識して作って見てください。

また何かあれば補足下さい。ちょくちょく見にきますんで。

この回答への補足

本当に本当にご丁寧にありがとうございます!!!
なぜそんなに親切なのですか??
今すぐに試したいのですが,時間がないため夜ごろになりそうです!
もし何かわからないことがあったとき,またご迷惑をかけるかもしれません。本当にすみませんがご協力お願いします。
また,私にできることがあればできる限りの範囲で力になれればと思います!!

補足日時:2006/02/28 14:08
    • good
    • 0
この回答へのお礼

ポート前回値 ポート取得値 時間データテーブルの添え字 ポート前回値バッファ には,具体的にどのようなものが入るのですか??

お礼日時:2006/02/28 17:45

こんにちは。

#3です。

>ポート前回値 ポート取得値 時間データテーブルの添え字 ポート前回値バッファ には,具体的にどのようなものが入るのですか??
ポート前回値、ポート前回値バッファは同じバッファです。
ポート前回値 or 時間データテーブルの添え字には単純に変数名が入ります。
グローバル変数を用意して、置換えして下さい。
あとポート取得値に関してですが、マイコンのレジスタにアクセスする
為のdefine定義が有ると思いますのでそれを使用して下さい。
(例)http://www.sendai-ct.ac.jp/~ckuma/micom/3052/305 …

(例ポート11をSW入力とした場合)
□□□(P1.B1 == LO))/* HI→LO検出? */

URLのレジスタ定義を使用すると上記のような記述になります。

一応こんな感じの回答で良いですか?
また何かあれば補足下さい。

この回答への補足

このような感じですか??
P4.PCR.BYTE = 0xff;
j = str[];
if((P4.DDR == HI)&&(P4.PCR.BYTE == LO))
{
++j;
if(j == 13)
{
j = 0;
}
}
P4.DDR = P4.PCR.BYTE;
}
/* 時間UPSW */

void Up_Swin(void)
{
if((P4.DDR == HI)&&(P4.PCR.BYTE == LO))
{
++str[0];
}
P4.DDR = P4.PCR.BYTE;
}

補足日時:2006/03/02 12:20
    • good
    • 0

こんにちは#4です。



一応私のイメージを貼り付けときます。

#define HI 1/* ポート状態HI */
#define LO 0/* ポート状態LO */
#define TIM_TBL_END 3/* テーブル終端判定用定義 */

char SelSwPrev;/*設定切替SW前回値*/
char UpSwPrev;/*時間UPSW前回値*/
char TimTbl[3];/*時間テーブル[0]=時間[1]=分[2]=秒 */
char TimTblIdx;/*時間テーブルインデックス*/

/* スイッチ入力初期化処理 */
void SwIn_Init(void)
{
□□P4.DDR = 0x00;/*ポート4を入力ポートとして設定*/
□□P4.PCR.BYTE = 0xff;/*ポート4をプルアップ設定*/
□□SelSwPrev = HI;/*設定切替SW情報格納バッファ初期化*/
□□UpSwPrev = HI;/*UP SW情報格納バッファ初期化*/
□□TimTblIdx = 0;/*テーブルインデックスバッファ初期化*/

}

/* 設定切替SW入力判定処理 */
void Sel_Swin(void)
{
□□if((SelSwPrev == HI)&&
□□□(P4.DR.BX == LO))/* HI→LO検出? */
□□{
□□□□++TimTblIdx;
□□□□if( TimTblIdx >= TIM_TBL_END )
□□□□{
□□□□□□TimTblIdx = 0;
□□□□}
□□}
□□SelSwPrev = P4.DR.BX;
}

P4.DR.BXのX部分には設定切替SW入力のポート番号が入る

/* UPSW入力判定処理 */
void Up_Swin(void)
{
□□if((UpSwPrev == HI)&&
□□□(P4.DR.BX == LO))/* HI→LO検出? */
□□{
□□□□++TimTbl[TimTblIdx];/* オーバーフロー対策すること */
□□}
□□UpSwPrev = P4.DR.BX;
}

P4.DR.BXのX部分にはUPSW入力のポート番号が入る

ここどーなってんの??みたいな所があれば補足下さい。

この回答への補足

In function 'SwIn_Init'や'P4PCRBYTE'undeclaredがでてきました・・・

補足日時:2006/03/02 16:21
    • good
    • 0
この回答へのお礼

これの秒が表示されないのはなぜですか??
/*メイン関数*/
int main(void)
{
lcd_init();
lcd_puts(str);
start_itu0();
EI;
for(;;) {
if (cnt >=100) {
cnt = 0;
sec++;
if (sec >=60) {
sec = 0;
min++;
if (min >= 60) {
min = 0;
hour++;
if (hour >= 24) hour = 0;
}
str[6] = '0' + hour /10;
str[7] = '0' + hour %10;
str[9] = '0' + min /10;
str[10] = '0' + min %10;
str[12] = '0' + sec /10;
str[13] = '0' + sec %10;
lcd_home();
lcd_puts(str);
}
}
}
return 0;
}

/*ITUOの初期設定*/
void start_itu0(void)
{
TCR0 = ITU_CLEAR_GRA + ITU_CLOCK8;
TIOR0 = 0;
GRA0 = 31250;
TIER0 = ITU_IE_IMFA;
TSTR = 1;
}

お礼日時:2006/03/02 17:44

こんにちは。

 #5です。

>In function 'SwIn_Init'や'P4PCRBYTE'undeclaredがでてきました・・・
P4PCRBYTE→P4.PCR.BYTE
「.」が抜けてませんか?
    • good
    • 0

こんにちは。

 #6です。

>これの秒が表示されないのはなぜですか??
あれっ?
時間刻みと表示はうまくいってたんじゃなかったの??
それとも別件ですか?

この回答への補足

やっぱり秒だけがうつらないんです。
まあこれはいいとしても・・

補足日時:2006/03/02 22:06
    • good
    • 0

こんにちは。

 LUMINOQ-です。

苦戦してますね。
実際にソース一式見ることが出来たらもうちょっと的確なアドバイス
ができるんですが・・・・

この回答への補足

遅くなってすみません!!
ソースすべてを見ていただきたいのですが,文字数がオーバーしてしまって書ききれないのですよ;;

補足日時:2006/03/06 10:30
    • good
    • 0

こんにちは。

 LUMINOQ-です。

>ソースすべてを見ていただきたいのですが,文字数がオーバーしてしまって書ききれないのですよ;;
公開しても問題ないような物でしたら、適当な所にアップロードすれば
よいと思いますよ。
(参考)http://up00.hyperbit.info/up/trash-box/
  上記URLの下部の「アップロードフォームに行く。」をクリックで
  最大50MBまでファイルをアップロードできるようです。
  ソースファイル一式を圧縮してアップしてみて下さい。

この回答への補足

遅くなってすみません
20060326104239093にアップロードしました!!
もしよろしければ確認お願いします。

補足日時:2006/03/26 10:43
    • good
    • 0

こんにちは。

 LUMINOQ-です。

確認してみましたが無くなってました。
私が紹介したURLの所で良いんですよね??

すみませんがもう一度UPしてもらえますか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!