找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 676|回复: 0
收起左侧

51单片机利用定时器动态扫描8X8LED滚动显示0-9

[复制链接]
ID:597405 发表于 2023-6-17 11:29 | 显示全部楼层 |阅读模式
LED8X8点阵,使用74HC595芯片作为数据输入,以P0口作为阴极循环扫描每一列。采用STC89C52RC单片机,感兴趣的可以复制来玩。
程序如下:
#include "reg52.h"         //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>


typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;


sbit SRCLK=P3^6;//数据输入时钟,上升沿时SER的最高位被移入数据寄存器中
sbit RCLK=P3^5;//移位寄存器,上升沿时数据寄存器里的数据被移到输出端
sbit SER=P3^4;//数据输入
u16 timecount;
u8 cnta,cntb;

u8 code ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//(0111 1111,1011 1111,1101 1111.....)
u8 code digittab[88]={                              //设置0-9的显示数组,也可以根据不同的接法写出不同的结合,本程序采用共阴扫描
                                                               //当输入点为高,则点亮对应的led
0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00, //0
0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00, //1
0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00, //2
0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00, //3
0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00, //4
0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00, //5
0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00, //6
0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00, //7
0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00, //8
0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00, //9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};


void Hc595SendByte(u8 dat)//
{
        u8 a;
        SRCLK=0;
        RCLK=0;                        //SRCLK,RCLK为0,以便产生上升沿
        for(a=0;a<8;a++)
        {
                SER=dat>>7;       //输入的数据高位首先被移入数据寄存器中
                dat<<=1;            //次高位

                SRCLK=1;           // 数据时钟产生上升沿,数据被移入
                _nop_();
                _nop_();
                SRCLK=0;        //   数据时钟产生下降沿,数据寄存器里的数据不变,等待下一个数据(次高位)移入
        }

        RCLK=1;            //移位寄存器上升沿,数据寄存器里的数据被移到输出端
        _nop_();
        _nop_();
        RCLK=0;       // 输出端的数据保持不变
}



void Initi_t0()    //T0定时器的设置3000us中断一次
{
TMOD=0x01;
TH0=(65536-3000)/256;
TL0=(65536-3000)%256;
TR0=1;
ET0=1;
EA=1;
}

void main()
{                       
        Initi_t0();
       
        while(1);
               
}


void t0(void) interrupt 1 using 0
{
TH0=(65536-1000)/256;           //重装,每隔3ms产生一次
TL0=(65536-1000)%256;
P0=0xff;                                                //清除LED数据,也可以在后面写成Hc595SendByte(0x00),但显示数据变暗
Hc595SendByte(digittab[cnta+cntb]);
P0=ledwei[cnta];


cnta++;

if(cnta==8)                    //当cnta=8时,8x8点整显示digittab[]数组中的前8个,及digittab[0]~digittab[7]
{
cnta=0;
}
timecount++;             //为延时,当不满100,LED8X8一直显示digittab[0]~digittab[7]
if(timecount==100)
{
timecount=0;
cntb++;               //初始为0,当cntb+1时,Hc595SendByte(digittab[cnta+cntb])就从digittab[1]~digittab[8]移数,
if(cntb==80)        //当cntb+2时,Hc595SendByte(digittab[cnta+cntb])就从digittab[2]~digittab[9]开始移数.....当cntb+3时,                                                               //Hc595SendByte(digittab[cnta+cntb])就从digittab[3]~digittab[10]移数......一直到digittab[80]~digittab[87]
cntb=0;              // 每次显示digittab[]8位,从整体来看从0-9不断的循环移动
}
}
}



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表