c语言数码管0000到180,求助;51单片机独立按键长按加减键四位数码管就显示0000...
时间: 2023-12-14 08:38:29 浏览: 33
以下是基于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达到一定时间时,就判断为长按操作,然后进行加减数值的计算,并将结果显示在数码管上。