标题: 51单片机一个8*8点阵数据如何滚动起来 一片595+一组IO [打印本页]

作者: 无名氏1957    时间: 2022-2-3 07:12
标题: 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, 下载次数: 93)

逐行点亮595 IO组.png

作者: 无名氏1957    时间: 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;这句,包内忘记改了。
作者: 人工置顶员    时间: 2024-1-9 00:46
顶一下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1