8*8点阵原理图:
上方的8个位置是由P0口控制,左侧的ROW是由75HC95芯片控制;
14口是数据输入端,每次只能输入一位,当11引脚为上升沿时将SER中的数据送入内部移位寄存器,当把八位数据送入内部移位寄存器中,可以令RCLK为上升沿,将八位数据从移位寄存器送入锁存器中。由这个芯片和P0口来进行动态扫描显示图形;
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
char code led_mod[]={0x0C,0x12,0x22,0x44,0x22,0x12,0x0C,0x00}; //P0口段选值;
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //从文字取模软件中取出的,每一列锁存器的值;
void delay(u16 i)
{
while(i--);
}
void Hc595SendByte(char dat)//发送八位数据; 只能是char类型具体见博客下面
{
int a;
SRCLK=0;
RCLK=0;
for(a=0;a<8;a++) //取出数据的八位,高位先传送,低位后传送
{
SER=dat<<7; //取最高位
dat/=2; //舍去最高位,此高位变为最高位
SRCLK=1; //当SRCLK为上升沿时,移位寄存器向下移动一位,并存入一位新数据
_nop_(); //延时两个机器周期,保证数据移位成功
_nop_();
SRCLK=0; //为下一次的上升沿做准备;
}
RCLK=1; //上升沿启动,移位寄存器的值将会被锁存到锁存器里,
_nop_(); //延时两个机器周期,保证数据传送成功
_nop_();
RCLK=0; //为下一次上升沿做准备
}
void main()
{
while(1)
{
int i;
for(i=0;i<8;i++) //实现八列动态扫描的过程
{
P0=ledwei[i]; //每次只实现一列的灯显示,只有一个引脚为0,其余的引脚都为1,
Hc595SendByte(led_mod[i]); //
delay(100); //延时,便于肉眼观察到现象;
Hc595SendByte(0x00); // 要进行消隐,因为距离下一个循环时间很短,如果不改变锁存器的话,这一次的锁存器的值会体现在下一个循环中,造成视觉影响;
_nop_(); //或者将发送数据写道PO取值之前,这样就不会造成视觉误差;
_nop_();
}
}
}
关于int类型和char类型的说明:
int类型是一个字节的存储单元,为十六数据,占二个字节,赋值0xff后,里面存储的就是0x00ff;
char类型占一个字节,赋值过0xff后里面存储的便是0xff,和int不同,int如果只赋值八个位,则前八位为零