/******************************(abc951-13145.c)******
* ADCデータを電圧に変換後7segに表示
*--------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include "mcc_generated_files/system/system.h"
//===== シリアル関係 ================
#define EU_BFSIZE 80
char RBuf[EU_BFSIZE]; // 受信データバッファ
uint8_t EU_Flg = 0; // 受信フラグ
//----- シリアル受信割り込み関数
void myEusart(void) {
static uint8_t sIdx = 0; // 受信データポインタ
char ch; // 受信文字
if(EUSART1_IsRxReady()){ // 受信データ有り?
ch = EUSART1_Read(); // データ受信
EUSART1_Write(ch); // エコーバック
if((ch == 0x0a)||(ch == 0x0d)){ // 改行処理
RBuf[sIdx] = 0; // 文字列終端文字
sIdx = 0; // ポインタを初期化
EU_Flg = 1; // 受信フラグON
}else if((ch == 0x08)&&(sIdx > 0)){ // BS処理
sIdx--;
}else{ // 上記以外の文字
if(sIdx < EU_BFSIZE){ // バッファサイズ以内?
RBuf[sIdx++] = ch; // バッファにデータ格納
}
}
}
}
//----- 文字列シリアル出力(改行なし)
void EU_print(char * msg) {
while(*msg != 0) {
while(!EUSART1_IsTxReady())
; // データ送信済確認
EUSART1_Write(*msg++); // 1文字送信
}
}
//----- 文字列シリアル出力(改行付き)
void EU_puts(char *msg) {
EU_print( msg );
EU_print("\n");
}
//===== 4桁BCD変換関数 ==============
uint16_t bin2bcd(int d) { // 最大9999(下位4桁)
div_t qr;
int i, bcd = 0;
for (i = 0; i < 4; ++i, d = qr.quot) {
qr = div(d, 10); // 商・余りを得る
bcd += qr.rem << (i * 4); // i 桁分左シフト後、加算
}
return (uint16_t)bcd;
}
//========= main ===================
int main(void) {
uint16_t aDat; // ADCデータ
uint16_t vVal; // 電圧データ
uint16_t dat; // 2進数データ
uint16_t bcd; // 4桁BCD数
char sBf[20]; // 出力文字列
SYSTEM_Initialize(); // 初期化
EUSART1_RxCompleteCallbackRegister(myEusart);
// 割り込みハンドラー設定
INTERRUPT_GlobalInterruptEnable(); // 割り込み許可
INTERRUPT_PeripheralInterruptEnable();
EU_puts("== Test ADC & 7seg ==");
ADC_ConversionStart(); // ADC変換開始
while(1) {
//---- USB Serial -----------
if(EU_Flg){ // 受信データ有?
EU_Flg = 0; // 受信フラグクリア
dat = (uint16_t)atoi(RBuf); // 受信文字列を数値に
bcd = bin2bcd((int)dat); // 4桁bcdに変換
sprintf(sBf, "%d -> %x", dat,bcd); // 表示文字列へ
EU_puts(sBf); // シリアル送信
CLB1_SWIN_Write16(bcd); // 7seg表示
__delay_ms(2000); // 2秒間表示
}
//---- ADC -------------------
if(ADC_IsConversionDone()){ // ADC変換が終了?
aDat = (uint16_t)ADC_ConversionResultGet();
vVal = (uint16_t)(aDat * 50 / 1023);
bcd = bin2bcd((int)vVal); // 4桁BCDに変換
sprintf(sBf,"%d -> %x", vVal,bcd); // 表示文字列へ
EU_puts(sBf); // シリアル送信
bcd |= 0x8000; // 小数点表示を加える
CLB1_SWIN_Write16(bcd); // 7seg表示
ADC_ConversionStart(); // ADC変換開始
__delay_ms(500); // ADC変換間隔調整
}
}
}
|