c51单片机用c程序如何将数码管的各位数字显示到十位,且能让各位在显示其他的数字,例如计算器的显示那种..

c51单片机用c程序如何将数码管的各位数字显示到十位,且能让各位在显示其他的数字,例如计算器的显示那种..

第1个回答  2012-07-16
比如00到59计时器吗?推荐一个群228319245单片机的追问

4*4矩阵按键,已经实现了1-16数字的现实,现在需要按一下键,如按下数字“8”在个位上显示8,再按一下“9”,则9显示到个位,8显示到十位的那种程序.......

追答

#include
#define unchar unsigned char
#define uint unsigned int
void delay(int);
unchar key=0,table[]={0x40,0x4f,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};
void display(uint key)
{
P0=0x40;
P0=table[key];
delay(1000);
}
void juzhensaomiao()
{
unchar num;
P1=0xfc;
num=P1;
num=num&0xf0;
if(num!=0xf0)
{
delay(10);
num=P1;
num=num&0xf0;
if(num!=0xf0)
{
num=P1;
switch(num)
{
case 0xec:
key=1;
break;
case 0xdc:
key=2;
break;
case 0xbc:
key=3;
break;
case 0x7c:
key=4;
break;
}
while(num!=0xf0)
{
num=P1;
num=num&0xf0;
}
display(key);
}
}
P1=0xfa;
num=P1;
num=num&0xf0;
if(num!=0xf0)
{
delay(5);
num=P1;
num=num&0xf0;
if(num!=0xf0)
{
num=P1;
switch(num)
{
case 0xea:
key=5;
break;
case 0xda:
key=6;
break;
case 0xba:
key=7;
break;
case 0x7a:
key=8;
break;
}
while(num!=0xf0)
{
num=P1;
num=num&0xf0;
}
display(key);
}

}

P1=0xf6;
num=P1;
num=num&0xf0;
if(num!=0xf0)
{
delay(5);
num=P1;
num=num&0xf0;
if(num!=0xf0)
{
有点长,这里放不下,我只传了部分,你看看,应该可以看懂

第2个回答  2012-07-17
单片机 群228319245

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar k,m,n;
uchar bdata FLAG;
sbit FLAG_anjian = FLAG^0;// 按键标志 1:有键 0:无键
sbit FLAG_12 = FLAG^1;// 显示选择 1:十位数 0:个位数
unsigned D_code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F } ;
//-------- 延时 -----------------------------------------------------------------------
void Delay_1ms(uint x)
{
uint j;
while(x--)
{
for(j=0;j<125;j++) //
{;}
}
}
//-------- T1中断 ---------------------------------------------------------------------
void int_t1() interrupt 3 using 1// 显示 (采用中断方式显示)
{
TH1=(65536-2000)/256; // 2ms中断一次
TL1=(65536-2000)%256;
FLAG_12=~FLAG_12;// 在十位数和个位数之间切换
P2=0xff;
if (FLAG_12)
{
P0=D_code[m];
P2=0xef;
}
else
{
P0=D_code[n];
P2=0xdf;
}
}
void key_scan()// 键扫描
{
unsigned char x,y,z;
P1=0x0f;
if(P1!=0x0f)
Delay_1ms(10);
if(P1!=0x0f)
{
FLAG_anjian=1;
x=P1&0x0f;
P1=0xf0;
y=P1&0xf0;
z=x|y;
switch(z)
{
case 0xee:k=1; break;
case 0xed:k=2; break;
case 0xeb:k=3;break;
case 0xe7:k=4;break;
case 0xde:k=5;break;
case 0xdd:k=6;break;
case 0xdb:k=7;break;
case 0xd7:k=8;break;

case 0xbe:k=9;break;
case 0xbd:k=0;break;
// case 0xbb:k=11;break;
// case 0xb7:k=12;break;
// case 0x7e:k=13;break;
// case 0x7d:k=14;break;
// case 0x7b:k=15;break;
// case 0x77:k=16;break;
}
} else FLAG_anjian=0;
}
void main()
{
FLAG_anjian=FLAG_12=0;
m=n=0;

TMOD=0x11;// 显示定时器初始化
TH1=(65536-2000)/256; // 2ms中断一次
TL1=(65536-2000)%256;
TR1=ET1=EA=1;
while(1)
{
key_scan();// 按键扫描
if (FLAG_anjian)
{
m=n;
n=k;
while(FLAG_anjian) // 等待按键放开
{
key_scan();
}
}
}
}本回答被提问者采纳
相似回答