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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
旋转编码开关,比如数码电位器  驱动程序      具有左转、右转和按下三个功能,有五个脚,它的外形如下图所示:( X3 z. @& M0 }4 v* Z/ i6 d2 y

" X* e1 }2 H9 S+ Q                    , I; M9 m: O8 H4 g: }' w
9 S  Q0 ?: a8 E& M* w4 H
! `: _7 T2 d4 W% q% ?
(1) 1、3脚要外接上拉电阻,一般10K就足矣;+ E! X. P1 x5 g' h! Q& b. k
(2) 2脚一般接地就行;
+ ~7 q0 I/ \, g(3) 4、5脚是下按键的开关接线(按下时,4脚为低电平);* z; Y  {. T' j* x
实物接线示意图为:6 v7 \  h# o4 _* M* Z3 ^  y
5 s% t' _4 A0 _& D0 k

9 c6 ^1 s4 F: u, H" C; B
& \. ~) O( W7 ~: ~
                                       
; r) s* ?4 N. Y" K" C4 X" L% b4 _1 a1 e$ g: C/ t
     判断正转 和反转的关键就是:当BMA为低电平时,BMB的跳变沿是怎样的——上升沿表示正转,下降沿表示反转。只要用代码把这itP27=P2^7;
) e/ t# T5 J2 N2 J: k0 E! T6 g" v6 csbit P26=P2^6;
! M& }; y6 p9 K8 nsbit P25=P2^5;% h8 q, s9 Y" w4 k: T
uchar codetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
& q& G) g' j+ ^: b# o, M$ k4 l* vuchar count=0;
4 @/ w+ S$ b4 xuchar flag;, F# ^- C$ J8 n6 ^( N) c
ucharLast_BMB_status;# r# A, i: y6 e0 U1 q8 E
ucharCurrent_BMB_status;  w; z5 W: @( b. p. |
//************************************************. O& B: V+ \& n7 C
void delay(uchar z)   //大约1ms的延时3 n3 a2 d4 _" D" s! c
{/ J# ~, x6 B. A. x; r
   uchar x,y;
6 ]" g! a" i- q! T   for(x=z;x>0;x--), Q/ n: c8 e' C, P' `4 K
   for(y=110;y>0;y--);2 }! B5 l/ u6 n& h
}
8 p' R2 u6 G# O9 n//************************************************5 r' a$ n9 q  U+ M1 `+ H5 i) J
void display()//显示子程序
5 L# b: Z7 ^5 b& X8 S. g{
3 a9 z) |9 F" I) U   P0=table[count];   //个位
) D( Y2 i* V3 g+ J, ~* I8 W# G& f8 `   P27=0;6 O, @3 r, j1 Q* h7 Z
   delay(10);
