单片机STC89C52学习——14 8x8LED点阵
汇总:00 单片机STC89C52学习
参考教程:普中科技
1 工作原理
1.1 8x8LED点阵
通过动态扫描显示。若为双色LED,只是多并联一个发光二极管
1.2 74HC595芯片
8 位串行输入、串行或并行输出的移位寄存器,具有高阻关断状态,三态。通过74HC595节约IO口。移位时从最高位开始
2 程序:8x8LED点阵——1 显示左上角1个点;2 显示0
2.1 显示左上角1个点
#include "reg51.h"// 52单片机头文件有RCLK,会导致下面重定义
#include "intrins.h"// 因为用到_nop_()
typedef unsigned char u8;
typedef unsigned int u16;
// 需要控制74HC595的3个口
sbit SER = P3^4;// 串行数据输入
sbit RCLK = P3^5;// 存储寄存器时钟输入
sbit SRCLK = P3^6;// 移位寄存器时钟输入
void HC595(u8 dat)// P34的输入
{
u8 a;
SRCLK = 0;
RCLK = 0;
// 先到移位寄存器
for (a = 0; a < 8; a ++)
{
SER = dat >> 7;// 移位7次,传送最高位
dat <<= 1;// 把最高位左移换掉
SRCLK = 1;// 上升沿,芯片手册写的是“大于几十纳秒”
_nop_();// 延时1个机器周期。其实一条指令就有1微秒,所以也可以不延时。只是保险起见
_nop_();
SRCLK = 0;// 拉低回去
}
// 再从移位寄存器输出
RCLK = 1;
_nop_();
_nop_();
RCLK = 0;
}
void main()
{
HC595(0x80);// D7高电平其余低电平,P34输入0x80,1000 0000
P0 = 0x7f;// P07低电平其余高电平,P0输入0x7f,0111 1111
while (1);
}
效果:并未显示...
2.2 显示0
#include "reg51.h"// 52单片机头文件有RCLK,会导致下面重定义
#include "intrins.h"// 因为用到_nop_()
typedef unsigned char u8;
typedef unsigned int u16;
// 需要控制74HC595的3个口
sbit SER = P3^4;// 串行数据输入
sbit RCLK = P3^5;// 存储寄存器时钟输入
sbit SRCLK = P3^6;// 移位寄存器时钟输入
u8 ledduan[] = {0x00, 0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00};// 显示0,每列如何显示
u8 ledwei[] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};// 点亮每一列,0111 1111 0右移
void delay(u16 i)
{
while(i --);
}
void HC595(u8 dat)// P34的输入
{
u8 a;
SRCLK = 0;
RCLK = 0;
// 先到移位寄存器
for (a = 0; a < 8; a ++)
{
SER = dat >> 7;// 移位7次,传送最高位
dat <<= 1;// 把最高位左移换掉
SRCLK = 1;// 上升沿,芯片手册写的是“大于几十纳秒”
_nop_();// 延时1个机器周期。其实一条指令就有1微秒,所以也可以不延时。只是保险起见
_nop_();
SRCLK = 0;// 拉低回去
}
// 再从移位寄存器输出
RCLK = 1;
_nop_();
_nop_();
RCLK = 0;
}
void main()
{
u8 i = 0;
while (1);
{
for (i = 0; i < 8; i ++)
{
P0 = ledwei[i];// 选择哪一列显示
HC595(ledduan[i]);// 列如何显示
delay(100);
HC595(0x00);// 消隐
}
}
}
效果:什么都没有...