找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 445|回复: 2
打印 上一主题 下一主题
收起左侧

51单片机一个8*8点阵数据如何滚动起来 一片595+一组IO

[复制链接]
跳转到指定楼层
楼主
xianfajushi:51单片机一个8*8点阵数据如何滚动起来 一片595+一组IO

[51单片机点阵逐行点亮595+IO组]2022-2-1

#include "REG52.h"
sbit ds=P1^0; // 数据线  595的14脚
sbit shcp=P1^1; // 数据输入时钟线  595的11脚
sbit shcp=P1^2; // 输出存储器锁存时钟线  595的12脚
sbit mr=P1^3;// 数据清零

void QuDong595(unsigned char sj)
{
        unsigned char aa=8;
        mr=0;mr=1;
        while(aa--)
        {
                ds=sj>>7;
                sj<<=1;// 十六进制数据发送
                shcp=1;// 上升沿发生移位  上升沿时数据寄存器的数据锁存。
                shcp=0;
        }
        stcp=0;
        stcp=1;// 上升沿将数据送到输出锁存器
        stcp=0;
}
void main()
{
        unsigned char Xd=0,ss=1,cs=0,d=0,y=0;
        unsigned int ys=0;
        while(1)
        {
                QuDong595(0x00+d);
                P0=ss;
                while(++Xd);
                if(++y==0)
                {
                        if((ss*=2)>128)ss=1;
                        ++d;
                }
        }
}
======================================

逐行点亮595 IO组.png (10.17 KB, 下载次数: 39)

逐行点亮595 IO组.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:997051 发表于 2022-2-5 19:57 | 只看该作者
xianfajushi:

精准到0.1秒的单片机秒表

sbit Qitin = P3^0; //启停按键
sbit duan = P2^6; //数码段
sbit wei = P2^7; //数码位
unsigned char code ShuMaGuan[]={0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char code WeiXuanBiao[]={0x00,0xfe,0xfd,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char Js=0; //中断计时
unsigned char Hm=0; //毫秒
unsigned char Mo=0; //秒
void ShuMaXianShi(unsigned char d,unsigned char w)
{
        unsigned char YanShi=255;
        P0=WeiXuanBiao[w];
        wei=1;
        wei=0;
        P0=ShuMaGuan[d];
        duan=1;
        While(YanShi--);
        duan=0;
}
void ZhongDuanSheZhi()
{
        TH0+=0X4c; /*定时器赋初值, 定时50ms触发中断, 自动补偿方式*/
        TL0+=0X00;
        TMOD=0X01;
        TR0=1;
        ET0=1; //开启定时器
        EA=1; //全局中断开关
}
void XianShi()
{
        ShuMaXianShi(Hm,3);
        ShuMaXianShi(Mo%10,2);
        ShuMaXianShi(Mo/10,1);
}
void main()
{
        ZhongDuanSheZhi();
        while(1)
        {
                XianShi()
                if(!QiTin)
                {
                        if(Js>=2)        TR0=!TR0;
                        while(!QiTin)    XianShi();
                }
        }
}
void ZhongDuan() interrupt 1
{
        ++Js;
        if(!(Js%2))
        if(++Hm>=10)
        Hm=0;
        if(Js>=20)
        {
                if(++Mo>=60)Mo=0;
                Js=0;
        }
        TH0+=0X4c;
        TL0+=0X00;
}
==========================================
void main()
{
        ZhongDuanSheZhi();
        {
                XianShi();
                if(!QiTin)
                {
                        //XianShi(/*巧借 8个数码显示消抖*/);
                        YanShi=Js;
                        if(TR0==0){TR0=!TR0;K=1;} //重启中断
                        while(Js==YanShi)XianShi(); //中断消抖
                        if(!k)TR0=!TR0;else k=0; //关闭中断, 消抖后清除标记
                        while(!QiTin)XianShi(/*按下期间显示*/);
                }
        }
}
======================================
另说明代码工程中的中断内的这句YanShi=Js;要删除掉,并修改  if(!k&&++Hm>=10) Hm=0;这句,包内忘记改了。
回复

使用道具 举报

板凳
ID:301191 发表于 2024-1-9 00:46 | 只看该作者
顶一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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