第九课:数码管与HC595芯片的使用 数码管的结构:共阴共阳接法 3461AS7.3中 AS=单色 BS=双色 试验箱上使用了两个74HC595芯片级联,形成一个用两字节的数据控制这8位数码管的效果,高8位用于控制段选(数码管显示的字符),低八位控制位选(选择哪一个位置进行显示). 74hc595时序信号: SCK 时钟线 上升沿移位寄存器会把SER上的电平读入, RCK出现上升沿的时候会把移位寄存器上的数据通过Q0-Q7进行输出. 移位寄存器在收到超过8位数据的时候会按顺序吧数据通过Q7’传送给下一个芯片, 试验箱上的引脚定义 SCk=P32 RCK=P35 SER=P34 两个595共用SCK和RCk 第一个的Q7’输出给第二个的SER u8 SMG_POSITION[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; u8 SMG_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*/ }; void hc595_send(u8 dat) { u8 i; for (i = 0; i < 8; i++) { dat <<= 1; HC595_DIO = CY; HC595_SCK = 1; HC595_SCK = 0; } } void smg_disp(u8 cha, u8 index) { hc595_send(SMG_NUM[cha]); // 发送段选 hc595_send(SMG_POSITION[index]); // 发送位选 HC595_RCK = 1; HC595_RCK = 0; if (++index >= 7) index = 0; } void led_40() { u8 cod[8]; cod[0] = 0x0f; // p0-p3 这八位从高到低代表 p7-p0 cod[1] = P0; // P0^1 高电平 cod[2] = P1; // P1^1 高电平 cod[3] = P2; // P2^1 高电平 cod[4] = P3; // P3^1 高电平 LED40_SendData(cod, 5); } void SMG_PC() { SEG7_ShowString("1234567abc"); } void smg_display() { u8 displayer_buff[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}, i; for (i = 0; i < sizeof(displayer_buff) / sizeof(displayer_buff[0]); i++) { smg_disp(SMG_NUM[displayer_buff], SMG_POSITION); } // printf("smg_disp! \r\n"); smg_disp(0, 0); SMG_PC(); led_40(); }
|