找回密码
 注册
关于网站域名变更的通知
查看: 199|回复: 2
打印 上一主题 下一主题

旋转编码开关在单片机方面使用 附程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-20 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
旋转编码开关,比如数码电位器  驱动程序      具有左转、右转和按下三个功能,有五个脚,它的外形如下图所示:
" x% B; n' v* Y" \6 _3 j6 q) ]

, I7 u. v8 A; j. G! q                    * Z% f! p/ ~  q" W0 q1 T" N

; T# S9 i& V0 {, N
) `2 i. o9 x: L4 f: j, G1 x$ T! Q
(1) 1、3脚要外接上拉电阻,一般10K就足矣;
/ K8 y! H3 {5 j0 \  R(2) 2脚一般接地就行;* h; y: |; Z& a, Z
(3) 4、5脚是下按键的开关接线(按下时,4脚为低电平);# \. x/ B- @. h  T: v. r/ ]/ e) D
实物接线示意图为:
3 _$ N) E! s9 r7 K6 J0 i4 K! D) B# b; v! |5 o1 _) T$ \

2 q5 V7 [- V; ?8 m

5 k1 ?; E4 I( J# k& E7 B: \                                       
: D1 o2 M9 O6 p$ |3 S$ N( [7 _! u' u; H( M$ a. [9 }2 q  @0 x
     判断正转 和反转的关键就是:当BMA为低电平时,BMB的跳变沿是怎样的——上升沿表示正转,下降沿表示反转。只要用代码把这itP27=P2^7;& K0 W0 Q) l% _7 D& v
sbit P26=P2^6;; q0 ?" b0 e! D
sbit P25=P2^5;  f! X  E3 H. R9 O9 `. k9 M
uchar codetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
$ P6 U9 u9 p0 d, ]4 _  Suchar count=0;
: m& X0 I8 Y2 G" m5 [: Z# tuchar flag;
& K) u% M  W9 j0 [ucharLast_BMB_status;
9 M( ?5 J. s2 B/ @* Q. L6 TucharCurrent_BMB_status;
; N! ^3 E! ?7 Y9 p//************************************************
  f6 l: D/ F9 I3 {( c! K. r4 @; a3 W! Nvoid delay(uchar z)   //大约1ms的延时
7 u* r' \/ {/ N) h1 O{
0 @+ K( Y" ~. D! H( [; S$ W   uchar x,y;
! k% Y, a' D4 k# F- J4 L   for(x=z;x>0;x--)
7 x( T' H) Y) H; b% {   for(y=110;y>0;y--);
% t( q, i7 Q" g}
$ c' Z2 z7 v# K. x6 E6 v//************************************************
* G6 V+ [' |4 k* Ovoid display()//显示子程序
% G: f. N( |! K. w, C/ I9 l" X{
5 T# p2 c; a, W' K   P0=table[count];   //个位* ^  }% X$ r. h
   P27=0;
! x, Z, {9 x) }  O7 k& Q: ?   delay(10);
5 Z% V1 I6 a: Y5 Q/ G   P27=1;
' U: _: x$ f( _2 G" B   P0=table[count0/10];   //十位
, n' |* E" L& D7 ?5 l) C   P26=0;- f. m' [) w: d7 I# {) s9 }
   delay(10);
( s9 G9 w  l# g% E   P26=1;5 _' ?7 G* r0 u9 O) n: \' G
   P0=table[count/100];   //百位
; Z9 V0 y4 O7 L: w6 ~# M. }2 Y  \   P25=0;0 g) `6 L2 m3 G# h/ t
   delay(10);' p$ Q) R5 n1 p; i" G
   P25=1;( e8 C/ W- p$ \' y
}
6 Y: O& a) p4 H1 q//************************************************4 X, O8 t- A" t6 y6 Y- u8 J
void main()3 A$ w) ]1 @' ?2 L8 z0 N* S  w
{
6 u1 p" {& X/ r- S' {9 e4 h" m   TMOD="0x01";   //定时器0,工作方式1: ?6 b% r9 E/ K- @/ W$ p2 }+ z
   TH0=0xD8;1 e3 `* H; Z; t9 L& l8 m
   TL0=0xF0;    //给定时器装上初值,10ms中断一次: u1 Q  ^) i; O" }+ i) J% q( O
   ET0=1;   //打开定时器中断4 w: ?0 i2 c' R" \, [7 |- K5 ^
   EA =1;   //打开总中断
$ |8 g' M; w% ^- A) g/ g$ h   TR0=1;   //启动定时器0  n2 v+ ~* V* b3 ?+ i  }; ~

8 K1 S  n, `8 r" }& H; q/ [( N2 Q, K

9 h7 U1 d) X0 ^6 `0 X& G   while(1). J  N! T! Q7 ^7 e, k
   {
$ t0 }5 D3 G5 J! L      Last_BMB_status=BMB;
. H2 C+ J! j* V/ L7 [1 p9 v' c- {$ m; A/ E  `
6 X( g4 T, Z( b. P  a6 M' R7 W
      while(!BMA)   //BMA为低电平时, y9 q9 u9 J- ~) R
      {( k; Z$ ~! Z2 n1 X
         Current_BMB_status=BMB;# R8 S- \6 u$ z" X0 s3 Y
          flag="1";   //标志位置为1说明编码开关被旋转了; h/ d* Y0 j$ \  s
      }  Y; \0 N" u& G, i- r

7 ^' s6 m' M) O5 K; S1 v7 R

" d( C: _3 c- Q6 Q. ?7 |      if(flag==1)
- y; E6 ]# z7 a1 H+ x      {
! t* A$ p& V8 u3 Z; N5 g          flag="0";   //时刻要注意这一点!给标志位清零) k0 H. P) J; N, u
         if((Last_BMB_status==0)&&(Current_BMB_status==1))//BMB上升沿表示正转
5 c  b/ J" t/ p2 _% Q          {# ]6 \& c" m# J
             count++;, Z: s  E' Y1 R, O; c! @! F0 Z
             if(count==255)
* U5 j+ I8 O( E# J) G  P             {- d$ p+ O0 B$ v$ Q0 m( P: q
                count="0";
: }; ?6 G! ?  o: E0 Z3 V7 R             }
% D/ Z9 E2 k' Y* s+ \          }
4 ?. A0 b) P* a         if((Last_BMB_status==1)&&(Current_BMB_status==0))//BMB下降沿表示反转2 H7 Q# N8 d) R- B- C, G4 u/ @0 U8 r  r: o
          {) r) D5 i$ V' H" U8 i+ |: j. h# l
             count--;
3 e- ]1 W5 ^- d8 b% H             if(count==0)
2 B5 O* j  \# U             {/ K* y1 w$ {- h9 s+ m. l6 L
                count="255";
6 P) n0 d) C3 e" I7 A8 C             }! n5 k  w  \7 Q9 R6 n3 ?
          }" M, k* c4 P. H0 G4 W
      }2 x3 _9 F$ O. F: \- X6 r" z
   }2 `& ]5 z- K" ]+ N$ ?( L! V, K
}' o0 p6 X; _6 ~# D1 K5 B/ }1 z/ m
//************************************************, l" `& \& q, N# H
void timer0() interrupt 1   //定时器0的中断服务程序
$ O5 }1 j- l# g; S7 k) n+ x1 c{. M5 h" Y/ e# y
   TH0=0xD8;
+ D! ~. V* z( J+ w   TL0=0xF0;   //再次装入初值
4 g% a4 _% ^" }, U0 t   display();  //每隔10ms显示一次
, ^7 G9 Y2 K' v   if(!BMC)    //按下旋转编码开关则计数清零
- b& o7 X7 r" @   {7 q9 D: w. y6 B5 b% ]( j9 z
      count="0";
9 `! H8 E. g/ _2 ^* {   }: Q3 n* W' E' `$ q2 c% x% B- b  {
}
8 c& t5 Z* r6 v3 m& K-------------------------------------------------------------------------------------------------- t9 [7 a7 M4 D9 k

该用户从未签到

2#
发表于 2022-6-20 10:13 | 只看该作者
有的时候编码开关会卡死while(!BMA)   //BMA为低电平时  : D4 O) \9 I9 q. Z" j& F
有过试验。

该用户从未签到

3#
发表于 2022-6-20 13:49 | 只看该作者
我觉得可能用外部中断的办法做比较好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-18 10:13 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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