最近在项目上,用到鼠标上用的编码器,按照厂家给的编程方法,发现容易产生误判,故而自己用外部中断的方式来做,发现这样误判的情况会得到很大的改善,现发上来与大家分享。
#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;
}
上一篇:TM1638测试程序STM8S
下一篇:Stm8l051x timer 库函数的使用
推荐阅读最新更新时间:2024-11-22 04:19
设计资源 培训 开发板 精华推荐
- LT3973HMSE-3.3 1.21V 降压转换器的典型应用
- 用于计量的模拟放大
- 电子教鞭(带鼠标控制)
- LT1021BMH-5 电压基准作为应变计调节器的典型应用
- LC717A30UJ 电容数字转换器 LSI 的典型应用,用于具有 8 个大电容传感器和 I2C 接口的静电电容式触摸传感器
- LDK130C08R 0.8V、300mA 低静态电流极低噪声 LDO 的典型应用可调版本电路
- AD5332 并行接口、双电压输出、8 位 DAC 的典型应用
- TDA7292 40 W + 40 W 立体声放大器的典型应用,带静音和待机功能
- TPS51117RGYR-同步降压电源模块
- L78L06AB可调输出稳压器的典型应用