
本帖最后由 perpetuiy 于 2015-11-7 23:08 编辑 最近在项目上,用到鼠标上用的编码器,按照厂家给的编程方法,发现容易产生误判,故而自己用外部中断的方式来做,发现这样误判的情况会得到很大的改善,现发上来与大家分享。 #include "stm8s103f3p.h" #include "stm8s_bitsdefine.h" #include "typedef.h" #define CodeA PB_IDR_0 #define CodeB PB_IDR_1 uint8_t CodeB_last,CodeB_current,whe_ch,ADJ; void UART1_Init(void) { UART1_CR2=0x00; UART1_CR1=0x00; UART1_CR3=0x00; UART1_BRR2=0x00; UART1_BRR1=0x0d; UART1_CR2=0x2C; } void UART1_SendChar(uint8_t ch) { while((UART1_SR & 0x80) == 0x00); UART1_DR = ch; } void IO_Init(void) { PB_DDR=0x04; PB_CR1=0x07; PB_CR2=0x01; } void EXTI1_INIT(void) { EXTI_CR1=0x08; } main() { IO_Init(); EXTI1_INIT(); UART1_Init(); _asm("rim"); while(1) ; } @far @interrupt void EXTI1_IRQHandler(void) { _asm("sim"); whe_ch++; if(whe_ch==1) { CodeB_last=CodeB; IO_Init(); EXTI_CR1=0x04; } if(whe_ch==2) { whe_ch=0; CodeB_current=CodeB; IO_Init(); EXTI_CR1=0x08; } if((CodeB_last==1)&&(CodeB_current==0)) { ADJ++; UART1_SendChar(ADJ); } if((CodeB_last==0)&&(CodeB_current==1)) { ADJ--; UART1_SendChar(ADJ); } _asm("rim"); return; } |
STM8自学笔记(推荐STM8很好的入门电子书)
基于STM8的DALI (数字可寻址调光协议)
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
《无刷直流电机控制应用 基于STM8S系列单片机》
STM8S库函数中文参考 小软件
【资料分享】STM8L的智能手持血糖监测设备的源码
基于STM8S207工程模板
【培训资料】STM8系列PPT培训资料
STM8S 直流电机例程及相关资料
无刷直流电机控制应用+基于STM8S系列单片机---电子书
好文章,值得学习
这个赞一下,很有用