专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

自写程序:旋转编码器软件方式扫描计数

作者:佚名   来源:本站原创   点击数:  更新时间:2010年05月21日   【字体:

   国培期间时间相对而言比较充裕,于是就想写点程序。来的时候带了一个旋转编码开关,今天晚上写了个程序测试了一下,通过了,程序能够识别编码开关的旋转方向和旋转次数,并且在数码管上显示出来。支持负数显示。以下为源程序,程序在一职校开发板上运行成功,芯片为STC89C51RC。

#include < reg52.h>  //头文件 
sbit anotherbit = P1^2; //旋转编码器另一脚 
sbit rotation=P1^0;  //旋转编码器中一脚 
bit oldbit;    //上一状态暂存位 
unsigned char led1,led2,led3,led4,ztj;//LED显示缓存,扫描状态机 
int xuanzhuanzhi,ctemp;//旋转值 
unsigned char code ledseg[17]={0x88,0xBE,0xC4,0x94,0xB2,0x91,0x81,0xBC,0x80, 
                               0x90,0xA0,0x83,0xC9,0x86,0xC1,0xE1,0xf7}; 
void init(void) 
     { 
  TMOD=0x11;  //方式1 
  TR0=1;   //启动T0开始扫描数码管 
  ET0=1;   //打开中断 
  EA=1; 
  } 
void ledscan(void) //数码管扫描程序 
     { 
  switch(ztj) //切换状态机 
    { 
    case 0:  //分支 
  P2=0xff; //关闭数码管 
  P0=ledseg[led4];//查表得段码数据 
  P2=0x7f; //打开数码管 
  ztj=1;  //转移状态 
    break;  //分支结束 
    case 1: 
  P2=0xff; 
  P0=ledseg[led3]; 
  P2=0xbf; 
  ztj=2; 
    break; 
    case 2: 
  P2=0xff; 
  P0=ledseg[led2]; 
  P2=0xdf; 
  ztj=3; 
    break; 
    case 3: 
  P2=0xff; 
  P0=ledseg[led1]; 
  P2=0xef; 
  ztj=0; 
    break; 
    default:  //没有找到分支 
    ztj=0;  //状态机复位 
    break;  //分支结束 
    } 
  } 
void timer0 (void) interrupt 1 using 1 //T0定时器中断程序,定时时间到,自动运行此程序 
     { 
  TH0=(65536-5000)/256;    //置定时值,每次时间到都要重新置定时值 
  TL0=(65536-5000)%256;    //每5000us产生一次定时器定时中断(12MHz) 
  ledscan();       //每5000us扫描一次LED(12MHz) 
  } 
void main(void) 
{ 
init();            //是初始化,打开中断及定时器 
while(1) 
  { 
      ctemp=xuanzhuanzhi;    //复制计数值 
   if(ctemp<0)      //判断符号 
   { 
   ctemp=-ctemp;      //如果为负数,取反 
   led4=16;       //显示负号 
   led3=ctemp%1000/100;   //提取各位数值 
   led2=ctemp%100/10;   //提取各位数值 
   led1=ctemp%10;    //提取各位数值 
   } 
   else 
   { 
   led4=ctemp/1000;    //提取各位数值 
   led3=ctemp%1000/100;   //提取各位数值 
   led2=ctemp%100/10;   //提取各位数值 
   led1=ctemp%10;    //提取各位数值 
   } 
   if(oldbit==1&&rotation==0) //判断前后状态以识别是否发生下降沿 
   { 
   if(anotherbit)    //判断另一相电平 
    { 
     xuanzhuanzhi++;   //为高,正转 
    } 
    else 
    { 
    xuanzhuanzhi--;   //为低,反转 
    } 
   } 
   oldbit=rotation;    //刷新位暂存值 
  } 
} 

关闭窗口

相关文章