51单片机 8x8点阵显示程序参考

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本程序用的是51单片机控制8*8点阵显示I(心形)U
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//使用的IO口要根据自己接在单片机里的情况来更改
sbit RCK = P3^6; //声明串行输出存储锁存线RCK
sbit SCK = P3^5; //声明串行数据输入时钟线SCK
sbit SER = P3^4; //声明串行数据输入线SER
sbit HC = P0^0; //声明C信号接口
sbit HB = P0^1; //声明B信号接口
sbit HA = P0^2; //声明A信号接口
#define ROW1 HC = 0; HB = 0; HA = 0; //定义使能第1行#define ROW2 HC = 0; HB = 0; HA = 1; //定义使能第2行#define ROW3 HC = 0; HB = 1; HA = 0; //定义使能第3行#define ROW4 HC = 0; HB = 1; HA = 1; //定义使能第4行#define ROW5 HC = 1; HB = 0; HA = 0; //定义使能第5行#define ROW6 HC = 1; HB = 0; HA = 1; //定义使能第6行#define ROW7 HC = 1; HB = 1; HA = 0; //定义使能第7行#define ROW8 HC = 1; HB = 1; HA = 1; //定义使能第8行
uchar h;
//显示数据,可以用取模软件来获取
uchar iloveu[] = {
0x00,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,
0x00,0x36,0x7F,0x7F,0x3E,0x1C,0x08,0x00,
0x00,0x22,0x22,0x22,0x22,0x22,0x1C,0x00,
0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,
0x7C,0x08,0x10,0x08,0x04,0x44,0x38,0x00,
0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,
0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00};
void delay(uint z) //延时函数,单位ms
{
uint i, j;
for(i = z; i > 0; i--)
for(j = 110; j > 0; j--);
}
void ROW() //行驱动函数
switch(h)
{
case 0: ROW1;break;
case 1: ROW2;break;
case 2: ROW3;break;
case 3: ROW4;break;
case 4: ROW5;break;
case 5: ROW6;break;
case 6: ROW7;break;
case 7: ROW8;break;
}
RCK = 1; //595输出存储器锁存移位寄存器中的状态值RCK = 0; //595输出存储器状态保持
}
void in_data(uchar n) //数据打入74HC595函数
{
uchar x,y;
y = n;
for(x = 8; x > 0; x--)
{
if(y&0x01)
//特别注意先打入的是高位对应第8列,最后打入低位对应第1列SER = 1;
else
SER = 0;
y = y>>1;
//对应先高位后对位应往右移位数据
SCK = 0; //时钟接低,准备下一次读取数据
SCK = 1; //595芯片读取数据
}
}
void main(void)
{
uchar m, in[56], n;
RCK = 0; //清零锁存线
SCK = 0; //清零时钟线
for(h = 0; h < 56; h++)
in[h] = iloveu[h]; //赋值运算,保护原始数据while(1)
{
for(m = 18; m> 0; m--)
{
for(h = 0; h < 8; h++)
{
in_data(in[h]);
ROW();
delay(1);
}
}
//左移
for(h = 0; h < 8; h++)
{
if(in[h]&0x80)
m = 1; //预先保存第一位数据
else
m = 0;
for(n = 0; n < 6; n++)
{
if(in[h+8*n+8]&0x80) //没有改变in[h+8]的值in[h+8*n] = (in[h+8*n]<<1) + 1; //循环左移思想
else
in[h+8*n] <<= 1; //第一位数据丢失了
}
if(m)
in[h+8*n] = (in[h+8*n]<<1) + 1; //循环左移思想else
in[h+8*n] <<= 1;
}
}
}。

相关文档
最新文档