c语言数码管0000到180,数码管显示 0000-9999计数器

数码管显示0-9999计数器,两个按键,一个按键复位,一个按键累加计数。

要求提供程序和原理图

悬赏分:50 | 解决时间:2011-6-9 13:40

;===========================================

最佳答案:

用PROTEUS仿真的电路图,可以吗?

追问:可以的。

回答:

仿真电路图如下:

1613935c790bfec98fbe44e30cc23428.png

实际制作时,应采用共阳数码管,PNP三极管驱动“位”,还要有限流电阻。

;===========================================

;下列程序经过实验,可以满足题目要求.

ORG  0000H

LJMP MAIN

ORG  0030H

MAIN:

MOV  70H, #0         ;显示缓冲区.

MOV  71H, #0

MOV  72H, #0

MOV  73H, #0

MOV  74H, #12H       ;计数单元.

MOV  75H, #34H       ;都是 BCD 码.

;-------------------------------

M_LOOP:

LCALL DISP

JNB   P3.2, JIA_YI

JNB   P3.3, QING_L

AJMP  M_LOOP

;-------------------------------

JIA_YI:

LCALL DISP

JB    P3.2, M_LOOP

MOV   A,  75H

ADD   A,  #1

DA    A

MOV   75H, A

MOV   A,  74H

ADDC  A,  #0

DA    A

MOV   74H, A

J_L:

LCALL DISP

JNB   P3.2, J_L

AJMP  M_LOOP

;-------------------------------

QING_L:

LCALL DISP

JB    P3.3, M_LOOP

MOV   74H, #0

MOV   75H, #0

AJMP  M_LOOP

;-------------------------------

DISP:

MOV  R0, #70H

MOV  A,  74H

SWAP A

ANL  A,  #0FH

MOV  @R0,  A

INC  R0

MOV  A,  74H

ANL  A,  #0FH

MOV  @R0,  A

INC  R0

MOV  A,  75H

SWAP A

ANL  A,  #0FH

MOV  @R0,  A

INC  R0

MOV  A,  75H

ANL  A,  #0FH

MOV  @R0,  A

MOV  DPTR, #D_TAB

MOV  R2, #254

MOV  R0, #70H

D_LOOP:

MOV  A,  @R0

MOVC A,  @A+DPTR

MOV  P2, #255       ;消隐.

MOV  P0, A          ;输出段码.

MOV  P2, R2         ;输出位码.

LCALL  DL_1MS

MOV  A,  R2

RL   A

MOV  R2, A

INC  R0

CJNE R0, #74H, D_LOOP

RET

D_TAB:

DB  0C0H, 0F9H, 0A4H, 0B0H, 99H,  92H, 82H, 0F8H

DB   80H,  90H,  88H,  83H, 86H, 0A1H, 86H,  8EH

;-------------------------------

DL_1MS:

DJNZ  R7, $

DJNZ  R7, $

RET

;-------------------------------

END

;===========================================

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于51单片机的C语言代码,可以实现独立按键长按加减键四位数码显示0000的功能。具体的实现方式是:通过外部中断来检测按键的状态,在按键被按下时启动定时器,当定时器达到一定时间时,就判断为长按操作,然后进行加减数值的计算,最后将结果显示数码管上。 ```c #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit KEY_PLUS=P3^1; //加键接口 sbit KEY_MINUS=P3^0; //减键接口 sbit KEY_ONOFF=P3^2; //开关接口 sbit LED1=P2^0; //LED1指示灯接口 sbit LED2=P2^1; //LED2指示灯接口 uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示0~9的数码管编码 uchar cnt=0; //数码显示计数器 uchar time=0; //计时器计数器 uchar flag=0; //长按标志位 uchar num_disp[4]={0,0,0,0}; //数码显示值 void delay(uint x) //延时函数 { uint i,j; for(i=0;i<x;i++) for(j=0;j<125;j++); } void timer0_init() //定时器0初始化 { TMOD|=0x01; //设置为定时器0模式 TH0=(65536-50000)/256; //50ms重载值高位 TL0=(65536-50000)%256; //50ms重载值低位 ET0=1; //开启定时器0中断 TR0=1; //启动定时器0 EA=1; //开启总中断 } void key_check() interrupt 0 //外部中断0,按键检测 { delay(5); if(!KEY_PLUS) //加键按下 { flag=0; //长按标志位清零 TH0=(65536-50000)/256; //50ms重载值高位 TL0=(65536-50000)%256; //50ms重载值低位 TR0=1; //启动定时器0 while(!KEY_PLUS); //等待按键释放 } else if(!KEY_MINUS) //减键按下 { flag=0; //长按标志位清零 TH0=(65536-50000)/256; //50ms重载值高位 TL0=(65536-50000)%256; //50ms重载值低位 TR0=1; //启动定时器0 while(!KEY_MINUS); //等待按键释放 } } void timer0_isr() interrupt 1 //定时器0中断服务函数 { TH0=(65536-50000)/256; //50ms重载值高位 TL0=(65536-50000)%256; //50ms重载值低位 time++; //计时器计数器加1 if(time==20) //1s到达 { time=0; //计时器计数器清零 flag=1; //长按标志位置一 TR0=0; //关闭定时器0 } } void display() //数码显示函数 { uchar i; for(i=0;i<4;i++) { switch(i) //选择数码管 { case 0: P1=num[cnt%4_disp[0]]; break; case 1: P1=num[cnt/10_disp[1]%10]; break; case 2: P1=num[cnt/100_disp[2]%10]; break; case 3: P1=num[cnt/1000_disp[3]%10]; break; } P0=0x0f&(0x01<<i); //锁存 delay(5); //延时 P0=0x00; //消隐 } cnt++; //计数器加1 if(cnt==10000) //计数器到达10000时清零 cnt=0; } void main() { LED1=0; //LED1指示灯亮 LED2=1; //LED2指示灯灭 timer0_init(); //定时器0初始化 while(1) { if(flag==1) //长按标志位为1时进行加减数值计算 { if(!KEY_PLUS) //加键长按 { cnt++; //计数器加1 if(cnt>180) //计数器超过180时清零 cnt=0; } else if(!KEY_MINUS) //减键长按 { cnt--; //计数器减1 if(cnt<0) //计数器小于0时置为180 cnt=180; } flag=0; //长按标志位清零 } display(); //数码显示 } } ``` 这段代码中,我们使用了定时器0来进行长按检测和计时操作,同时使用了外部中断0来检测按键的状态。在按键被按下时,我们启动定时器0并等待按键释放,当定时器0达到一定时间时,就判断为长按操作,然后进行加减数值的计算,并将结果显示数码管上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值