找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 318|回复: 0
收起左侧

单片机EC11编码器TM1637数码管显示程序

[复制链接]
ID:1044703 发表于 2025-6-9 09:52 | 显示全部楼层 |阅读模式
用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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表