『壹』 一段数码管动态显示一行六位数字的程序,求解析所有代码含义。越详细越好
;这个程序的基本流程是:
;1.把content中的数字对应的断码找出,并依次存放到LEDBuf中
;2.依次送LEDBuf中的断码到LED上,LED显示对应字符
OUTBIT equ 08002h ;将位码送至此地址,位码表示显示哪一位LED管
OUTSEG equ 08004h ;将断码送至此地址,断码表示在指定的LED管上显示什么字符
data segment
Content db 1,2,3,0dh,0eh,0fh ;要显示的数字
LEDBuf db 6 p(?) ;要显示的数字对应的断码
;LEDMAP给出的是断码表,表示16进制数到断码的映射。总共16个,分别表示0-f。
;比如第一个3fh就是0的断码,断码送到LED中,LED会自动显示0。
LEDMAP:
db 3fh,06h,5bh,4fh,66h,6dh,7dh,,07h
db 7fh,6fh,77h,7ch,39h,5eh, 79h,71h
data ends
code segment
assume cs:code, ds:data
;Delay的目的就是为了让LED灯上的内容停留,以便看清
Delay proc
push cx
mov cx,100h
loop $ ;这里的循环目的是暂停一段时间,让LED上的数字停留,以便人看清
pop cx
ret
Delay endp
;DisplayLED做的事:把LEDbuf中内容全部显示到LED灯上。LEDbuf中6个断码,对应6个LED灯。
DisplayLED proc near
mov bx, offset LEDBuf
mov cx, 6 ;总共显示6个断码
mov ah, 00100000b ;位码,00100000b中1的位置指示了要显示的数位,当前是1在左起第六个,也就是显示6号LED灯
;后面有shr指令会将这个00100000b右移,这样变成00010000,显示5号LED,以此类推。
DLoop: mov dx, OUTBIT
mov al, 0
out dx,al ;将0送端位码端口,表示当前不选中任何LED,即关闭LED
mov al, [bx] ;将LEDbuf中的一个断码,送入al
mov dx, OUTSEG
out dx,al ;送断码,表示要在LED中显示这个字符
mov dx, OUTBIT
mov al, ah
out dx, al ;送位码,表示要显示哪一个LED灯
call Delay ;上面送完断码,位码后,在相应的LED上就显示相应的字符,Delay可以让这个字符停留一段时间,视觉滞留。
shr ah, 1 ;位码右移,显示下一个LED
inc bx ;bx加1,那么[bx]就指向LEDbuf中的下一个断码
loop Dloop ;这个Dloop循环把LEDbuf中的六个断码依次全部送到对应LED上显示
ret
DisplayLED endp
;Start:程序的入口,从这里开始运行程序
Start proc near
mov ax, data
mov ds, ax
mov cx,6 ;显示六个字符
mov ah,0 ;ah是content中的偏移量,从0->5,分别找出content中各个字节内容
mov si,offset ledbuf
redo: mov bx,offset content
mov al,ah ;后面的xlat指令要使用al
xlat ;xlat的作用al<-[bx+al],也就是将bx这个地址(content)起的第al个字节内容送到al中
mov bx,offset ledmap
xlat ;将此时al中的数字对应的断码找出,并放到al中。(数字a对应的断码就是ledmap起第a个字节的数据)
mov [si],al ;将找到的断码放到LEDbuf中
inc si ;LEDbuf地址加1,存放下一个断码
inc ah ;找content中下一个数字的断码
loop redo ;整个redo循环做的事:把content中数字对应的断码放到LEDbuf中,循环最后结果是LEDbuf变成:06h,5bh,4fh,5eh,79h,71h
show: call displayled
jmp show ;在LED上一直显示这6个字符
start endp
code ends
end start
『贰』 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); //延时
}
}
}
(2)六位数码管程序扩展阅读
对于74HC573,形象一点,我们只需要将其理解为一扇大门,只不过这扇大门是单向的,其中11引脚(LE)控制着门的开、关状态,高电平为大门打开,低电平为大门关闭。
D0-D7为输入,Q0-Q7为输出,在LE = 1,即输入高电平时,输入端=输出端,输入是什么,输出也就原封不动的输出;在LE = 0 ,即输入高电平时,大门关闭,实现锁存,不再输出。了解之后,我们按照电路图,来进行编程,代码实现。
在实现数码管的静态显示中,用到了两个锁存器,两个I/O口,P1.6和P1.7,分别是位选和段选。
首先定义了个数码管位选数组,也就是十六进制代码,这便是后来数码管显示数字的核心,接着,用 sbit 定义了位选和段选端口,分别是 P1.6 和 P1.7 ,定义了一个延时函数,其实这一串代码很有意思,开关开关思想,贯穿始终。
首先把位选打开,送入位选数据后,关闭锁存器,实现锁存,进入循环,随之打开段选锁存器,送入段选数据后,再次关闭段选。
接下来,这个延时操作对于实际看到数码管的显示效果特别重要,因为程序在段选后之后,会马上消隐,显示的时间之后几个微秒,这显然不太合理,需要在关闭段选后加上延时,这样一来,才会让每位数码管亮度保持均匀。
『叁』 单片机6位数码管计数器程序问题
#include<reg52.H>//STC头文件
#defineucharunsignedchar
#defineuintunsignedint
#definetimewe3
sbitwe=P2^7;
sbit=P2^6;
unsignedlongtemp;
uintjsms=0;
ucharcodean[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
ucharcodewei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
voiddelay(uinta)//1ms延时程序(12MHz10倍于51单片机速度时)
{
uinti;
while(--a!=0)
{
for(i=0;i<600;i++);
}
}
uchardisbuf[6];
voiddisplay()
{ ucharcodewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
staticuchara;
if(a>=6)a=0;
we=1;
P0=0xff;
we=0;
=1;
P0=an[disbuf[a]];
=0;
we=1;
P0=wei[a];
we=0;
a++;
}
/**********************************************/
/*主函数*/
/**********************************************/
voidmain(void)
{
temp=0;
while(1)
{
if(++jsms>=1000){
if(++temp==999999)
temp=0;
}
disbuf[0]=temp/100000;
disbuf[1]=temp%100000/10000;
disbuf[2]=temp%10000/1000;
disbuf[3]=temp%1000/100;
disbuf[4]=temp%100/10;
disbuf[5]=temp%10;
display();
delay(1);
}
}
『肆』 6位数码管动态显示,单片机直接片选,先显示201903,再显示abcdef,再显示123456,用C语言编程
8位数码管动态显示,单片机直接片选,先显示201903,再显示abcdef,再显示123456,用C语言编程 ,重复循环,仿真试试。
#include<reg51.h>
#define uchar unsigned char
// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void delay(uchar z)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<z;j++);
}
void main()
{
uchar k;
while(1)
{
for(k=0;k<50;k++)
{
P0=0xff;
P2=LED7Code[0];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[2];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[1];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[9];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[3];
P0=0x7f;
delay(5);
}
for(k=0;k<50;k++)
{
P0=0xff;
P2=LED7Code[0];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[10];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[11];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[12];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[13];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[14];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[15];
P0=0x7f;
delay(5);
}
for(k=0;k<50;k++)
{
P0=0xff;
P2=LED7Code[0];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[1];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[2];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[3];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[4];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[5];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[6];
P0=0x7f;
delay(5);
}
}
}
『伍』 单片机89c51一个6位LED数码管显示功能 程序,希望能准确点的程序,只显示6位数字就好。
#include <reg51.h>
#include <intrins.h>
void delay(unsigned int i); //函数声名
char DelayCNT;//定义变量
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
//此表为8个数码管位选控制, 共阴数码管 1-8个 -
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制
/************主函数**********************/
main()
{
unsigned int i,LedNumVal=1 ; //变量定义
unsigned int LedOut[10]; //变量定义
DelayCNT=0;
while(1)
{
if(++DelayCNT>=20) //控制数字变化速度
{
DelayCNT=0; //20个扫描周期清零一次
++LedNumVal; //每隔20个扫描周期加一次
}
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];
LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位
LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点
LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[7]=Disp_Tab[LedNumVal%10]; //个位
for( i=0; i<9; i++)
{
P0 = LedOut[i];
P1 = dispbit[i]; //使用查表法进行位选
/* switch(i) //使用switch 语句控制位选
{
case 0:P1 = 0x7F; break;
case 1:P1 = 0xbF; break;
case 2:P1 = 0xdF; break;
case 3:P1 = 0xeF; break;
case 4:P1 = 0xf7; break;
case 5:P1 = 0xfb; break;
case 6:P1 = 0xfd; break;
case 7:P1 = 0xfe; break;
} */
delay(150); //扫描间隔时间 太长会数码管会有闪烁感
}
}
}
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}