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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
旋转编码开关,比如数码电位器  驱动程序      具有左转、右转和按下三个功能,有五个脚,它的外形如下图所示:* O! ?6 |  s& [+ S2 X3 L5 L) o

' w1 k+ R& q( @- v4 @0 K% w/ C. V                    % {$ q5 p! [: y" I
8 T1 P& A  K: q2 w0 ~8 x2 M

; L* P7 E" p/ \2 ?7 @9 ~4 K1 x(1) 1、3脚要外接上拉电阻,一般10K就足矣;
8 C+ Z# }% M' d9 w% }# a9 {. ^4 q' L9 V(2) 2脚一般接地就行;
. k! x) w4 |" U) `6 J(3) 4、5脚是下按键的开关接线(按下时,4脚为低电平);7 ]9 l/ b# F& X: c' H9 I
实物接线示意图为:
% E% X4 k; \; f7 i
4 H( s- x5 G8 W. Y& O! I1 A/ F" |7 {% ^" h7 K

" d  n' Z3 o5 p. y5 n                                       
8 y! h2 p9 J& P* N# \- `
$ T+ n* s. v1 Z# t
     判断正转 和反转的关键就是:当BMA为低电平时,BMB的跳变沿是怎样的——上升沿表示正转,下降沿表示反转。只要用代码把这itP27=P2^7;
. z( b% s3 x7 t8 a. t! `sbit P26=P2^6;
( T( \% d( ~& f! psbit P25=P2^5;
' M" _* A2 t5 x, v) Xuchar codetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- F9 J* {5 m; ]6 |uchar count=0;
) F" }" c# v6 f3 J7 f' ]uchar flag;6 t8 E3 y2 Q, X+ Q7 X
ucharLast_BMB_status;
( ?7 Y+ Z6 R( A+ IucharCurrent_BMB_status;; i& q7 k' |( I5 A, e! K9 J
//************************************************
. Y3 G: W! L6 svoid delay(uchar z)   //大约1ms的延时
; t3 m: E; Q0 @$ H{8 ]8 R- }7 s3 M( `" t
   uchar x,y;, {1 C9 g+ |' O* m: X0 F: j
   for(x=z;x>0;x--)
) r: M6 ~; q* r1 H   for(y=110;y>0;y--);) ^1 w* `  x3 ~( P9 j: G
}5 \- R( _& V$ r1 r) u" q
//************************************************& B. Q, ]+ L3 `- Y$ H* g9 v3 B
void display()//显示子程序! H2 @, w! l# |. |; X
{/ b3 r( ]; Z# O0 Y. ]  p) g0 b- [( U
   P0=table[count];   //个位/ F! {# I8 N) J7 ~
   P27=0;
6 |" H  s  e8 s! X8 h   delay(10);
0 r% U: G- u7 w" ?   P27=1;/ T' ^# C: w7 }# h+ `' T8 X. X# M
   P0=table[count0/10];   //十位
( [; n2 Q* n" ]$ C1 H, q: U   P26=0;
9 Y7 ^2 {; ~1 H- y+ `; j   delay(10);
9 \! g( Y  ?( ~7 `" ?   P26=1;% u  p5 S1 {5 W4 V5 N
   P0=table[count/100];   //百位
' c+ f1 o. m- S' ?   P25=0;9 K! `) b0 T$ K4 ?
   delay(10);
- ]: ]4 f# R+ c! T5 c   P25=1;
8 S; }" t& m9 v2 Z; E) O}+ Q' F. L  a4 k
//************************************************+ D" s' W& [( `6 ~# k
void main()
. F: G4 R9 u1 B: {  I1 L{
' y% O; d- x7 e, M6 ~6 P  I   TMOD="0x01";   //定时器0,工作方式1* E3 }4 [5 e/ z# K: Q" l1 z
   TH0=0xD8;
$ ]$ L8 V& Q. |8 O   TL0=0xF0;    //给定时器装上初值,10ms中断一次
0 M# }) Q5 k9 u! C- W   ET0=1;   //打开定时器中断
: i& w! I: O* c3 Q: x: L   EA =1;   //打开总中断
9 t/ {+ O+ P" b3 O   TR0=1;   //启动定时器0
$ ~. g$ i9 n; Y, N5 V5 x$ J2 @ 1 Y7 H( Y% f/ @+ p# Z" [
* f: B7 j" X- h& T, d
. W- F% F' `: v0 X
   while(1)9 g. c5 T# f! I  N+ W( p1 j
   {
5 i( }9 e3 m: b      Last_BMB_status=BMB;5 ~( z9 O. N; `* L( Q- a) P' s; W+ X
, ~4 D8 I+ X5 H# X4 u2 c6 z

: x5 a5 _; c: J- l2 W" i      while(!BMA)   //BMA为低电平时
, }2 ]! W- M7 b      {2 y  J* N0 Z: H; t( |: A3 R
         Current_BMB_status=BMB;5 P% A# \9 f  j" j$ W& I
          flag="1";   //标志位置为1说明编码开关被旋转了: G3 \9 x5 ?! q6 V1 c3 a$ B
      }2 S- @0 v2 ^% M- {1 i, A/ w

, A% S+ C6 E& {! n! ~# T2 t
7 f  O* P0 v/ C8 A0 ?  S8 Q! f! s
      if(flag==1)
, W  t1 B1 s1 `. k      {
$ r( n3 {0 g$ C2 V* U          flag="0";   //时刻要注意这一点!给标志位清零
: U7 m. r& B' {) l' v8 u2 E         if((Last_BMB_status==0)&&(Current_BMB_status==1))//BMB上升沿表示正转
; f+ ], Y5 g! c+ d; Q" X0 h          {
* |, I) w' n) I             count++;
6 P. I) e0 f$ k2 D, U/ B0 H             if(count==255)% L- ?6 H5 E/ l6 a" v7 w" K
             {: B; |7 j# N$ [" }2 o6 {( |* S* e
                count="0";1 P4 a3 O) a( i, a! c3 {
             }
( f: z1 E: w6 a          }
$ d9 A+ }' N% H2 [' X         if((Last_BMB_status==1)&&(Current_BMB_status==0))//BMB下降沿表示反转
- ?  L1 o7 ^- P) P4 E; g. ~+ R  V# v          {( h+ M: V+ G$ Z" O6 Y! c
             count--;! g. s" ^3 |% C7 p/ s6 c
             if(count==0)/ C, q7 f8 W0 V7 u' d1 {% n
             {
; n, p7 ^& Q* `1 J3 l                count="255";8 o5 C" z8 y% k( F
             }0 c- Y5 f( a! W' H% X  @
          }
, X  ?9 }4 \+ F6 f4 r      }
& ?, ~, N/ ?+ F2 `$ ?   }
& l  \8 |4 j0 t5 Y2 @  e% f: x; w}4 T5 C, |- `& Y4 r/ r+ X$ o. X
//************************************************
. P- L/ W* W9 n) Gvoid timer0() interrupt 1   //定时器0的中断服务程序
- D- B# x. ~, v, s5 B( o. l{
% I: s- {! r, z   TH0=0xD8;
% y9 O) H' V6 \. A+ I   TL0=0xF0;   //再次装入初值
: ]! n2 u: H+ u, i   display();  //每隔10ms显示一次4 Z8 W' l5 \$ p, l2 N
   if(!BMC)    //按下旋转编码开关则计数清零) [; L: q2 P1 k- o
   {
- L# [5 z. {+ Q) I% z; Y6 C      count="0";
6 ^& n% n3 A% B+ g2 |0 z1 \8 H   }
3 E+ O0 x$ B; Q3 t0 o- X" n& T! x6 w}4 ^; L' X2 |( k% X: y8 m
-------------------------------------------------------------------------------------------------
0 }; j! _. `  X

该用户从未签到

2#
发表于 2022-6-20 10:13 | 只看该作者
有的时候编码开关会卡死while(!BMA)   //BMA为低电平时  
) @7 s  h9 ]3 k6 D& N3 f2 _5 p% W' `8 _4 ]有过试验。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 23:02 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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