|
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;
char code tap[]=
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
};
char code tab[]=
{ /*-- 文字: 普 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00,
0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,
};
/*******************************************************************************
* 函 数 名 : HC595SendData
* 函数功能 : 通过595发送四个字节的数据
* 输 入 : BT3:第四个595输出数值
* * BT2: 第三个595输出数值
* * BT1:第二个595输出数值
* * BT0:第一个595输出数值
* 输 出 : 无
*******************************************************************************/
void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0)
{
uchar i;
for(i = 0; i < 8; i++)
{
MOSIO = BT3 >> 7 ; //从高位到低位
BT3 <<= 1;
S_CLK = 0;
_nop_();
S_CLK = 1;
}
for(i = 0; i < 8; i++)
{
MOSIO = BT2 >>7;
BT2 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
for(i = 0; i < 8; i++)
{
MOSIO = BT1 >> 7;
BT1 <<= 1;
S_CLK = 0;
_nop_();
S_CLK = 1;
}
for(i = 0; i < 8; i++)
{
MOSIO = BT0 >> 7;
BT0 <<= 1;
S_CLK = 0;
_nop_();
S_CLK = 1;
}
//--输出--//
R_CLK = 0;
_nop_();
R_CLK = 1;
_nop_(); //片选
R_CLK = 0;
}
void main()
{
int j;
while(1)
{
for(j = 0; j < 16; j++) //显示一个字
{
//--因为字模软件取的数组是高电平有效,所以列要取反--//
HC595SendData(~tap[j+16],~tap[j],tab[j+16],tab[j]);
}
}
}
我抄的,但是我的led点阵一直乱闪,没有规律的那种 |
|