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

关于arm展示点阵有一处语句不是请很清楚

热度:65   发布时间:2016-04-28 15:08:06.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 对着代码看比较容易理解
------解决方案--------------------
引用:
Quote: 引用:

通常显示有两种做法:
1、是把显示的数据先发送到缓冲区,再通过显示的驱动从缓冲区一次性的写到显示芯片中,这中做法要明显的看到有把缓冲区的数据送入到显示芯片的驱动。
2、是CPU或者MCU的外部存储的扩展接法,比如把显示芯片当成是MCU的外部存储芯片,比如MCU的地址线,片选线等会接到显示芯片中,此时通过写外部RAM的方式往显示芯片的地址写数据。
我猜可能你的做法是第二种,具体看看MCU和显示的芯片是如何连线的,是否显示芯片按照MCU的0x2000000地址的外部存储方式接线了?


看到这里确实学习到不少东西

因为中间没有其他芯片连接应该是所说的第二种方式

能不能追问一下怎么计算或者得出地址的?0x2000000这个地址的计算方法一直是我很迷惑的地方(程序和数据手册中均未看到定义 是不是要通过偏移量之类计算得来?)

以及是如何定义一个外部部件的?需要事先声明吗?程序中声明的部分有没有什么明显的特征?

整个点阵控制部分确实是有一个片选信号连接的74hc573  

如果定义外部部件要声明是不是意味着s3c44b0可以不通过程序自动通过识别数据地址控制片选使能信号?
这个要看MCU手册上的内存映射部分,手册会给出内存的映射地址空间,比如哪个地址段是给外部存储的,对应每个片选的范围是多少等等。
  相关解决方案