51单片机(四位数码管的显示)程序
基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P___”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“000...
基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
只要一个程序就好,先不要管那些静态或动态的,一个能运行的即可。 展开
只要一个程序就好,先不要管那些静态或动态的,一个能运行的即可。 展开
展开全部
下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!
#include<at89x52.h>
unsigned char code Dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管 0-F 代码
unsigned char k; //设置全局变量k 为键盘的键值
/************************************键盘延时函数****************************/
void key_delay(void) //延时函数
{
int t;
for(t=0;t<500;t++);
}
/************************************键盘扫描函数******************************/
void keyscan(void) //键盘扫描函数
{
unsigned char a;
P2 = 0xf0; //键盘初始化
if(P2!=0xf0) //有键按下?
{
key_delay(); //延时
if(P2!=0xf0) //确认真的有键按下?
{
P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平
key_delay();
a = P2; //a作为缓存
switch (a) //开始执行行列扫描
{
case 0xee:k=15;break;
case 0xde:k=11;break;
case 0xbe:k=7;break;
case 0x7e:k=3;break;
default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平
a = P2;
switch (a)
{
case 0xed:k=14;break;
case 0xdd:k=10;break;
case 0xbd:k=6;break;
case 0x7d:k=2;break;
default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平
a = P2;
switch (a)
{
case 0xeb:k=13;break;
case 0xdb:k=9;break;
case 0xbb:k=5;break;
case 0x7b:k=1;break;
default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平
a = P2;
switch (a)
{
case 0xe7:k=12;break;
case 0xd7:k=8;break;
case 0xb7:k=4;break;
case 0x77:k=0;break;
default:break;
}
}
}
break;
}
}
}
}
/****************************** ***主函数*************************************/
void main(void)
{
while(1)
{
keyscan(); //调用键盘扫描函数
switch(k) //查找按键对应的数码管显示代码
{
case 0:P0=Dig[0];break;
case 1:P0=Dig[1];break;
case 2:P0=Dig[2];break;
case 3:P0=Dig[3];break;
case 4:P0=Dig[4];break;
case 5:P0=Dig[5];break;
case 6:P0=Dig[6];break;
case 7:P0=Dig[7];break;
case 8:P0=Dig[8];break;
case 9:P0=Dig[9];break;
case 10:P0=Dig[10];break;
case 11:P0=Dig[11];break;
case 12:P0=Dig[12];break;
case 13:P0=Dig[13];break;
case 14:P0=Dig[14];break;
case 15:P0=Dig[15];break;
default:break; //退出
}
}
}
/**********************************end***************************************/
#include<at89x52.h>
unsigned char code Dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管 0-F 代码
unsigned char k; //设置全局变量k 为键盘的键值
/************************************键盘延时函数****************************/
void key_delay(void) //延时函数
{
int t;
for(t=0;t<500;t++);
}
/************************************键盘扫描函数******************************/
void keyscan(void) //键盘扫描函数
{
unsigned char a;
P2 = 0xf0; //键盘初始化
if(P2!=0xf0) //有键按下?
{
key_delay(); //延时
if(P2!=0xf0) //确认真的有键按下?
{
P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平
key_delay();
a = P2; //a作为缓存
switch (a) //开始执行行列扫描
{
case 0xee:k=15;break;
case 0xde:k=11;break;
case 0xbe:k=7;break;
case 0x7e:k=3;break;
default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平
a = P2;
switch (a)
{
case 0xed:k=14;break;
case 0xdd:k=10;break;
case 0xbd:k=6;break;
case 0x7d:k=2;break;
default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平
a = P2;
switch (a)
{
case 0xeb:k=13;break;
case 0xdb:k=9;break;
case 0xbb:k=5;break;
case 0x7b:k=1;break;
default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平
a = P2;
switch (a)
{
case 0xe7:k=12;break;
case 0xd7:k=8;break;
case 0xb7:k=4;break;
case 0x77:k=0;break;
default:break;
}
}
}
break;
}
}
}
}
/****************************** ***主函数*************************************/
void main(void)
{
while(1)
{
keyscan(); //调用键盘扫描函数
switch(k) //查找按键对应的数码管显示代码
{
case 0:P0=Dig[0];break;
case 1:P0=Dig[1];break;
case 2:P0=Dig[2];break;
case 3:P0=Dig[3];break;
case 4:P0=Dig[4];break;
case 5:P0=Dig[5];break;
case 6:P0=Dig[6];break;
case 7:P0=Dig[7];break;
case 8:P0=Dig[8];break;
case 9:P0=Dig[9];break;
case 10:P0=Dig[10];break;
case 11:P0=Dig[11];break;
case 12:P0=Dig[12];break;
case 13:P0=Dig[13];break;
case 14:P0=Dig[14];break;
case 15:P0=Dig[15];break;
default:break; //退出
}
}
}
/**********************************end***************************************/
展开全部
这个要看你的硬件电路是怎么做的,因为要区别动态或是静态扫描,可以帮你理下思路,如果动态的话,用两个锁存器如74HC573 。一个锁段字形码,一个锁位选哪一个数码管亮。有键值也是这样,如下简单的写法:
duan=1; //开段锁存
P0=table[字型表];///送字型
duan=0; //段锁住
wei=1; //开位锁存, P0=tablewe[数码管的表];///选中哪个码管
wei=0; //位锁住
duan=1; //开段锁存
P0=table[字型表];///送字型
duan=0; //段锁住
wei=1; //开位锁存, P0=tablewe[数码管的表];///选中哪个码管
wei=0; //位锁住
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询