找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1752|回复: 9
收起左侧

DS1302模块数据用数码管显示时,数码管发生闪烁数据时而正常时而统一变为9

[复制链接]
ID:1110071 发表于 2024-1-26 22:09 | 显示全部楼层 |阅读模式
所有代码,原理图在附件,希望大佬不嫌麻烦指点一下

部分代码如下
//头文件声明区域
#include <STC15F2K60S2.H>
#include <Key.h>
#include <Seg.h>
#include <channel.h>
#include <ds1302.h>

//变量声明区
unsigned int Key_Val,Key_Down,Key_Old,Key_Up;//按键扫描专用变量
unsigned int Key_Slow_Down;//按键减速专用变量,小 10ms
unsigned int Seg_Slow_Down;//数码管减速专用变量,大 500ms
unsigned int LED_Slow_Down;
unsigned char Seg_Buf[8] = {10,10,10,10,10,10,10,10};//数码管显示数据存放数组
unsigned char Seg_Pos;//数码管扫描专用变量
unsigned char ucrtc[3] = {0x00,0x00,0x00};
sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;
/* 键盘处理函数 */        
void Key_Proc()
{
        if(Key_Slow_Down) return;
        Key_Slow_Down = 1;//键盘减速程序

  Key_Val = Key_read();//实时读取键码值
  Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
  //Key_Up = ~Key_Val & (Key_Old ^ Key_Val);//捕捉按键上降沿
  Key_Old = Key_Val;//辅助扫描变量        
}

/* 信息处理函数 */
void Seg_Proc()
{
        if(Seg_Slow_Down) return;
        Seg_Slow_Down = 1;//数码管减速程序
        //信息读取区域
        Read_rtc(ucrtc);
        //数据处理区域
        Seg_Buf[0]=ucrtc[0]/16;
        Seg_Buf[1]=ucrtc[0]%16;
        Seg_Buf[2]=10;
        Seg_Buf[3]=ucrtc[1]/16;
        Seg_Buf[4]=ucrtc[1]%16;
        Seg_Buf[5]=10;
        Seg_Buf[6]=ucrtc[2]/16;
        Seg_Buf[7]=ucrtc[2]%16;
}

/* 其他显示函数 */
void Led_Proc()
{
        
}

/* 定时器0中断初始化函数 */
void Timer0_Init(void)                //1毫秒@11.0592MHz
{
        TMOD &= 0xF0;                        //设置定时器模式
        TMOD |= 0x01;                        //设置定时器模式
        TL0 = 0x66;                                //设置定时初始值
        TH0 = 0xFC;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        
        ET0 = 1; //定时器0中断允许开关
        EA = 1 ; //总中断允许开关
        
}

/* 定时器0中断服务函数 */
void Timer0Server() interrupt 1
{  
        TL0 = 0x66;                //设置定时初始值
        TH0 = 0xFC;                //设置定时初始值
        if(++Key_Slow_Down == 10) Key_Slow_Down = 0;//键盘减速专用
        if(++Seg_Slow_Down == 100) Seg_Slow_Down = 0;//数码管减速专用
        if(++Seg_Pos == 8) Seg_Pos = 0;//数码管显示专用
}

//主函数
void main()
{
        Timer0_Init();
        Set_rtc(ucrtc);
        while (1)
        {
                Key_Proc();
                Seg_Proc();
                Led_Proc();
        }
}

数码管驱动部分
#include <Seg.h>

unsigned char Dula[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
unsigned char Wela[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void Seg_disp(unsigned char wela,dula)
{
        HC753(7);
        P0=0XFF;//消影
        HC753(6);
        P0=Wela[wela];
        HC753(7);
        P0=Dula[dula];

}

channle部分
#include <STC15F2K60S2.H>

sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;

void HC753(unsigned char channel)//三八译码器方式选择
{
        switch(channel)
        {
                case 0:LSC=0;LSB=0;LSA=0;break;
                    case 4:LSC=1;LSB=0;LSA=0;break;
                                case 5:LSC=1;LSB=0;LSA=1;break;
                                case 6:LSC=1;LSB=1;LSA=0;break;
                                case 7:LSC=1;LSB=1;LSA=1;break;
        }
}

2.zip

47.72 KB, 下载次数: 2

CT107D单片机竞赛板V20原理图.pdf

96.94 KB, 下载次数: 7

回复

使用道具 举报

ID:332444 发表于 2024-1-27 10:15 | 显示全部楼层
电路图数码管使用的是2片573没看到使用138?
回复

使用道具 举报

ID:332444 发表于 2024-1-27 12:59 | 显示全部楼层
数码管使用2片573的话就很简单了,和直接使用IO组一样赋值即可,无需像使用138那样麻烦,直接控制1 2 4 8 16...即可控制数码管的位。
回复

使用道具 举报

ID:1110071 发表于 2024-1-27 17:14 | 显示全部楼层
xianfajushi 发表于 2024-1-27 12:59
数码管使用2片573的话就很简单了,和直接使用IO组一样赋值即可,无需像使用138那样麻烦,直接控制1 2 4 8 1 ...

使用了138
LED,数码管段选,位选都是通过138进行控制的,分时复用
原理图中的U24是138
回复

使用道具 举报

ID:1110071 发表于 2024-1-27 17:15 | 显示全部楼层
xianfajushi 发表于 2024-1-27 10:15
电路图数码管使用的是2片573没看到使用138?

138来控制573
回复

使用道具 举报

ID:332444 发表于 2024-1-27 22:22 | 显示全部楼层

工程压缩包包含仿真图?
回复

使用道具 举报

ID:332444 发表于 2024-1-27 22:27 | 显示全部楼层

Seg_Pos 在哪调用?
回复

使用道具 举报

ID:213173 发表于 2024-1-28 08:00 | 显示全部楼层
316396226 发表于 2024-1-27 17:14
使用了138
LED,数码管段选,位选都是通过138进行控制的,分时复用
原理图中的U24是138

P0分时复用的外围电路74HC573传过数据后要随手关门。特别是段码、位码选通都要经过74HC138、74HC02控制,逻辑关系稍显复杂,一步错就步步错。
void Seg_disp(unsigned char wela,dula)
{        
        P0=0xff;       HC753(7); HC753(0);//段消影
        P0=Wela[wela]; HC753(6); HC753(0);//传位码
        P0=Dula[dula]; HC753(7); HC753(0);//传段码
}
回复

使用道具 举报

ID:332444 发表于 2024-1-28 09:31 | 显示全部楼层
数码管动态驱动是最基础的:延时》消隐》送段值》送位值。
回复

使用道具 举报

ID:332444 发表于 2024-1-28 11:33 | 显示全部楼层
或非门00=1余皆0电路中WR接哪里?573使能1为开。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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