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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
旋转编码开关,比如数码电位器  驱动程序      具有左转、右转和按下三个功能,有五个脚,它的外形如下图所示:  M# j+ P6 C& T2 J' c# R' P! S6 _% P

7 I/ _, `3 D7 x( J& M, @; D                    
' j! |8 o$ V; @" }* u+ A' R1 N- Y 0 G. @% I6 a1 }5 N2 r5 z2 }/ z5 E

0 G% y9 m8 X4 I3 p/ \; v' f(1) 1、3脚要外接上拉电阻,一般10K就足矣;
. ~3 k' T% m. j, y  ^# T(2) 2脚一般接地就行;6 b/ p1 Q* C0 v* D) l
(3) 4、5脚是下按键的开关接线(按下时,4脚为低电平);
& [) X; m4 D' b: D 实物接线示意图为:' H4 S$ s4 v0 p# r2 t4 x6 B- ?
; I/ p+ l" Z% x" q6 G

  J5 w$ m  n) r$ ~5 d

3 O# G" H+ h; s7 H$ ?* q0 f. j! l( x                                        ) z% X+ ^0 w/ N) h% ~

% V& C; y% L, Z/ L# q, r
     判断正转 和反转的关键就是:当BMA为低电平时,BMB的跳变沿是怎样的——上升沿表示正转,下降沿表示反转。只要用代码把这itP27=P2^7;/ @5 _) I4 M. }7 V4 G+ R; P
sbit P26=P2^6;! m; D5 d/ |! [- e/ x6 S% w; }% {- a
sbit P25=P2^5;. ~7 U$ ?: p! D7 E! n4 `2 N$ P
uchar codetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};% l3 j) n8 y. {0 I- W: L* _: g
uchar count=0;
# I( y, W3 x1 v& r) Tuchar flag;
, `4 E: l8 V% YucharLast_BMB_status;4 |5 n4 I4 \, _
ucharCurrent_BMB_status;% _/ X+ T6 V3 H# c. k) m$ q7 d
//************************************************
- J, M$ Q8 B! ]2 C$ Gvoid delay(uchar z)   //大约1ms的延时' e: W& }! l( U# ~! a: b
{4 @: t( |, N; q2 O  q
   uchar x,y;; s4 ~+ g0 y" d) m6 a, U  ?
   for(x=z;x>0;x--)
) L1 ]& f7 d5 G/ ]% f! c   for(y=110;y>0;y--);
  A0 m! _2 f: [4 y! J/ v* E0 j! \}" Y8 w$ d% L6 U$ n2 e
//************************************************: p% _9 D, d, K% _
void display()//显示子程序5 W& A2 @; L. \% z: A- p* f
{0 K2 V6 _  I$ o  J! }% ~
   P0=table[count];   //个位" e* P: e+ y) e$ L* ?
   P27=0;( w( y* p! x9 D/ |! `$ r9 j
   delay(10);
9 s8 H% n) f7 S# ^, {. `   P27=1;9 P. E$ V  M8 `6 y- F% s9 M& Z
   P0=table[count0/10];   //十位
) r4 M& c% A2 w" v   P26=0;
) B8 @; l) Z" A/ r7 _: N   delay(10);* |& v. k6 A: U) u8 G
   P26=1;
