STM8S105K4芯片组驱动程序的程序,只有.BIN文件,通过什么方法下载到单片机??

上海沪生电子-|单片机解密|单片机破解|芯片解密|芯片破解|CPLD解密|CPLD破解|
常用单片机解密相关软件下载
单片机解密热线:021-
常用单片机解密相关软件下载(这些软件目前在各个网站反汇编器中是比较全面的,并且经过我们测试过):
注:下面反汇编器(反汇编软件)并非由我们开发,版权属于软件开发者,我们通过比较感觉这些反汇编工具不错,所以提供给网友;我们提供这些软件仅供学习研究使用,我们对这些软件都进行了测试,可以正常使用,并且用卡巴斯基杀毒软件杀毒,但我们也不能保证这些软件功能完全正确,请使用者自我鉴定选择。
& Bin和Hex互相转换工具
& BIN和HEX烧写文件互相转换的软件,WINDOWNS版本
你也可以从.cn/software/nspusbw.exe
下载SUPPER的编程器软件,采用脱机运行方式,联后读出你的BIN(或HEX)文件,联后另存为HEX(或BIN)格式,这种方式可以避免一些软件不识别“
Bin和Hex互相转换工具”转换的格式。
& 51单片机反反汇编器
 51内核的反汇编器,可以反汇编ATMEL、SYNCMOS、&PHILIPS和WINBOND等51内核的单片机,这是一个不错的反汇编软件;WINDOWNS版本
 PIC单片机反汇编器
 PIC单片机的反汇编软件,可以反汇编大部分PIC单片机,我们对使用做了说明
这些只包括普通的PIC16F,PIC12F等常见型号的反汇编,对于PIC18F和DSPIC30F我们只对在我们这解密的客户提供
&AVR单片机反汇编器
AVR单片机开发调试工具(包括反汇编器功能)
当用菜单FILE 中的OPEN命令打开HEX格式.hex
文件时进入反汇编调试,窗口中出现反汇编后的程序,但这个不能保存,可以COPY后保存;目前网上我们还没有找到比这个更好的AVR反汇编器
WINDOWNS版本
 HOTEK系列单片机反汇编器
 HOLTEK单片机反汇编软件
1、自动把程序和数据区分开来
2、大片为0的数据,自动忽略(程序的NOP不会忽略)
3、支持符号引入(尚未优化,速度较慢),设置格式见Symbol.ini,可以自己增删
4、支持OTP文件和BIN文件(非OTP格式的文件一律按BIN处理)
WINDOWNS版本,使用方法有详细说明
 EMC单片机反汇编器
 EMC反汇编软件,DOS版本,不支持中文路径
EMC单片机的CDS和BIN格式转换方法、HOTEK系列单片机的OTP和BIN格式互相转换方法、ALTERA的POF文件和BIN文件互相转换方法、程序分割为FLASH和EEPROM区的方法,这些都是我们研究的成果,只免费帮助正式的客户转换。
 MDT单片机反汇编器
 MDT(麦肯单片机)反汇编软件,WINDOWNS版本,不需要安装,绿色软件,MDT原厂软件,效果不错;HUSOON写了对应的使用说明
EMC单片机的CDS和BIN格式转换方法;
HOTEK系列单片机的OTP和BIN格式互相转换方法;
ALTERA的POF文件和BIN文件互相转换方法;
motorola的BIN文件和S19互相转换方法;
motorola(摩托罗拉,飞思卡尔)反汇编;
SONIX(松翰)的SN19和BIN(或者DDB)互相转换;
51,PIC,AVR等程序完全反汇编
程序分割为FLASH和EEPROM区的方法,这些都是我们研究的成果,只免费帮助正式的客户转换,对于其他客户需要收取一定的费用。
提供单片机反汇编:&
一、什么是汇编和反汇编
  通常单片机的程序是用汇编语言或高级语言(C或C++)编写的,这些代码叫原代码或者说是源程序,当程序编写完成后,经过编译软件或编译器的编译生成可以烧录到单片机程序区和数据区中的文件,这种文件称呼为机器码或者烧写文件,这个过程叫汇编。
