当前位置: 代码迷 >> 单片机 >> 关于arm显示点阵有一处语句不是请很清楚,该如何处理
  详细解决方案

关于arm显示点阵有一处语句不是请很清楚,该如何处理

热度:108   发布时间:2016-04-28 15:05:13.0
关于arm显示点阵有一处语句不是请很清楚
本帖最后由 BTFKM 于 2014-01-22 03:12:03 编辑
在这里定义了一个地址
volatile U16 * LedDBuffer = (volatile U16 *)(0x2000000);


这里是相关函数

void Show_WWW(void)
{

U8 i=0,j=0,t;
for(i=0;i<104;i++)
{
for(t=0;t<5;t++)
{

for(j=0;j<8;j++)

*LedDBuffer=(ZI_MO[j+i]|0xff00);
//Send_595(~(1<<i));//低电平点亮
//取字模时取反码
Send_595(~(1<<(7-j)));
sysUtilsUSecDelay(200);
Clr_DZ(); //清屏
}
}
}
}

大概就是按顺序显示ZI_MO中的信息
-------------------------------------------------
Send_595函数:


#define DATA_H() rPDATC|=(1<<14)   
#define DATA_L() rPDATC&=~(1<<14)
#define CLK_H() rPDATC|=(1<<15)
#define CLK_L() rPDATC&=~(1<<15)
#define OE_H() rPDATE|=(1<<0)
#define OE_L() rPDATE&=~(1<<0)


void Send_595(U16 n)
{
unsigned char i;
for(i=0;i<9;i++)
{
if(n&0x100)
DATA_H();
else
DATA_L();
sysUtilsUSecDelay(50);
CLK_H();
n<<=1; 
sysUtilsUSecDelay(50);
CLK_L();
sysUtilsUSecDelay(50);
}
OE_H();
OE_L();
}

我的疑问:
1.
volatile U16 * LedDBuffer = (volatile U16 *)(0x2000000);
这里LedDBuffer储存了相关数据 可是怎么定位在0x2000000这个位置?在数据手册中没有找到对这个位置的定义  也没找到相关解释 程序就是直接把变量储存在这个位置  为什么?
2.
在Send_595函数中 好像仅仅是将n的最高位不断发送给595芯片 整个过程好像没有涉及到LedDBuffer 

请问程序是怎样将ZI_MO中的数据发送并显示在点阵屏幕上的??

附电路图

------解决方案--------------------
起始地址
/////////////////////


关于第二问题

看 else 部分

 分别 做了高和低 两个函数,,应该是半屏 半屏 处理的

 我以前做的是左右 半屏处理,,不是程序必须这样写,是屏的工作方式,要求要这样做。。。


------解决方案--------------------
void Send_595(U16 n) 是串行发送数据(共9位,高位在前),应该是行(列)控制信号。DATA_H() 和 DATA_L() 发数据,CLK_H() 和 CLK_L() 生成时钟信号,OE_H() 和 OE_L() 完成锁存。数据只有一位为低,只点亮一行(列)。
0x2000000 地址大概是直接指到一个I/O 口输出或外围芯片。可以对照下写入 0x2000000 的数据是否就是U9 a - h 内容
------解决方案--------------------
这个找到 lcd的datasheet 对着代码看比较容易理解
  相关解决方案