单片机菜鸟求高人指点 矩阵键盘 数码管,怎么实现:按1显示1,再按2显示12,这样子。。

作者&投稿:禤狱 (若有异议请与网页底部的电邮联系)
急求4*4矩阵键盘控制数码管显示! 51单片机~

共阳极数码管 如果是共阴极数码管则 display()里的P0=0xff;改为P0=0x00;P2=smg_we[a];改为P2=~smg_we[a];P0=dsp_code_ca[xianshi[a]];改为P0=~dsp_code_ca[xianshi[a]];即可
#include
#define uchar unsigned char
#define uint unsigned int

uchar key_char,key_char0;
uint aa,bb,num;
uint number[8]={16,16,16,16,16,16,16,16};
uint xianshi[8]={16,16,16,16,16,16,16,16};
uchar code Key_init[] = {0xfe,0xfd,0xfb,0xf7};
uchar code smg_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code dsp_code_ca[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xff};//共阳极数码管0~F

void delay(uint);
bit Test_Key();
void display();

void main(void)
{
uint x,y,z;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //开启总中断
ET0=1;
TR0=0;
while(1)
{
if(!TR0)
{
if(Test_Key())
{
number[x]=num;
x++;
for(y=x,z=0;y>0;y--,z++)
{
xianshi[8-y]=number[z];
}
if(x==8)
{
x=0;
TR0=1;
}
}
}
display();
}
}

void time0() interrupt 1 //T1中断用来计数器溢出 数码管显示
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==100)
{
aa=0;
TR0=0;
for(bb=0;bb<8;bb++)
{
number[bb]=16;
xianshi[bb]=16;
}
}
}

void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=124;b>0;b--); //这里b的大小有晶振频率决定 反比
}

bit Test_Key()
{
uint i;
for(i=0;i<4;i++)
{
P1=Key_init[i];
key_char=P1;
key_char=key_char&0xf0;
if(key_char!=0xf0)
{
delay(5);
key_char=P1;
key_char=key_char&0xf0;
key_char0=P1;
key_char0=key_char0&0xf0;
while(key_char0!=0xf0)
{
key_char0=P1;
key_char0=key_char0&0xf0;
}
if(key_char!=0xf0)
{
switch(key_char)
{
case 0x70: num=12+i;
break;
case 0xb0: num=8+i;
break;
case 0xd0: num=4+i;
break;
case 0xe0: num=0+i;
break;
}
return 1;
}
}
}
return 0;
}

void display()
{
uint a;
for(a=0;a<8;a++)
{
P0=0xff;
P2=smg_we[a];
P0=dsp_code_ca[xianshi[a]];
delay(2);
}
}

其实这个程序很简单。按下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();
}
}

#include<reg52.h>

unsigned char key_num,count=0,k;

unsigned long sum=0;

unsigned char code str[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};

void scan();

void disp_led(unsigned long int dat);

void delay(unsigned int dly);

void main()

{for(k=0;k<=7;k++)

 {SBUF=str[10];

  while(TI==0);

  TI=0;

 }

 while(1)

  {scan();

   count=key_num;

   sum=sum*10+count;

   scan();

   while(key_num!=16)

   scan();

   disp_led(sum);

   delay(1);

   scan();

   while(key_num==16)

   scan();

  }

}

void disp_led(unsigned long int dat)

