/* * File: NEWCPU_LED_001.c 16F1716 * Author: Vivid * * Created on 2016/01/13, 17:10 */ //-------------------------------------------------------------------------- //CPU付きLEDストリーム制御用プログラム //下記の8MHz用を20MHz用に改造する // *LED 1個の指定色の表示成功 v001 // *LED 1個で、表示色を順次変更する v002 //     このFOR文とDelayの設定で綺麗にデモ表示が可能 // *LED 5個をシリアル通信で点滅する v003 // 動作するも時々異なる色を表示する // 一部シリアルデータの欠落がある可能性 // * 一部動作不良の対策で、デューティー一部修正 v004 //   しかし安定しない v005 // * 回路の電源に挿入していた抵抗(150Ω)を撤去したら //   正常動作 v010 // * RAND関数で色を指定する v011 // RAND()関数は、整数の乱数を返す // * B9テスト用 赤色を点滅 v012 // // // // // 関数disp_rgbは、「かしまのボヤキ天国」さんのHPより引用し、改変 #include #include #include // CONFIG1 #pragma config FOSC = HS // Oscillator Selection Bits->HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins #pragma config WDTE = OFF // Watchdog Timer Enable->WDT disabled #pragma config PWRTE = OFF // Power-up Timer Enable->PWRT disabled #pragma config MCLRE = ON // MCLR Pin Function Select->MCLR/VPP pin function is MCLR #pragma config CP = OFF // Flash Program Memory Code Protection->Program memory code protection is disabled #pragma config BOREN = ON // Brown-out Reset Enable->Brown-out Reset enabled #pragma config CLKOUTEN = OFF // Clock Out Enable->CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin #pragma config IESO = ON // Internal/External Switchover Mode->Internal/External Switchover Mode is enabled #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable->Fail-Safe Clock Monitor is enabled // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection->Write protection off #pragma config PPS1WAY = ON // Peripheral Pin Select one-way control->The PPSLOCK bit cannot be cleared once it is set by software #pragma config ZCDDIS = ON // Zero-cross detect disable->Zero-cross detect circuit is disabled at POR and can be enabled with ZCDSEN bit. #pragma config PLLEN = OFF // Phase Lock Loop enable->4x PLL is always enabled #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable->Stack Overflow or Underflow will cause a Reset #pragma config BORV = LO // Brown-out Reset Voltage Selection->Brown-out Reset Voltage (Vbor), low trip point selected. #pragma config LPBOR = OFF // Low-Power Brown Out Reset->Low-Power BOR is disabled #pragma config LVP = ON // Low-Voltage Programming Enable->Low-voltage programming enabled unsigned char red[5], green[5], blue[5]; //PICのクロック設定 #define _XTAL_FREQ 20000000 //PICのクロックをHzで設定(20MHz) unsigned char i, j, k, r, g, b; //------------------------------------------------------------------- // r,g,bに1バイトのRGBの各輝度データをセットしてdisp_rgbを呼ぶと // そのデータをシリアル変換してRC0ぽーとから出力する関数 // あらかじめRC0を出力用に設定する事 //-------------------------------------------------------------------- void disp_rgb(unsigned char r, unsigned char g, unsigned char b) { volatile unsigned char rr, gg, bb, c; //ローカル変数 rr = r; gg = g; bb = b; // RC1 = 0; // RC0をLにして // __delay_us(50); // LEDのリセット信号とする // GIE = 0; // 割り込み禁止にセット #asm // ここからアセンブラの記述 putbit MACRO var, bit // ビット操作のマクロを定義する btfsc var, bit // var変数の所定のビットをチェックし1なら61行へ // goto $ + 7 // ジャンプする goto $ + 8 bsf PORTC, 1 // 0ならRC1をHにして nop // 約2マシンサイクル(20MHzの場合は0.4マイクロ秒)後に bcf PORTC, 1 // Lに戻す nop // Lのまま4マシンサイクル維持しマクロ終了 nop nop goto $ + 9 bsf PORTC, 1 // 1ならRC1をHにして(61行目) nop // 約7マシンサイクル(1.4マイクロ秒)後に nop nop nop nop nop bcf PORTC, 1 // Lに戻す // nop // Lのまま2マシンサイクル維持し、マクロ終了 ENDM BANKSEL disp_rgb@rr // 変数rr(RED)の場所にバンクを切り換える putbit disp_rgb@rr, 7 // RED dataのビット7から順次チェックする putbit disp_rgb@rr, 6 putbit disp_rgb@rr, 5 putbit disp_rgb@rr, 4 putbit disp_rgb@rr, 3 putbit disp_rgb@rr, 2 putbit disp_rgb@rr, 1 putbit disp_rgb@rr, 0 putbit disp_rgb@gg, 7 // Green putbit disp_rgb@gg, 6 putbit disp_rgb@gg, 5 putbit disp_rgb@gg, 4 putbit disp_rgb@gg, 3 putbit disp_rgb@gg, 2 putbit disp_rgb@gg, 1 putbit disp_rgb@gg, 0 putbit disp_rgb@bb, 7 // Blue putbit disp_rgb@bb, 6 putbit disp_rgb@bb, 5 putbit disp_rgb@bb, 4 putbit disp_rgb@bb, 3 putbit disp_rgb@bb, 2 putbit disp_rgb@bb, 1 putbit disp_rgb@bb, 0 #endasm // GIE = 1; // enable interrupt } //アセンブラ記述終了 //----------------------------------------------------------------- //メインプログラム(表示データのセットアップ) // RC1 にCPU_LEDを接続 //----------------------------------------------------------------- main() { /** LATx registers */ LATA = 0x00; LATB = 0x00; LATC = 0x00; /** TRISx registers */ TRISE = 0x08; TRISA = 0xFF; TRISB = 0xFF; TRISC = 0xFC; /** ANSELx registers */ ANSELC = 0xFC; ANSELB = 0x3F; ANSELA = 0x3F; /** WPUx registers */ WPUE = 0x08; WPUB = 0xFF; WPUA = 0xFF; WPUC = 0xFC; OPTION_REGbits.nWPUEN = 0; // SCS FOSC; SPLLEN disabled; IRCF 500KHz_MF; OSCCON = 0x38; // SOSCR disabled; OSCSTAT = 0x00; // TUN 0; OSCTUNE = 0x00; // Set the secondary oscillator TRISC = 0b00000000; RC1 = 0; // RC0をLにして __delay_us(50); // LEDのリセット信号とする disp_rgb(0, 0, 0); // Blank LED disp_rgb(0, 0, 0); // Blank LED disp_rgb(0, 0, 0); // Blank LED disp_rgb(0, 0, 0); // Blank LED disp_rgb(0, 0, 0); // Blank LED __delay_us(50); // LEDのリセット信号とする //---------------------------------------------- // PICスタートアップ確認 //---------------------------------------------- RC0 = 1; // 以下、RC0に接続したモニタLED(赤)を点滅してPICの __delay_ms(1000); // 稼動を確認するための処理 RC0 = 0; __delay_ms(1000); RC0 = 1; __delay_ms(1000); RC0 = 0; __delay_ms(1000); //----------------------------------------------- // CPU内蔵LEDへの各RGBの値を40づつ変化させてカラーを変更する //----------------------------------------------- while (1) { for (i = 0; i <= 250; i = i + 5) { for (j = 0; j <= 250; j = j + 5) { for (k = 0; k <= 250; k = k + 5) { disp_rgb(i, j, k); __delay_ms(10); } } } } } //------------------------------終了----------------------------------