单片机4*4键盘控制四位7段数码管显示00-15问题,十位数字闪一闪后就不亮了,个位数字是对的 帮我改成4*4矩阵键盘控制 4位共阴极数码管显示! 51单片...

作者&投稿:后狮 (若有异议请与网页底部的电邮联系)
你的显示是动态的,必须时时扫描,也就是循环送显示数据,否则就无法正常显示,
#include<reg51.h>
sbit a=P3^4;
sbit b=P3^5;
sbit c=P3^6;
sbit d=P3^7;
sbit e=P2^0;
sbit f=P2^1;
sbit g=P2^2;
sbit h=P2^3;
sbit i=P2^6;
sbit j=P2^7;
bit flag;
unsigned char flag;
unsigned char code dcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0xff} ;
unsigned char key;
unsigned char t;
unsigned char m,mm;
void delay1ms(unsigned int x){
unsigned char j;
while(x--){
for(j=0;j<123;j++){;}
}
}
void t0isr() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
flag=~flag;
if(flag){e=0;f=0;g=1;h=0;P0=dcode[key/10];}
else {e=0;f=0;g=0;h=1;P0=dcode[key%10];}
}
void main(void){
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
while(1) {
P3=0xff;
a=0;
t=P3;
t=t&0x0f;
if(t!=0x0f)
{ delay1ms(80);
if (t!=0x0f){
t=P3;
t=t&0x0f;
if(t==0x0e){key=0;}
if(t==0x0d){key=1;}
if(t==0x0b){key=2;}
if(t==0x07){key=3;}
}
}
P3=0xff;
b=0;
t=P3;
t=t&0x0f;
if (t!=0x0f)
{
delay1ms(80);
if (t!=0x0f){
t=P3;
t=t&0x0f;
if(t==0x0e){key=4;}
if(t==0x0d){key=5;}
if(t==0x0b){key=6;}
if (t==0x07){key=7;}
}
}
P3=0xff;
c=0;
t=P3;
t=t&0x0f;
if (t!=0x0f)
{
delay1ms(80);
if (t!=0x0f){
t=P3;
t=t&0x0f;
if(t==0x0e){key=8;}
if(t==0x0d){key=9;}
if(t==0x0b){key=10;}
if (t==0x07){key=11;}
}
}
P3=0xff;
d=0;
t=P3;
t=t&0x0f;
if (t!=0x0f)
{
delay1ms(80);
if (t!=0x0f){
t=P3;
t=t&0x0f;
if(t==0x0e){key=12;}
if(t==0x0d){key=13;}
if(t==0x0b){key=14;}
if(t==0x07){key=15;}
}
}
}}

单片机4*4键盘分别控制数码管显示0-f,不知道哪里错了,控制cdef的四个键不对,其他都对 求高手指点,多谢~

#include // 试试这个#define uchar unsigned charuchar temp;int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e funsigned char code LED7Code[] = {~0x3F,~0x06,~0x9B,~0x8F,~0xA6,~0xAD,~0xBD,~0x07,~0xBF,~0xAF,~0xB7,~0xBC,~0x39,~0x9E,~0xB9,~0xB1};void delay(uchar z){ uchar i,j; for(i=0;i<120;i++) for(j=0;j<z;j++); }void scan() // 要是按键了,扫描键盘编码值{ P1=0xF0; // P1 4X4 键盘
delay(1); temp=P1; switch(temp) { case 0xe0: key1=0; break; case 0xd0: key1=1; break; case 0xb0: key1=2; break; case 0x70: key1=3; break; } P1=0x0f; delay(1); temp=P1; switch(temp) { case 0x0E: key=key1+0; break; case 0x0D: key=key1+4; break; case 0x0B: key=key1+8; break; case 0x07: key=key1+12; break; default : key=-1; } if((key1+1)&&(key+1)) disbuf=key;}void ejjc() //判断是否按键{P1=0xF0;if(P1!=0xF0)scan();}void main(){while(1){ejjc();P3=LED7Code[disbuf]; // P3 显示 89c2051 仿真delay(200);}}

