#include<iostm8s003f3.h>
#include<intrinsics.h>
#include<stdbool.h>
#define BIT(X) (1 << (X))
#define SEG3 PD_ODR_ODR4//1脚
#define SEG1 PA_ODR_ODR3//2脚
#define SEG2 PD_ODR_ODR5//10脚
//PB5
#define E_ON PB_ODR_ODR5 = 0 //11
#define E_OFF PB_ODR_ODR5 = 1
//PC3
#define A_ON PC_ODR_ODR3 = 0 //13
#define A_OFF PC_ODR_ODR3 = 1
//PC4
#define F_ON PC_ODR_ODR4 = 0 //14
#define F_OFF PC_ODR_ODR4 = 1
//PC5
#define B_ON PC_ODR_ODR5 = 0 //15
#define B_OFF PC_ODR_ODR5 = 1
//pC6
#define G_ON PC_ODR_ODR6 = 0 //16
#define G_OFF PC_ODR_ODR6 = 1
//PC7
#define C_ON PC_ODR_ODR7 = 0 //17
#define C_OFF PC_ODR_ODR7 = 1
//PD1
#define DF_ON PD_ODR_ODR1 = 0 //18
#define DF_OFF PD_ODR_ODR1 = 1
//PD2 新加
#define D_ON PD_ODR_ODR2 = 0 //19
#define D_OFF PD_ODR_ODR2 = 1
unsigned char dispIndex = 0,tim4InTick = 0,count = 0,count1 = 0;
unsigned char DF=0,dispBit1 = 0,dispBit2 = 0,dispBit3 = 0,adcSampleTimes = 0,dispIndexEx = 0;
unsigned long int adOutputValueTemp = 0,adOutputValue = 0;
unsigned long int adcOutputSampleBox[8] = {0};
bool mainProcessEn = 0,getAdFirstFlag = 1;
void SystemClockInitialization(void)
{
LAB1: CLK_ICKR = 0x09;
asm("nop");
asm("nop");
while(! (CLK_ICKR && BIT(1)));
while(! (CLK_ICKR && BIT(4)));
if(CLK_SWR != 0xE1)
{
goto LAB1;
}
CLK_CKDIVR = 0x00;//内部2MRC
}
void IoInitialization(void)
{
PA_DDR = 0Xff;
PA_CR1 = 0Xff;
PA_CR2 = 0Xff;
PB_DDR = 0Xff;
PB_CR1 = 0Xff;
PB_CR2 = 0Xff;
PC_DDR = 0Xff;
PC_CR1 = 0Xff;
PC_CR2 = 0Xff;
PD_DDR = 0Xff;
PD_CR1 = 0Xff;
PD_CR2 = 0Xff;
//AD输入口 输入电压输入口 3 PD6
PD_DDR_DDR6 = 1;
PD_CR1_C16 = 0;
PD_CR2_C26 = 0;
}
void WatchDogInitialization(void)
{
//--------喂狗时间1.02s
IWDG_KR = 0xCC;
IWDG_KR = 0x55;
IWDG_RLR = 0XFF;
IWDG_PR = 0X06;
IWDG_KR = 0XAA;
}
void SegmentProcess(unsigned char dispCode)
{
switch(dispCode)
{
case 0:
{
A_ON;B_ON;C_ON;D_ON;E_ON;F_ON;G_OFF;
break;
}
case 1:
{
A_OFF;B_ON;C_ON;D_OFF;E_OFF;F_OFF;G_OFF;
break;
}
case 2:
{
A_ON;B_ON;C_OFF;D_ON;E_ON;F_OFF;G_ON;
break;
}
case 3:
{
A_ON;B_ON;C_ON;D_ON;E_OFF;F_OFF;G_ON;
break;
}
case 4:
{
A_OFF;B_ON;C_ON;D_OFF;E_OFF;F_ON;G_ON;
break;
}
case 5:
{
A_ON;B_OFF;C_ON;D_ON;E_OFF;F_ON;G_ON;
break;
}
case 6:
{
A_ON;B_OFF;C_ON;D_ON;E_ON;F_ON;G_ON;
break;
}
case 7:
{
A_ON;B_ON;C_ON;D_OFF;E_OFF;F_ON;G_OFF;
break;
}
case 8:
{
A_ON;B_ON;C_ON;D_ON;E_ON;F_ON;G_ON;
break;
}
case 9:
{
A_ON;B_ON;C_ON;D_ON;E_OFF;F_ON;G_ON;
break;
}
case 10:
{
A_OFF;B_OFF;C_OFF;D_OFF;E_OFF;F_OFF;G_OFF;
break;
}
}
}
//显示3位
void DispSegment(unsigned char data1,unsigned char data2,unsigned char data3,unsigned char DF)
{
switch(dispIndex)
{
case 0:
{
SEG1 = 1;
SEG2 = 0;
SEG3 = 0;
SegmentProcess(data1);
if(DF==1)
DF_ON;
else
DF_OFF;
break;
}
case 1:
{
SEG1 = 0;
SEG2 = 1;
SEG3 = 0;
SegmentProcess(data2);
if(DF==2)
DF_ON;
else
DF_OFF;
break;
}
case 2:
{
SEG1 = 0;
SEG2 = 0;
SEG3 = 1;
SegmentProcess(data3);
if(DF==3)
DF_ON;
else
DF_OFF;
break;
}
}
}
void Time4Initialization(void)
{
TIM4_CR1 =0x81;
TIM4_IER =0x01;
TIM4_EGR =0x00;
TIM4_ARR =0Xff;
TIM4_PSCR =0x07;//50us中断一次
}
void AdcInitialization(void)
{
ADC_CSR = 0X00;
ADC_CR1 = 0XFD;
ADC_CR2 = 0X38;
ADC_CR3 = 0X00;
ADC_TDRL= 0XFF;
ADC_TDRH= 0XFF;
}
void Delay(unsigned int i)
{
for(;i > 0;i --);
}
void GetAd(void)
{
unsigned long int adGetTemp = 0;
unsigned char i,j;
adGetTemp = 0;
ADC_CSR = 0x06;//输出
Delay(500);
asm("nop");asm("nop");asm("nop");asm("nop");
ADC_CR1_ADON = 1;
asm("nop");asm("nop");asm("nop");asm("nop");
while(! ADC_CSR_EOC);//等待转换结束
ADC_CSR_EOC = 0;
adGetTemp = ADC_DRL;
adcOutputSampleBox[adcSampleTimes] = ADC_DRH;
adcOutputSampleBox[adcSampleTimes] <<= 8;
adcOutputSampleBox[adcSampleTimes] |= adGetTemp;
adcSampleTimes ++;
if(adcSampleTimes > 7)
{
adcSampleTimes = 0;
for(i = 0;i < 8;i ++)
{
for(j = 0;j < 8 - i;j ++)
{
if(adcOutputSampleBox[j + 1]< adcOutputSampleBox[j])
{
adGetTemp = adcOutputSampleBox[j + 1];
adcOutputSampleBox[j + 1] = adcOutputSampleBox[j];
adcOutputSampleBox[j] = adGetTemp;
}
}
}
if(getAdFirstFlag)
{
adOutputValueTemp = (adcOutputSampleBox[2] + adcOutputSampleBox[3] + adcOutputSampleBox[4] + adcOutputSampleBox[5]) >> 2;
}
else
{
adOutputValueTemp -= adOutputValueTemp >> 3;
adOutputValueTemp += (adcOutputSampleBox[2] + adcOutputSampleBox[3] + adcOutputSampleBox[4] + adcOutputSampleBox[5]) >> 5;
}
//adOutputValue = ((adOutputValueTemp * 340) / 1023);
adOutputValue = (long)1.22 * 1024 / adOutputValueTemp;
getAdFirstFlag = 0;
}
}
void main(void)
{
asm("sim"); //关全局中断
SystemClockInitialization();
IoInitialization();
Time4Initialization();
WatchDogInitialization();
AdcInitialization();
WWDG_CR = 0X00;
asm("rim"); //开全局中断
while(1)
{
WatchDogInitialization();
if(mainProcessEn)
{
mainProcessEn = 0;
GetAd();
dispBit1 = adOutputValue / 1000;
if(dispBit1 == 0){//小于10V, 显示2位小数
dispBit1 = adOutputValue / 100; //shi
DF=1;
dispBit2 = adOutputValue / 10; //ge
dispBit3 = adOutputValue - dispBit1 * 100 - dispBit2 * 10;
}
else{
DF=2;//小数点位置
dispBit2 = adOutputValue % 100 / 10; //shi
dispBit3 = adOutputValue % 10; //ge
}
}
}
}
#pragma vector=TIM4_OVR_UIF_vector
__interrupt void TIM4_UPD_OVF_IRQHandler(void)
{
TIM4_SR = 0x00;
tim4InTick ++;
if(tim4InTick >= 2)
{
tim4InTick = 0;
dispIndex ++;
if(dispIndex > 2)
{
dispIndex = 0;
mainProcessEn = 1;
}
DispSegment(dispBit1,dispBit2,dispBit3,DF);
}
}
STM-8.zip_STM8 原理图_stm 原理图_stm8_stm8 schematic_stm8 原理图
版权申诉
39 浏览量
2022-09-20
22:47:54
上传
评论
收藏 132KB ZIP 举报
weixin_42653672
- 粉丝: 93
- 资源: 1万+
最新资源
- Picasso_v3.1 2.ipa
- chromedriver-mac-arm64.zip
- 蓝zapro.apk
- chromedriver-linux64.zip
- UCAS研一深度学习实验-MNIST手写数字识别python源码+详细注释(高分项目)
- 基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MINIST手写数字数据集)+详细注释(高分项目)
- 基于Matlab在MNIST数据集上利用CNN完成手写体数字识别任务,并实现单层CNN反向传播算法+源代码+文档说明(高分项目)
- NVIDIA驱动、CUDA和Pytorch及其依赖
- 基于SVM多特征融合的微表情识别python源码+项目说明+详细注释(高分课程设计)
- html动态爱心代码一(附源码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