您好,欢迎来到尚车旅游网。
搜索
您的当前位置:首页51单片机 8x8点阵显示程序参考

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

来源:尚车旅游网
本程序用的是51单片机控制8*8点阵显示I(心形)U

#include

#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;

}

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务