{

 unsigned char num[8];

 if((dat>=0)&&(dat<=9))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=10;

  num[5]=10;

  num[6]=10;

  num[7]=dat;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=10)&&(dat<=99))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=10;

  num[5]=10;

  num[6]=dat/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=100)&&(dat<=999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=10;

  num[5]=dat/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=1000)&&(dat<=9999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=dat/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=10000)&&(dat<=99999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=dat/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=100000)&&(dat<=999999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=dat/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=1000000)&&(dat<=9999999))

 {

  num[0]=10;

  num[1]=dat/1000000;

  num[2]=dat%1000000/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=10000000)&&(dat<=99999999))

 {

  num[0]=dat/10000000;

  num[1]=dat%10000000/1000000;

  num[2]=dat%1000000/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if(dat>=100000000)

 {

  dat=dat%100000000;

  num[0]=dat/10000000;

  num[1]=dat%10000000/1000000;

  num[2]=dat%1000000/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

}

void delay(unsigned int dly)

{int i,j;

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

 for(j=0;j<dly;j++);

}

void scan()

{unsigned char readkey,x_temp,y_temp;

 P2=0x0f;

 x_temp=P2&0x0f;

 P2=0xf0;

 y_temp=P2&0xf0;

 readkey=x_temp|y_temp;

 switch(readkey)

   {case 0x7e:key_num=0; break;

   case 0x7d:key_num=1; break;

 case 0x7b:key_num=2; break;

 case 0x77:key_num=3; break;

 case 0xbe:key_num=4; break;

 case 0xbd:key_num=5; break;

 case 0xbb:key_num=6; break;

 case 0xb7:key_num=7; break;

 case 0xde:key_num=8; break;

 case 0xdd:key_num=9; break;

 case 0xff:key_num=16;

   }

}

图中是led连接的电路,矩阵按键接的是P2口。



迷糊。

看程序,真正明白数码管的现实原理,弄清楚位选和段码后不难。


...专家进。。。菜鸟旁观免入!!多谢合作。。。
还是建议50D。以后你要是入手各种红圈和白炮的话那镜头都不是一般的沉。如果放到550D身上就会出现头重脚轻的情况,拿着感觉就会很别扭。另外50D有侧肩屏,周围有很多快捷键,设置非常方便。续航能力上50D也很有实力。包括理论快门次数。要说画质。这几年佳能一直在提高像素,但是画质并没有什么明显的提高...

菜鸟想买入门单反相机,纠结于sony A350 ,nikon的D3100 D5000,请高手...
不知道你为什么要在这几款实际已经停产的东西里面挑,最重要的是它们的画质都比较差。给你张图,来自国外权威网站。左上是尼康D3100,右上是奥林巴斯EPL1入门微单,左下是尼康D5000,右下是索尼A380(我找不到350,估计更差)。可以清楚地看到,和EPL1折款最便宜的微单比较起来,三部单反都差太多了...

求高人指点 急啊急啊急啊 、、、 我要怎么使用佳能7D拍出类似复古或者很...
你可以直接选好角度拍一张,构图好。。。然后PS,,或者最实用的一个软件,美图秀秀,直接有复古效果,,各种效果,黑白复古,太多了。。!··想要直接拍出来,有点困难,要有特定的灯光,当然一般你所看到的类似复古的照片,出了老照片,都是后期出来的。。所以后期是每个摄影人必须掌握的一门技巧。

我是个菜鸟,求高人给看看着BOOS数据
看不大懂啊,应该都还标准吧,那些电压都小于后边的值,只有最后一条超出;零点几,没事的,正常。。

想买个单反,本人菜鸟一个,550、600、60D选一个,请高人指点,谢谢。
目前550D的价位比较适合,性价比算是这三个最高的……首先推荐。600D是550D的升级机型,但是升级不明显(主要部分和550D一样),价格差距倒是蛮明显的,没必要多花冤枉钱去买那几个不常用的功能(比如翻转屏啥的),还不如省下钱来买更好的镜头。60D算是比较低端的中端单反,定位比550D这种入门机高...

电脑开机快一点?请高人指点一二。详细一点,哈哈,俺是菜鸟
优化一下,可能系统启动的程序太多,占用了内存跟CPU资源。

电脑攒机高人给菜鸟指点迷津
用独显的话,用 技嘉 770T-ud3p 。显卡至少 蓝宝石 HDG4670 黄金版 一个价。这个显卡的游戏系能一般,有钱换个4830或4750好多了。电源用 酷冷至尊 战斧400 380w就够了,便宜好多。散热器 你cpu发热量不大,没大必要换。

想购单点相机,望各位高人能指点指点~我原想买佳能G11的,但后来停产了...
2.而事实上,单电相机是定位很小众的产品,面向的是追逐潮流,要求性能华丽而不太在意价格的那批人。。。3000预算,买这样的机器还是比较吃力的,主流的价格在4000以上。。而且你也不要指望它真的有多少镜头能供你更换。。“可换镜头的卡片机”对你来讲就是个华而不实的噱头!3.对于大多数人来讲...

本人是PPT菜鸟!求大虾指点!O(∩_∩)O~
本人是PPT菜鸟!求大虾指点!O(∩_∩)O~ 我是个新手对PPT一点都不了解!但是在单位使用率还是很高的!我想求高人指点一下我该怎么入手?怎么才能快速掌握PPT技巧并且能实际应用?不要给我说些理论,关键是我要怎么去“做”并... 我是个新手对PPT一点都不了解!但是在单位使用率还是很高的!我想求高人指点一下我该...

各位大哥帮帮忙啊,我是菜鸟,请高人指点!
用什么MP4看电影,到电脑看算了!!

汉台区18371463843: 请问单片机中的4*4矩阵键盘的键值怎么求??? -
无民盐酸: 单片机书上应该有讲的哦,多查资料. 既然是4x4,即4行4列了,共需要8个I/O口,有8bit数据(如高四位为行4bit,低四位为列4bit)位:xxxx xxxx.还要结合你的程序来编码键值,如果有键按下了,查询所有按键的所连接的I/O口电平状态,每...

汉台区18371463843: 用51单片机,怎么让数码管显示一串矩阵键盘按下的键代表的数(0~f)? -
无民盐酸: 这种显示方式就和手机拨号时,按下号码的显示是一样,第一个数码先在右边显示,再按键,依此向左移动显示.要是6位数码管,就保留6位显示了,按键超过6位时,先按的自然丢掉了.

汉台区18371463843: 单片机 矩阵键盘 -
无民盐酸: 方法一;按照图在板子的一面按图连线飞线即可(麻烦.可靠性低)2,一部分焊板子上一部分焊板子下不就行了....不过要安排好....可能占用其他空间3.梯式焊法...像很多个L平行嵌套一样......但要占用背面大...

汉台区18371463843: 求单片机高手帮忙 数码管 -
无民盐酸: 搜索4 * 4矩阵键盘网络,这是供大家参考... 自己做的小.../ ***************************************** ************************** // ** // *单片机开发系统演示程序 - 矩阵键盘键* // ** // *数字显示* // ** // ***************** ******************************************...

汉台区18371463843: 如何在C中将矩阵键盘输入转换成数? -
无民盐酸: char szInputBuf[BUF_LENGTH];//按键输入之后,转化为数字字符,小数点,不能是你的键值 float fInput = 0.0; sscanf(szInputBuf,"%f",&fInput) //发送,假设发送一个字节的函数为SendByte(unsigned char bDat) unsigned char i; for(i = 0; i<sizeof...

汉台区18371463843: 51单片机矩阵键盘问题 -
无民盐酸: 这问题问得还是可以,scan1&0xf0 就是为了防止其他因素干扰了P1的低四位,用你说的scan1!=0xf0 程序就会认为有按键按下,实际则没有.只不过在不严格要求下用 scan1!=0xf0 也是可以的.顺便提醒你一下,程序改了,实践下就知道了

汉台区18371463843: 单片机 矩阵键盘 怎么扫描多个数? -
无民盐酸: 将接键盘的端口置为读状态,例如接在P1口上的4*4键盘就写:MOV P1,#0F0H 然后读P1口的状态,然后消除键抖动,在确定有键按下的情况下逐个判断P1.0,P1.1P,P1.2,P1.3的状态,再逐个判断P1.4,P1.5,P1.6,P1.7的状态,最后的键值等于行首号加列号.行首号从上到下依次为:0,4,8,C,列号从左到右依次为0,1,2,3,例如第二列第三个数应该为4+2=6,第三行第二个数应为8+1=9,第一个应为8+0=8.4*4键盘最后一个数应为第四行初值C+第四列值3=键码F.让我们共同进步.

汉台区18371463843: 单片机的 矩阵键盘问题 求讲解!!附程序了 -
无民盐酸: 这程序,逻辑上,是有错的.------------------ if(key_l!=0xf0) //--不等于则....{ delay_50us(800);//键盘消抖 if(key_l!=0xf0) //--不等于则....…… ------------------ 在延时前、后的两个判断,所用的条件、变量内容,都是完全相同的.在前面如果满足条件,在后面,就也能满足.在前面,不满足条件,在后面,也一定不满足.实际上,后面的这个判断,并无任何用处.对于消抖,这程序仅仅是进行了延时而已.采纳答案中,没有指出这个缺点.http://wenwen.sogou.com/z/q765985689.htm 这才是正确的程序和正确的解释.

汉台区18371463843: 不知道怎么在矩阵键盘按键释放后,数码管能够动态显示???、求单片机编程大神帮忙 -
无民盐酸: 把key 定义为全局变量,按键扫描程序里去掉display(key); 主程序里加display(key*key); void main() { while(1) {yscan(); display(key*key);} }

汉台区18371463843: 单片机实现5X5矩阵键盘 -
无民盐酸: 哎,语法错误帮你找出来了,有两点,第一:main里面少了两个 }} 以后写{}要成对写,第二:case 0xde&&0xff: a=0; break;0xde&&0xff 应该是0xde&0xff,因为0xde&&0xff的值不是0就是1;所以你这样写 case后面的值就会有相同的,所以会报错....

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网