按照下面的逻辑时序,就在Q4Q5上产生高电平,其他都是地电平
要理解595的缓存和移动,特别是锁存RCK引脚的作用:
锁存的数据输出后,和LED完全一致:
点亮数码管某一位,其实就是发光二极管
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芯片:
程序如上:
真调用的时候,要输出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;
}
任务1.:数码管静态的显示一个数字
先学会用工具生成数码管数组:工具这里有一个自库生成工具
再选择数码管字库:
打开以后是这样的:
可以选择你需要的,复制就OK
把生成的数组定义好:
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*/
};
先在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初始状态