标题: 单片机EC11编码器TM1637数码管显示程序 [打印本页]

作者: aihofor    时间: 2025-6-9 09:52
标题: 单片机EC11编码器TM1637数码管显示程序
用TM1637数码管显示EC11编码器调整数字
/*========================================  
引脚分别为a,b,c  b接地;a,c分别接到P3.3和P3.2口并分别接两个10K上拉  
电阻,并且a,c需要分别对地接一个104的电容,否则  
因为编码开关的触点抖动会引起轻微误动作。本程序不  
使用定时器,不占用中断,不使用延时代码,并对每个  
细分步数进行判断,避免一切误动作,性能超级稳定。  
我使用的编码器是APLS的EC11可以参照附件的时序图  编码器控制流水灯最能说明问  
电路原理图如下:

(单片机为STC89C52)=================*/   
#include <STC89c52.H>
#include "TM1637.h"  
#include <intrins.h>

#define uint unsigned int   
#define uchar unsigned char   
#define NULL 0   

uchar x,WheelOld;   
uchar Led=0;//LED流水灯初始化   
/*************************定义接口************************/

/*************************定义接口************************/     
sbit PINA=P3^2;    //定义编码器连接的IO   
sbit PINB=P3^3;    //定义编码器连接的IO   
/*************************过程返回************************/     
uchar WheelLeft()      
{        
    Led++;         
    return(NULL);      
}     
/*************************右转一步的操作************************/
uchar WheelRight()      
{         
     Led--;   
     return(NULL);      
}     
/*************************编码器过程************************/     
uchar EncoderProcess()   
{      
        uchar keytmp,keytmp1,keytmp2,WheelNow;   
        
        PINA=1;                                                                 //PINA至高电平   
        PINB=1;                                                                        //PINB至高电平   
        if(PINA==1)                                                         //如果PINA为高电平   
        {   
                keytmp1=0x01;   
        }   
                else keytmp1=0;     
        if(PINB==1)                                                         //如果PINB为高电平   
        {   
                keytmp2=0x02;   
        }   
        else keytmp2=0;   
        WheelNow=keytmp1+keytmp2; //根据两个IO组合成16进制数为0x00|0x01|0x02|0x03   
        keytmp=WheelNow;   
        keytmp^=WheelOld;  //判断新数据同旧数据   
        if(keytmp==0) return(NULL); //如果新数据和原来的数据一样 就直接退出   
        if(WheelOld==0 && WheelNow==0x01)   
        {   
                x=WheelNow;   
        }           
        if(WheelOld==0 && x==0x01 && WheelNow==0x03)   
        {   
                WheelOld=WheelNow;   
                x=0;   
                return(WheelLeft()); //左旋转00 01 03   
        }   
        if(WheelOld==0x03 && WheelNow==0x02)   
        {   
                x=WheelNow;   
        }           
        if(WheelOld==0x03 && x==0x02 && WheelNow==0x00)   
        {   
                WheelOld=WheelNow;   
                x=0;   
                return(WheelLeft()); //左旋转03 02 00   
        }   
        if(WheelOld==0 && WheelNow==0x02)   
        {   
                x=WheelNow;   
        }   
        if(WheelOld==0 && x==0x02 && WheelNow==0x03)   
        {   
                WheelOld=WheelNow;   
                x=0;           
                return(WheelRight());  //右旋转00 02 03   
        }   
        if(WheelOld==0x03 && WheelNow==0x01)   
        {   
                x=WheelNow;   
        }           
        if(WheelOld==0x03 && x==0x01 && WheelNow==0x00)   
        {   
                WheelOld=WheelNow;   
                x=0;      
                return(WheelRight());  //右旋转03 01 10   
        }   
}   
/*************************主函数************************/
void main()   
{      

    while (1)   
    {   
            EncoderProcess();   
            Fnshu(Led);   
    }   
}

完整程序: EC11.7z (26.47 KB, 下载次数: 0)





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1