EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
给大家分享一个51单片机+1602液晶屏显示 KY-040旋转编码器模块的程序和仿真
; e; h7 Q. `: s, P# e; }; V# P& |$ q% ^5 B. e- h+ U6 ^
程序功能:旋转编码器顺时针旋转,显示数值增加2 `* E( ^* m/ y7 O5 D
旋转编码器逆时针旋转,显示数值减小7 |) x7 M- ?5 M1 d& X% q8 x
旋转编码器按下,切换显示ON/OFF
4 d. y8 F; f+ Y F5 J
% a5 [* [9 R" Y! \' ]" S根据旋转编码器KY-040模块资料可知:
' C7 X3 f" B! a/ c$ g( d
6 H- a) X* M, Q5 y. \/ M: p
3 x& T& p" r4 Q3 S& P+ s在下降触发模式下,A和B进行电平比较:
* y* u! ?1 d' e0 w对A触发的中断:同加异减
( Y& w/ m; A. q9 t2 k0 P/ i对B触发的中断:同减异加: _! L/ ?, [, B/ n! ^! i1 E
反之亦然
! h/ ]; m( l8 A$ e* }2 H那么可以通过手动模拟外部中断触发瞬间的电平状态来进行仿真, CLK(A) ---- P3^2 DT(B) ---- P3^3 SW(Z) ---- P3^4 外部中断0下降沿触发后,对B的电平进行判断即可知道旋转编码器 的旋转方向。 E( d- S9 m1 w' i1 s
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)# \8 F3 t* ^4 c- M
7 l) |! i8 U7 k' [
' |6 R$ Y I; ~; A- I! w单片机源程序如下:
8 V2 P" _/ u8 k7 W1 O: o- #include<reg51.h>
- #include"lcd.h"
- #include<intrins.h>
- //外部中断的IO
- sbit K1=P3^2;
- sbit K2=P3^3;
- sbit K3=P3^4;
- void IntConfiguration();
- void Delay(unsigned int n);
- unsigned char KeyValue=0;
- unsigned char state=0;
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main(void)
- {
- LcdInit();
- IntConfiguration();
- LCDWrite_String(2, 0, 10, "Bian ma qi");
- while(1)
- {
- if(K3==0)
- {
- Delay(1); //延时消抖
- if(K3==0)
- {
- state=!state;
- while(K3==0);
- }
- }
- if(state==1)
- {
- LcdWriteCom(0xc0+13);
- LcdWriteData('O');
- LcdWriteData('N');
- LcdWriteData(' ');
- }
- else
- {
- LcdWriteCom(0xc0+13);
- LcdWriteData('O');
- LcdWriteData('F');
- LcdWriteData('F');
- }
- LcdWriteCom(0xC0+4);
- LcdWriteData('0'+KeyValue/100%10);
- LcdWriteData('0'+KeyValue/10%10);
- LcdWriteData('0'+KeyValue%10);
- }
- }
- /*******************************************************************************
- * 函 数 名 : IntConfiguration()
- * 函数功能 : 设置外部中断
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void IntConfiguration()
- {
- //设置INT0
- IT0=1;//跳变沿出发方式(下降沿)
- EX0=1;//打开INT0的中断允许。
- EA=1;//打开总中断
- }
- /*******************************************************************************
- * 函 数 名 : Delay(unsigned int n)
- * 函数功能 : 延时
- * 输 入 : n
- * 输 出 : 无
- *******************************************************************************/
- void Delay(unsigned int n) //延时50us误差 0us
- {
- unsigned char a,b;
- for(;n>0;n--)
- {
- for(b=1;b>0;b--)
- for(a=22;a>0;a--);
- }
- }
- /*******************************************************************************
- * 函 数 名 : Int0() interrupt 0
- * 函数功能 : 外部中断0的中断函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Int0() interrupt 0 //外部中断0的中断函数
- {
- if(K2==1)
- {
- KeyValue++;
- }
- if(K2==0)
- {
- KeyValue--;
- }
- if(KeyValue>200)
- KeyValue=200;
- if(KeyValue<1)
- KeyValue=1;
- }
2 N3 {5 Y1 ?) c3 i: ?% I0 D6 S : t' I8 Q; a* H/ G- |5 w9 F3 ^
|