#include#define uchar unsigned charuchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0到fuchar keyval;uint x;
void delay(uchar a){ uchar i,j; for(i=0;i<a;i++) for(j=0;j<125;j++);}uchar kbscan(void){ unsigned char sccode,recode; P3=0x0f; //发0扫描,列线输入 if ((P3 & 0x0f) != 0x0f) //有键按下 { delay(20); //延时去抖动 if ((P3&0x0f)!= 0x0f) { sccode = 0xef; //逐行扫描初值 while((sccode&0x01)!=0) { P3=sccode; if((P3&0x0f)!=0x0f) { recode=(P3&0x0f)|0xf0; while((P3&0x0f)!=0x0f);//等待键抬起 return((~sccode)+(~recode)); } else sccode=(sccode<<1)|0x01; } } } return 0; //无键按下,返回0}
void getkey(void){ unsigned char key; key=kbscan(); if(key==0) { return; } switch(key) { case 0x11:keyval=7;break; case 0x12:keyval=4;break; case 0x14:keyval=1;break; case 0x18:keyval=10;break; case 0x21:keyval=8;break; case 0x22:keyval=5;break; case 0x24:keyval=2;break; case 0x28:keyval=0;break; case 0x41:keyval=9;break; case 0x42:keyval=6;break; case 0x44:keyval=3;break; case 0x48:keyval=11;break; case 0x81:keyval=12;break; case 0x82:keyval=13;break; case 0x84:keyval=14;break; case 0x88:keyval=15;break; default:keyval=0xff;break; }}void t0isr() interrupt 1{ TH0=(65536-10000)/256; TL0=(65536-10000)%256; switch(num) { case 0:P2=0x0fe;break; case 1:P2=0x0fb;break; case 2:P2=0x0fd;break; case 3:P2=0x0f7;break; default:break; } P0=tab[keyval]; num++; num&=0x03;}main(){ TMOD=0x01; TH0=(65536-10000)/256; TL0=(65536-10000)%256; TR0=1; ET0=1; EA=1; while(1) { getkey(); }}

单片机4*4矩阵键盘两位数码管显示0—16
答:步骤如下:1、将4x4矩阵键盘连接到单片机上,并将数码管连接到单片机上。2、编写程序以实现键盘扫描和数码管显示。3、使用行扫描法识别键盘输入。将行线设置为高电平,然后逐行扫描列线。4、使用两位数码管显示0-16的数值。将数码管的段选线连接到单片机的GPIO引脚上,并将位选线连接到另一个GPIO引...

使用p1.0-p1.7口实现4*4键盘输入,并用p0口和p2口控制数码管显示输入键值...
答:void DelayMS(uint x) // 延时 { uchar i;while(x--)for(i=0;i<120;i++);} uchar Keys_Scan() //键盘扫描 { uchar sCode,kCode,i,k; //低4位置0,放入4行 P1=0xf0;if((P1&0xf0)!=0xf0) //若高4位出现0,则有键按下 { DelayMS(2);if((P1&0xf0)!=0xf0){...

怎么用4*4键盘和4位数码管设计一个电子密码锁?
答:用4*4键盘和4位数码管设计一个电子密码锁,可用proteus 仿真来实现,画出仿真图测试,用四位一体共阳数码管,P3口接4*4矩阵键盘。仿零效果如下图。

单片机4*4矩阵键盘与数码管连用问题(将某行某列的键盘显示在数码管上...
答:你用的是静态显示,按下某一銉后,只有列数信号被锁存,因你的行和列数码管共用P0口和同一个锁存器,所以先显示的行数被后面的列数代替,且中间还没有任何延时,所以行数只是一闪而过 即使按住按键不丢,虽行数信号可以被反复显示,但由于按銉识别时有10MS的延时 ,这期间行数信号是不显示的,...

at89s52单片机 如何实现4个按键控制四位数码显示管,按p3.2数码管显示1...
答:在flash编程和校验时,P3口也接收一些控制信号。端口引脚 第二功能:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 INTO(外中断0)P3.3 INT1(外中断1)P3.4 TO(定时/计数器0)P3.5 T1(定时/计数器1)P3.6 WR(外部数据存储器写选通)P3.7 RD(外部数据存储器读选通)汇编语言我还...

单片机四位数码管显示中间一行字母
答:51单片机(四位数码管的显示)程序[1]51单片机(四位数码管的显示)程序 基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管 上显示P ”个字符;2)等待按键,如按了任何一个键,则将这 4个字符清除, 改为显示0000”个字符(为数字的0)。E3最佳答案 下面这个程序是4x4距阵...

帮我改成4*4矩阵键盘控制 4位共阴极数码管显示! 51单片机
答:sccode<<1)|0x01; } } } return 0; //无键按下,返回0}void getkey(void){ unsigned char key; key=kbscan(); if(key==0) { return; } switch(key) { case 0x11:keyval=7;break; case 0x12:keyval=4;break; case 0x14:keyval=1;break; case 0x18:keyval=10;...

求一款支持4位7段数码管的驱动IC
答:支持4位7段数码管的驱动IC有不少,推荐一款国产的CH455,驱动4位数码管,支持I2C总线,贴片封装,很适合你的需求。这是一个系列的驱动多位数码管的芯片,CH451~CH456。

关于4位7段数码管的问题,谢谢
答:效果不好,亮度不均匀 3.小尺寸的数码管每段只要一个LED,压降大概1.8V,也就是说只要电压大于1.8V就可以点亮;大尺寸的数码管每段有多个LED串联组成,所以压降比较高,具体压降要看尺寸,我用过的高9厘米左右的数码管要9V以上才能点亮。要注意LED是电流型器件,电流不能过高,10mA左右就够了 ...

可不可用c语言给我解释一下4*4键盘是怎么工作的!万分感谢啊!
答:4*4键盘四行四列;有8个引出线;每个键可以都可以由行和列的引出线高低电平(0、1)所唯一确定;我们也可以理解为2^4=16;键盘只要有键按下那么4条行引出线和4条列引出线必定分别有一根线电平是一样的;这样我们就可以人为先把某行或者某列设置为1或0电平;然后根据列电平的点位变化可以知道是否...