- i/ L" ?" ~! `. F2 ^   P0=table[count/100];   //百位6 r: Z7 d: o/ B* ?. e6 J6 b1 P! ~; k
   P25=0;& D9 e$ _5 I6 E( H$ g% g! W  B
   delay(10);
7 S" A0 n. B: W4 G- ]   P25=1;3 v8 }- G& X1 Z. ]4 S0 I0 @
}
: ^# T% q6 w- x' U: _, _6 G* B//************************************************
6 b# o, S, X  [: d8 D1 S3 G2 ovoid main()
) X+ R4 |7 v. T{
& M. S7 Z" e, v1 I$ J9 F6 |" V   TMOD="0x01";   //定时器0,工作方式1
) d  M+ }: g+ X5 a' A* a) l" `# k   TH0=0xD8;
1 v+ s" i* V5 A   TL0=0xF0;    //给定时器装上初值,10ms中断一次
4 }* v9 t4 N" l- P9 I   ET0=1;   //打开定时器中断7 n8 C" L" G" G* ~( B9 O
   EA =1;   //打开总中断
" E+ Z* D3 w8 W   TR0=1;   //启动定时器0
9 {* v/ m( k. ]! T$ x
  O( M) z! v' `
6 J$ P* ]# S7 i1 [5 l9 ]
5 P( i# f/ N6 c6 c
   while(1)
1 C2 d# s3 p' i  k  a- O( u1 [   {
# @) E7 S% z! ?* \& A, _9 _      Last_BMB_status=BMB;
' ?! ^0 Z/ o& ~( [0 Z+ W, q
7 W0 c! v! T$ g# }! ~; d
9 F  j0 s" `/ {4 ~
      while(!BMA)   //BMA为低电平时
, b( x4 X6 y* Y      {
! }( ^6 C$ b6 R  T& Z% }         Current_BMB_status=BMB;
. W+ g! M9 ]. A$ H) A/ _2 x4 ~, E6 F          flag="1";   //标志位置为1说明编码开关被旋转了
( g7 ^0 h2 J+ E6 ?0 d' t5 Q( x      }
2 q1 E3 R% }3 e
. ]- Q2 h! ]6 b' @& }3 ^
$ {1 a* T1 W7 T1 h. N+ _) V
      if(flag==1)
4 |/ x1 A! W) ^' n% N- @      {
/ z4 E* j& j+ z3 M7 ]          flag="0";   //时刻要注意这一点!给标志位清零9 h  X: x1 U  R- q) H+ h+ Y* m# \
         if((Last_BMB_status==0)&&(Current_BMB_status==1))//BMB上升沿表示正转
' l+ b8 p% r) g7 f& V! Z0 r          {
( j) ~( E" H0 s$ T6 |3 B# D             count++;
# R, w. B7 P! |             if(count==255)
3 F" Y$ U2 H# U& x' u2 E3 ?) c             {4 e7 A$ B+ f6 M! a" b
                count="0";
2 n. f: c7 p: ~  A& R7 {( f             }/ r( y- ^. Z: G9 ]5 t2 Y
          }
! w& o  Q6 n* b* N         if((Last_BMB_status==1)&&(Current_BMB_status==0))//BMB下降沿表示反转8 i  O/ n+ J. E! R) Y2 }4 }
          {
( V' _% k6 H% e  Q( v! R- O) Q             count--;
* I! B: E1 |* b) D5 C             if(count==0)
4 g6 G( P! I1 ?             {
  H, m0 ~! I  R4 T* s2 r# U                count="255";' p: X& t% M* ^/ c& V
             }* i3 `& z$ D$ J" p
          }
7 ?# _6 B1 h4 X+ x. d; M  S      }- m$ e, @& l6 }
   }! U0 x. V3 U* l9 c" {3 h
}
3 E$ B; o& [7 w' `1 @* `! w//************************************************
) A0 G& c0 N; }# kvoid timer0() interrupt 1   //定时器0的中断服务程序% A* I# p$ F) w' O/ Y9 k7 v& W9 Z
{
2 H, B  z( D! ]$ v   TH0=0xD8;
: W% U% Q# e4 {# l+ ]   TL0=0xF0;   //再次装入初值
! _6 u5 z$ w, A3 x$ }2 j   display();  //每隔10ms显示一次$ E0 J% P5 y, Q9 t
   if(!BMC)    //按下旋转编码开关则计数清零/ |8 o. V8 U. W. {& B+ O4 w+ f8 g
   {
+ [& [2 [$ k* G5 w      count="0";3 c+ m% t2 h% d% Z' t7 B
   }
1 Z; `- q; G: d8 x1 Q2 U; _}
  j# }& f/ ]! s! G. j( J-------------------------------------------------------------------------------------------------
- W3 o7 V7 x2 m2 r

该用户从未签到

2#
发表于 2022-6-20 10:13 | 只看该作者
有的时候编码开关会卡死while(!BMA)   //BMA为低电平时  
+ f, ]: M# O: q' ^& _5 Y/ Y, ]有过试验。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 14:43 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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