找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8084|回復(fù): 8
收起左側(cè)

我做51單片機(jī),矩陣鍵盤輸入,想輸入4位數(shù),并在數(shù)碼管上顯示出來(lái),我的程序哪里不...

[復(fù)制鏈接]
ID:65696 發(fā)表于 2014-9-2 18:15 | 顯示全部樓層 |閱讀模式

鍵盤掃描函數(shù),顯示函數(shù)都沒(méi)問(wèn)題,都測(cè)試過(guò)了,就主函數(shù)那一塊,一直調(diào)試不出來(lái),要實(shí)現(xiàn)的功能就是由鍵盤輸入,比如說(shuō)輸入2345,就在鍵盤上分別按2345鍵,然后由數(shù)碼管顯示出來(lái)

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit wela=P2^7;

sbit dula=P2^6;

uchar temp,num,num1,bitnum=0,i,flag;

uint value,temp1=1;

uchar keybuffer[4];

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};


void delay(x)

{

uint a,b;

for(a=x;a>0;a--)

for(b=110;b>0;b--);

}


void display(uint num)

{

uchar ge,shi,bai,qian;

ge=num%10;

shi=num%100/10;

bai=num%1000/100;

qian=num/1000;


wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=table[ge];

dula=0;

delay(5);


wela=1;

P0=0xfb;

wela=0;

dula=1;

P0=table[shi];

dula=0;

delay(5);


wela=1;

P0=0xfd;

wela=0;

dula=1;

P0=table[bai];

dula=0;

delay(5);


wela=1;

P0=0xfe;

wela=0;

dula=1;

P0=table[qian];

dula=0;

delay(5);


}


uchar keyscan()

{


P1=0xfe;

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xee:num=1;flag=1;

break;

case 0xde:num=2;flag=1;

break;

case 0xbe:num=3;flag=1;

break;

case 0x7e:num=4;flag=1;

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}


P1=0xfd;

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xed:num=5;flag=1;

break;

case 0xdd:num=6;flag=1;

break;

case 0xbd:num=7;flag=1;

break;

case 0x7d:num=8;flag=1;

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}


P1=0xfb;

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xeb:num=9;flag=1;

break;

case 0xdb:num=10;flag=1;

break;

case 0xbb:num=11;flag=1;

break;

case 0x7b:num=12;flag=1;

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}


P1=0xf7;

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xe7:num=13;flag=1;

break;

case 0xd7:num=14;flag=1;

break;

case 0xb7:num=15;flag=1;

break;

case 0x77:num=16;flag=1;

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

return num;

}


void main()

{

while(1)

{


while(num1<10&bitnum<4)

{

num1=keyscan();

keybuffer[bitnum]=num1;

if(flag==1)

{

bitnum++;

flag=0;

}

}

for(i=0;i<bitnum;i++)

{

value=keybuffer[bitnum-i]*temp1+value;

temp1=temp1*10;

}   

display(value);

}

}


回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2014-9-2 18:29 來(lái)自觸屏版 | 顯示全部樓層
你現(xiàn)在這個(gè)程序按鍵以后,顯示屏上面有反應(yīng)嗎
回復(fù)

使用道具 舉報(bào)

ID:63656 發(fā)表于 2014-9-3 11:01 | 顯示全部樓層
本帖最后由 2842687945 于 2014-9-3 11:08 編輯

#include "reg52.h"
typedef unsigned int uint16;
typedef unsigned char uint8;
void main()
        {
                uint8 d;
                P1 = 0xff;//初始化P1口
                while(1)
                {
                        P1 = 0xfe;//第一行鍵,1111 1110        
                        //第一行鍵的鍵碼的判斷               
                        d = P1;
                        switch(d)
                        {
                                case 0xee:P0 = 0x3f;break;
                                case 0xde:P0 = 0x06;break;
                                case 0xbe:P0 = 0x5b;break;
                                case 0x7e:P0 = 0x4f;break;
                        }
                        P1 = 0xfd;//第二行鍵,1111 1101
                        //第二行鍵的鍵碼的判斷
                        d = P1;
                        switch(d)
                        {
                                case 0xed:P0 = 0x66;break;
                                case 0xdd:P0 = 0x6d;break;
                                case 0xbd:P0 = 0x7d;break;
                                case 0x7d:P0 = 0x07;break;
                        }
                        P1 = 0xfb;//第三行鍵,1111 1011
                        //第三行鍵的鍵碼的判斷        
                        d = P1;
                        switch(d)
                        {
                                case 0xeb:P0 = 0x7f;break;
                                case 0xdb:P0 = 0x6f;break;
                                case 0xbb:P0 = 0x77;break;
                                case 0x7b:P0 = 0x7c;break;
                        }
                        P1 = 0xf7;//第四行鍵,1111 0111        
                        //第四行鍵的鍵碼的判斷
                        d = P1;
                        switch(d)
                        {
                                case 0xe7:P0 = 0x39;break;
                                case 0xd7:P0 = 0x5e;break;
                                case 0xb7:P0 = 0x79;break;
                                case 0x77:P0 = 0x71;break;
                        }
                }
        }
