通过编码开关(旋转编码器)控制数码管的加减一|我爱单片机

//直上调试好的程序看看能否换个M币哈哈!

//通过编码开关(旋转编码器)控制数码管的加减一

#include

#define uchar unsigned char

#define uint  unsigned int

#define cycle       1           //定义动作周期,编码器旋转多少格有效

#define NULL       0          //定义编码器不动作时的还回值

#define E_RIGHT     0x0e        //定义右旋转还回值

#define E_LEFT      0x0f        //定义左旋转还回值

/*=====数码管位及按键定义=====*/

sbit dula=P2^6;  //数码管段选,锁存器控制信号

sbit wela=P2^7;  //数码管位选,锁存器控制信号

sbit PINA   =   P1^0;  //定义IO

sbit PINB   =   P1^1;

uchar WheelNow,WheelOld,RightCount,LeftCount;

/*=====0-9=====A-G=====*/

uchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x00};

//数码管显示编码

unsigned sled_bit_table[]={0x5f,0x6f,0x77,0x7b,0x7d,0x7e,0xff};

/*定义点亮的数码管与数组的关系*/

/*=====四个数码管显示数据存放处=====*/

uchar one,two,three,four;

uint wc=0;

/*=====函数定义=====*/

void delay(uint x);

void display(void);

//void key();

void led_analyze(uint i);

/*====延时函数=====*/

void delay(uint x)

{

uint i;

for(i=0;i

}

/*====显示函数=====*/

void display(void)

{

//送段码

dula=0;

P0 =a[one];

dula=1;

dula=0;

//数码管位选

wela=0;

P0=sled_bit_table[0]; //开显示

wela=1;

wela=0;

delay(200);    //调用键盘扫描

wela=0;

P0=sled_bit_table[6];

wela=1;

wela=0;  //关显示

dula=0;

P0=a[two];

dula=1;

dula=0;

//数码管位选

wela=0;

P0=sled_bit_table[1]; //开显示

wela=1;

wela=0;

delay(200);    //调用键盘扫描

wela=0;

P0=sled_bit_table[6];

wela=1;

wela=0;  //关显示

dula=0;

P0=a[three];

dula=1;

dula=0;

//数码管位选

wela=0;

P0=sled_bit_table[2]; //开显示

wela=1;

wela=0;

delay(200);    //调用键盘扫描

wela=0;

P0=sled_bit_table[6];

wela=1;

wela=0;  //关显示

dula=0;

P0=a[four];

dula=1;

dula=0;

//数码管位选

wela=0;

P0=sled_bit_table[3]; //开显示

wela=1;

wela=0;

delay(200);    //调用键盘扫描

wela=0;

P0=sled_bit_table[6];

wela=1;

wela=0;  //关显示

}

/*====分解显示数据=====*/

void led_analyze(uint i)

{

i=i%10000;

four=i/1000;  // 千位

three=(i/100)%10; // 百位

two=(i%100)/10;  // 十位

one=(i%100)%10;  // 个位

}

//=================================================

uchar WheelRight()

{

LeftCount=0;

RightCount++;

if (RightCount>=cycle)

{

RightCount=0;

return(E_RIGHT);

}

else

return(NULL);

}

//=====================================================

uchar WheelLeft()

{

RightCount=0;

LeftCount++;

if (LeftCount>=cycle)

{

LeftCount=0;

return(E_LEFT);

}

else

return(NULL);

}

//=================================================================

uchar EncoderProcess()

{

uchar keytmp;

PINA = 1;

PINB = 1;

WheelNow=WheelNow

if (PINA==1) WheelNow=WheelNow+1;  // 读 PINA

WheelNow=WheelNow

if (PINB==1) WheelNow=WheelNow+1;  // 读 PINB

WheelNow=WheelNow & 0x03;   // 将 WheelNow 的 2 - 7 位清零,保留 0 - 1 两个位的状态.

if (WheelNow==0x00) return(NULL); //当  PINA 和 PINB 都为低电平时退出,低电平区不做处理

keytmp=WheelNow;

keytmp ^=WheelOld; // 判断新读的数据同旧数据

if (keytmp==0) return(NULL); // 新读的数据同旧数据一样时退出.

if (WheelOld==0x01 && WheelNow==0x02)

{ // 是左旋转否

WheelOld=WheelNow;

return(WheelLeft()); //左旋转

}

else

if (WheelOld==0x02 && WheelNow==0x01)

{ // 是右旋转否

WheelOld=WheelNow;

return(WheelRight()); //右旋转

}

WheelOld=WheelNow; // 保存当前值

return(NULL); // 当  PINA 和 PINB 都为高电平时表示编码器没有动作,退出

}

//==========================================================================

void inc()

{

wc++;

if(wc>9999) wc=0;//如果WG大于9999则将它清零

led_analyze(wc);

} // 在此处设置断点看 num 加的变化

//====================================================================

void dec()

{

wc--;

if(wc>9999) wc=9999;

led_analyze(wc);

} // 在此处设置断点看 num 减的变化

//===========================================================================

void main()

{

while (1)

{

switch(EncoderProcess())

{

case E_RIGHT:  inc(); break;

case E_LEFT:   dec(); break;

}

display();

}

}

//直上调试好的程序看看能否换个M币哈哈!

//通过编码开关(旋转编码器)控制数码管的加减一

#include

#define uchar unsigned char

#define uint  unsigned int

#define cycle       1           //定义动作周期,编码器旋转多少格有效

#define NULL       0          //定义编码器不动作时的还回值

#define E_RIGHT     0x0e        //定义右旋转还回值

#define E_LEFT      0x0f        //定义左旋转还回值

/*=====数码管位及按键定义=====*/

sbit dula=P2^6;  //数码管段选,锁存器控制信号

sbit wela=P2^7;  //数码管位选,锁存器控制信号

sbit PINA   =   P1^0;  //定义IO

sbit PINB   =   P1^1;

uchar WheelNow,WheelOld,RightCount,LeftCount;

/*=====0-9=====A-G=====*/

uchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x00};

