找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1921|回复: 2
打印 上一主题 下一主题
收起左侧

跪求大神解惑,主函数中数组指针咋调用的?j为什么最大取到17*15

[复制链接]
跳转到指定楼层
楼主
ID:85763 发表于 2015-7-15 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//16*16点阵显示汉字
#include <REG51.H>
#include <intrins.h>
#include "array.h"
//--重定义函数变量--//

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//--定义SPI要使用的 IO--//

sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;
unsigned char code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00};
unsigned char code tab17[] = {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};

unsigned char code tab1[] = {64,0,128,8,254,31,16,2,32,1,255,63,64,0,64,0,254,31,64,0,72,6,68,8,82,16,32,0,0,0,0,0};unsigned char code tab2[] = {0,14,252,1,72,8,144,4,254,63,2,16,33,8,252,31,32,0,224,7,80,2,136,1,68,2,58,28,0,0,0,0};
unsigned char code tab3[] = {8,2,8,2,4,17,62,63,162,16,98,16,34,17,62,18,34,18,34,16,34,16,34,16,62,10,34,4,0,0,0,0};

unsigned char code tab4[] = {0,16,190,63,2,2,186,31,170,16,170,20,170,20,186,20,138,20,138,20,170,20,26,10,1,49,193,32,0,0,0,0};
unsigned char code tab5[] = {64,0,128,0,254,31,34,16,241,11,40,2,68,1,192,1,32,2,248,63,23,4,16,4,16,4,240,7,0,0,0,0};

unsigned char code tab6[] = {0,1,0,1,63,1,32,63,162,32,148,18,84,2,8,2,8,2,20,5,36,5,162,8,65,16,32,32,0,0,0,0};

unsigned char code tab7[] = {2,1,196,16,36,62,32,18,32,18,39,18,36,18,164,18,100,18,36,26,4,2,10,2,49,0,192,63,0,0,0,0};

unsigned char code tab8[] = {16,2,16,18,232,63,8,2,204,31,74,18,73,18,200,31,8,18,72,2,136,2,8,1,136,6,104,56,0,0,0,0};

unsigned char code tab9[] = {0,8,252,31,132,8,132,8,252,15,132,8,132,8,132,8,252,15,132,8,132,8,130,8,130,10,129,4,0,0,0,0};

unsigned char code tab10[] = {16,2,32,1,254,31,32,1,36,9,40,5,255,63,0,0,248,7,8,4,248,7,8,4,8,4,248,7,0,0,0,0};

unsigned char code tab11[] = {64,0,64,0,64,8,254,31,66,8,66,8,66,8,66,8,254,15,64,0,64,0,64,0,64,0,64,0,0,0,0,0};

unsigned char code tab12[] = {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};

unsigned char code tab13[] = {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};
unsigned char code tab14[] = {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};
unsigned char code tab15[] = {0,0,0,0,60,240,102,156,67,130,0,0,0,0,0,0,0,0,0,0,48,24,96,8,192,7,0,0,0,0,0,0};

unsigned char code tab16[] = {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};

//--全局函数声明--//
void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0);

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/


void main(void)
{
int k, j, ms;

//--定义一个指针数组指向每个汉字--//
uchar *p[17] =
{tab17, tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8,
tab9, tab10, tab11, tab12, tab13, tab14, tab15, tab16};
while(1)
{


for(ms =5; ms > 0; ms--)//移动定格时间设置
{
for(k = 0; k < 16; k++)//显示一个字
{
HC595SendData(~(*(p[0] + 2*(k+j) + 1)),~(*(p[0] + 2*(k+j) )),tab0[2*k],tab0[2*k + 1]); //因为字模软件取的数组是高电平有效,所以列要取反
}

//--清屏--//
HC595SendData(0xff,0xff,0,0); //清屏
}



j++;
if((j ==17*15))
{
j = 0;
}

}
}


/*******************************************************************************
* 函 数 名 : 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;
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;
S_CLK = 1;
}


//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT0 >> 7;//从高位到低位
BT0 <<= 1;
S_CLK = 0;
S_CLK = 1;
}

//--输出--//
R_CLK = 0; //set dataline low
R_CLK = 1; //片选
R_CLK = 0; //set dataline low
}
还请各位大神仔细讲解一下main函数各语句的含义!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2015-7-17 16:25 来自手机 | 只看该作者
应该是一个点阵屏的显示程序吧,楼主有电路图吗?有图的话好分析一点
回复

使用道具 举报

板凳
ID:155598 发表于 2017-3-30 16:00 | 只看该作者
admin 发表于 2015-7-17 16:25
应该是一个点阵屏的显示程序吧,楼主有电路图吗?有图的话好分析一点


HC595SendData(~tab6[2*k +1],~tab6[2*k],tab0[2*k],tab0[2*k + 1]);这一步能解释下吗?
还有点阵显示数组怎么来的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表