STM8S电压电流表头重新编程芯片解密
芯片解密STM8S单片机源程序(IAR环境)如下:
- #include "math.h"
- //#include "stdbool.h"
- #include "iostm8s003f3.h"
- #include "stm8s.h" //包含用到的外设的头文件
- #define u8 unsigned char
- #define uchar unsigned char
- #define uint unsigned int
- #define sCnt 104
- uint ms_count, tmpin, ADCBuff[6], ADValueV[sCnt], ADValueI[sCnt], ADCData, mA;
- u8 pDataV=0, pDataI=0, vDotPS, cDotPS, VGain = 35, ampGain = 129, vFlag=0, iFlag=0;
- unsigned long mV; //uint的话,mV最大只能到 65535mV,本电源80V,故用long
- float voltRAW, curtRAW, Rs = 0.00218;
- float ADVal_Av[2]={0}, Val_Av[2]={0};
- float preCoef[2]={0.005}; //ADC 转换滤波噪声用的系数
- bool preTrend[2]={TRUE}; //ADC 转换结果的变化趋势 true:变大,false:变小
- float ADvalue[2]={0.0}; //ADC 前次的转换结果滤波后的值
- float newData[2]={0.0}; //ADC 本次次的转换结果
- /*******************************************************************************
- **函数名称:void GPIO_Init0()
- **功能描述:GPIO->功能引脚初始化
- **入口参数:无
- **输出:无
- *******************************************************************************/
- void GPIO_Init0()
- {
- PA_ODR |=0x02; //PA1置高,I个位选通
- PA_ODR &=0xf3; //PA2,3置零,g,f
- PA_DDR |=0x0e; //设置端口PA1,2,3的输入输出方向寄存器为输出方向
- PA_CR1 |=0x0e; //PA1,2,3为推挽输出
- PA_CR2 |=0x0e; //PA1,2,3是输出速度最快为10MHz
-
- PB_ODR |=0x30; //PB4,5置高,I十位和百位选通
- PB_DDR |=0x30; //设置端口PB4,5的输入输出方向寄存器为输出方向
- PB_CR1 |=0x30; //PB4,5为推挽输出
- PB_CR2 |=0x30; //PB4,5是输出速度最快为10MHz
-
- PC_ODR &=0x07; //置零PC3,4,5,6,7, c,f,h,d,e
- PC_DDR |=0xf8; //设置端口PC->3,4,5,6,7的输入输出方向寄存器为输出方向
- PC_CR1 |=0xf8; //PC->3,4,5,6,7为推挽输出
- PC_CR2 |=0xf8; //PC->3,4,5,6,7是输出速度最快为10MHz
-
- PD_ODR &=0xfd; //置零PD1, a
- PD_ODR |=0x70; //PD4,5,6置高 V百位 个位 和十位选通
- PD_DDR |=0x72; //设置端口PD->1,4,5,6的输入输出方向寄存器为输出方向
- PD_CR1 |=0x72; //PD->1,4,5,6为推挽输出
- PD_CR2 |=0x72; //PD->1,4,5,6是输出速度最快为10MHz
- }
- /*******************************************************************************
- **函数名称:void SMG_Display(int num)
- **功能描述:SMG显示函数
- **入口参数:int num
- **输出:无
- *******************************************************************************/
- void SMG1_Display(unsigned char num)
- {
- PA_ODR |=0x02; //PA1置高,I个位选通
- PB_ODR |=0x30; //PB4,5置高,I十位和百位选通
- PD_ODR |=0x70; //PD4,5,6置高 V百位 个位 和十位选通
- switch(num)
- {
- case 0: //a b c d e f
- PA_ODR |=0x08; //PA3置高,b
- PA_ODR &=0xfb; //PA2置零,g
- PC_ODR &=0xdf; //置零PC5,h
- PC_ODR |=0xd8; //PC3,4,6,7置高 c,f,d,e
- PD_ODR |=0x02; //PD1置高 a
- break;
- case 1: //b c
- PA_ODR |=0x08; //PA3置高,b
- PA_ODR &=0xfb; //PA2置零,g
- PC_ODR &=0x0f; //置零PC4,5,6,7,f,h,d,e
- PC_ODR |=0x08; //PC3置高 c
- PD_ODR &=0xfd; //PD1置零 a
- break;
- case 2: // a b d e g
- PA_ODR |=0x0c; //PA2,3置高,g,b
- PC_ODR &=0xc7; //置零PC3,4,5 c,f,h
- PC_ODR |=0xc0; //PC6,7置高,d e
- PD_ODR |=0x02; //PD1置高 a
- break;
- case 3: //a b c d g
- PA_ODR |=0x0c; //PA2,3置高,g,b
- PC_ODR &=0x4f; //置零PC4,5,7,f,h,e
- PC_ODR |=0x48; //PC3,6置高 c,d
- PD_ODR |=0x02; //PD1置高 a
- break;
- case 4: //b c f g
- PA_ODR |=0x0c; //PA2,3置高,g,b
- PC_ODR &=0x1f; //置零PC5,6,7,h,d,e
- PC_ODR |=0x18; //PC3,4置高 c,f
- PD_ODR &=0xfd; //PD1置零 a
- break;
- case 5: //a c d f g
- PA_ODR |=0x04; //PA2置高,g
- PA_ODR &=0xf7; //PA3置零,b
- PC_ODR &=0x5f; //置零PC5,7 h,e
- PC_ODR |=0x58; //PC3,4,6置高 c,f,d
- PD_ODR |=0x02; //PD1置高 a
- break;
- case 6: //a c d e f g
- PA_ODR |=0x04; //PA2置高,g
- PA_ODR &=0xf7; //PA3置零,b
- PC_ODR &=0xdf; //置零PC5,h
- PC_ODR |=0xd8; //PC3,4,6,7置高 c,f,d,e
- PD_ODR |=0x02; //PD1置高 a
- break;
- case 7: //a b c
- PA_ODR |=0x08; //PA3置高,b
- PA_ODR &=0xfb; //PA2置零,g
- PC_ODR &=0x0f; //置零PC4,5,6,7,f,h,d,e
- PC_ODR |=0x08; //PC3置高 c
- PD_ODR |=0x02; //PD1置高 a
- break;
- case 8: //a b c d e f g
- PA_ODR |=0x0c; //PA2,3置高,g,b
- PC_ODR &=0xdf; //置零PC5,h
- PC_ODR |=0xd8; //PC3,4,6,7置高 c,f,d,e
- PD_ODR |=0x02; //PD1置高 a
- break;
- case 9: //a b c d f g
- PA_ODR |=0x0c; //PA2,3置高,g,b
- PC_ODR &=0x5f; //置零PC5,7 h,e
- PC_ODR |=0x58; //PC3,4,6置高 c,f,d
- PD_ODR |=0x02; //PD1置高 a
- break;
- }
- }
- /*******************************************************************************
- **函数名称:void ADC_Init()
- **功能描述:初始化ADC
- **入口参数:无
- **输出:无
- *******************************************************************************/
- void ADC_Init()
- {
- //电流
- PD_DDR_bit.DDR2 = 0; //设置PD->2 为输入
- PD_CR1_bit.C12 = 0; //设置为浮空输入
- PD_CR2_bit.C22 = 0; //设置中断禁止
-
- //电压
- PD_DDR_bit.DDR3 = 0; //设置PD->3 为输入
- PD_CR1_bit.C13 = 0; //设置为浮空输入
- PD_CR2_bit.C23 = 0; //设置中断禁止
-
- ADC_CR1_bit.SPSEL = 7; //fmaster / 18 = 16MHZ / 18 = 888888HZ
- ADC_CR2_bit.ALIGN = 1; //RIGHT ALIGN
-
- ADC_CR1_bit.ADON = 1; //初次上电唤醒ADC
- }

芯片解密