久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8050|回復: 8
打印 上一主題 下一主題
收起左側

我做51單片機,矩陣鍵盤輸入,想輸入4位數,并在數碼管上顯示出來,我的程序哪里不...

[復制鏈接]
跳轉到指定樓層
樓主
ID:65696 發表于 2014-9-2 18:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

鍵盤掃描函數,顯示函數都沒問題,都測試過了,就主函數那一塊,一直調試不出來,要實現的功能就是由鍵盤輸入,比如說輸入2345,就在鍵盤上分別按2345鍵,然后由數碼管顯示出來

#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);

}

}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2014-9-2 18:29 來自觸屏版 | 只看該作者
你現在這個程序按鍵以后,顯示屏上面有反應嗎
回復

使用道具 舉報

板凳
ID:63656 發表于 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;
                        }
                }
        }
回復

使用道具 舉報

地板
ID:63656 發表于 2014-9-3 11:09 | 只看該作者
這個程序是我寫的,我試過了
回復

使用道具 舉報

5#
ID:65758 發表于 2014-9-3 16:09 | 只看該作者
2842687945 發表于 2014-9-3 11:01
#include "reg52.h"
typedef unsigned int uint16;
typedef unsigned char uint8;

他要實現的是連續按鍵4次,然后出現千位數。
回復

使用道具 舉報

6#
ID:65758 發表于 2014-9-3 16:50 | 只看該作者
我感覺你那個 flag 沒起作用,  另你在初始化下 num1=0  flag=0,  另外如果你那按鍵大于9以上的話,會直接調出while大循環,
回復

使用道具 舉報

7#
ID:65696 發表于 2014-9-3 21:04 | 只看該作者
hesongchuan 發表于 2014-9-3 16:50
我感覺你那個 flag 沒起作用,  另你在初始化下 num1=0  flag=0,  另外如果你那按鍵大于9以上的話,會直接 ...

那你說我具體應該怎么做呢
回復

使用道具 舉報

8#
ID:65696 發表于 2014-9-3 21:05 | 只看該作者
hesongchuan 發表于 2014-9-3 16:50
我感覺你那個 flag 沒起作用,  另你在初始化下 num1=0  flag=0,  另外如果你那按鍵大于9以上的話,會直接 ...

那你說我具體應該怎么做呢
回復

使用道具 舉報

9#
ID:65758 發表于 2014-9-5 18:02 | 只看該作者
本帖最后由 hesongchuan 于 2014-9-7 13:57 編輯
lx983625241 發表于 2014-9-3 21:05
那你說我具體應該怎么做呢

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

下面程序可以實現連續按鍵四次,出現一個千位數,然后在按第十個鍵  ,數碼管關閉,實驗下吧。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^1;
sbit dula=P2^2;
sbit sb=P3^5;//管段數碼管鍵 第十個鍵
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)     //未按管段鍵,一直執行顯示程序。
{
display(value);
}
wela=1;
P1=0xff;
wela=0;
}
}


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品色欧美aⅴ一区二区 | av网站免费| 日韩精品影院 | 麻豆精品久久久 | 国产伦一区二区三区 | 毛片a级 | 99中文字幕 | 99热欧美 | 国产精品 欧美精品 | 一区二区三区免费观看 | 一区二区三区在线免费观看 | 亚洲一区二区在线视频 | 97狠狠干| 91精品久久久久久久久 | 欧美精品在线观看 | 国产中文字幕在线 | 亚洲一页| 亚洲成人一二区 | 亚洲欧美激情精品一区二区 | 亚洲一区二区视频 | 亚洲一区二区高清 | 拍戏被cao翻了h承欢 | av网站在线免费观看 | 男女国产视频 | 精品一区二区三区四区五区 | 最新中文字幕第一页视频 | 久久中文字幕一区 | jlzzxxxx18hd护士| 91国产在线视频在线 | 精品福利av导航 | 精品视频在线观看 | 久久久av | 亚洲综合99 | 久久亚洲综合 | 精品免费国产视频 | 国产a区| 国产精品视频一区二区三区, | 久久久久久久久久久久久9999 | 亚洲日本欧美 | 欧美精品中文字幕久久二区 | 精品久久ai电影 |