So-net無料ブログ作成
検索選択
mikroC PRO ブログトップ

C言語は方言がきついのでしょうか? [mikroC PRO]

mikroC PRO は 例文が少なく マニュアルだけでは、LCD表示の法則が見いだされません。
表示の確認
sIMG_0539.jpg 
// ********************
// LCD SC802A
// 1 Vss 2 Vdd
// 3 VO 4 RS
// 5 R/W(G) 6 E
// 7 D0 8 D1
// 9 D2 10 D3
// 11 D4 12 D5
// 13 D6 14 D7
// 15 BLA 16 BLK

// 16F628A
//1 RA2 LCD_5 18 RA1 LCD_6
//2 RA3 LCD_4 17 RA0 LCD_7
//3 RA4 NC 16 RA7 OSC1 XTal IN
//4 RA5 MCLR ICSP Vpp 15 RA6 OSC2 XTal OUT
//5 Vss ICSP Vss 14 Vdd ICSP Vdd
//6 RB0 SW1 13 RB7 LCD_EN ICSP PGD
//7 RB1 SW2 12 RB6 T1CK_IN ICSP PGC
//8 RB2 LED 11 RB5 NC LCD_RW(G)
//9 RB3 uPB1507GV SEL 10 RB4 LCD_RS

// ********************
// Lcd_INT;
// Lcd_Custom_Config(&PORTA,0,1,2,3,&PORTB,4,5,7);
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB7_bit;
sbit LCD_D7 at RA0_bit;
sbit LCD_D6 at RA1_bit;
sbit LCD_D5 at RA2_bit;
sbit LCD_D4 at RA3_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB7_bit;
sbit LCD_D7_Direction at TRISA0_bit;
sbit LCD_D6_Direction at TRISA1_bit;
sbit LCD_D5_Direction at TRISA2_bit;
sbit LCD_D4_Direction at TRISA3_bit;
// End LCD module connections
// ********************

char *res;
char t;
char txt[4];

void main() {
CMCON = 0b00000111; //Comparators Off
VRCON = 0b00000000; //RA7
// PORT is SET
TRISA = 0b10100000; // PORTAの方向 osc1 osc2 mclr nc lcd4 lcd5 lcd6 lcd7
TRISB = 0b01000011; // PORTBの方向 en sigin r/w rs 64 led sw2 sw1
OPTION_REG.F7 = 0; // PORTB PULLUP

// ********************
// LCD(DISP)INIT
LCD_Init(); // 2.4mS
Delay_us(2400);
Lcd_Cmd(_LCD_CURSOR_OFF); // 40uS
Delay_us(40);
Lcd_Cmd(_LCD_CLEAR); // 1.6mS
Delay_us(1600);

for ( ; ; ) {

t = 11;
// t = 01;
ByteToStr(t, txt); // txt is "11" (one blank here)
res = Ltrim(txt);
Lcd_Out(1, 1, txt);
Delay_us(1600);

t = 23;
ByteToStr(t, txt); // txt is "23" (one blank here)
res = Ltrim(txt);
Lcd_Out(1, 3, res);
Delay_us(1600);

t = 45;
ByteToStr(t, txt); // txt is "45" (one blank here)
res = Ltrim(txt);
Lcd_Out(1, 5, res);
Delay_us(1600);

t = 67;
ByteToStr(t, txt); // txt is "67" (one blank here)
res = Ltrim(txt);
Lcd_Out(1, 7, res);
Delay_us(1600);

Delay_ms(1000);

Lcd_Out(2, 1, "01234567");
Delay_ms(1000);

// Lcd_Cmd(_LCD_CLEAR); // 1.6mS
// Delay_us(1600);

// I Can Display
// "11234567"
// "01234567"
// or
// "1 234567"
// "01234567"
// I Want Display
// "01234567"
// "01234567"
// Is it possible?
}
}
押しボタンによる計数
sIMG_0536.jpg 
For UP / DOWN counter.

Hello everyone
Using the two push buttons, and made the UP / DOWN counter.
Display will cycle through the numbers from 0 to 63.
Has issued a LCD8-2 displayed in order to know the internal state.
Count will continue to press the push button and fast.
Numbers, but will stop when you release, the rate of change is slower.
Speed ​​will change to the stage from 10 to 50mS 5mS.
1 is equivalent to 5mS.
When you press the button in the middle of a change, and then counted with a rate of change at that time.
(HOLD is 1) will display the number of state circulation, rate of change, of buttons,
Stability, although it is planned to become 10 in HOLD,
Are shown thinner the position of "0" 10.
What has actually changed, what looks past the display position is changed, not be determined.
Can you confirm that?
Sincerely yours
APOLLO21


