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

基于下面的代码 求大神改一个只用两位数码管显示 根据按键显示 01 02 -----一直到15

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-22 15:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
基于下面的代码 求大神改一个只用两位数码管显示 根据按键显示 01 02 -----一直到15
4 P* A; `8 [5 L& x/ ~- j
3 Z7 }) R1 o3 [- j$ m

: x( A4 Q6 U7 s/ A1 {7 a$ U* J, D) ]#include<at89x52.h>                //头文件
2 K+ I0 ~8 c/ Q: y$ f#define uchar unsigned char         //宏定义. @! Q" U( [- o$ A
#define uint unsigned int
' o! X/ z1 C8 y9 w8 X" s' d, m' `uchar key,n,i;                 //定义变量* n3 `4 A) r1 D. z7 N
uchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};        //反转法矩阵键盘的各个按键的计算值
2 H; o7 ]+ p1 D% V4 b4 Wuchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};               //共阴极数码管显示0~F/ r7 `. f  b; a$ b, S; u; U4 x- F
void delay(uint i)    //延时函数
' C7 M6 y  O3 Q- p+ a{: w5 W( e" Z9 t# k$ w
  while(i--);
, Z7 T( i5 B* \/ h}
' i" V% F( S* x& T  S; Uvoid keyscan()- d; |' l4 r3 I8 y
{
; w/ C; F  o3 k( ~" I        uchar l,h,i;                        //定义局部变量,用l得出低4位的值,用h得出高4位的值
# r1 b- Q0 l' A/ @( r) z        P3=0x0f;                             //给P3赋值00001111
/ O5 D( x) i0 i; c        l=P3&0x0f;
2 j3 |2 w. [2 g* @4 x9 W! `! o                if(l!=0x0f)' t$ w6 {) C/ Y7 ~' ~/ ?' i
                {
: I" `5 R& z( W, A# n                          delay(100);; O* h1 _/ R7 i' Y' H$ ]' ^; q
                          P3=0x0f;                                       
" b# ~0 O* F  H- e8 d; ?" G7 F5 ~                        l=P3&0x0f;
) R- \) I- |1 n( r# |/ R                    if(l!=0x0f)$ e9 c% R$ @6 p5 z- H
                 h=P3&0xf0;
/ v0 V4 d) j3 k& }5 j: Q' A1 l                  P3=0xf0;                           //给P3赋值11110000
! D, J8 {. {* T/ P% Y1 Z3 _# `                 h=P3&0xf0;                        //若有键按下,得出低四位的值
* b5 {5 d/ O8 y3 i& v# |" M                  }' r0 H5 [" I* G2 Q0 ]3 x  {3 ?
                        key=l+h;                      //高4位的值与低4位的值相加
1 _; F9 Z- J7 s) \" _* `                          for(i=0;i<16;i++)
+ d( M, b7 O6 c4 }4 [. X6 n                           {( c* p) \3 i9 D$ A5 f7 r  ]9 {
                    if(key==table)            //通过查表得出n的值
& s, J) Y% ^8 U4 h; q% w: e                    n=i;
" t! _/ |! I" Z, Q                    }
/ n0 S9 N* {+ }1 v- m( n}7 m* U! P: y: W; |# Z* }3 m' F
1 l- Y8 k6 U/ s& I; `& v
void main()
' _7 r+ S+ w6 N2 Y" U6 d( r{
7 S, J3 ~- n; j# c) k" B; `% Y# E: p3 Z! ~' u1 c) ?& }
while(1)
) O$ m4 y& d/ f0 r  {   {
$ s1 D. K7 ^7 D! X' {          keyscan();                //扫描按键
7 N" I+ K6 |4 l  Z; W8 j7 A& K1 R    for(i=0;i<6;i++)                //送入位选信号 控制数码管
7 m+ x$ Q+ G/ G# y- o        {
8 C: j$ X: j! ]! c4 P                   P2_6=12_7=0;
4 v5 |! C7 \6 o, d                   P0=yin[n];
/ b& G4 D0 V- n4 G5 R$ N* d/ S3 R                P2_6=02_7=1;' w5 R* b+ J/ X
                switch(i)
$ y' J* q! W( d" m  p  B( F! m# F" F                {
! y2 O1 M5 O( `& N) T( m                        case 00=0xfe;break;# H3 ?' J0 s& G; B
                        case 10=0xfd;break;
  m" x* c$ a3 e5 s9 C4 r                        case 20=0xfb;break;
) ?9 Y: g+ a3 G" }6 n$ _                        case 3:P0=0xf7;break;
. f: |' G1 q4 B                        case 4:P0=0xef;break;
+ v3 A+ B5 X: ^2 g; @6 E                        case 5:P0=0xdf;break;. k7 I4 O  ~* @7 z" d3 X
                        default:break;
, G3 x: h) o* @# u5 B8 A                }
, Y3 S8 S( Z9 {# F! j' Z" j. h' Z3 b; X0 l
                P2_6=02_7=0;
* e' X2 X, J$ `                delay(100);
: r, P+ Q( q  }) q$ N  }: {. y- a     }* m9 o( a& Y  c2 p# W9 v8 Q
   }* `! ]5 o/ Y% v/ E' Q
}
6 Y4 g) ]$ T  t! R6 @) w5 D2 O% c: c4 D$ M5 f

该用户从未签到

2#
发表于 2019-3-22 15:37 | 只看该作者
程序还没看,根据你所需要的功能,可以分几个模块来调试,1 b4 \  n3 G2 N2 j3 g$ _. J
一,数码管显示部分,要能够在数码管的任意位置显示任意数字
' F6 |  Z& I! Y2 V8 W二,按键扫描部分,需要又一个是否有按键按下的标志,以及一个存储按键扫描码的变量$ D% o2 [4 S8 L; t# ]
调试顺序是先调试显示部分,再调试按键扫描部分,最后是联调来实现需求功能。3 N& W+ U3 ^% D- d! Z
根据功能需求,首先要能正确显示按键所代表的数值,这里有扫描码正确转换为按键所代表的数值的过程,比如将扫描码0xfe转换为数值1即0x01。
; _! Q% R' K% e/ Z: |其次,数字显示位置的控制,这里需要有6个字节的数组,分别对应6个数码管,' V" H8 ?% b* d: A& ~
第三,各程序模块的功能尽量简单,唯一,比如显示驱动部分,只根据当前需要显示的数码管位号来显示对应的数码管,至于判断该显示哪一位数码管则在定时器程序里判断。
3 p7 M5 T5 ]2 G0 q7 s# x4 x( F1 N各模块的功能简单和唯一,即能使程序清晰明了,也方便单个模块调试。- X, _$ O6 ?) y) e+ b
第四,需求功能的明确,在功能需求里需要显示大于10的数,这个大于10的数是由1-9组合的,还是按键值A-F的数字体现,不同要求,不同的做法

该用户从未签到

3#
 楼主| 发表于 2019-3-22 15:53 | 只看该作者
kinidrily 发表于 2019-3-22 15:37
4 Y0 c$ w/ N# }3 h0 f4 [  K程序还没看,根据你所需要的功能,可以分几个模块来调试,+ ]0 o  X+ _/ ^& _+ J5 m
一,数码管显示部分,要能够在数码管的任意位置 ...
/ k6 M3 }* u) v1 J9 j
#include<AT89X52.h>' ~* ^; k, ]. s- z9 V2 p, T
#include<intrins.h>
) ^( c: C# ~- G& p. S2 V. }#define uchar unsigned char         
6 Y& x$ \( P& H" F" p#define uint unsigned int( u, w2 [/ }# \2 H( e
uchar key,n,i,count,digital_number = 0,num,shi,ge; + y% b8 {5 [1 g1 {6 T
uchar code xx[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //按键      
) ~9 _& T# @) ^8 ounsigned char code Tab[ ]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; //1-9段码& \; T5 X5 S$ O' `6 o
unsigned char code port[]={0xef,0xdf};//数码管+ `  K2 ~! r9 R( v7 T% s
void delay(uint i)    //延时函数
1 b& d( y. X. i+ r{
, G8 Q) q% R  P  [% {  while(i--);, w  {* S, a' X1 u  e8 E; a# V
}' z* u4 \( Y# R- p) f" e
void keyscan()                             I8 ]% ?8 y) D3 Z& k4 D9 z
{
5 e! X/ s, _8 t# @( ~# H        uchar l,h,i;                       - Q' }% W# j- U
        P3=0x0f;                           
+ \, W# m4 e! F  j0 }        l=P3&0x0f;, _9 j& X1 T; B3 n
                if(l!=0x0f)- ?2 G1 b" t/ m" p7 `& A3 e% l
                {
( Q$ o7 Y$ c- b/ Q5 n; @                          delay(100);
, l( B+ V, L7 A" a4 t                          P3=0x0f;                                       
7 T  D7 Q7 X( J$ m2 |& w                        l=P3&0x0f;
0 N4 {4 b' k' t5 `9 e! {                    if(l!=0x0f)
" X; D" N5 I6 z4 `0 c                 h=P3&0xf0; ( J2 }, c4 p& z( `3 H
                  P3=0xf0;                          
; L- H  k; U1 F1 ?) d& h                 h=P3&0xf0;                     
) V8 o! ?% o1 [6 p7 C  v                  }
( j6 t/ z' N% y) X$ X" B' q$ t                        key=l+h;                     
9 D* X9 E* @2 C0 O( w& a                          for(i=0;i<16;i++)/ M3 X& o& X, w6 P" u" m
                           {3 V+ G1 T) T) V2 W6 {* G2 W! M
                    if(key==xx)            : e: l! @/ q& A9 p6 j
                    n=i;" O/ P8 J  _4 f+ l% Q
                    }
! ~4 _. V/ S3 U% V  J! M6 n}
& O5 E7 t4 ~1 b! P. L, K# i9 a' z' Xint main()! C7 H7 h4 m- ~' s+ o5 n
{
: G* M% K+ N, t+ M* M; v
3 Z+ y$ @( U  U/ H7 V
% V6 p" Q6 T- p9 L/ t        TMOD=0X11;  //T1定时器   T0做定时器+ j% Z* J5 L/ ]0 q1 L1 d! _+ [& [- P
        TL0=0X00;         //定时五十微秒赋初值3 z; D2 K- A/ @( b( M/ T
        TH0=0X4C;
: u& C1 P# K  o( N: N        TR0=1;                //启动定时器/计数器
- o, t) a$ \) K- j! F' x5 c: _        EA=1;                  //启动CPU中断6 x2 P6 A1 G0 c& [- Q0 e2 E+ H
        ET0=1;                //T0中断* l0 R( x' U5 S& f1 [8 S( u5 I# T
        TL1=0XFA;         //  定时3毫秒
1 }: r5 P4 Y$ G/ `# Y3 p# N        TH1=0XF2;
3 d; E6 z9 Z- C9 }5 ^6 C1 C6 l        TR1=1;        //启动定时器/计数器* K% Z% d6 ^4 ]' L& S, @7 V
        ET1=1;        //T1中断* n( Z, G" t( V; I, g5 i5 F
        while(1)          //主函数
- U. D1 N6 Y# h, U& v8 ]$ L0 a        {
, D& @0 ~" t. B& \; A4 O2 t7 x        keyscan();
7 q; u0 n) g* {0 n) b6 N5 y- V! m
; D" P% Q- Y/ m1 x0 H4 J  H" h        }
: V6 L, [& ~" p}
) a) C& e9 D0 ?5 x( c1 v( U( k+ k7 J' O; S9 E
6 k& \5 U4 ^1 G) o1 Y9 G

* _- s$ Z5 H  f6 V) r# i' |2 Evoid  t0interrupt(void) interrupt 1                //定时器T0的中断处理
2 R& d% B* A) t* S/ o9 L{6 n  }. }8 t. n) F$ \2 u7 n
            TL0=0X00;                                        //重赋初值
, a. X9 L/ y$ Y2 ]            TH0=0X4C;
7 B3 l, S/ `: c& Q+ J            count++;
% e, B+ }, y/ U) o            if(count==20)                                //延时一秒4 Q2 B% j! J3 H/ d& D* d# d# |5 F. [
            {
4 ]+ n2 N, X. q; Y) B8 k& U- M. Y                          count=0;) @. W* c0 L$ D* o- T$ v
                        }
