|
本帖最后由 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 的MCU有四个供电单元
【STM8-SO8】08-STM8L001J3的点灯
STM8单片机如何实现Bootloader
基于STM8的DALI (数字可寻址调光协议)
开源基于STM32的STM8脱机编程器
【ST MCU实战经验】之STM8中UART奇偶校验的使用方法
【思修电子STM8集合贴】龙顺宇STM8理论/实战视频/书籍/软件/
初次尝试STM8S001J3
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
基于STM8的实验代码汇总分享
微信公众号
手机版
好文章,值得学习
这个赞一下,很有用