製造技術者のためのディジタル技術
(9回:組み込み型制御入門2)
16進数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
2進数 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
#include <16f648a.h> #include <stdlib.h> #fuses INTRC_IO,NOWDT,NOLVP,NOMCLR//内部クロック、WDT,LVPなし #use delay(CLOCK=4000000) //クロック4MHz //PB7..PB1に7素子のg..aを接続 //PA2,PA1,PA0に7素子の桁信号を接続 //5mS単位で各桁を表示 //20回表示したら、表示する数値を更新する int ct;//数字の更新間隔 long val;//表示する数字 int digit;//表示する桁 //表示パターン int segment_data[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xCE}; char st[3]; void main(){ digit=0; ct=1;//数字を更新する周期 val=0;//表示する値 while(1){ ct --; if(ct == 0){//数字の更新 st[2]=val/100; st[1]=val/10-st[2]*10; st[0]=val%10;//10の余り val++; if(val==1000) val=0; ct=20; } if(digit== 2){//第3桁の表示 output_b( segment_data[st[2]]); output_bit(PIN_A2,1);//3桁表示開始 delay_ms (5); //表示期間(ミリ秒) output_bit(PIN_A2,0);//表示を消す delay_us(100); } if(digit== 1){ output_b( segment_data[st[1]]); output_bit(PIN_A1,1); delay_ms (5); output_bit(PIN_A1,0); delay_us(100); } if(digit == 0){ output_b( segment_data[st[0]]); output_bit(PIN_A0,1); delay_ms (5); output_bit(PIN_A0,0); delay_us(100); } digit ++;//表示桁を変更 if(digit ==3 ) digit=0; } }
#include <16f88.h> #device ADC=10 #fuses INTRC_IO,NOWDT,NOLVP,NOMCLR,NOBROWNOUT//内部クロック、WDT,LVPなし #use delay(CLOCK=4000000) //クロック4MHz int prd; int vd,vs; //int segment_data[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xCE}; int segment_data[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xE6}; void main(){ //ポートA入力 set_tris_a(0xFF); setup_adc_ports(sAN0); setup_adc(ADC_clock_div_32); set_adc_channel(0); set_tris_b(0x01); //ポートB7bit出力 output_b(0xFF); setup_ccp1(CCP_PWM); //RB0にPWM信号生成 //タイマー2の周期を設定 //内部クロック 、最後の1は割り込み間隔 prd=100; setup_timer_2(T2_DIV_BY_1,prd,1);//pwm周期設定:100u while(1){ vd = read_adc()/20; //明るさを取得、 if(vd > prd/2 ) vd = prd/2;// vs = vd/3;//表示する値 0..9 if(vs>9) vs=9; output_b(~segment_data[vs]);//7セグ出力 set_pwm1_duty(prd-(int)vd);//pwmの幅設定 delay_ms(100); } }