//数码管显示编码

unsigned sled_bit_table[]={0x5f,0x6f,0x77,0x7b,0x7d,0x7e,0xff};

/*定义点亮的数码管与数组的关系*/

/*=====四个数码管显示数据存放处=====*/

uchar one,two,three,four;

uint wc=0;

/*=====函数定义=====*/

void delay(uint x);

void display(void);

//void key();

void led_analyze(uint i);

/*====延时函数=====*/

void delay(uint x)

{

uint i;

for(i=0;i

}

/*====显示函数=====*/

void display(void)

{

//送段码

dula=0;

P0 =a[one];

dula=1;

dula=0;

//数码管位选

wela=0;

P0=sled_bit_table[0]; //开显示

wela=1;

wela=0;

delay(200);    //调用键盘扫描

wela=0;

P0=sled_bit_table[6];

wela=1;

wela=0;  //关显示

dula=0;

P0=a[two];

dula=1;

dula=0;

//数码管位选

wela=0;

P0=sled_bit_table[1]; //开显示

wela=1;

wela=0;

delay(200);    //调用键盘扫描

wela=0;

P0=sled_bit_table[6];

wela=1;

wela=0;  //关显示

dula=0;

P0=a[three];

dula=1;

dula=0;

//数码管位选

wela=0;

P0=sled_bit_table[2]; //开显示

wela=1;

wela=0;

delay(200);    //调用键盘扫描

wela=0;

P0=sled_bit_table[6];

wela=1;

wela=0;  //关显示

dula=0;

P0=a[four];

dula=1;

dula=0;

//数码管位选

wela=0;

P0=sled_bit_table[3]; //开显示

wela=1;

wela=0;

delay(200);    //调用键盘扫描

wela=0;

P0=sled_bit_table[6];

wela=1;

wela=0;  //关显示

}

/*====分解显示数据=====*/

void led_analyze(uint i)

{

i=i%10000;

four=i/1000;  // 千位

three=(i/100)%10; // 百位

two=(i%100)/10;  // 十位

one=(i%100)%10;  // 个位

}

//=================================================

uchar WheelRight()

{

LeftCount=0;

RightCount++;

if (RightCount>=cycle)

{

RightCount=0;

return(E_RIGHT);

}

else

return(NULL);

}

//=====================================================

uchar WheelLeft()

{

RightCount=0;

LeftCount++;

if (LeftCount>=cycle)

{

LeftCount=0;

return(E_LEFT);

}

else

return(NULL);

}

//=================================================================

uchar EncoderProcess()

{

uchar keytmp;

PINA = 1;

PINB = 1;

WheelNow=WheelNow

if (PINA==1) WheelNow=WheelNow+1;  // 读 PINA

WheelNow=WheelNow

if (PINB==1) WheelNow=WheelNow+1;  // 读 PINB

WheelNow=WheelNow & 0x03;   // 将 WheelNow 的 2 - 7 位清零,保留 0 - 1 两个位的状态.

if (WheelNow==0x00) return(NULL); //当  PINA 和 PINB 都为低电平时退出,低电平区不做处理

keytmp=WheelNow;

keytmp ^=WheelOld; // 判断新读的数据同旧数据

if (keytmp==0) return(NULL); // 新读的数据同旧数据一样时退出.

if (WheelOld==0x01 && WheelNow==0x02)

{ // 是左旋转否

WheelOld=WheelNow;

return(WheelLeft()); //左旋转

}

else

if (WheelOld==0x02 && WheelNow==0x01)

{ // 是右旋转否

WheelOld=WheelNow;

return(WheelRight()); //右旋转

}

WheelOld=WheelNow; // 保存当前值

return(NULL); // 当  PINA 和 PINB 都为高电平时表示编码器没有动作,退出

}

//==========================================================================

void inc()

{

wc++;

if(wc>9999) wc=0;//如果WG大于9999则将它清零

led_analyze(wc);

} // 在此处设置断点看 num 加的变化

//====================================================================

void dec()

{

wc--;

if(wc>9999) wc=9999;

led_analyze(wc);

} // 在此处设置断点看 num 减的变化

//===========================================================================

void main()

{

while (1)

{

switch(EncoderProcess())

{

case E_RIGHT:  inc(); break;

case E_LEFT:   dec(); break;

}

display();

}

}


相关文章

  • 电气工程实践报告
  • 一.实验装置介绍 该实践课所用的实验装置是THBCDT-2型群控多层电梯实训装置是依据国家数控及机电一体化教学要求而开发的,适合机械制造及自动化.机电一体化.自动化.电气工程等专业的相关课程开设实验课.可编程控制器可采用目前市面上比较流行的 ...查看


  • 8人抢答器电子课程设计
  • <电子技术课程设计>任务书 摘要 主要介绍了数码显示八路抢答器电路的组成,设计及功能,电路采用常用74系列集成电路进行设计.该抢答器具备基础的抢答和主持人控制功能.由主持人控制总开关,总开关未开之前抢答无效,开始抢答数码管显示优 ...查看


  • 伺服电机选型的原则和注意事项
  • <装备制造技术)2009年第11期 伺服电机选型的原则和注意事项 王军锋.唐宏 (江西理工大学.江西赣州341q100) 摘要:阐述了伺服电机的优.轰.用途和选型的原则,并对选型中难理解的概念做了详细解释,介绍了选型时需要注意的事项. ...查看


  • 遥控窗帘电路的设计-毕业设计
  • 遥控窗帘电路的设计 学生:XX 指导教师:XX 内容摘要:本文主要介绍了遥控窗帘的电路设计.电机工作的时候是否有鸣响提示,以及光控状态下环境亮度的控制参数的调整等等都可以通过遥控器随着电子技术和自动化技术的发展,人们对生活质量的要求越来越高 ...查看


  • 8路抢答器设计八路智力竞赛抢答器
  • 1 前言 1.1主要功能介绍 (1)抢答器最多可供8名选手参赛,编号为1~8号,各队分别用一个按钮(分别为S1~S8)控制,并设置一个系统清零和抢答控制开关S,该开关由主持人控制. (2)抢答器具有数据锁存功能,并将锁存数据用LED数码管显 ...查看


  • 基于单片机的智能小车的设计与制作
  • ・380・计算机测量与控制.2009.17(2) ComputerMeasurement&Control 设计与应用 文章编号:1671-4598(2009)02-0380-03 中图分类号:TP33 文献标识码:B 基于单片机的智 ...查看


  • 单片机控制红外遥控电子锁系统
  • 安徽职业技术学院 毕 业 论 文 单片机控制红外遥控电子锁的 系统设计 系 别 班 级 姓 名 学 号 指导教师 2011 - 2012 学年第 1学期 摘要 针对传统机械锁的各种缺点和重要部门安全性的要求,提出一种基于红外遥控的密码锁设计 ...查看


  • 第三章 时分多路复用与复接技术
  • 1 时分多路复用 为了提高信道利用率,使多个信号沿同一信道传输而互相不干扰,称多路复用.目前采用较 多的是频分多路复用和时分多路复用.频分多路复用用于模拟通信,例如载波通信,时分多 路复用用于数字通信,例如PCM通信. 时分多路复用 ...查看


  • 编码器原理
  • 实用光电编码器技术 编著 陈先锋 第1章 光电编码器基础 1.1 概述 光电编码器是一种集光.机.电为一体的数字化检测装置,它具有分辨率高.精度高.结构简单.体积小.使用可靠.易于维护.性价比高等优点.近10几年来,发展为一种成熟的多规格. ...查看


热门内容