不同型号的单片机的烧写文件后缀是不一定相同的,最常用的是BIN和HEX格式,还有JED、POF、SOF、OTP、S19,SN8或CDS等格式。反汇编就是指将这些机器码反编译还原成汇编语言(ASM格式或者DT等格式)。但通常直接用软件反编译出来的程序只能作为参考,如果需要得到的源文件完全正确,或者说编译为BIN文件和最初始给上海沪生电子解密出来的BIN文件一样,那就需要手工调整。
二、为什么要进行反汇编
  沪生电子解密出来的文件时烧写文件,客户想研究学习程序思路,或者需要改变一些参数,在烧写文件上几乎无法修改,烧写文件时0110001这些格式。如果能提供反汇编后的ASM文件,那么就相对容易了很多。基于以上原因,很多客户希望能提供反汇编业务,如果客户需要,可以从我们网站
下载反汇编软件进行反汇编,但是上软件只作为参考。如果需要得到可以完全编译的源文件(或者说编译后的BIN文件和解密出来的BIN文件一样),那需要收费,具体可以联系:上海沪生电子021-。
  上海沪生电子提供的单片机程序反汇编有以下特点:
& 专业解决使用DS2401加密法的方案。
上海沪生电子,
提供上海,浙江,江苏,安徽广东,北京,山东,江西,福建,天津,杭州,温州,宁波,义乌,苏州,南京,无锡,常州,合肥,济南,淄博,南昌等地单片机解密
黑龙江(哈尔滨),吉林(长春),辽宁(沈阳),北京,天津,河北(石家庄,唐山)芯片解密
山西(太原),山东(济南,青岛,淄博),河南(郑州,洛阳),广西(南宁),云南昆明IC解密
江苏(南京,无锡,苏州,常州,扬州,南通),上海,浙江(杭州,宁波,温州,衢州)芯片破解
江西(南昌),安徽(合肥),武汉,四川(成都),甘肃(兰州),青海(西宁),河北(武汉),单片机解密
福建(福州,泉州,厦门),广东(广州,深圳,惠州,汕头,东莞,柳州),台州,单片机破解
单片机解密,单片机破解,芯片解密,芯片破解,IC解密,IC破解,集成块解密和破解业务
Copyright&
All Rights Reserved
TEL: 021- & 021-& FAX:021-单片机下载文件:HEX文件和BIN文件的区别 - 简书
单片机下载文件:HEX文件和BIN文件的区别
单片机程序写好之后,我们都要把程序下载到单片机的内存中,单片机才会按照程序员的逻辑执行命令实现功能。之前也讲过下载单片机的几种方式,比如ISP下载,JTAG下载,下载文件的格式最常见的是hex文件,这个格式大家都是知道的,还有一种bin文件是单片机的下载文件。下面介绍这两种格式的区别。HEX文件和BIN文件是我们经常碰到的2种文件格式。下面简单介绍一下这2种文件格式的区别:1. hex文件包含地址信息。在用ISP方式烧写程序时,我们都有这样的经验:1)选择单片机型号;2)选择串口号;3)设置波特率(或者默认);4)选择下载的文件;5)点击下载按钮下载。如下图所示。
经过这几步后,程序下载工作就完成了,在以上的步骤中我们并没有选择要把程序下载到单片机的哪块内存中,即不需要设置地址。因为HEX文件内部的信息已经包括了地址。而烧写BIN文件的时候,用户是一定需要指定地址信息的。单片机多下载hex文件。2. BIN文件格式只包括了数据本身,没有包含地址bin文件本身只是数据,没有包含地址信息,所以在下载bin文件时需要选择内存的起始地址和终止地址,即要把bin文件下载到指定的内存空间。通常需要指定程序内存地址的芯片为ARM芯片和DSP芯片。3、HEX文件和BIN文件大小不一样对于bin文件,通过右键属性查看到的文件的大小就是数据的实际大小。而对HEX文件而言,你看到的文件大小并不是实际的数据的大小。一是因为HEX文件是用ASCII来表示数据,二是因为HEX文件本身还包括别的附加信息。hex文件的大小该怎么看呢?之前我推送过查看方法,忘记的同学可以点下面的链接查看:本订阅号致力于单片机、ARM等嵌入式软硬件的设计经验分享,秉承“人人都是电子设计经验的分享者”的理念,成功路上不孤单,我们一起努力。公众号:micropoint8。查看: 2131|回复: 0
STM8应用,如何写出强健的程序
& &&&& &下文纯属个人见解,如有错误的地方请及时指正,也希望提出好的建议,在这里抛砖引玉了。
& && && && && & 实现 需求很简单。做好却很难,没有最好的程序。在满足需求的情况下,如何让程序健壮、良好可扩展性是一个程序员要考虑的事情。好的办法是反复实验、修改得来的。废话不多说,上硬菜。
& && && && &这里以我家台灯为例,功能需求很简单,可以通过旋钮,及红外遥控控制灯光强弱及开关状态,遥控优先级高于旋钮。我是利用&&AIN0 采集旋钮的电压值,TIM2_CH1 捕获红外信号 ,TIM1_CH1 输出PWM 控制灯光&&,TLI 监控电压状态& &,内部FLASH存储数据。单片机 105K4& &内部16M晶振。
& && && && &程序的主函数部分& &:
#include&stm8s105k4.h&#include&ad105.h&& && &&&//旋钮电压采集头文件
#include&deng.h&& && && &&&//灯光控制头文件
#include&irdate.h&& && &&&//红外采集头文件
#include&eeprom.h&& & //数据存储头文件,包含TLI电压检测
#include&keys.h&& && &&&//红外解码值转换为按键头文件
////////////////////////////////////////////////////
void&&TIM3_INIT(void)&&//定时器初始化 程序基本运行定时器,所有工作指示都靠这个定时器指定
& && &&&TIM3_EGR=0X01;& && && && && &//产生更新事件
& & & & TIM3_PSCR=0X07;& && && && &//128分频
& & & & TIM3_ARRH=0X04;& && && && &//1250& & 重装载值
& & & & TIM3_ARRL=0Xe2;& && && && &//1250 &&重装载值
& & & & TIM3_CR1=0X01;& && && && &&&//开定时器
& & & & TIM3_IER=0X01;& && && && && & //使能更新中断
void&&DOG_Init(void)
& & & & IWDG_KR=0XCC;& & //使能看门狗
& & & & IWDG_KR=0X55;& & & & & & & & & & & & //解锁,PR&&RLR 赋值
& & & & IWDG_PR=0X06;& & & & & & & & & & & & //分频&&赋值
& & & & IWDG_RLR=0XFF;& & & & & & & & //重装值
& & & & IWDG_KR=0XAA;& & & & & & & & & & & & //重新加载
void Feed_DOG(void)
& & & & IWDG_KR=0XAA;& & & & & & & & & & & & //重新加载 ,喂狗
void&&clock_config(void)
& & & & CLK_CKDIVR=0X00;//CPU0分频
& & & & clock_config();& && && && &//时钟初始化
& & & & TIM1_CH1PWM();& & //灯管控制初始化
& & & & TIM3_INIT();& && && && && & //基本运行定时器初始化
& & & & TIM2_CH3_Init();& && &&&//红外捕获初始化
& & & & adinit(0);& && && && && && && &&&//旋钮电压采集初始化
& & & & DOG_Init();& && && && && & //看门狗初始化
& & & & _asm(&rim&);& && && && && & //开总中断
& & & & while (1)
& & & & & & & & adzread();& && && && &//旋钮电压值读取
& & & & & & & & deng_pwm();& & & && && && &//灯光控制
& & & & & & & & getzudate();& && && && &//红外解码
& & & & & & & & keysirrun();& && && && &//按键处理
@far @interrupt void TIM3_UP (void)& && && && &//基本运行定时器
& & & & static&&unsigned&&char&&t200ms=0,t1s=0;
& & & & TIM3_SR1=0X00;& && && && && && && && && && && && &//清标志位
& & & & /////////////////////////add& &10ms& &flag
& & & & /////////////////////////
& & & & t200ms++;
& & & & if(t200ms&9)
& & & & & & & & t200ms=0;
& & & & & & & & /////////////////////////add& &200ms& &flag
& & & & & & & & adstartflag=1;& && && && && && && && && && && && &//电压采集标志位
& & & & & & & & /////////////////////////
& & & & & & & & t1s++;
& & & & & & & & if(t1s&4)
& & & & & & & & {
& & & & & & & & & & & & t1s=0;
& & & & & & & & & & & & /////////////////////////add& &1s& &flag
& & & & & & & & & & & & Feed_DOG();& && && && && && && && && & //喂看门狗
& & & & & & & & & & & & /////////////////////////
& & & & & & & & }
& && & 你可能说有啥问题,这个小项目,对如何提高单片机的执行效率方面的代码不是很多。首先我说一下我的代码风格。
我的程序都有一个程序运行基本定时器,保证程序的基本运行,它决定程序的运行方向。就是上面的定时器3。这个定时器的作用是,合理的管理要执行的任务,避免CPU 的浪费,提高吞吐率.我大致分为三个时间段,10ms&&级别 ,200ms级别,1s级别。对应的下边是待处理函数的标志位,中断是把双刃剑,时效性高,过度利用中断会加重CPU的工作量,很大一部分时间浪费在进入中断及跳出中断的路上。这样一来,在频繁、多个中断同时到达时,中断的的时效性反而不如不用中断了。我习惯在中断里边只处理标志位的状态,在大循环里面运行内嵌标志位的实时函数。这样,在多中断,大工作量的情况下,程序也跑的很轻松。我会在讲解完本历程后贴出一个按键检测小程序,你就会感觉这样做的优点。
不难发现,在While&&里面有一下几个函数
& && && && && & adzread();& && && && &//旋钮电压值读取& & & & & & & & deng_pwm();& & & && && && &//灯光控制
& & & & & & & & getzudate();& && && && &//红外解码
& & & & & & & & keysirrun();& && && && &//按键处理
旋钮电压采集函数,电压采集函数内部有个允许电压采集标志位, adstartflag&&只有这个标志位被至位后,才运行函数内部程序,且运行完后将标志为复位,等待下次标志位置位。在定时器200MS下将这个标志位每200MS 置位一次
if(t200ms&9)
& & & & & & & & t200ms=0;
& & & & & & & & /////////////////////////add& &200ms& &flag
& & & & & & & & adstartflag=1;& && && && && && && && && && && && &//电压采集标志位
& && &&&}
你可能又会说,为啥只有这么一个标志位,这样有啥用,上边说了本历程相关代码较少,是因为其他函数不需要有时间的感念,它们都是基于,旋钮电压的变化、及红外捕获值存在,而变化,不需要时间决定它们的运行状态。当程序庞大,关系繁琐复杂时你会体会到这种写法的优点。
看门狗每1s喂一次,这里不多说。
& && &&&下面分别说每个头文件下的函数
#include&stm8s105k4.h&
#include&eeprom.h&
#include&ad105.h&
_Bool adstartflag=0;& && &&&//标志位
unsigned&&short&&adz1, adz2;
unsigned& &char& &adi=0;
void& &adgpioinit(void)
& & & & PB_ODR&=0XFE;
& & & & PB_DDR&=0XFE;
& & & & PB_CR1&=0XFE;
& & & & PB_CR2&0XFE;
void& &adinit(unsigned& &char&&ch)
& & & & adgpioinit();
& & & & ADC_CSR &=0xf0;
& & & & ADC_CSR|=& &//通道& && && &
& & & & ADC_CR1=0X01;
& & & & ADC_CR2=0X30;
unsigned& &short&&readadz(void)
& & & & unsigned& &short& &adz=0;
& & & & ADC_CR1|=0x01;
& & & & while(!(ADC_CSR & 0x80)); // 等待ADC结束
& & & & adz=ADC_DRH;adz&&=2;adz+=ADC_DRL;
& &return (adz);& &
void& &adzread(void)
& & & & if(adstartflag)& && && && && && && && &//是否可以采集旋钮电压
//& & & & & & & & if(adi&4)
& & & & & & & & if(adendlag==0){& && && && &//没有处于红外控制状态下
& & & & & & & & adz=readadz();
//& & & & & & & & adi=0;& & & &
& & & & & & & & pwmstartflag=1;}& & & & & & & & //灯光控制允许变化。这里也可以对电压值比较有变化时允许灯光变化
//& & & & & & & & if(((adz1+10)&adz)&&((adz1-10)&adz)) adi++; //判断当前状态
//& & & & & & & & & & & & else&&adi=5;//状态不稳定时
//& & & & & & & & adz1=
//被注释掉的地方是为在稳定状态下降低旋钮电压检测次数,在不讲求功耗的时候没有太大必要。
& & & & & & & & adstartflag=0;
每个头文件下总有那么1-2个标志位。号召它们旗下的小兵们。这个就这么简单,速度过。
#include&stm8s105k4.h&
#include&deng.h&
#include&eeprom.h&
void& &TIM1_CH1PWM(void)
& & & & TIM1_CR1=0X00;
& & & & TIM1_CCMR1=0X68;
& & & & TIM1_CCER1=0X01;
& & & & TIM1_ARRH=0X04;& && &&&//旋钮电压采集满量程值,
& & & & TIM1_ARRL=0X00;
& & & & TIM1_PSCRH=0X00;
& & & & TIM1_PSCRL=0X00;& & /0分频,让PWM频率最大
& & & & TIM1_BKR=0X80;& && && && && && &&&//注意这个别忘了& &
& & & & TIM1_CR1=0X81;
void&&T1_CH1PWMT(unsigned&&short date)
& & & & TIM1_CCR1H=date/256;
& & & & TIM1_CCR1L=date%256;
void& &deng_pwm(void)
& & & & if(pwmstartflag)& && && && && && && && &//是否可以控制更改灯光输出
& & & & & & & & T1_CH1PWMT(adz);& && &&&//赋值
& & & & & & & & pwmstartflag=0;& && && && &//& & 清除标志位
也很简单& &过& &。。。。。。。。。。。。。。
#include&stm8s105k4.h&
#include&irdate.h&
#include&eeprom.h&
//////////14 03 27&&张小强
#define& &tim2_ccr3 (TIM2_CCR1H*256+TIM2_CCR1L)& &//捕获值
#define& &tim2_ovfz&&(0xffff)& &//预设值
//#define& &tim2_ovfz&&(0x7a10)& &//预设值
//更换遥控器需要修改的的数据
#define& &learnadd& &0& &&&//是否学习地址
#define& &learndate&&0& &&&//是否学习数据
//////////////////////////////////////////////////
#define& &irstartH 255 & & & & //引导吗最大值
#define& &irstartL 95& & & & //引导吗最小值
#define& &irstopH 95& & & & //停止码最大值
#define& &irstopL 75& & & & //停止码最小值
#define& &irhH & & & & & & & & <font color="#& & & & //高电平最大值
#define& &irhL & & & & & & & & <font color="#& & & & //高电平最小值
#define& &irlH & & & & & & & & <font color="#& & & & //低电平最大值
#define& &irlL & & & & & & & & <font color="#& & & & //低电平最小值
///////////////////////////////////////////////
//所用变量
unsigned&&char&&ovfflag=0;//溢出标志&&实际捕获值 辅助计算值
unsigned&&char&&zu[33]={0};& & //捕获临时存放的捕获时间
unsigned& &long irzu=0;& & & & //解出得遥控码包含地址 数据 及各自的反码
unsigned& &char& &irflag=0x01;& & & & & & & & & & & & //捕获值进入
unsigned& &char&&irz=0,tempfalg=0;//得到的键值与次数
_Bool IRled @PD_ODR:1;
/////////////////////////////////////////////
#if learndate ==1
& & & & unsigned&&char& &irzu1[50]={0},irzu1i=0;
#if&&learnadd==1
& & & & unsigned& &char&&iradd=0 , iraddf=0;
unsigned&&char * //= (unsigned char *)0x4000;& &//
void&&miyao(void)
& & & & & & & & FLASH_DUKR = 0& && && && & // 写入第一个密钥
& & & & & & & & FLASH_DUKR = 0x56;& && && && & // 写入第二个密钥
while((FLASH_IAPSR & 0x08) == 0);&&
void& &irwrite(unsigned short add,unsigned&&char&&date&&)
& & & & & & & & miyao();
iraddr=(unsigned char *)
while((FLASH_IAPSR & 0x04) == 0);
& &&&// 等待写操作成功
unsigned&&char&&irreadadd(unsigned short add)
& & & & & & & & iraddr=(unsigned char *)
& & & & & & & & return (*iraddr);
& & & & & & & &
& & & & #define& &iradd& & 0x38& & & & & & & & & & & & & & & & & & & & //遥控器地址
& & & & #define& &iraddf& &0xc7& & & & & & & & & & & & & & & & & & & & //遥控器地址反码& & & &
////////////////////////////////////////////
void& &TIM2_CH3_Init(void)
& & & & TIM2_CR1=0X00;
& & & & TIM2_PSCR=0X0b;
& & & & TIM2_EGR=0X03;
& & & & TIM2_ARRH=0X
& & & & TIM2_ARRL=0X& & & &
& & & & TIM2_CCMR1=0Xa1;& & & &
& & & & TIM2_CCER1=0X03;
& & & & TIM2_IER|=0X03;
& & & & TIM2_CR1|=0X01;
& & & & & & & & PD_CR1|=0X10;
& & & & PD_DDR&=0XEF;
& & & & PD_CR2&=0XEF;
& & & & PD_ODR&=0XEF;
& & & & irled_config();
& & & & #if&&learnadd==1
& & & & iradd=irreadadd(0x40a0);
& & & & iraddf=irreadadd(0x40a1);
& & & & #endif
void& &getirdate(void)
& & & & static&&unsigned char&&tim2_ch3date=0,tim2_ccr3c=0,iri=0;
& & & & if(ovfflag==0)
& & & & & & & & tim2_ch3date=tim2_ccr3-tim2_ccr3c;
& & & & & & & & tim2_ccr3c=tim2_ccr3;
& & & & else
& & & & & & & &
& & & & & & & & tim2_ch3date=((tim2_ovfz -tim2_ccr3c)+tim2_ccr3);
& & & & & & & & ovfflag=0;
& & & & if((tim2_ch3date&irstartL)&&(tim2_ch3date&irstartH)){iri=0;irflag=0x05;}
& & & & if((tim2_ch3date&irlL)&&(tim2_ch3date&irhH)&&(irflag==0x05))
& & & & & & & & zu[iri++]=tim2_ch3
& & & & & & & & if(iri&31)irflag=0x0a;
& & & & if((tim2_ch3date&irstopL)&&(tim2_ch3date&irstopH)){iri=0;irflag=0x0a;}
& & & & if(iri&32)iri=0;
& & & & #if learndate ==1
& & & & & & & & irzu1[irzu1i++]=tim2_ch3
& & & & & & & & if(irzu1i&49)irzu1i=0;
& & & & #endif
void& & restzu(void)
& & & & static&&unsigned&&char&&rzi=0;
& & & & for(rzi=0;rzi&32;rzi++)
& & & & & & & & zu[rzi]=0;
void& &irtimeupflag(void)
& & & & ovfflag=1;
void& &getzudate(void)
& & & & static& &unsigned&&char iri1=0,z1=0,z2=0,z3=0,z4=0,z5=0;
#if&&learnadd==1& & & &
static&&unsigned&&char add1=0,add2=0,add3=0,add4=0,add5=0,add6=0;
& & & & if(irflag==0x0a)
& & & & & & & & for(iri1=32;iri1&0;iri1--)
& & & & & & & & {
& & & & & & & & & & & & if((zu[iri1]&irhL)&&(zu[iri1]&irhH)){irzu|=0x01;}
& & & & & & & & & & & & irzu&&=1;
& & & & & & & & }
& & & & & & & & z1=z2=(irzu&&8);z3=(~(irzu&&24));z4=(irzu&&16);
& & & & & & & &
& & & & & & & & if(((z1==iradd )&&(z2==iraddf)))
& & & & & & & & {
& & & & & & & & & & & & if(z3==z4)
& & & & & & & & & & & & {
& && &&&& && && && && & switch(z4)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & case 3: irz=10;&&irokflag=1; & & & & & & & & & && & //有效按键&&进入按键待处理状态
& & & & & & & & & & & & & & & & & & & & case 9: irz=11;&&irokflag=1; & & & & & & & &
& & & & & & & & & & & & & & & & & & & & case 14:irz=12;&&irokflag=1;&&& & & &
& & & & & & & & & & & & & & & & & & & & case 26:irz=13;&&irokflag=1;& & & & & & & &
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & if((z5==z4)&&(irokflag)){tempfalg++;}& && && && &//连按情况下& && &
& & & & & & & & & & & & & & & & else&&tempfalg=0;
& & & & & & & & & & & & & & & & z5=z4;
& & & & & & & & & & & & & & & & restzu();
& && && && && && && && && && &&&
& & & & & & & & & & & & //& & & & z1=0;z2=0;z3=0;z4=0;
& & & & & & & & & & & & }
& & & & & & & & }
& & & & & & & & #if learnadd==1& & & & & & & & & & & &
& & & & & & & & & & & & else
& & & & & & & & {
& & & & & & & & & & & & add5=add3;add6=add4;add3=add1;add4=add2;add1=z1;add2=z2;
& & & & & & & & & & & & & & & & if((add5==add1)&&(add6==add2))
& & & & & & & & & & & & & & & & {iradd=add1;iraddf=add2;irwrite(0x40a0,add1);irwrite(0x40a1,add2);}
& & & & & & & & }//地址学习功能
& & & & #endif
& & & & & & & & irflag=0;
@far @interrupt void TIM2_CC (void)
& & & & TIM2_SR1&=0XFd;
& & & & TIM2_SR2&=0
& & & & getirdate();
@far @interrupt void TIM2_UP (void)
& & & & TIM2_SR1&=0XFE;
& & & & irtimeupflag();
& & & & & & & & #if learndate ==1
& & & & irzu1i=0;
& & & & #endif
上面是红外解码部分,原理是,捕获的一组时间段,放到数组中,接收完毕后判断数组的内容,解出红外值,对应有,地址学习&&功能,数据分析功能。方便在更换遥控器调试使用。这些代码需要耐心看,首先要成功捕获数据,以后就顺理成章了。功能可以做的跟好。这里只是粗略的写写,有兴趣的可以慢慢研究。
#include&stm8s105k4.h&
#include&keys.h&
#include&eeprom.h&
#include&irdate.h&
_Bool pwmen@TIM1_CCER1:0;
void& &keysirrun(void)
& & & & if(irokflag)& && && && && && && && && && && && && & //是否有有效遥控解码值
& & & & & & & & if(irz==11)& && && && && && && && && && && && &//进入遥控控制模式,关闭旋钮电压采集功能
& & & & & & & & {
& & & & & & & & & & & & adendlag=!
& & & & & & & & & & & & adz=(adz-(adz%10));
& & & & & & & & }
& & & & & & & & if(adendlag)& && && && && && && && && && &&&//在遥控模式下
& & & & & & & & {
& & & & & & & & & & & & if(irz==12)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & if(adz&700)adz+=10;pwmstartflag=1;& && &&&//更改灯光强度& &,使能灯光变化
& & & & & & & & & & & & }
& & & & & & & & & & & & if(irz==13)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & if(adz&0)adz-=10;pwmstartflag=1;
& & & & & & & & & & & & }
& & & & & & & & }
& & & & & & & & if(irz==10)
& & & & & & & & {
& & & & & & & & & & & & pwmen=!& && && && && && && && &//开关灯光& && &
& & & & & & & & }& & & &
& & & & & & & & irokflag=0;
//////////内容很少有效指令后处理对应的动作。
#include&stm8s105k4.h&
#include&eeprom.h&
_Bool ledevent @PD_ODR:1;//事件指示灯
_Bool&&eventledflag=0;
unsigned&&char ledi=0;
/////////////////////////////自身变量
unsigned&&char&&eeflag=0;
////////////////////////////////////外部变量
unsigned& &short& &shiji=0;
unsigned&&char&&shanflag=0,shflag=0,disflag=0;
//////////////////////////////////
void& &eepromEN(void)
& & & & eeflag=1;
unsigned&&char * //= (unsigned char *)0x4000;& &//
void&&miyao(void)
& & & & & & & & FLASH_DUKR = 0& && && && & // 写入第一个密钥
& & & & & & & & FLASH_DUKR = 0x56;& && && && & // 写入第二个密钥
while((FLASH_IAPSR & 0x08) == 0);&&
void& &write(unsigned short add,unsigned&&char&&date&&)
& & & & & & & & miyao();
addr=(unsigned char *)
while((FLASH_IAPSR & 0x04) == 0);
& &&&// 等待写操作成功
unsigned&&char&&readadd(unsigned short add)
& & & & & & & & addr=(unsigned char *)
& & & & & & & & return (*addr);
& & & & & & & &
& & & & void& &eventledgpio(void)
& & & & ledevent=1;
& & & & PD_DDR|=0X02;
& & & & PD_CR1|=0X
void& &eventleden(void)
& & & & eventledflag=1;//& &set&&ventlede&&flag
& & & & ledevent=0;& & & & & & & & & & & & //& &&&open&&led
void& & eventledable(void)
& & & & & & & & if(eventledflag)
& & & & & & & & {
& & & & & & & & & & & & ledi++;
& & & & & & & & & & & & if(ledi&1)& & & & & & & & // 30ms&&
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & ledi=0;
& & & & & & & & & & & & & & & & eventledflag=0;&&//reset& &ventlede&&flag
& & & & & & & & & & & & & & & & ledevent=1;& & & & & & & & & & & & & & & & //close led
& & & & & & & & & & & & }
& & & & & & & & }
void& &TLI_init(void)
& & & & PD_DDR&=0X7F;
& & & & PD_CR2|=0X80;
& & & & EXTI_CR2|=0X20;
& & & & eventledgpio();
& & & & eepromEN();
void& &readeeprom(void)
& & & & adendlag=readadd(0x4000);
@far @interrupt void TLI_PD7(void)
& & & & if(eeflag==1)
& & & & & & & & write(0x4000, adendlag);
在电压下降到认为发生掉电时,触发TLI中断,将需要保存的数据保存到FLASH内部,等待下次运行用。这里就一个数据需要存储。
按键小程序驾到
#include&stm8s105k4.h&
#include&eeprom.h&
#include&key.h&
_Bool keystartflag=0;
#define keyc02&&0x02
#define keyc04&&0x04
#define keyc08&&0x08
#define keyc10&&0x10
#define& &keygc&&PC_IDR&0x1e&&//宏定义控制
#define keyd01&&0x01
#define keyd04&&0x04
#define keyd08&&0x08
#define& &keygd&&PD_IDR&0x0d&&//宏定义控制
unsigned&&char&&c10g=0,c20g=0,c40g=0,c80g=0;
_Bool c10kflag=0,c20kflag=0,c40kflag=0,c80kflag=0;
unsigned&&char&&c20cg=0;& &//长按
_Bool&&c20cflag=0;& & & &
unsigned&&char d20g=0,d40g=0,d80g=0;
_Bool&&d40kflag=0,d20kflag=0,d80kflag=0;
void& &keyinit(void)
& & & & PC_DDR&=0Xe1;
& & & & PC_CR1|=0X1e;
& & & & PD_DDR&=0Xf2;
& & & & PD_CR1|=0X0d;
void&&keysjian(unsigned char k1t,unsigned char k2t,unsigned char k3t,unsigned char k4t,unsigned char k5t,unsigned char&&k6t,unsigned char k7t)
& & & & if(keystartflag)
& & & & & & & & eventledable();& &//进过30ms关闭led&&事件指示灯
& & & & & & & & //端口c
& & & & & & & & if((keygc&keyc10)==0x00){if(c10kflag==0){c10g++;if(c10g&k1t){c10kflag=1;eventleden();& & 动作& & }}}
& & & & & & & & else {c10kflag=0;c10g=0;}
& & & & & & & & if((keygc&keyc08)==0x00){if(c20kflag==0){c20g++;if(c20g&k2t){c20kflag=1;eventleden();动作& & }}}
& & & & & & & & else {c20kflag=0;c20g=0;}
& & & & & & & & if((keygc&keyc04)==0x00){if(c40kflag==0){c40g++;if(c40g&k3t){c40kflag=1;eventleden();动作& & }}}
& & & & & & & & else {c40kflag=0;c40g=0;}
& & & & & & & & if((keygc&keyc02)==0x00){if(c80kflag==0){c80g++;if(c80g&k4t){c80kflag=1;eventleden();动作& & }}}
& & & & & & & & else {c80kflag=0;c80g=0;}
& & & & & & & &
& & & & & & & & if((keygd&keyd01)==0) {if(d20kflag==0){d20g++;if(d20g&k5t){d20kflag=1;eventleden();动作& & }}}
& & & & & & & & else {d20kflag=0;d20g=0;}
& & & & & & & &
& & & & & & & & if((keygd&keyd04)==0) {if(d40kflag==0){d40g++;if(d40g&k6t){d40kflag=1;eventleden();动作& & }}}
& & & & & & & & else {d40kflag=0;d40g=0;}
& & & & & & & & if((keygd&keyd08)==0x00){if(d80kflag==0){d80g++;if(d80g&k7t){d80kflag=1;eventleden();动作& & }}}
& & & & & & & & else {d80kflag=0;d80g=0;}
& & & & & & & &
& & & & & & & & keystartflag=0;
将标志位放到10MS下,调用函数&& keysjian(1,2,10,50,100,200,250);& &参数是承认该按键的时间,可更换有关变量类型加大选择时间的宽度,这里只写了按下的检测函数,可以很容易的更改 为松开后& &、长按&&、短按& &、组合 、等检测方式,很有趣,这个需要读者理解,才能为己所用,我多说无益。重要是领悟编程方法& & 。
程序员万万不能懒。
下次再会& && &张小强于 23 02
Powered by

我要回帖

更多关于 via芯片声卡驱动程序 的文章

 

随机推荐