3 C1 I) z, T. J: Z% }}# c9 ^4 B6 U, o/ ^# g
void  t1interrupt(void) interrupt 3     //计数器T1的中断处理3 {' R: B5 V5 o) d; K, v) q2 O
{
* }4 Z! b# K( x  ?5 F        unsigned char temp;( \7 `0 |  Y$ i
        TL1=0XFA;& L5 c, m. d2 G  @5 D
        TH1=0XF2;
" [, e8 P# O3 c: s/ B% K# t        P2_6= 0;                                                //处于锁存状态. Q3 I- i6 D" j/ L  K* l! q
        P2_7= 0;3 {+ O9 D1 M+ d* T2 m+ {6 ?8 u+ }) Y  @% M

1 f4 n7 D! T$ @8 U3 U6 ?; m' \; Q! @( z        P0 =Tab[n];7 r  }! `" B) t1 R4 ]2 n/ J
/ ~2 I( x+ J; I5 b
        P2_6 = 1;                                                //处于直通状态
( l& @% H& {- w1 G$ t% J# j        _nop_();                                  //空指令,延时一个指令周期# T6 j* L7 |, X6 _" [' I
        P2_6 = 0;                                                //处于锁存状态
9 B) b9 T: n1 G9 ~+ l* y8 x        P0 = port[digital_number];                //数码管显示8 X% R* h" n- q9 X6 t: ~2 j
        P2_7= 1;! q2 k" g! X; V$ h( h, `$ L
        _nop_();
; g$ }# l2 o8 n. h+ L9 F( p( Y               P2_7 = 0;. Q6 C* D1 R9 C( K. J
        digital_number ++;2 s& F4 x7 v* N. `
        if(digital_number == 2) digital_number = 0;        : o! q# k  J$ K
}
; q, f9 U: o& g4 h9 [* H& H# ~% _; a/ \2 D  D8 ]0 N/ @

2 q/ v6 Z$ u. d6 h7 T5 J! \我瞎改了一部分  一直没实现   求大佬帮忙
; y! B6 C; d; I8 @! M! O& T8 H$ c4 H
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-27 20:36 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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