YangHY 发表于 2025-12-25 20:52:14

利用595芯片,向数码管输出:

void Init_595(void)
{
        HC595_SER = 0;
        HC595_RCK = 0;
        HC595_SCK = 0;       
}


void Send_595( u8 dat )
{
        u8 i;
       
        for( i=0;i<8;i++ )
        {
                dat <<= 1;                                //DAT = (DAT<<1);        最高位移入CY
                HC595_SER = CY;                  //先把数据写到引脚上
                HC595_SCK = 1;                        //输出上升沿的时钟信号
                HC595_SCK = 0;          //这样就传出了1位,循环8次,8位就传完!
        }
}

YangHY 发表于 2025-12-25 21:02:52

接着把锁存的数据输出出去

void Display_Seg(u8 HC595_1,u8 HC595_2)   //第一个595是数码管段码输出,高电平点亮,第二个595是数码管位码输出,低电平点亮
{
        Send_595(HC595_1);                        //数码管段码输出高电平点亮
        Send_595(HC595_2);                        //数码管位码      低电平点亮
       
        HC595_RCK = 1;                                //数据输出       
        HC595_RCK = 0;
}

YangHY 发表于 2025-12-25 21:10:20

有个问题,我们周期性调度函数,不能带参数!返回值也是空

void Seg_Task(void)
{
        //Display_Seg(SEG_NUM,~T_NUM); //在第一位显示0
}

暂时先这样处理..............

YangHY 发表于 2025-12-25 21:12:05

记得要在io.h 里声明:

YangHY 发表于 2025-12-25 21:13:40

这样在主函数就可以直接调用:

#include "config.h"
#include "task.h"
#include "io.h"


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";


void main(void)
{
        Sys_init();                                                                                //系统初始化
        usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
        Timer0_Init();                                                                        //定时器初始化
        Init_595();                                                                                //595端口电平初始化
    EA = 1;                                                                                        //IE |= 0X80;
       
        P40 = 0;
       
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
       
        while(1)
        {
               
      if (bUsbOutReady)                                                        //如果接收到了数据
      {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                       
            usb_OUT_done();                                                        //
      }
                Task_Pro_Handler_Callback();                                //执行功能函数

        }
}



void Timer0_Isr(void) interrupt 1                //1MS执行一次
{

        Task_Marks_Handler_Callback();                                        //系统计时

}

YangHY 发表于 2025-12-25 21:17:20

编译连接,下载后看能否显示静态的0:

YangHY 发表于 2025-12-25 21:18:56

数码管有输出,但是个乱码:


看看是哪里有问题:

YangHY 发表于 2025-12-25 21:20:18

发现之前的任务都没有屏蔽掉

YangHY 发表于 2025-12-25 21:22:28

这样就正常了:

YangHY 发表于 2025-12-25 21:26:24

当然,位也可以定义个数组:

// T_NUM是位码(要在哪一位显示数字)数组
u8 T_NUM =
{
        0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};

下面看动态显示:

先看看流程图:


页: 23 24 25 26 27 28 29 30 31 32 [33] 34 35 36 37 38 39 40 41 42
查看完整版本: 第一课 序言《AI8051U的特点》