❶ 51单片机(四位数码管的显示)程序
下面这个程序是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***************************************/
❷ 单片机数码显示程序解读帮我读下!!
程序应该是在数码管上显示2010
P2的作用是数码管位选引脚,P1是段码
ORG
0000H
;程序入口
;主函数
MAIN:
MOV
DPTR,#TABAL
;将数码管码表TABAL赋给DPTR用于查表
MOV
A,#02H
;将立即数02H赋给A
MOVC
A,@A+DPTR
;将TABAL第三个值赋给A,即0A4H赋给A
MOV
P2,#01H
;选通第一个数码管
MOV
P1,A
;将查到的0A4H赋给P1
ACALL
DELAY
;延时
;以上这一小段就是在第一个数码管上显示2,下面类似
MOV
A,#0
MOVC
A,@A+DPTR
MOV
P2,#2H
MOV
P1,A
ACALL
DELAY
MOV
A,#01H
MOVC
A,@A+DPTR
MOV
P2,#04H
MOV
P1,A
ACALL
DELAY
MOV
A,#0
MOVC
A,@A+DPTR
MOV
P2,#8H
MOV
P1,A
ACALL
DELAY
AJMP
MAIN
;跳到MAIN,这里构成循环,不停地扫描数码管显示
;以下为延时函数
DELAY:
MOV
R6,#10H
;将10H赋给R6
LOOP1:
MOV
R7,#38H
;将38H赋给R7
LOOP2:
DJNZ
R7,LOOP2
;判断R7减1是否为0,若不为0则继续执行LOOP2
DJNZ
R6,LOOP1;判断R6减1是否为0,若不为0则继续跳到LOOP1执行
RET
;下面为共阳数码管码表
TABAL:
DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,080H,090H
END
❸ 51单片机共阴数码管利用静态显示,让六个数码管显示1~6,程序怎么写
代码如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define data P0 //P0口宏定义
/* ***************************************************** */
// 数码管位选数组定义
/* ***************************************************** */
uchar code leddata[] =
{ 0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义};
};
/* ***************************************************** */
// 位定义
/* ***************************************************** */
sbit = P1^7; //段选定义
sbit we = P1^6; //位选定义
/* ***************************************************** */
// 函数名称:DelayMS()
// 函数功能:毫秒延时
// 入口参数:延时毫秒数(ValMS)
// 出口参数:无
/* ***************************************************** */
void delay(uint z)
{
uint x,y;
for(x = 0; x < z; x++)
for(y = 0; y < 113; y++);
}
/* ***************************************************** */
// 函数名称:main()
// 函数功能:数码管静态显示
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void main(void)
{
uchar i;
we = 1;//位选开
data = 0x00;//送入位选数据
we = 0;//位选关
while(1)
{
for(i = 0;i < 16 ; i++)
{
= 1; //段选开
data = leddata[i]; //送入段选数据
= 0; //段选关
delay(500); //延时
}
}
}
(3)单片机实验数码显示程序扩展阅读
对于74HC573,形象一点,我们只需要将其理解为一扇大门,只不过这扇大门是单向的,其中11引脚(LE)控制着门的开、关状态,高电平为大门打开,低电平为大门关闭。
D0-D7为输入,Q0-Q7为输出,在LE = 1,即输入高电平时,输入端=输出端,输入是什么,输出也就原封不动的输出;在LE = 0 ,即输入高电平时,大门关闭,实现锁存,不再输出。了解之后,我们按照电路图,来进行编程,代码实现。
在实现数码管的静态显示中,用到了两个锁存器,两个I/O口,P1.6和P1.7,分别是位选和段选。
首先定义了个数码管位选数组,也就是十六进制代码,这便是后来数码管显示数字的核心,接着,用 sbit 定义了位选和段选端口,分别是 P1.6 和 P1.7 ,定义了一个延时函数,其实这一串代码很有意思,开关开关思想,贯穿始终。
首先把位选打开,送入位选数据后,关闭锁存器,实现锁存,进入循环,随之打开段选锁存器,送入段选数据后,再次关闭段选。
接下来,这个延时操作对于实际看到数码管的显示效果特别重要,因为程序在段选后之后,会马上消隐,显示的时间之后几个微秒,这显然不太合理,需要在关闭段选后加上延时,这样一来,才会让每位数码管亮度保持均匀。
❹ 51单片机四位一体共阳极数码管显示编程
不清楚你的电路构成如何,因此先按下面的假设执行段码及位码的输出;
其中,延时值可根据实验效果予以调整;
设 P0 为输出七段码(共阳极数据);
四位数码管有4个阳极,设位码分别与P2.4--P2.7对应,并且=1时表示可点亮数码管;
sbit wma1=b2^4; //对应左起第1个数码管的阳极
sbit wma2=b2^5; //对应左起第2个数码管的阳极
sbit wma3=b2^6;
sbit wma4=b2^7;
void main()
{
wma1=0; wma2=0; wma3=0; wma4=0;
while(1)
{
P0=table[0]; wma1=1; delay(10); wma1=0;
P0=table[1]; wma1=2; delay(10); wma2=0; P0=table[2]; wma1=3; delay(10); wma3=0; P0=table[3]; wma1=4; delay(10); wma4=0; P0=table[4]; wma1=1; delay(10); wma1=0; P0=table[5]; wma1=2; delay(10); wma2=0; P0=table[6]; wma1=3; delay(10); wma3=0; P0=table[7]; wma1=4; delay(10); wma4=0;
}
}
❺ 51单片机数码管显示的程序是什么
#include
❻ 单片机用汇编写两个数码管显示0到99循环的程序
1、新建项目,做好准备。
❼ 求单片机实验七段数码管显示实验程序
/* ch03-3-4.c - 七段LED数码管实验程序 */
//==声明区=================================================
#include<reg51.h> //定义8051寄存器的头文件,P2-17~19
#define SEG P0 //定义七段LED数码管接至Port 0
/*声明七段LED数码管驱动信号数组(共阳)*/
char code TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99, //数字0-4
0x92,0x83,0xf8,0x80,0x98}; //数字5-9
void delay(int); //声明延迟函数
//==主程序==========================================
main() //主程序开始
{ unsigned char i; //声明无符号变量i
while(1) //无穷循环,程序一直跑
for(i=0;i<10;i++) //显示0-9,共10次
{ SEG=TAB[i]; //显示数字
delay(500); //延迟500×1m=0.5秒
} //for循环结束
} //主程序结束
//==子程序==========================================
/* 延迟函数,延迟约x×1ms */
void delay (int x) //延迟函数开始
{ int i,j; //声明整形变量i,j
for (i=0;i<x;i++) //计数x次,延迟x×1ms
for (j=0;j<160;j++); //计数120次,延迟1ms
} //延迟函数结束
❽ 运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序
动态显示的是有固定格式的,赋值,开显示,延时,关显示,假设p0口接数据显示位,p2口低4位接片选,
p2=tab[1];
//赋值
p3_0=0;
//开第一位显示
for(i=0;i<200:i++);//延时
p3_0=1;
//关第一位显示
p2=tab[2];
p3_1=0;
//开第二位显示
for(i=0;i<200:i++);
p3_1=1;
这个程序就是让两个数码管分别显示1和2,注意程序开头包含头文件regx52.h,如果是包含reg52.h编译不了的