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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于下面的代码 求大神改一个只用两位数码管显示 根据按键显示 01 02 -----一直到15
3 Y) q( b# ~( S# W# G$ b$ O4 c6 \( u; J$ U

5 A2 |# T( o, n+ A#include<at89x52.h>                //头文件
0 F1 p% Z* o: e) a% L#define uchar unsigned char         //宏定义
3 Y! E. n2 g* c3 W) W#define uint unsigned int
; W" s, G& n4 N7 K' x1 Cuchar key,n,i;                 //定义变量
6 o: |- U5 K0 n- L9 x& r7 n5 i7 y5 B. Uuchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};        //反转法矩阵键盘的各个按键的计算值) P* t4 F4 l4 M, o# L1 [: W
uchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};               //共阴极数码管显示0~F
  G7 w  _0 B" }void delay(uint i)    //延时函数
, `6 }& c6 e" ]' \: i; d{
& s, V& [# Y0 k# }- u  while(i--);
9 a) u$ G( g( q+ f}, X2 [  B! {  S2 M  S& q
void keyscan()9 C. X; O( ^  G% E0 A
{
$ j1 I* Q5 g; p3 c8 e4 ?8 \        uchar l,h,i;                        //定义局部变量,用l得出低4位的值,用h得出高4位的值1 O, `  Z5 Q1 u1 ~
        P3=0x0f;                             //给P3赋值00001111* I1 U' s# M' A/ l* R+ M
        l=P3&0x0f;
2 |; G9 }, }+ ^  H/ c$ s6 _                if(l!=0x0f)3 j0 O# i# s( _* @4 x/ n! b: {
                {, W1 M0 u4 c: W6 h- O, e; v
                          delay(100);
  n- L' |9 d# d& I                          P3=0x0f;                                        5 t) P: A/ f, |& t# |1 e- k& i
                        l=P3&0x0f;
/ F& s: j4 ~+ Z2 M! _                    if(l!=0x0f)9 L. l9 _# T/ p2 o# ~5 i
                 h=P3&0xf0;
, g5 K! _) l9 S; s                  P3=0xf0;                           //给P3赋值11110000
7 ^1 V: ^; I1 J+ b; c* D; m                 h=P3&0xf0;                        //若有键按下,得出低四位的值  @1 J" G/ n, C/ ]8 W
                  }
