PIC

Counter: 6328, today: 1, yesterday: 0

環境

RS232Cシリアル通信とLCD表示

2010/01/30
  • RS232C(9600bps)で入力された文字をLCD液晶ディスプレイへ1行目,2行目と順番に表示する.
  • C:\Program Files\HI-TECH Software\PICC\9.70\samples\usart と LCDemo を参考にした.
#include <stdio.h>
#include <htc.h>
#include "usart.h"
#include "lcd.h"
	__CONFIG( UNPROTECT & LVPDIS & BORDIS & MCLRDIS & PWRTEN & WDTDIS & INTIO );
#define RX_PIN RCSTA
#define TX_PIN TXSTA
void main(void){
	unsigned char input;
    int i;
	INTCON=0;
	CMCON = 0b00000111;
	lcd_init();
	init_comms();
	printf("\rPress a key and I will print it in LCD:\n");
       i = 0;
	lcd_clear();
       lcd_goto(0);
	while(1){
          if (i == 32) i=0;
          if (i == 0) {
            lcd_goto(0);
            lcd_puts("                ");
            lcd_goto(0);
	  }
         if (i == 16) {
            lcd_goto(0x40);
            lcd_puts("                ");
            lcd_goto(0x40);
          }
          input = getche();
         if (input >= 0x20) {
            lcd_putch(input);
            i++;
         }
         if (input == 13) {
            i = (i + 16) & 0xf0;
         }
	}
}

タイマー1割り込みによる時計

2010/02/11
  • 0.1秒のタイマー1割込みを利用して時刻を表示する. RS232C(9600bps)からhh:mmの形式で入力して時刻変更が可能.
    CCPR1L = 0x24; CCPR1H = 0xF4; // 20MHz = 62500 = 0xF424
  • 次のリンク(簡易時計(PIC単体))を参考にしました.
    #include <stdio.h>
    #include <htc.h>
    #include <string.h>
    #include "usart.h"
    #include "lcd.h"
    #include "delay.h"
    	__CONFIG( UNPROTECT & LVPDIS & BORDIS & MCLRDIS & PWRTEN & WDTDIS & HS);
    #define RX_PIN RCSTA
    #define TX_PIN TXSTA
    #define FOSC 2000000L
    void itoa10(unsigned char *buf, int i);
    static long clock;
    static int  lock;
    void lcd_2digit(int i) {
        static char buff[2];
        itoa10(buff,i);
        if (buff[1]==0) {
           lcd_putch('0'); lcd_putch(buff[0]);
        } else {
           lcd_putch(buff[0]); lcd_putch(buff[1]);
        }
    }
    void interrupt it() {
        if (CCP1IF == 1) {
            CCP1IF = 0;
            if (lock == 0) {
               clock++;
               if (clock == 864000) clock = 0;
            }
        }
    }
    void main(void){
        static short h,m,s,hh,mm;
        char line[16], *b, ch;
        int i; 
        INTCON=0;
        CMCON = 0b00000111;
        TMR1IE = 0; TMR1IF = 0; TMR1CS = 0;
        T1CKPS0 = 1; T1CKPS1 = 1; TMR1ON = 0;
        TMR1L = 0; TMR1H = 0;
        CCP1IE = 1; CCP1IF = 0;
        CCP1M3 = 1; CCP1M2 = 0; CCP1M1 = 1; CCP1M0 = 1;
        CCPR1L = 0x24; CCPR1H = 0xF4; // 20MHz = 62500 = 0xF424
        lcd_init();
        init_comms();
        printf("\r\nHH:MM\r\n");
        lock = 0; clock = 0; i=0; 
    	lcd_clear();
        PEIE = 1; GIE = 1; TMR1ON = 1; 
    	while(1){
             if (RCIF) { ch = RCREG;
                 if (ch == '\r') {
                     hh = (line[0]-'0')*10+(line[1]-'0');
                     mm = (line[3]-'0')*10+(line[4]-'0');
                     if ((i==5)&&(hh>=0)&&(hh<=23)&&(mm>=0)&&(mm<=59)) {
                        lock = 1;
                        clock = ((long)hh * 36000) + ((long)mm * 600);
                        lock = 0;
                     }
                     i = 0;
                     printf("\r\nHH:MM\r\n");
                 }
                 else { putch(line[i++] = ch); }
             } 
             h = clock / 36000;
             m = (clock - (36000*(long)h))/600;
             s = (clock - (36000*(long)h) - (600*(long)m))/10;
             lcd_goto(0);
             lcd_2digit(h);
             lcd_putch(':');
             lcd_2digit(m);
             lcd_putch(':');
             lcd_2digit(s);
             DelayMs(500);
    	}
    }

添付ファイル: filelcd.c 1035件 [詳細] filePIC16F628A.jpg 966件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-21 (日) 11:09:39 (3526d)