- {- [# ~% z& m$ B8 ~   P27=1;
7 T9 y6 e2 N2 A% `  A   P0=table[count0/10];   //十位
: I& E/ Y) p" W0 r   P26=0;7 w; {. e/ H! x4 b9 w2 ]
   delay(10);
% c. V. h( P  c/ M& G   P26=1;
3 |9 {2 h6 K& F( F   P0=table[count/100];   //百位
/ V6 N3 a: ^3 a+ L2 x   P25=0;
6 X2 L, K6 b6 h- R1 H$ z   delay(10);
) T* |0 g+ R0 A# N: k6 m6 n$ ]   P25=1;
2 H2 _8 D* Y6 x9 _: Z5 [}
2 q  x9 v( |, u, h/ r3 [  y//************************************************5 a6 }) A  [+ A/ `7 f1 c: r8 W' Q7 X
void main()9 f. ]5 `: b2 E0 |. e. P& S$ U
{: a2 K& y" h* D3 R
   TMOD="0x01";   //定时器0,工作方式16 f+ ?& }) c, n2 B
   TH0=0xD8;" Q+ y& L, G8 ^, v, N9 @; A% J
   TL0=0xF0;    //给定时器装上初值,10ms中断一次
% K% I* n; c. X5 d: V& |; T% K   ET0=1;   //打开定时器中断
+ d, a! V: q) c: k: T! D  J   EA =1;   //打开总中断4 J& M% Y6 w& Z! k7 `! s- E# K8 B
   TR0=1;   //启动定时器0
" Q3 H( p* |: R1 H& z
& _" o# y8 p7 Z7 n( c. p9 z, q5 X* A8 d
" {& A0 k! v, _7 d/ {, k) a3 Z
* v! t; }  {! u  J% `6 e% ?
   while(1)) n. I) B$ A6 p& W4 I, B
   {
! z3 C: R# g9 g' O8 o4 O3 S      Last_BMB_status=BMB;2 L! z* P' C1 |8 \3 j

& O8 ]/ S8 e$ E, v2 E1 r
5 |- {, ]) G7 P
      while(!BMA)   //BMA为低电平时
" O5 U. R$ c1 t/ P      {) ?# R* F; I' v; a0 h0 B
         Current_BMB_status=BMB;
3 D, l/ Q& n5 q! c1 E: ?- h          flag="1";   //标志位置为1说明编码开关被旋转了
( D6 y" X9 C; n$ p  p& \% H( K      }
6 y$ a6 I( f+ O/ C% K2 D/ \, ?8 l( t! ]) z3 a* n- S7 {) n( s; J% w  \

) W  F, P2 I  Q+ _      if(flag==1)' p4 N$ U) v# B' K! _' g, A2 }
      {8 Y, t* ^! f) L2 t
          flag="0";   //时刻要注意这一点!给标志位清零
; ~) G* x) `: B         if((Last_BMB_status==0)&&(Current_BMB_status==1))//BMB上升沿表示正转+ I0 ]: T" {+ f: _3 @  a. Y9 M/ m
          {1 T; _  K& ?( D0 b/ z9 K
             count++;% @2 g" a9 @  _8 Q& E
             if(count==255): D% t# x- J2 m0 y  S: c, {
             {
; ]+ N4 m7 n, t  e  Q" H( k  o                count="0";0 o. w5 `8 b* n6 Z
             }
. v/ h6 Y2 }) W! L          }
  C/ g( X/ D. d         if((Last_BMB_status==1)&&(Current_BMB_status==0))//BMB下降沿表示反转6 W* d! v! Y5 {: v1 T; k, N, U% r& M& V
          {
" y' P- K# b( l2 `9 ?& ^" F5 e7 O             count--;
' @( w6 r9 x0 l. S             if(count==0)
5 V7 k+ s, h. V/ |; |             {
) q1 r' B6 W/ C8 t! C1 W( D7 g                count="255";
8 W& A/ ^- M  v0 @: h! X! u             }
$ }: C, k+ ]& w; x3 m. d1 M& j          }
: q- j% t4 d+ u1 j, ^( z. S      }
2 [: C, q: n, r% g) e* A2 c3 \   }
0 c* H5 \# R! V' j6 f}
; R  ]9 S' K. |) J' k//************************************************- u" \$ M% Z( N+ W  x( K! F9 t
void timer0() interrupt 1   //定时器0的中断服务程序
8 E' _4 D7 O3 ?. o{
8 j' @& ^3 w+ S5 X) R/ l& N* `   TH0=0xD8;
; R: g7 b+ |, l. F0 C   TL0=0xF0;   //再次装入初值2 T( f8 p3 S, R/ }* |
   display();  //每隔10ms显示一次$ I. D* v0 Z' A  I. F/ F9 f# G
   if(!BMC)    //按下旋转编码开关则计数清零
1 j$ z; r. E8 K   {
" i  N& t# U2 m3 k1 ^+ e. o      count="0";7 ^* u) y. p- m# J+ J9 \* T! o" {$ l0 P
   }
. f3 V$ n+ g0 `/ G( V6 r}
  ~0 ]# G( x- F5 T: }( Q" r- Q-------------------------------------------------------------------------------------------------3 w  S# [6 ^0 X6 i3 [

该用户从未签到

2#
发表于 2022-6-20 10:13 | 只看该作者
有的时候编码开关会卡死while(!BMA)   //BMA为低电平时  
% o# V4 h" o: t( d3 O有过试验。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-9 02:58 , Processed in 0.062500 second(s), 23 queries , Gzip On.

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

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

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