本帖最后由 xzf586 于 2017-9-21 16:10 编辑
/*******************************************************************************
*
* 普中科技
--------------------------------------------------------------------------------
* 实 验 名 : LED点阵显示汉字
* 实验说明 :
* 连接方式 : 见接线图
* 注 意 :
*******************************************************************************/
#include <REG51.H>
//--重定义函数变量--//
#define uchar unsigned char
//--定义SPI要使用的 IO--//
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;
//点阵显示数组
uchar code tab0[] = {
0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,//1-8行
0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00 //9-16行
};
uchar code tab[] = //为了显示方便,弄到一起来
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 缓冲
0,8,254,31,16,2,16,2,16,2,16,18,255,63,16,2,16,2,16,2,16,2,8,2,4,2,3,2,0,0,0,0, //开
32,2,36,4,36,4,34,16,254,63,32,0,224,15,80,8,80,4,136,2,8,1,132,2,98,60,29,16,0,0,0,0, //发
4,8,4,30,196,1,95,0,196,15,68,8,78,9,86,9,69,5,69,5,68,2,36,5,164,56,84,16,0,0,0,0, //板
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 缓冲
};
uchar distab[32]; //为了利于编程,定义显示缓存变量
uchar index=0; //记录每次显示的16行的起始行,思路关键
/*******************************************************************************
* 函 数 名 : HC595SendData
* 函数功能 : 通过595发送四个字节的数据
* 输 入 : BT3:第四个595输出数值
* * BT2: 第三个595输出数值
* * BT1:第二个595输出数值
* * BT0:第一个595输出数值
* 输 出 : 无
*******************************************************************************/
void HC595MoveData(uchar dat) //--移位一个字节,从高到低--//
{
uchar i;
for(i=0;i<8;i++)
{
MOSIO = dat >> 7 ; //从高位到低位
dat <<= 1;
S_CLK = 0;
S_CLK = 1;
}
}
void HC595SendData(uchar DuanU17, uchar DuanU16,uchar WeiU5,uchar WeiU4)
{
HC595MoveData(DuanU17); //控制点阵的c9~c16脚,9-16行代码
HC595MoveData(DuanU16); //控制点阵的c1~c8脚 1-8行代码 低电平亮灯
HC595MoveData(WeiU5); //控制点阵的R9~R16脚 9-16行扫描 高电平亮灯
HC595MoveData(WeiU4); //控制点阵的R1~R8脚 1-8行扫描 高电平亮灯
R_CLK = 0;
R_CLK = 1; //--输出--//
R_CLK = 0;
}
void DisplayOneChar(uchar TAB[32])
{
int k, i, ms;
i =40; //显示时间
for(ms = i; ms > 0; ms--)
{
for(k = 0; k < 16; k++)
{
HC595SendData(~TAB[2*k +1],~TAB[2*k],tab0[2*k],tab0[2*k + 1]);
}
}
HC595SendData(0xff,0xff,0,0); //清屏
}
void MoveUp()
{
uchar i;
for(i=0;i<32;i++)
{
distab=tab[(i+index)];
}
DisplayOneChar(distab);
}
/*************主函数*****************************/
void main(void)
{
while(1)
{
HC595SendData(0xff,0xff,0,0); //清屏
MoveUp();
index++;
if(index==128)
index=0;
}
}
|