下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!
#include<at89x52h>
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; //使行线P24为低电平,其余行为高电平
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; //使行线P25为低电平,其余行为高电平
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; //使行线P26为低电平,其余行为高电平
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; //使行线P27为低电平,其余行为高电平
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/
可以通过代码优化的方式来简化代码。
一、设置延时函数
延时函数在单片机中有着让现实延时的能力,本程序中可以通过采用for循环方式进行延时,具体代码如下:
void delay()
{
uinti,j;
for(i=100;i>0;i--)
for(j=1000;j>0;j--);
}
二、设置数码管显示数组
数组定义简单,而且访问很方便。所有元素类型相同,在数码管显示程序中可以让程序代码减少。数组代码如下:
chara[10]={0xff,0x3,0x9f,0x25,0xd,0x99,0x49,0x41,0x1f,0x1,0x9};
三、设置数码管显示循环
数码管显示循环可以不用编写一次又一次的数码管显示代码,既方便又简洁。具体代码如下:
for(int i=0;i<10;i++)
{
P0=a[i];
delay();
}
扩展资料
单片机程序进行简化可以查看是否有反复出现的代码序列,整合成循环进行更改。同一类型且用法相同的变量可以整合成数组,方便对各个内容进行访问。有特定功能的代码段可以定义一个函数进行访问。
注意:用C51语言编辑的单片机程序与普通C语言不同,C51语言中的数据类型和标准c中的数据类型不同。
#include<reg52h>
//52系列单片机头文件
#define
uchar
unsigned
char
//宏定义
#define
uint
unsigned
int
sbit
dula=P2^6;
//申明u1锁存器的锁存端
sbit
wela=P2^7;
//
u2
uchar
num1,num2;
uchar
code
table[]={
//数组定义
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar
code
aable[]={
//位选数组定义
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void
delays(uint);
//子函数申明
void
main()
{
while(1)
{
for(num1=0;num1<48;num1++)
//6个数循环显示
{
wela=1;
//打开u2锁存端
P0=aable[num1%6];
//送入位选信号
wela=0;
//关闭u2锁存端
//
delays(1);
dula=1;
//打开u1锁存端
P0=table[num1%16];
//送入段选信号
dula=0;
//关闭u1锁存端
delays(1);
}
}
}
/---------主函数-----------------------------------------------/
void
delays(uint
xs)
{
uint
i,j,k;
for(i=xs;i>0;i--)
for(j=1000;j>0;j--)
for(k=110;k>0;k--);
}
/----------------延时程序-----------------------------------------------/
最早的单片机里面是没有程序的,程序是在外置的程序存储器里面。现在大多数单片机都把程序区做在片内,做到真正的单片机。早期的单片机都是一次性写入(OTP)的,现在很多都是FLASH的,可以反复写的。最早的单片机是没有加密的,是可以直接读出来2进制的机器码,直接就可以写入另外一个单片机中。现在基本上都做了加密,正常的去读是读不出来的。
单片机:
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
以上就是关于51单片机(四位数码管的显示)程序全部的内容,包括:51单片机(四位数码管的显示)程序、51单片机 让数码管自动显示0至9的C程序。有没有比这个更简单的、51单片机数码管显示程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)