要将第一个点点亮,则 1 脚接高电平 a 脚接低电平,则第一个点就亮了;如果要将第一行点亮,则第 1 脚要接高电平,而(a、b、c、d、e、f、g、h )这些引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第 a 脚接低电平,而(1、2、3、4、5、6、7、8)接高电平,那么第一列就会点亮。
需求:控制LED点阵输出数字0
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
void delay_10us(u16 ten_us){
while(ten_us--);
}
//定义595芯片控制管脚
sbit srclk=P3^6;//移位寄存器
sbit rclk=P3^5;//存储寄存器
sbit ser=P3^4;//串行数据输入口//宏定义P0口
#define LEDDZ_PORT P0//LED点阵取行数据-取模
gled_row[8]={0x00,0x7E,0x81,0x81,0x81,0x81,0x7E,0x00};/*
gled_row[48]={0x00,0x00,0x00,0x00,0x7E,0x10,0x10,0x10,0x7E,0x00,0x7E,0x02,0x02,0x02,0x00,0x7E,
0x02,0x02,0x02,0x00,0x7E,0x52,0x52,0x52,0x00,0x3C,0x42,0x42,0x42,0x3C,0x00,0x18,
0x24,0x12,0x24,0x18,0x00,0x00,0x00,0x00}; //输出的是HELLO❤
*/
//LED点阵取列-对P0口赋值
gled_col[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//封装函数往595中写数据
void hc595_write_data(u8 data1){
u8 i=0;
for(i=0;i<8;i++){
ser=data1>>7;//优先移最高位
data1<<=1;//次高位移到最高位
srclk=0;
delay_10us(1);
srclk=1;
delay_10us(1);
}
rclk=0;
delay_10us(1);
rclk=1;
}
void main(){
u8 i=0;
while(1){
for(i=0;i<8;i++){
LEDDZ_PORT=gled_col[i]; //P0控制点阵列
hc595_write_data(gled_row[i]);//74HC595控制点阵行
delay_10us(100);//等待显示稳定
hc595_write_data(0x00);//消隐操作
}
}
}
/* 此段代码实现的是动态输出HELLO❤ */
void main(){
u8 i=0;
u8 offset=0;
u8 count=0;
while(1){
for(i=0;i<8;i++){
LEDDZ_PORT=gled_col[i];
hc595_write_data(gled_row[i+offset]);
delay_10us(100);
hc595_write_data(0x00);
}
count++;
if(count>10){
count=0;
offset++;
if(offset>40){
offset=0;
}
}
}
}