❶ 汇编语言 编写 程序 LED 灯显示
开关控制指示灯显示
MY8255_A EQU 0A860H;8255A口地址
MY8255_B EQU 0A861H;8255B口地址
MY8255_C EQU 0A862H;8255C口地址
MY8255_MODE EQU 0A863H;8255控制口地址
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,MY8255_MODE
MOV AL,82H
OUT DX,AL ;将控制字82H写入8255控制口,A口方式0输出,B口方式0输入, C口未用到。
A1: MOV DX,MY8255_B
IN AL,DX ;读8255 B口内容
MOV DX,MY8255_A
OUT DX,AL ; 将前面读到的B口内容送到A口,即A口内容=B口内容
CALL BREAK ;调用子程序BREAK
JMP A1;跳转到A1
BREAK PROC NEAR ;BREAK子程序
MOV AH,1
INT 16H
JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符
MOV AX,4C00H
INT 21H;返回DOS
RETURN:RET
BREAK ENDP
CODE ENDS
END START
;流水灯显示
MY8255_A EQU 0b860H;8255A口地址
MY8255_B EQU 0b861H;8255B口地址
MY8255_C EQU 0b862H;8255C口地址
MY8255_MODE EQU 0b863H;8255控制口地址
DATA SEGMENT
LA DB ?;留出1个字节
LB DB ?;留出1个字节
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE
MOV AL,80H
OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0输出,C口未用到。
MOV DX,MY8255_A
MOV AL,7FH
OUT DX,AL ;将7FH送入A口
MOV LA,AL ;将7FH送入LA存储单元
MOV DX,MY8255_B
MOV AL,0FEH
OUT DX,AL ;将FEH送入B口
MOV LB,AL ;将FEH送入LB存储单元
CALL DALLY
A1: MOV AL,LA
ROR AL,1 ;LA内容循环右移1次
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL ;将循环右移后的LA内容送A口,其目的是让A口连接的LED灯依次向右循环点亮
MOV AL,LB
ROL AL,1 ;LB内容循环左移1次
MOV LB,AL
MOV DX,MY8255_B
OUT DX,AL ;将循环左移后的LB内容送B口,其目的是让B口连接的LED灯依次向左循环点亮
CALL DALLY ;延时,让一个LED灯发光稳定之后再点亮另一个
CALL BREAK ;调用BREAK子程序,看是否有键按下
JMP A1 ;跳转到A1
DALLY: MOV CX,3FFH ;延时子程序
D1: MOV AX,0FFFFH
D2: DEC AX
JNZ D2
LOOP D1
RET
BREAK PROC NEAR ;是否有键按下
MOV AH,06H
MOV DL,0FFH
INT 21H
JE RETURN ;若无,则转RETURN
MOV AX,4C00H
INT 21H ;返回DOS
RETURN:RET
BREAK ENDP
CODE ENDS
END START
❷ 单片机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--);
}
❸ 应怎样编写LED数码管显示程序
首先你的仔细看看电路图,看一下数码管是怎么接的,接的是哪一个管脚,从而确定出位选和段选。所谓段选指的是数码管显示的内容,位选指的是哪几个数码管显示。总之你一定要学会看懂电路图。下面我给你一个例子啊,是根据我的电路板写的。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit la = P2^6;//段选决定显示什么内容
sbit wela = P2^7;//位选决定显示哪几个数码管
sbit d1 = P1^0;//流水灯
uchar num;
//段码表
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71};
void delay(uint z);
void main()
{
wela = 1;
P0 = 0xc0;
wela = 0;
while(1)
{
//显示0~F
for(num=0; num<16; num++)
{
la = 1;
P0 = table[num];
la = 0;
delay(1000);
}
}
}
//延时函数
void delay(uint z)
{
uint x, y;
for(x=z; x>0; x--)
for(y=110; y>0; y--);
}