コメント(0) 

少しだけC言語のお勉強が進みました。 [mikroC PRO]

と言いましても、対象は「MIKROC PRO」でして、

制御に必要な記述方法を見つけ出すことが出来ません。

TMR1とTMR2を使い、精度は追求しませんが、小型で使いやすいものにしたいのです。

普通のカウンタは1秒と0.1病のレンジが多いのですが、今回は0.6秒レンジも付けたいと思っています。

(経験から0.6秒が一番見やすかった、そのため精度が少し心配です)

まずは試験のため、2個の押しボタンをファンクション設定に使い、

長押しでだんだん早くなり、離すとカウントタイマー速度が低下する様にしました。

以前見たことがあるのは離すとカウントもゆっくりに成って停止しますが、

今回のは離したら即停止で、タイマーだけが戻って行き、途中で押すとその時の速度でカウントします。

もう一つ良く判らないのは、バイナリを文字に変換して、決めた位置に表示させるのが上手く行かず、

1桁ずれてしまいますが、(ずれない部分もある)マニュアルを何度読んでもその辺りの所が判りませんでした。

ICPSを使える様にすると、コンパイラーとPickit2を交互に使い、

LCDを外してPickit2を差し、コンパイルできると、自動的に書き込んでくれるのは便利でした。

また「CTL-ALT-D」 で表示される(とメーカーは云う)文例で

Bpoart の PULLUP フラグSET

// const register unsigned short int NOT_RBPU = 7;  // poartb pullup enable
// sbit                                  NOT_RBPU_bit at OPTION_REG.B7;

は働かず、「 OPTION_REG.F7 = 0; // PORTB PULLUP」で働きました。

(実は働いたのもあるのですが、働かないのもあって、その条件をメーカに問い合わせても要領を得ず諦めました)

LCD コンフィグレーションの

 Lcd_Cmd(_LCD_CURSOR_OFF); 等のコマンドは

あらかじめ 

#define                            LCD_Custom_Init    LCD_Init

の様に定義をして読み替えることが出来ますが、

//            Lcd_INT;
//            Lcd_Custom_Config(&PORTA,0,1,2,3,&PORTB,4,5,7);
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB7_bit;
sbit LCD_D7 at RA0_bit;
sbit LCD_D6 at RA1_bit;
sbit LCD_D5 at RA2_bit;
sbit LCD_D4 at RA3_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB7_bit;
sbit LCD_D7_Direction at TRISA0_bit;
sbit LCD_D6_Direction at TRISA1_bit;
sbit LCD_D5_Direction at TRISA2_bit;
sbit LCD_D4_Direction at TRISA3_bit;
// End LCD module connections

はメーカの指定通りでないと働かなかったです。

次は 押しボタン関連の練習プログラムですが、書いた様には動くのですが、

思う様には書けないものです。

// ********************
// LCD
// 1  Vss    2 Vdd
// 3  VO     4 RS
// 5  R/W(G) 6 E
// 7  D0     8 D1
// 9  D2     10 D3
// 11 D4     12 D5
// 13 D6     14 D7
// 15 BLA    16 BLK

// 16F628A
//1 RA2 LCD_5         18 RA1 LCD_6
//2 RA3 LCD_4         17 RA0 LCD_7
//3 RA4 NC            16 RA7 OSC1 XTal IN
//4 RA5 MCLR ICSP Vpp 15 RA6 OSC2 XTal OUT
//5 Vss ICSP Vss      14 Vdd ICSP Vdd
//6 RB0 SW1           13 RB7 LCD_EN ICSP PGD
//7 RB1 SW2           12 RB6 T1CK_IN ICSP PGC
//8 RB2 LED           11 RB5 NC LCD_RW(G)
//9 RB3 uPB1507GV SEL 10 RB4 LCD_RS

// ********************

#define        sw1 PORTB.F0
#define        sw2 PORTB.F1
#define        LED PORTB.F2

//#define        SW1_ON   Button(&PORTB, 0, 30, 0)
//#define        SW1_OFF  Button(&PORTB, 0, 30, 1)
//#define        SW2_ON   Button(&PORTB, 1, 30, 0)
//#define        SW2_OFF  Button(&PORTB, 1, 30, 1)

//#define        SW_UP  ((SW1_ON) * (SW2_OFF))
//#define        SW_DW  ((SW2_ON) * (SW1_OFF))
//#define        SW_HOLD  ((SW2_ON) * (SW1_ON) + (SW2_OFF) * (SW1_OFF))

// ********************
 static char* msg;
 static char  txt[20];
 static char  txt1[2];
        char  SW_HOLD;
 static char  COUNT;
 static char  TIMA;
 static char  TIMB;