回復(fù)

使用道具 舉報(bào)

ID:63656 發(fā)表于 2014-9-3 11:09 | 顯示全部樓層
這個(gè)程序是我寫的,我試過(guò)了
回復(fù)

使用道具 舉報(bào)

ID:65758 發(fā)表于 2014-9-3 16:09 | 顯示全部樓層
2842687945 發(fā)表于 2014-9-3 11:01
#include "reg52.h"
typedef unsigned int uint16;
typedef unsigned char uint8;

他要實(shí)現(xiàn)的是連續(xù)按鍵4次,然后出現(xiàn)千位數(shù)。
回復(fù)

使用道具 舉報(bào)

ID:65758 發(fā)表于 2014-9-3 16:50 | 顯示全部樓層
我感覺(jué)你那個(gè) flag 沒(méi)起作用,  另你在初始化下 num1=0  flag=0,  另外如果你那按鍵大于9以上的話,會(huì)直接調(diào)出while大循環(huán),
回復(fù)

使用道具 舉報(bào)

ID:65696 發(fā)表于 2014-9-3 21:04 | 顯示全部樓層
hesongchuan 發(fā)表于 2014-9-3 16:50
我感覺(jué)你那個(gè) flag 沒(méi)起作用,  另你在初始化下 num1=0  flag=0,  另外如果你那按鍵大于9以上的話,會(huì)直接 ...

那你說(shuō)我具體應(yīng)該怎么做呢
回復(fù)

使用道具 舉報(bào)

ID:65696 發(fā)表于 2014-9-3 21:05 | 顯示全部樓層
hesongchuan 發(fā)表于 2014-9-3 16:50
我感覺(jué)你那個(gè) flag 沒(méi)起作用,  另你在初始化下 num1=0  flag=0,  另外如果你那按鍵大于9以上的話,會(huì)直接 ...

那你說(shuō)我具體應(yīng)該怎么做呢
回復(fù)

使用道具 舉報(bào)

ID:65758 發(fā)表于 2014-9-5 18:02 | 顯示全部樓層
本帖最后由 hesongchuan 于 2014-9-7 13:57 編輯
lx983625241 發(fā)表于 2014-9-3 21:05
那你說(shuō)我具體應(yīng)該怎么做呢

這幾天忙,很簡(jiǎn)答  啊,swith case ,語(yǔ)句   case 0x7e:num=4,flag=1;    num 和flag用逗號(hào)不要分號(hào),  
把  num <=10的語(yǔ)句去掉,     另外while(num1<10&bitnum<5)  全局變量bitnum初值等于1。   

下面程序可以實(shí)現(xiàn)連續(xù)按鍵四次,出現(xiàn)一個(gè)千位數(shù),然后在按第十個(gè)鍵  ,數(shù)碼管關(guān)閉,實(shí)驗(yàn)下吧。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^1;
sbit dula=P2^2;
sbit sb=P3^5;//管段數(shù)碼管鍵 第十個(gè)鍵
uchar temp,num,num1,bitnum=1,i,flag;
uint value,temp1=1;
void display(uint z);
uchar keyscan();
uchar keybuffer[4];
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}

void display(uint z)
{
uchar ge,shi,bai,qian;
ge=z%10;
shi=z/10%10;
bai=z/100%10;
qian=z/1000%10;

wela=1;
P1=0xf7;
wela=0;
dula=1;
P1=table[ge];
dula=0;
delay(5);

wela=1;
P1=0xfb;
wela=0;
dula=1;
P1=table[shi];
dula=0;
delay(5);

wela=1;
P1=0xfd;
wela=0;
dula=1;
P1=table[bai];
dula=0;
delay(5);

wela=1;
P1=0xfe;
wela=0;
dula=1;
P1=table[qian];
dula=0;
delay(5);

}

uchar keyscan()
{

P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:num=1,flag=1;
break;
case 0xde:num=2,flag=1;
break;
case 0xbe:num=3,flag=1;
break;
case 0x7e:num=4,flag=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}

P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:num=5,flag=1;
break;
case 0xdd:num=6,flag=1;
break;
case 0xbd:num=7,flag=1;
break;
case 0x7d:num=8,flag=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}

P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:num=9,flag=1;
break;

}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}

return num;
}
void main()
{
while(1)
{
while(bitnum<5)
{
num1=keyscan();
keybuffer[bitnum]=num1;
if(flag==1)
{
bitnum++;
flag=0;
}
}
value=0;
for(i=4;i>0;i--)
{
value=keybuffer[bitnum-i]*temp1+value;
temp1=temp1*10;
}
temp1=1;
bitnum=0;
sb=1;
while(sb==1)     //未按管段鍵,一直執(zhí)行顯示程序。
{
display(value);
}
wela=1;
P1=0xff;
wela=0;
}
}


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表