5.1 单片机-16x16LED点阵屏
Posted DS小龙哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.1 单片机-16x16LED点阵屏相关的知识,希望对你有一定的参考价值。
5.1 16x16点阵滚动显示
5.1.1 点阵原理图
图5-1-1 点阵原理图
图5-1-2
5.1.2 单个汉字纵向移动示例
图5-1-3 纵向滚动取软件模配置方式(LCD2002)
图5-1-4 纵向滚动取模软件配置方式(字模提取V2.1)
示例代码:
#include <reg51.h> //定义了一些51单片机通用的寄存器地址
/*
第一片595芯片(U4) 控制行的上8个IO口(高电平有效)
第二片595芯片(U5) 控制行的下8个IO口(高电平有效)
第三片595芯片(U16) 控制列的左8个IO口(低电平有效)
第四片595芯片(U17) 控制列的右8个IO口(低电平有效)
*/
code u8 font[]=
0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x03,0xE0,0x7B,0xEF,0x7B,
0xEF,0x7B,0xEF,0x7B,0xEF,0x7B,0xEF,0x03,0xE0,0x7B,0xEF,0x7F,0xFF,
0x7F,0xFF,0x7F,0xFF,0x7F,0xFF
;/*"中",16X16 横向取模 从左到右 低位在前*/
//12MHZ 工作在12T模式下 执行i++语句花费的时间是12us
#define TIME 100
int main(void)
u16 row; //行
u8 i,j,n=0;
u8 *p;
p=font; //将数组的地址赋值给p
while(1)
for(j=0;j<TIME;j++)
p=font+n; //将数组的地址赋值给p
for(i=0;i<16;i++)
row=0x0000; //行的初始值,全部关闭
row|=1<<i; //单独点亮每一行
if(p-font>=32) //判断指针是否溢出
HC595_WriteByte(0xFF); //控制列的右8个IO口(低电平有效)
HC595_WriteByte(0xFF); //控制列的左8个IO口(低电平有效)
else
HC595_WriteByte(*(p+1)); //控制列的右8个IO口(低电平有效)
HC595_WriteByte(*p);//控制列的左8个IO口(低电平有效)
p+=2; //显示下一行
HC595_WriteByte(row>>8);//控制行的下8个IO口(高电平有效)
HC595_WriteByte(row); //控制行的上8个IO口(高电平有效)
HC595_DatOut(); //将缓冲区 的数据输出到物理IO口上
n+=2;
if(n>=32)n=0;
//定义74HC595的IO口
sbit HC595_DAT=P3^4; //数据输出(对于单片机来说)
sbit HC595_RCK=P3^5; //控制存储器(缓存区)的输出时钟
sbit HC595_SCK=P3^6; //控制数据输出的时钟(上升沿)
/*
函数功能: 向74H595写入一个字节
函数形参: 写入的字节数据
函数说明: 先发高位
*/
void HC595_WriteByte(u8 byte)
u8 i;
for(i=0;i<8;i++)
if(byte&0x80)HC595_DAT=1;
else HC595_DAT=0;
byte<<=1;
//产生上升沿
HC595_SCK=0;
HC595_SCK=1;
/*
函数功能: 输出使能--控制595将存储器里的数据输出到总线(8)
*/
void HC595_DatOut(void)
//上升沿将存储器的数据输出到总线
//下降沿保持输出状态
HC595_RCK=0;
HC595_RCK=1;
HC595_RCK=0;
5.1.3 多个汉字纵向移动示例
取模软件的配置方法同上(5.1.2)。
示例代码:
#include <reg51.h> //定义了一些51单片机通用的寄存器地址
#include "delay.h"
#include "type.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "hc595.h"
/*
第一片595芯片(U4) 控制行的上8个IO口(高电平有效)
第二片595芯片(U5) 控制行的下8个IO口(高电平有效)
第三片595芯片(U16) 控制列的左8个IO口(低电平有效)
第四片595芯片(U17) 控制列的右8个IO口(低电平有效)
*/
code u8 font[]=
/*-- 文字: 蓝 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x04,0x10,0x04,0xFF,0x7F,0x10,0x04,0x20,0x01,0x24,0x01,0x24,0x3F,0x24,0x05,
0xA4,0x08,0x00,0x00,0xFC,0x1F,0x24,0x12,0x24,0x12,0x24,0x12,0xFF,0x7F,0x00,0x00,
/*-- 文字: 桥 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x04,0x08,0x04,0x1E,0xC4,0x03,0x04,0x02,0x1F,0x02,0xE4,0x7F,0x04,0x05,0x8E,0x08,
0x56,0x10,0xA5,0x68,0x85,0x08,0x84,0x08,0x84,0x08,0x44,0x08,0x44,0x08,0x24,0x08,
/*-- 文字: 杯 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x00,0x08,0x00,0xC8,0x7F,0x08,0x04,0x3F,0x04,0x08,0x02,0x1C,0x02,0x2C,0x0B,
0x8A,0x12,0x4A,0x22,0x29,0x22,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,
/*-- 文字: 比 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x01,0x04,0x01,0x04,0x01,0x04,0x21,0x04,0x11,0x04,0x09,0x7C,0x05,0x04,0x03,
0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x41,0x64,0x41,0x1C,0x41,0x04,0x7E,0x00,0x00,
/*-- 文字: 赛 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x80,0x00,0xFE,0x7F,0x22,0x42,0xF9,0x2F,0x20,0x02,0xFC,0x1F,0x20,0x02,0xFF,0x7F,
0x10,0x04,0xF8,0x0F,0x94,0x14,0x93,0x64,0x90,0x04,0x50,0x05,0x20,0x02,0x18,0x04,
;/*"中",16X16 横向取模 从左到右 低位在前*/
//12MHZ 工作在12T模式下 执行i++语句花费的时间是12us
#define TIME 10
int main(void)
u16 row; //行
u8 i,j,n=0;
u8 *p;
p=font; //将数组的地址赋值给p
while(1)
for(j=0;j<TIME;j++)
p=font+n; //将数组的地址赋值给p
for(i=0;i<16;i++)
row=0x0000; //行的初始值,全部关闭
row|=1<<i; //单独点亮每一行
if(p-font>=32*5) //判断指针是否溢出
HC595_WriteByte(0xFF); //控制列的右8个IO口(低电平有效)
HC595_WriteByte(0xFF); //控制列的左8个IO口(低电平有效)
else
HC595_WriteByte(~(*(p+1))); //控制列的右8个IO口(低电平有效)
HC595_WriteByte(~(*p));//控制列的左8个IO口(低电平有效)
p+=2; //显示下一行
HC595_WriteByte(row>>8);//控制行的下8个IO口(高电平有效)
HC595_WriteByte(row); //控制行的上8个IO口(高电平有效)
HC595_DatOut(); //将缓冲区 的数据输出到物理IO口上
n+=2;
if(n>=32*5)n=0;
//定义74HC595的IO口
sbit HC595_DAT=P3^4; //数据输出(对于单片机来说)
sbit HC595_RCK=P3^5; //控制存储器(缓存区)的输出时钟
sbit HC595_SCK=P3^6; //控制数据输出的时钟(上升沿)
/*
函数功能: 向74H595写入一个字节
函数形参: 写入的字节数据
函数说明: 先发高位
*/
void HC595_WriteByte(u8 byte)
u8 i;
for(i=0;i<8;i++)
if(byte&0x80)HC595_DAT=1;
else HC595_DAT=0;
byte<<=1;
//产生上升沿
HC595_SCK=0;
HC595_SCK=1;
/*
函数功能: 输出使能--控制595将存储器里的数据输出到总线(8)
*/
void HC595_DatOut(void)
//上升沿将存储器的数据输出到总线
//下降沿保持输出状态
HC595_RCK=0;
HC595_RCK=1;
HC595_RCK=0;
5.1.4 多个汉字横向移动示例
图5-1-5 点阵横向滚动字模软件配置方式
示例代码:
#include <reg51.h> //定义了一些51单片机通用的寄存器地址
#include "delay.h"
#include "type.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "hc595.h"
/*
第一片595芯片(U4) 控制行的上8个IO口(高电平有效)
第二片595芯片(U5) 控制行的下8个IO口(高电平有效)
第三片595芯片(U16) 控制列的左8个IO口(低电平有效)
第四片595芯片(U17) 控制列的右8个IO口(低电平有效)
*/
code u8 font[]=
0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x08,0x21,0xF0,0x30,0x00,0x00,/*"2",0*/
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",1*/
0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x08,0x21,0xF0,0x30,0x00,0x00,/*"2",2*/
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",3*/
0x00,0x04,0x20,0x04,0x18,0x04,0xC7,0x07,0x44,0x04,0x44,0x04,0x44,0x04,0x44,0x04,0xFC,0xFF,0x44,0x04,0x44,0x04,0x44,0x04,0x44,0x04,0x04,0x04,0x00,0x04,0x00,0x00,/*"年",4*/
0x00,0x00,0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,/*"1",5*/
0x00,0x80,0x00,0x40,0x00,0x30,0xFE,0x0F,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x42,0x22,0x82,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,/*"月",6*/
0x00,0x00,0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,/*"1",7*/
0x00,0x00,0x18,0x00,0x08,0x00,0x08,0x3E,0x88,0x01,0x68,0x00,0x18,0x00,0x00,0x00,/*"7",8*/
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"日",9*/
;
//12MHZ 工作在12T模式下 执行i++语句花费的时间是12us
#define TIME 10
int main(void)
u16 col; //列
u8 i,j;
u8 cnt=0;
u8 *p=font;
while(1)
for(j=0;j<TIME;j++)
p=font+cnt;
for(i=0;i<16;i++)
col=0xFFFF; //列的初始值,全部关闭
col&=~(1<<i); //单独点亮每一列
HC595_WriteByte(col>>8); //控制列的右8个IO口(低电平有效)
HC595_WriteByte(col);//控制列的左8个IO口(低电平有效)
if(p-font>=(32*3)+(16*7))
HC595_WriteByte(0x0000);//控制行的下8个IO口(高电平有效)
HC595_WriteByte(0x0000); //控制行的上8个IO口(高电平有效)
else
HC595_WriteByte(*(p+1));//控制行的下8个IO口(高电平有效)
HC595_WriteByte(*p); //控制行的上8个IO口(高电平有效)
p+=2; //显示下一行
HC595_DatOut(); //将缓冲区 的数据输出到物理IO口上
cnt+=2;
if(cnt>=(32*3)+(16*7))cnt=0;
//(32*3)+(16*7) 计算字模占用的字节总大小
//定义74HC595的IO口
sbit HC595_DAT=P3^4; //数据输出(对于单片机来说)
sbit HC595_RCK=P3^5; //控制存储器(缓存区)的输出时钟
sbit HC595_SCK=P3^6; //控制数据输出的时钟(上升沿)
/*
函数功能: 向74H595写入一个字节
函数形参: 写入的字节数据
函数说明: 先发高位
*/
void HC595_WriteByte(u8 byte)
u8 i;
for(i=0;i<8;i++)
if(byte&0x80)HC595_DAT=1;
else HC595_DAT=0;
byte<<=1;
//产生上升沿
HC595_SCK=0;
HC595_SCK=1;
/*
函数功能: 输出使能--控制595将存储器里的数据输出到总线(8)
*/
void HC595_DatOut(void)
//上升沿将存储器的数据输出到总线
//下降沿保持输出状态
HC595_RCK=0;
HC595_RCK=1;
HC595_RCK=0;
以上是关于5.1 单片机-16x16LED点阵屏的主要内容,如果未能解决你的问题,请参考以下文章