51单片机控制16个led灯,要求16个灯依次点亮后依次熄灭

51单片机控制16个led灯,要求16个灯依次点亮后依次熄灭,第1张

两种方法,一种是给驱动16和灯的口每次变化赋和显示值,这种最好理解,32次变化写32行输出然后每个输出后面再加一个延时就可以了。另一种是用位移指令for循环 也要写两个for 一个渐亮的一个渐灭的

以下是16x16的点阵LED电子图文显示屏的源程序采用汇编语言编写(也可采用C语言编写,C程序KeiluVision2 V2.30环境下调试通过。

以下为用汇编语言编写的字符显示控制程序:

; ***************************************

; * *

; * 单个16x16的点阵电子屏字符显示器 *

; * ATA89C52 12MHz晶振*

; * 2004.2.11LRM*

; ***************************************

;显示字用查表法,不占用内存,字符用16x16共阳LED点阵,

;效果:向上滚动显示5个字,再重复循环。

;R1:查表偏址寄存器,B:查表首址,R2:扫描地址(从00~0FH)。

;R3:滚动显示时控制移动速度,单字显示可控制静止显示的时间。

;*************;

;中断入口程序 ;

;*************;

ORG 0000H

LJMPSTART

ORG 0003H

RETI

ORG 000BH

LJMPINTTO

ORG 0013H

ERTI

ORG 001BH

ERTI

ORG 0023H

RETI

ORG 002BH

RETI

;***********;

;初始化程序;

;***********;

;***********;

; 主程序 ;

;***********;

START:MOV20H,#00H ;清零标志,00H为第16行开始扫描标志,01为1帧

;扫描结束标志

MOVA,#0FFH;端口初始化

MOVP1,A

MOVP1,A

MOVP3,A

MOVP0,A

CLRP1.6 ;串行寄存器输入打入输出控制位

MOVTMOD,#01H ;使用T0做16位定时器,行扫描用。

MOVTH0,#0FCH ;1ms初值(12MHz)

MOVTL0,#18H

MOVSCON,#00H ;串口0方式传送显示字节

MOVIE,#82H ;T0中断允许,总中断允许

MOVSP,#70H

MAIN:LCALL DISI ;显示准备,黑屏,1.5s

MOVDPTR,#TAB

LCALL MOVDISP;向上滚动显示一页(8个字)

INCDPH

LCALL MOVDISP;向上滚动显示一页(8个字)

INCDPH

LACLL MOVDISP;向上滚动显示一页(8个字)

AJMPMAIN

;***********************;

; 多字滚动显示程序;

;***********************;

;每次8个字,入口时定义好DPTR值

MOVDISP: MOV B,#00H ;向上移动显示,查表偏值暂存(从00开始)

DISLOOP: MOV R3,#07H;移动速度

DISMOV: MOV R2,00H ;第0行开始

MOV R1,B

SETB TR0 ;开扫描(每次一帧)

WAITMOV: JBC 01H,DISMOV1 ;标志为1扫描一帧结束(16ms为1帧,每行1ms)

AJMP WAITMOV

DISMOV1: DJNZ R3,DISMOV;1帧重复显示(控制移动速度)

INC B;显示字的下一行(每行2字节)

INC B

MOV A,R1 ;R1为0,8个字显示完

JZMOVOUT

AJMP DISLOOP

MOVOUT:RET;移动先是结束

;****************;

; 单字显示程序 ;

;****************;

;显示表中某个字;

;****************;

DIS1: MOV R3,#5AH ;静止显示时间控制(16ms*#=1.6s)

DIS11: MOV R2,#00H ;一帧扫描初始值(行地址从00~0FH)

MOV DPTR,#TAB;取表首址

MOV R1,#00H ;查表偏址(显示第一个字)

SETB TR0 ;开扫描(每次一帧)

WAIT11: JBC 01H,DIS111 ;为1,扫描一帧结束

AJMP WAIT11

DIS111: DJNZ R3,DIS11

RET

;************;

; 扫描程序 ;

;************;

;1ms刷新一次,每行显示1s

INTT0: PUSH ACC

MOVTH0,#0FCH ;1ms初值重装

MOVTL0,#18H

JBC00H,GOEND ;16行扫描标志为1,结束

INCR1;取行右边字节偏址

MOVA,R1

MOVC A,@A+DPTR ;查表

MOVSBUF,A;串口0方式发送

WAIT: JBCTI,GO ;等待发送完毕

AJMP WAIT1

GO: DECR1;取行左边字节偏址

MOVA,R1

MOVC A,@A+DPTR

MOVSBUF,A

WAIT1: JBCT1,GO1

AJMP WAIT1

GO1: SETB P1.7 ;关行显示,准备刷新

NOP ;串口寄存器数据稳定

SETB P1.6 ;产生上升沿,行数据打入输出端

NOP

NOP

CLRP1.6 ;恢复低电平

MOVA,R2 ;修改显示行地址

ORLA,#0F0H;修改显示行地址

MOVR2,A ;修改显示行地址

MOVA,P1 ;修改显示行地址

ORLA,#0FH ;修改显示行地址

ANLA,R2 ;修改显示行地址

MOVP1,A ;修改完成

CLRP1.7 ;开行显示

INCR2 ;下一行扫描地址值

INCR1

INCR1 ;下一行数据地址

MOVA,R2

ANLA,#0FH

JNZGO2

SETB 00H;R2为01H,现为末行扫描,置标志

GO2:POPACC

RETI

GOEND: CLRTR0;一帧扫描完毕,关扫描

SETB 01H;一帧扫描完毕,置结束标志

POPACC

RETI ;退出

;***************;

; 扫描文字表 ;

;***************;

TAB:DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,00FFH,0FFH,0FFH ;黑屏

DB

0F9H,0BFH,0C7H,0AFH,0F7H,0B7H,0F7H,0B7H,0F7H,0BFH,000H,001H,0F7H,0BFH,0F7H,0B7H ;我

DB

0F1H,0D7H,0C7H,0CFH,037H,0DFH,0F7H,0AFH,0F6H,06DH,0F7H,0F5H,0D7H,0F9H,0EFH,0FDH ;

DB

0FFH,007H,0C0H,06FH,0EDH,0EFH,0F6H,0DFH,0C0H,001H,0DDH,0FDH,0BDH,0FFH,0C0H,003H ;爱

DB

0FBH,0FFH,0F8H,00FH,0F3H,0DFH,0F4H,0BFH,0EFH,03FH,09CH,0CFH,073H,0F1H,0CFH,0FBH ;

DB

0F7H,0DFH,0F9H,0CFH,0FBH,0BFH,0C0H,007H,0DEH,0F7H,0C0H,007H,0DEH,0F7H,0DEH,0F7H ;单

DB

0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH

DB

0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;片

DB

0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0FFH

DB

0EFH,0FFH,0EFH,007H,0EFH,077H,001H,077H,0EFH,077H,0EFH,077H,0C7H,077H,0CBH,077H ;机

DB

0ABH,077H,0AFH,077H,06EH,0F7H,0EEH,0F5H,0EDH,0F5H,0EDH,0F5H,0EBH,0F9H,0EFH,0FFH ;

DB

0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;黑屏

DB

0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;

END

#include <reg52.h>

void time(unsigned int ucMs)//函数声明

void main(void)

{

unsigned char ucTimes

#define DELAY_TIME 450

while(1)

{

P1=0xff

P0=0xff

for(ucTimes=0ucTimes<8ucTimes++){

P0 = P0 - (0x01<<ucTimes)time(DELAY_TIME)}

for(ucTimes=0ucTimes<8ucTimes++){

P1 = P1 - (0x01<<ucTimes)time(DELAY_TIME)}

P1=0xff

P0=0xff

for(ucTimes=0ucTimes<8ucTimes++){

P1 = P1 - (0x80>>ucTimes)time(DELAY_TIME)}

for(ucTimes=0ucTimes<8ucTimes++){

P0 = P0 - (0x80>>ucTimes)time(DELAY_TIME)}

}}

void time(unsigned int ucMs)

{

#define DELAYTIMES 239

unsigned char ucCounter

while(ucMs!=0) {

for(ucCounter=0ucCounter<DELAYTIMESucCounter++) { }

ucMs--

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11685460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存