按下16个矩阵键盘依次在数码管上显示1-16的平方,请教单片机高手,这个平方如何显示?大体框架已在下面

2024-11-26 03:30:03
推荐回答(3个)
回答1:

其实这个程序很简单。按下N,就显示N*N喽。多用点缓存,简单一下结构,就好写了。
首先,简化显示部分:
number[] = {...., 0x00}; //最后加上这个,以便显示灭状态:number[16] = 0x00;
uchar disbuf[6] = {0}; //显示6只数码和的缓存
void display(){
uchar i;
for(i = 0; i < 6; i++){
P1 = 7; //消影,也可以ENLED = 1; 写好段码后再 ENLED = 0;
P0 = number[disbuf[i]];
P1 = i;
delay(10); //这个长度可调亮度
}
}
//显示一个6位数字的整数:
void disData(ulong dat){
uchar i;
disbuf[0] = dat % 10;
dat /= 10;
for(i = 1; i < 6; i++){
if(dat > 0){
disbuf[i] = dat % 10;
dat /= 10;
} else {
disbuf[i] = 16; //灭状态,如果不需要可以不用
}
}
}
//读按键(行数)
uchar readkey(uchar n){
P2 = ~(1 << n); //选择要读的行,顺便把输入口拉高
return (P2 >> 4); //返回高4位
}
//扫描4*4键盘
void scankey(){
static keynum[16] = {0};
uchar key[4], i, j, vkey;
for(i = 0; i < 4; i++)
key[i] = readkey(i);//分别读出每行按键的状态
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
vkey = i*4+j; //这就是按下的键值了。。
if((key[i] & (1 << j)) == 0){ //判断这个键是否按下
if(keynum[vkey] == 10){ //按下持续时间超过10,是为按下,可用作消抖判定
disdata(vkey * vkey); //显示键值的平方
}
if(keynum[vkey] <= 10)
keynum[vkey]++;
} else{
keynum[vkey] = 0;
}
}
}
}

void main(){
while(1){
scankey();
display();
}
}

回答2:

#include
#include"51hei.h"
#define uc unsigned char
#define ui unsigned int
sbit dus=P2^6;
sbit wes=P2^7;
ui num,temp,a2,a1,a0;
uc code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
ui kscan();
delay(uc x)
{
ui i,j;
for(i=2;i>0;i--)
for(j=x;j>0;j--);
}
display(ui bi,ui si,ui ge)
{uc i;

P0=table[bi];
dus=1;
dus=0;
P0=0xdf;
wes=1;
wes=0;
delay(1);
P0=0xff;
wes=1;
wes=0;
for(i=50;i>0;i--);

P0=table[si];
dus=1;
dus=0;
P0=0xbf;
wes=1;
wes=0;
delay(1);
P0=0xff;
wes=1;
wes=0;
for(i=50;i>0;i--);

P0=table[ge];
dus=1;
dus=0;
P0=0x7f;
wes=1;
wes=0;
delay(1);
P0=0xff;
wes=1;
wes=0;
for(i=50;i>0;i--);
}
void main()
{ guandz();
while(1)
{
a2=kscan()/100;
a1=kscan()%100/10;
a0=kscan()%100%10;
display(a2,a1,a0);//kscan的返回值是num
}
}
ui kscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(8);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=1;
break;
case 0xd0:num=4;
break;
case 0xb0:num=9;
break;
case 0x70:num=16;
break;
}
while(temp!=0xf0) //松手检测
{
temp=P3;
temp=temp&0xf0;
display(a2,a1,a0);
}
}

}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(8);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=25;
break;
case 0xd0:num=36;
break;
case 0xb0:num=49;
break;
case 0x70:num=64;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
display(a2,a1,a0);
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(8);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=81;
break;
case 0xd0:num=100;
break;
case 0xb0:num=121;
break;
case 0x70:num=144;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
display(a2,a1,a0);
}
}

}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(8);
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=169;
break;
case 0xd0:num=196;
break;
case 0xb0:num=225;
break;
case 0x70:num=256;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
display(a2,a1,a0);
}
}

}
return num;//返回值是num
}

回答3:

你是说要在数字右上角有个2 还是计算出来显示