/*功能;计数模式数码管显示四位数字
计算模式数码管最后一位显示F
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define NUM P0 //将P0口重置为NUM
sbit wula=P2^7;
sbit dula=P2^6;
sbit beer=P2^3; //蜂鸣器
//==========按键"+、-、*、/"==========
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
//===========标志位============
bit flag_ms=1; //模式标志位
char led_num=0;//led灯计数变量
int dis_num=2;//数码管灯计数变量
double js_num;//计算结果数值
//数码管显示表0~f+全灭
unsigned char code table[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
//==========显示延时函数===========
void dis_delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=25;y>0;y--);
}
//==========延时函数1ms===========
void delay1ms(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//============显示初始化============
void display_int()
{
wula=1;
NUM=0;
wula=0;
dula=1;
NUM=0xff;
dula=0;
beer=0;
P1=0;
delay1ms(500);
beer=1;
P1=0xff;
}
//============数码管动态显示函数============
void display(uchar wei,duan)
{
wula=1;
NUM=~(0x01<<wei);
wula=0;
dula=1;
NUM=table[duan];
dula=0;
dis_delay(5);
dula=1;
NUM=0x00;//消阴
dula=0;
dis_delay(10);
}
//=============数码管取数显示函数============
void dis(uint num,flag)
{
uchar a;
if(flag==0)
{
a=15;
}
else a=16;
display(5,a);
display(3,num%10);
display(2,num/10%10);
display(1,num/100%10);
display(0,num/1000);
}
//=============led灯左移显示函数===========
void dis_zled(uchar num)
{
// if(num==0)
// {
// P1=0xff;
// }else
P1=(0xfe<<num);
}
//=============led灯右移显示函数===========
void dis_yled(uchar num)
{
// if(num==0)
// {
// P1=0xff;
// }else
P1=0x7f>>num;
}
//=============led灯显示控制函数===========
void dis_led(uchar flag,num)
{
if(flag==0) //左移
dis_zled(num);
if(flag==1) //右移
dis_yled(num);
}
//=======计数模式显示函数===========
void dis_ju(uchar flag)
{
dis(dis_num,1);
dis_led(flag,led_num);
}
//=======计算模式显示函数===========
void dis_js(uchar flag)
{
dis(js_num,0);
dis_led(flag,led_num);
}
//=============按键——计数模式==========
void key_ju()
{
key1=1;
if(key1==0)
{
delay1ms(20);
if(key1==0)
{
led_num++;
if(led_num>=7)
led_num=7;
beer=0;
dis_ju(0); //松手检测显示
beer=1;
}
}
while(!key1)
dis_ju(0); //松手检测显示
key2=1;
if(key2==0)
{
delay1ms(20);
if(key2==0)
{
led_num--;
if(led_num<=0)
led_num=0;
beer=0;
dis_ju(0);
beer=1;
}
}
while(!key2)
dis_ju(0); //松手检测显示
key3=1;
if(key3==0)
{
delay1ms(20);
if(key3==0)
{
dis_num++;
beer=0;
dis_ju(0);
beer=1;
}
}
while(!key3)
dis_ju(0); //松手检测显示
key4=1;
if(key4==0)
{
delay1ms(20);
if(key4==0)
{
dis_num--;
if(dis_num<=0)
dis_num=0;
beer=0;
dis_ju(0);
beer=1;
}
}
while(!key4)
dis_ju(0); //松手检测显示
}
//=============按键——计算模式==========
void key_js()
{
key1=1; //+键
if(key1==0)
{
delay1ms(20);
if(key1==0)
{
js_num=dis_num+(led_num+1);
dis_num=js_num;
beer=0;
dis_js(0);
beer=1;
}
while(!key1)
dis_js(0);//松手检测显示
}
key2=1;
if(key2==0)
{
delay1ms(20);
if(key2==0)
{
js_num=dis_num-(led_num+1);
dis_num=js_num;
beer=0;
dis_js(0);
beer=1;
}
while(!key2)
dis_js(0); //松手检测显示
}
key3=1;
if(key3==0)
{
delay1ms(20);
if(key3==0)
{
js_num=dis_num*(led_num+1);
dis_num=js_num;
beer=0;
dis_js(0);
beer=1;
}
while(!key3)
dis_js(0);//松手检测显示
}
key4=1;
if(key4==0)
{
delay1ms(20);
if(key4==0)
{
js_num=dis_num/(led_num+1);
dis_num=js_num;
if(js_num<=0)
{
js_num=0;
}
beer=0;
dis_js(0);
beer=1;
}
while(!key4)
dis_js(0);//松手检测显示
}
}
//============按键模式控制=============
void key_ms()
{
if(flag_ms==0) //计算模式
{
key_js();
dis_js(0);
}
else if(flag_ms==1) //计数模式
{
key_ju();
dis_ju(0);
}
key1=1;
key2=1;
if(key1==0&&key2==0) //转换计数模式
{
delay1ms(10);
if(key1==0&&key2==0)
{
flag_ms=1;
dis_num=js_num;
beer=0;dis_ju(0);beer=1;
}
while(!(key1==0||key2==0))
dis_ju(0);
}
key3=1;
key4=1;
if(key3==0&&key4==0)//转换计算模式
{
delay1ms(10);
if(key3==0&&key4==0)
{
flag_ms=0;
js_num=dis_num;
beer=0;dis_js(0);beer=1;
}
while(!(key3==0||key4==0))
dis_js(0);
}
}
//============主函数==============
void main()
{
display_int();//显示初始化
while(1)
{
key_ms();
}
}
评论0