; w  [0 y0 r9 w# Q& i7 v0 V                        key=l+h;                      //高4位的值与低4位的值相加* \+ M9 s+ R5 w0 i/ g' {
                          for(i=0;i<16;i++)
9 m- o' ]2 O1 @" i' Z5 c& [                           {# g6 A/ B! |/ ^$ @  R' x) x& q, Q
                    if(key==table)            //通过查表得出n的值
+ Q0 A% U  }' B7 a* s4 c                    n=i;" {4 u6 x& i8 i; h# P$ t8 a/ H
                    }
1 |/ `+ M! S6 ^. k8 E9 g: E) V}
6 C" a  ^9 g" B- C, h( F( G; b
void main()
: V6 {& y! |5 a$ Q{4 {7 c7 ]# D) Q, u9 d
3 w8 I$ ~- U- R2 q, ?
while(1)
/ P4 u( f; J2 I: r' t4 u   {5 N' [: a4 e6 C! x3 v; y% d6 V9 j; U
          keyscan();                //扫描按键" O: k$ ]$ k( g0 q1 K2 O5 J  E
    for(i=0;i<6;i++)                //送入位选信号 控制数码管
: ?/ C% W' a4 M# q! ]9 C+ I        {
- j; D9 N; G* ^7 Z0 F                   P2_6=12_7=0;
9 l2 T/ j  u0 A- l6 h                   P0=yin[n];
! ~9 Z' z' r( ~                P2_6=02_7=1;
, G$ D: m- E3 i8 M$ O! l                switch(i). {7 c  H: k. o  w8 ?) A% M
                {
& ]$ z. C- I" s' e! y0 o" l+ o                        case 00=0xfe;break;! {  k! v1 W4 \2 V5 z
                        case 10=0xfd;break;
5 Z! F, x, j4 k$ ?: i0 Y; K( }, N# [8 F                        case 20=0xfb;break;
2 U0 F+ F+ j. p  ]9 J8 l                        case 3:P0=0xf7;break;: n# i" H' |6 O
                        case 4:P0=0xef;break;
; {3 k) L9 O9 n3 |3 p/ A                        case 5:P0=0xdf;break;
- @8 W( j7 I% J7 x' e$ E; g                        default:break;+ C" {( F  z  J7 X. i
                }
7 B& u+ N4 N' l0 r  [: f' `& {
8 e- x! Z$ S9 \  I! r* r) J                P2_6=02_7=0;
. b4 P9 \( J( n: O# h                delay(100); 0 A' X7 G" u, b$ V2 {4 T
     }
+ u5 w. i* {% i/ x' @& @  n   }& g, y+ t( x# C3 D3 c- n
} 5 d" q, ?" O" Y- ?7 d' P

, S, |  W# }, ?+ _4 f- @

该用户从未签到

2#
发表于 2019-3-22 15:37 | 只看该作者
程序还没看,根据你所需要的功能,可以分几个模块来调试,
  f; s: F; a5 _4 c2 H7 d8 w* y一,数码管显示部分,要能够在数码管的任意位置显示任意数字" K$ R% `/ i  Q6 n) o3 d& m
二,按键扫描部分,需要又一个是否有按键按下的标志,以及一个存储按键扫描码的变量. _. z' j3 U5 u
调试顺序是先调试显示部分,再调试按键扫描部分,最后是联调来实现需求功能。+ b$ [! X3 ]/ z' {) K4 b
根据功能需求,首先要能正确显示按键所代表的数值,这里有扫描码正确转换为按键所代表的数值的过程,比如将扫描码0xfe转换为数值1即0x01。) U+ m9 U, B- T9 V
其次,数字显示位置的控制,这里需要有6个字节的数组,分别对应6个数码管,
5 l. `  E$ x% x第三,各程序模块的功能尽量简单,唯一,比如显示驱动部分,只根据当前需要显示的数码管位号来显示对应的数码管,至于判断该显示哪一位数码管则在定时器程序里判断。
3 _/ \$ g6 Y0 e$ V- F# \各模块的功能简单和唯一,即能使程序清晰明了,也方便单个模块调试。; ?4 r) m( ?/ l5 |
第四,需求功能的明确,在功能需求里需要显示大于10的数,这个大于10的数是由1-9组合的,还是按键值A-F的数字体现,不同要求,不同的做法

该用户从未签到

3#
 楼主| 发表于 2019-3-22 15:53 | 只看该作者
kinidrily 发表于 2019-3-22 15:37
- m4 F6 @, d. c1 v程序还没看,根据你所需要的功能,可以分几个模块来调试,8 H9 R$ x; C! Y% q$ [  E- x' C4 @' T  h4 A
一,数码管显示部分,要能够在数码管的任意位置 ...

: [" c; P* u' A( b#include<AT89X52.h>
$ v% N" N3 F* T1 V6 }6 F' d) X#include<intrins.h>7 Y& P7 Z& u( u
#define uchar unsigned char         ; d  J% M# {8 F1 V, }/ c
#define uint unsigned int
1 ]8 L% e- t! g" Zuchar key,n,i,count,digital_number = 0,num,shi,ge; * P5 o! v6 F/ ^  V6 u0 b
uchar code xx[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //按键      " @/ W, P' e/ R. `
unsigned char code Tab[ ]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; //1-9段码- M3 T0 |6 l$ f1 C
unsigned char code port[]={0xef,0xdf};//数码管9 }+ j$ h! m6 g7 k
void delay(uint i)    //延时函数
2 w2 v  x7 \$ q$ S{8 a  \% F; Y8 M/ M
  while(i--);3 T( U$ X3 z; h1 M/ ?! ]
}
9 X' x7 W: m; f! l6 Q+ H/ _( Zvoid keyscan()                           , s; b5 c& F. s6 V: w- x
{
0 j4 |7 f4 E, e1 Q        uchar l,h,i;                       / Q; d& s+ `% ]( Y; O' Z8 `
        P3=0x0f;                              j& h( r) F# ^2 }3 w3 i
        l=P3&0x0f;
1 ^2 I9 G/ [6 j                if(l!=0x0f)6 f( c, ~2 y0 q& U% y4 x
                {
1 q' B: z& G) d; u5 N                          delay(100);
* ~6 L5 A; u- X/ g4 E: h/ W/ \/ m                          P3=0x0f;                                       
/ K* `0 S1 m& `1 \% |. I9 _                        l=P3&0x0f;5 [! g" [  [- |. d$ j/ }. `5 G
                    if(l!=0x0f)
% h  R* N: W! d) u% K" \+ F; C                 h=P3&0xf0;
1 H/ Q- F1 r7 u# G: `5 g                  P3=0xf0;                          
- q$ `$ l3 @; X* ~                 h=P3&0xf0;                     
  U3 \# R& A+ W$ \0 B                  }0 n- l3 a( S- e* H) F4 S
                        key=l+h;                      " Y9 E- L& _& H4 w' j
                          for(i=0;i<16;i++)  j- P* t: W8 O6 P" t3 H! U/ j
                           {% n3 ^& V* D  r
                    if(key==xx)            8 n2 _5 {& y( n- i  [
                    n=i;
( u; x" `5 R0 e: w                    }* y5 B( `0 s8 ~! {8 r/ I
}7 u( `3 d7 `8 m6 c+ `4 \6 V, U* R2 A
int main()2 W+ @/ a. x2 v1 d! L7 l
{
( d/ {5 e  s  R2 {9 [: v( f4 L
3 y% K# M- L# `1 i4 t- `" E* }$ |: c& Z" N5 n  o7 @. `# l
        TMOD=0X11;  //T1定时器   T0做定时器9 o* B) B8 D: ^' M1 z
        TL0=0X00;         //定时五十微秒赋初值6 j( G; K) b. ?& a8 J
        TH0=0X4C;- M5 `: h0 w3 g( c9 _0 l5 H- _/ X4 |
        TR0=1;                //启动定时器/计数器
0 v; t7 J/ u7 ?: T: l- h+ Z        EA=1;                  //启动CPU中断1 f+ h1 ?# m; @, m, m0 p
        ET0=1;                //T0中断  k- d" r7 F2 E7 S/ t% D
        TL1=0XFA;         //  定时3毫秒( ^, d  |' c' t  I1 k) L# j
        TH1=0XF2;
- f6 N6 a& O6 L; ]        TR1=1;        //启动定时器/计数器- k+ E5 P1 D1 y$ X& W8 j. x, X
        ET1=1;        //T1中断
& i' Q; t: O7 m- O        while(1)          //主函数0 Z, K* f2 L$ q1 ^; P- B
        {
" t0 Z( J1 u6 ]3 g- Q. e# N        keyscan(); : O" w) s& Z* f. O$ c
: X6 s$ \3 c% Y2 X' y0 ~
        }
1 J1 c" {1 K1 P7 b7 ^0 v}) k) j; O, z& \( @6 J8 i8 v
6 N* [6 H) @* o: @
' p( ]) n& ]" z9 c: L6 C$ p2 ^

7 V) k5 Q, E* U: s' Qvoid  t0interrupt(void) interrupt 1                //定时器T0的中断处理
: d# P! q6 x8 `; ]' @# S{6 |' I; `8 g* z+ h% o+ x% d& S: g* o
            TL0=0X00;                                        //重赋初值1 i9 r6 L: h. ]! g9 t/ u5 K6 g
            TH0=0X4C;+ y' L, p4 {6 H
            count++;
3 Q. w3 O$ `0 [0 @( A& ~, k2 r            if(count==20)                                //延时一秒0 K% \9 P0 V! s7 g( H( u
            {. s2 @. e3 M0 W& N( ~
                          count=0;
. a- P5 X( ~3 ~& e3 q' |6 T+ Z                        }4 ]- g) H1 y, k3 o+ n
}
# v4 `$ p# p- T4 ?6 u7 zvoid  t1interrupt(void) interrupt 3     //计数器T1的中断处理
8 T( m* J6 O! ~1 W{
2 f7 m( @. |" {. X; Z' b  @" {5 R        unsigned char temp;
  k. R; C9 O3 b: `* @4 u        TL1=0XFA;
. y* ~6 \& R; E/ z2 j9 X* [        TH1=0XF2;) F2 ~- X7 C) y) a
        P2_6= 0;                                                //处于锁存状态
+ L  n% h" V, y. Y- w8 K        P2_7= 0;' k& q  Q" N8 q" Z0 C; k0 H
% q$ u) ^# R3 Y7 }! ?( ?. |5 W3 S
        P0 =Tab[n];7 `. d" i- G/ J5 u) |4 K( A
8 k5 J8 M! T: p9 r2 W/ U
        P2_6 = 1;                                                //处于直通状态& F5 q/ W: o7 S+ W
        _nop_();                                  //空指令,延时一个指令周期
" W2 p* x8 A5 a  V( x1 _        P2_6 = 0;                                                //处于锁存状态
4 X' }* R3 h8 r, N9 n9 y5 s        P0 = port[digital_number];                //数码管显示( ~6 o- c* [! x2 J
        P2_7= 1;
& y: v; k, V2 o        _nop_();1 I% G& n* k' ^
               P2_7 = 0;
. p; S: _% ?0 T  z3 ]" ~. e        digital_number ++;
# U# q! K0 d# `% T/ C6 {; Q9 r; [5 b        if(digital_number == 2) digital_number = 0;        ! j( u/ ~, g" y) b& m0 Q$ n) n& t
}7 r; K4 K( j1 C5 B0 g$ E

" Z) n+ \/ q$ f- n* k7 o4 z
8 y% a9 O0 O) k* T我瞎改了一部分  一直没实现   求大佬帮忙9 [, n( n" [% r/ \  Z# Q/ D: A

* t4 Z% j0 @0 o+ L3 _; K* V: t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-3 20:08 , Processed in 0.078125 second(s), 26 queries , Gzip On.

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

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

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