製造技術者のためのディジタル技術
(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);
}
}