// const register unsigned short int NOT_RBPU = 7;  // poartb pullup enable
// sbit                                  NOT_RBPU_bit at OPTION_REG.B7;

//            Lcd_INT;
//            Lcd_Custom_Config(&PORTA,0,1,2,3,&PORTB,4,5,7);
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB7_bit;
sbit LCD_D7 at RA0_bit;
sbit LCD_D6 at RA1_bit;
sbit LCD_D5 at RA2_bit;
sbit LCD_D4 at RA3_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB7_bit;
sbit LCD_D7_Direction at TRISA0_bit;
sbit LCD_D6_Direction at TRISA1_bit;
sbit LCD_D5_Direction at TRISA2_bit;
sbit LCD_D4_Direction at TRISA3_bit;
// End LCD module connections

// ********************
void                main()                {
 CMCON = 0b00000111; //Comparators Off
 VRCON = 0b00000000; //RA7
// PORT is SET
 TRISA = 0b10100000; // PORTAの方向 osc1 osc2 mclr nc lcd4 lcd5 lcd6 lcd7
 TRISB = 0b01000011; // PORTBの方向 en sigin r/w rs 64 led sw2 sw1
//sbit                                  NOT_RBPU_bit at OPTION_REG.B7;
 OPTION_REG.F7 = 0; // PORTB PULLUP
 sw1 = 1; //  pullup
 sw2 = 1; //  pullup
 COUNT = 0; // start
// ********************
// LCD(DISP)INIT
 LCD_Init();  // 2.4mS
 Delay_us(2400);
 Lcd_Cmd(_LCD_CURSOR_OFF);  // 40uS
 Lcd_Out(2, 1, "FC ___V8");
 Delay_us(1600);
// Lcd_Cmd(_LCD_BLINK_CURSOR_ON);
 Lcd_Cmd(_LCD_CLEAR);   // 1.6mS
 Delay_us(1600);
 
// ********************
// sw_in
//#define        SW1_ON   (Button(&PORTB, 0, 30, 0))
//#define        SW1_OFF  (Button(&PORTB, 0, 30, 1))
//#define        SW2_ON   (Button(&PORTB, 1, 30, 0))
//#define        SW2_OFF  (Button(&PORTB, 1, 30, 1))

 COUNT = 0;
 TIMA = 10;

 do {     //SW_HOLD
    SW_HOLD = (((Button(&PORTB, 0, 30, 1)) * (Button(&PORTB, 1, 30, 1))) + ((Button(&PORTB, 0, 30, 0)) * (Button(&PORTB, 1, 30, 0))));
    if (SW_HOLD == 1) {
       if (TIMA < 10) TIMA++;
           ByteToStr(TIMA, txt);// txt is "num"
           Lcd_Out(1, 4, txt);
           Delay_us(1600);
           msg = "SW__HOLD"; // hold
    }
// ********************
         // SW_UP
    if ((Button(&PORTB, 0, 30, 0)) * (Button(&PORTB, 1, 30, 1))) {
       if (TIMA > 1) TIMA--;
           ByteToStr(TIMA, txt);// txt is "num"
           Lcd_Out(1, 4, txt);
           Delay_us(1600);
       TIMB = TIMA;
       do {
          Delay_ms(5);
          TIMB--;
          } while (TIMB > 1);
       LED = 1; // on
           msg = "SW____UP";
       COUNT++;
       if(COUNT >= 64) COUNT = 0;
    }
// ********************
         // SW_DW
    if ((Button(&PORTB, 1, 30, 0)) * (Button(&PORTB, 0, 30, 1))) {
          if (TIMA > 1) TIMA--;
           ByteToStr(TIMA, txt);// txt is "num"
           Lcd_Out(1, 4, txt);
           Delay_us(1600);
       TIMB = TIMA;
       do {
          Delay_ms(5);
          TIMB--;
          } while (TIMB > 1);
       LED = 0; // on
           msg = "SW__DOWN";
       COUNT--;
       if(COUNT > 64) COUNT = 63;
    }
// ********************
 Lcd_Out(2, 1, msg);
  Delay_us(1600);
 ByteToStr(COUNT, txt);// txt is "num"
 Lcd_Out(1, 1, txt);
  Delay_us(1600);
 ByteToStr(SW_HOLD, txt);// txt is "num"
 Lcd_Out(1, 6, txt);
 }
// ********************
 while(1); // Endless loop
 Delay_ms(500);
}
// ********************

sIMG_0531.jpg

sIMG_0530.jpg

sIMG_0534.jpg

 


コメント(0) 
mikroC PRO ブログトップ
メッセージを送る

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。