51单片机--设置数码管的闪烁位置,便于输入数字

/*


有四个独立按键为 K1~K4,有四个数码管,可显示 0000~9999。


初始时都显示 0。


四个数码管中,有一个处于闪烁状态。闪烁的频率为 1Hz。


利用 K3、K4 可以使得闪烁的位置左右移动。


只有不停闪烁的位,才可以用 K1、K2 使其数值递增或递减。


数值的范围是 0~9。


题目连接:http://zhidao.baidu.com/question/455550887523150405.html


做而论道编写程序如下:


*/

#include <reg52.h>

#include <intrins.h>


sbit  k_a = P3^1;

sbit  k_s = P3^3;

sbit  k_l = P3^5;

sbit  k_r = P3^7;

//---------------------------------------


unsigned char code SEG7[] = {

    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};


unsigned char DISP_BUFF[] = {0, 0, 0, 0, 0, 0, 0, 0};


unsigned char num[] = {0, 0, 0, 0, 0, 0, 0, 0};

unsigned char n = 0, n_50ms;


bit flag; 

//---------------------------------------

void DelayMS(unsigned int x)

{

    unsigned char  i;

    while(x--)  for(i = 200; i > 0; i--);

}

//---------------------------------------

void  display()

{

    unsigned char i, w = 128;


    for(i = 0; i < 8; i++)  DISP_BUFF[i] = num[i];

    if (flag)   DISP_BUFF[n] = 10; 


    for(i = 0; i < 8; i++)  {

      P0 = SEG7[DISP_BUFF[i]];

      P2 = w;  DelayMS(1);   P2 = 0;

      w = _cror_(w, 1);

    }

}

//---------------------------------------

void main()

{

    TMOD = 0x01;

    TH0 = 0x3C;

    TL0 = 0xB0;

    TR0 = 1;

    IE = 0x82;


    while(1)  {

      if  (!k_a) {

        display();

        if  (!k_a) {

          while (!k_a)  display();

          num[n]++;  if (num[n] > 9)  num[n] = 0;

        }

      }

      if  (!k_s) {

        display();

        if  (!k_s) {

          while (!k_s)  display();

          num[n]--;  if (num[n] > 9)  num[n] = 9;

        }

      }

      if  (!k_l) {

        display();

        if  (!k_l) {

          while (!k_l)  display();

          n++;  if (n > 3)  n = 0;

        }

      }

      if  (!k_r) {

        display();

        if  (!k_r) {

          while (!k_r)  display();

          n--;  if (n > 3)  n = 3;

        }

      }

      display();

    }

}

//---------------------------------------

void T0_INT() interrupt 1

{

    TH0 = 0x3C;

    TL0 = 0xB0;

    n_50ms++;

    n_50ms %= 6;   //10对应1Hz

    if(!n_50ms)  flag = ~flag;

}

//---------------------------------------


//仿真运行的截图如下:

51单片机--设置数码管的闪烁位置,便于输入数字 - 非著名博主 - 电子信息角落




  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值