提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
学习了数码管的静态和动态显示,利用动态数码管显示的原理,搞定点阵。
一、点阵是什么?
1.点阵的原理
2. 3*3 点阵显示原理
3. 8*8点阵实物图
4. 8*8点阵内部原理图
5. 16*16点阵实物图,显示原理
二、使用步骤
1.先看原理图,确定点阵是88 1616 ,共阴,共阳?
代码如下(示例):
取段码:用专门的软件。
2.写代码
代码如下(示例):
逐行:
第一行
1.先给段码
P0=0X?
P2=0X?
P1=0X00;
第一行
1.先给段码
P0=0X?
P2=0X?
P1=0X01;
0000~1111 0-15
for(i=0;i<16;i++)
{
P0=0X?
P2=0X?
P1=i;
delay(?);
P0=0X00;
P2=0X00;
}
核心问题,段码怎么来?
三、实物操作
1.原理图
2.编程思路
- 段码 P0=0X?
- 位选
P35 pclk
P36 srclk
P34 SER
J24 接 GND
P35_RCLK
P34_data
P36_SRCLK
一次移位
P34_data=1;
P36_SRCLK=0;
P36_SRCLK=1;
八次移位:
最简单的方法将上面的代码赋值八次
P34_data=?; // 是0 给00,是1给1
P36_SRCLK=0;
P36_SRCLK=1;
........
P35_RCLK=0;
P35_RCLK=1;
//发送 x =0x01 第一行
// 0000 0001
// 1000 0000
&
//= 0000 0000
//x =x<<1;
// 0000 0010
for(i=0;i<8;i++)
{
if((x&0x80)==0)
{
P34_data=0; // 是0 给00,是1给1
}
esle
{
P34_data=1; // 是0 给00,是1给1
}
P36_SRCLK=0;
P36_SRCLK=1;
x=x<<1;
}
P35_RCLK=0;
P35_RCLK=1;
P36_SRCLK=0;
P35_RCLK=0;
//发送0x02 第二行
for(i=0;i<8;i++)
{
P34_data=?; // 是0 给00,是1给1
P36_SRCLK=0;
P36_SRCLK=1;
}
P35_RCLK=0;
P35_RCLK=1;
P36_SRCLK=0;
P35_RCLK=0;
简化的方法:
// 1000 0000
// 1 000 0000 0
for(i=0;i<8;i++)
{
X=X<<1;
P34_data=CY; // 是0 给00,是1给1
P36_SRCLK=0;
P36_SRCLK=1;
}
P35_RCLK=0;
P35_RCLK=1;
P36_SRCLK=0;
P35_RCLK=0;
P0=0X?
HC595(0X01)
temp=0x01;
for(i=0;i<8;i++)
{
P0=0X?
HC595(temp) //0x01
temp=temp<<1;
delay();
P0=0X?//,灭
}
四、 书上的代码讲解
4.1代码讲解
改变j显示不同的汉字,改变i显示不同行的段码;
n的讲解
4.2 仿真逐行滚动:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define out0 P0
#define out2 P2
#define out1 P1
void delay(uint j)
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=100;
}
}
uchar code string[]=
{
/*文字"电"的16x16点阵*/
0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x03,0xE0,0x7B,0xEF,0x7B,0xEF,0x03,0xE0,0x7B,0xEF,
0x7B,0xEF,0x7B,0xEF,0x03,0xE0,0x7B,0xEF,0x7F,0xBF,0x7F,0xBF,0xFF,0x00,0xFF,0xFF,
/*文字"子"的16x16点阵*/
0xFF,0xFF,0x03,0xF0,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE,0x7F,0xFF,0x7F,0xFF,0x7F,0xDF,
0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x5F,0xFF,0xBF,0xFF,
/*文字"技"的16x16点阵*/
0xF7,0xFB,0xF7,0xFB,0xF7,0xFB,0x40,0x80,0xF7,0xFB,0xD7,0xFB,0x67,0xC0,0x73,0xEF,
0xF4,0xEE,0xF7,0xF6,0xF7,0xF9,0xF7,0xF9,0xF7,0xF6,0x77,0x8F,0x95,0xDF,0xFB,0xFF,
/*文字"术"的16x16点阵*/
0x7F,0xFF,0x7F,0xFB,0x7F,0xF7,0x7F,0xFF,0x00,0x80,0x7F,0xFF,0x3F,0xFE,0x5F,0xFD,
0x5F,0xFB,0x6F,0xF7,0x77,0xE7,0x7B,0x8F,0x7C,0xDF,0x7F,0xFF,0x7F,0xFF,0xFF,0xFF,
/*0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void main()
{
uchar i,j,n;
while(1)
{
for(j=0;j<4*16;j++)//共有4个汉字 4*32= 4*16*2
// for(j=0;j<4;j++)//共有4个汉字
{
for(n=0;n<10;n++)//每个汉字整屏扫描40次
{
for(i=0;i<16;i++)//16行
{
out1=i%16;
out0=string[i*2+2*j]; //2*j 每次滑动两个字节即16位,刚好移动一行
out2=string[i*2+1+2*j];
// out0=string[i*2+32*j];
// out2=string[i*2+1+32*j];
delay(4);
out0=0xff;
out2=0xff;
}
}
}
}
}
关键:每次移动一行或者一列,逐次移动则可以得到想要的效果
2*j 每次滑动两个字节即16位,刚好移动一行
可以试着移动多行,当移动16行的时候则为一次移动一个汉字,就变成了书上的代码
out0=string[i*2+2*j]; //2*j 每次滑动两个字节即16位,刚好移动一行
out2=string[i*2+1+2*j];
out0=string[i*2+32*j]; //2*j 每次滑动两个字节即16位,刚好移动一行
out2=string[i*2+1+32*j];
总结
利用动态数码管显示的原理,用点阵显示字符。