YangHY 发表于 2025-12-24 20:46:22

按照下面的逻辑时序,就在Q4Q5上产生高电平,其他都是地电平

YangHY 发表于 2025-12-24 20:53:57

要理解595的缓存和移动,特别是锁存RCK引脚的作用:

YangHY 发表于 2025-12-24 20:57:35

锁存的数据输出后,和LED完全一致:

YangHY 发表于 2025-12-24 21:00:22

点亮数码管某一位,其实就是发光二极管

YangHY 发表于 2025-12-24 21:04:23

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位就传完!
      }
}单片机传8位数据给595芯片:

程序如上:

YangHY 发表于 2025-12-24 21:08:33

真调用的时候,要输出2次:

第一个595是数码管段码输出,高电平点亮,第二个595是数码管位码输出,低电平点亮



<div class="blockcode"><blockquote>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-24 21:14:51

任务1.:数码管静态的显示一个数字

先学会用工具生成数码管数组:工具这里有一个自库生成工具

再选择数码管字库:

YangHY 发表于 2025-12-24 21:16:06

打开以后是这样的:

可以选择你需要的,复制就OK

YangHY 发表于 2025-12-24 21:22:42

把生成的数组定义好:

u8 SEG_NUM[]=
{
    0x3F,       /*'0', 0*/
    0x06,       /*'1', 1*/
    0x5B,       /*'2', 2*/
    0x4F,       /*'3', 3*/
    0x66,       /*'4', 4*/
    0x6D,       /*'5', 5*/
    0x7D,       /*'6', 6*/
    0x07,       /*'7', 7*/
    0x7F,       /*'8', 8*/
    0x6F,       /*'9', 9*/
    0x77,       /*'A', 10*/
    0x7C,       /*'B', 11*/
    0x39,       /*'C', 12*/
    0x5E,       /*'D', 13*/
    0x79,       /*'E', 14*/
    0x71,       /*'F', 15*/
    0x40,       /*'-', 16*/
    0x00,       /*' ', 17*/
    0x80,       /*'.', 18*/
};

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

先在io.h里说明引脚定义,以后修改就很方便:

//#define 引脚名称PXX的端口

#define HC595_SER         P34
#define HC595_RCK         P35
#define HC595_SCK         P32

再搞清楚位码和初始状态:

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


u8 State1 = 0;                                        //LED1初始状态
u8 State2 = 0;                                        //LED2初始状态
u8 State3 = 0;                                        //LED3初始状态
页: 22 23 24 25 26 27 28 29 30 31 [32] 33 34 35 36 37 38 39 40 41
查看完整版本: 第一课 序言《AI8051U的特点》