DIY点阵模块程序讲解—74HC595程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

74HC595 发送数据时先发高位,则数据位和管脚位相对应
******************************************************************************/
void Send_Hang ( uint8 Data )
{
uint8 i;
for ( i = 0; i < 8; i++ )
{ PDATA_H = (bit)( Data&0x08);/*送一位数据,强制转换为位数据型,*/
PCLK_H = 0;
PCLK_H = 1;
Data<<=1;
}
} 我们可以看看汇编的结果是怎么样的,
19: void Send_Hang ( uint8 Data )
20: {
21:
22: uint8 i;
23:
24: for ( i = 0; i < 8; i++ )
C:0x031F E4
CLR
A
C:0x0320 FE
MOV
R6,A
25: {
26:
PDATA_H = (bit)( Data&0x08);
C:0x0321 EF
MOV
A,R7
C:0x0322 A2E3 MOV
C,0xE0.3
C:0x0324 92A0 MOV
现在我们的程序又有了一个进步了,大家不要就满足于这样的效果,这和用汇编来写效果还 是有差距,为此我们还是等一下再休息,继续想更好的方法来实现,接着请看方法三。
方法三:
void Send_Hang ( uint8 Data )
{
uint8 i;Байду номын сангаас
ACC = Data;
CY = 0;
for ( i = 8; i > 0; i-- )
PCLK_H(0xA0.2)
30:
PCLK_H = 1;
C:0x033D D2A2 SETB PCLK_H(0xA0.2)
31: }
C:0x033F DFF6 DJNZ R7,C:0337
32: }
C:0x0341 22
RET
可以看到这个方法里面只用到了一个 R7,循环判断也是用 DJNZ。
总结:
呵呵 ,我想这个总结留给大家自己来总总结,大家自己总结能学到更多东西,大家可以 自己把每一种方法都试一下,自己分析总结一下,由于时间方面比较紧,可能有不足之处, 欢迎大家指正,如果大家有更好的方法欢迎和大家一起分享,也好让我学习一下。 74HC595 发送数据时先发高位,则数据位和管脚位相对应 74HC595 发送数据时先发高位, 则数据位和管脚位相对应,低位在前是数据位和管脚位相反。 以下是三个程序发送低位在前的参考程序。 方法一: void Send_Hang ( uint8 Data ) {
uint8 i; PDATA_H = (bit)( Data&0x01); PCLK_H = 0; PCLK_H = 1; Data>>=1; } 方法三: void Send_Hang ( uint8 Data ) { uint8 i; ACC = Data; CY = 0; for ( i = 8; i > 0; i-- ) { PDATA_H = ( ACC & 0x01 ); PCLK_H = 0; PCLK_H = 1; } }
方法 1:
/****************************************************************************** * 函数名:Send_Hang * 函数功能: 函数扫描串行发送函数 * 输入:行 * 输出:无 * 返回值: * 修改历史: * -------------------*14.apr.2011, Written By:Blueice
方法二:
for ( i = 8; i > 0; i-- )
{
uint8 i;
PDATA_H = (bit)( Data&0x08);
PCLK_H = 0;
PCLK_H = 1;
Data<<=1;
} 初一看是和方法一没什么区别,仔细一看还是有区别的,for 循环现在是自减,这样有什么 好处呢,我们来看看汇编。
C:0x0335 7F08 MOV
R7,#Uart_Buff(0x08)
27: {
28:
PDATA_H = ( ACC & 0x08);
C:0x0337 A2E3 MOV
C,0xE0.3
C:0x0339 92A0 MOV
PDATA_H(0xA0.0),C
29:
PCLK_H = 0;
C:0x033B C2A2 CLR
C:0x0334 EF
MOV
A,R7
C:0x0335 A2E3 MOV
C,0xE0.3
C:0x0337 92A0 MOV
PDATA_H(0xA0.0),C
27:
PCLK_H = 0;
C:0x0339 C2A2 CLR
PCLK_H(0xA0.2)
28:
PCLK_H = 1;
C:0x033B D2A2 SETB PCLK_H(0xA0.2)
DIY 点阵模块程序讲解—74HC595 程序 上一讲已经讲解了点阵显示原理和一些基本概念,现在我们得着手程序的设计了,大家看一 下原理图就会发现,我们用的驱动芯片是常用 的 74HC595,顺便提一句 74HC595 比 74LS595 要好一点,所以我们的程序也是由 74HC595 驱动开始。 首先我们要根据硬件接口定义好接口,如下图先新建一个 74HC595.H 的头文件,这个文件 是专门为 595 服务的,为什么要这样做的,方便以后的移植,如果以后的程序要用的 595 驱动,不需要重新再写,只需要把 H 文件和 C 文件复制过去就 OK 了。其写法如下图。
19: void Send_Hang ( uint8 Data )
20: {
21:
22: uint8 i;
23:
24: for ( i = 8; i > 0; i-- )
C:0x0332 7E08 MOV
R6,#Uart_Buff(0x08)
25: {
26:
PDATA_H = (bit)( Data&0x08);
uint8 i; for ( i = 0; i < 8; i++ ) {
PDATA_H = (bit)( Data&0x01);/*送一位数据,强制转换为位数据型,*/ PCLK_H = 0; PCLK_H = 1; Data>>=1; } } 方法二
for ( i = 8; i > 0; i-- ) {
19: void Send_Hang ( uint8 Data )
20: {
21: uint8 i;
22: ACC = Data;
23:
C:0x0332 EF
MOV
A,R7
24: CY = 0;
25:
C:0x0333 C2D7 CLR
CY(0xD0.7)
26: for ( i = 8; i > 0; i-- )
29:
Data<<=1;
C:0x033D 25E0 ADD
A,ACC(0xE0)
C:0x033F FF
MOV
R7,A
30: }
C:0x0340 DEF2 DJNZ R6,C:0334
31: } C:0x0342 22
RET
/*程序执行完返回*/
比较一下上面的汇编是不是简单多了,大家不要说自己不懂汇编,看不懂,要写出好的程序 要调试 BUG 还是得懂一点汇编,我们不要求自己能用汇编写出好程序,但最起码要看得懂 汇编。
看到上面的图片大家一定会注意到字体的颜色很漂亮,在这我向大家推荐一个好软件, Source Insight 3.5,这个软件用来编写软件很好用,怎么个好用大家可以去问一下百度。接 着我们的话题,头文件写完了接下来写 C 文件了,我们取名为 74HC595.C,里面就两个函 数,一个是行驱动函数,一个是列驱动函数。在头文件里面我们已经声明了。我们来看看这 两个函数的写法,同时比较各种写法的好坏。
MOV
R7,A
30: }
C:0x032D 0E
INC
R6
C:0x032E BE08F0 CJNE R6,#Uart_Buff(0x08),C:0321
31: } C:0x0331 22
RET
/*程序执行完返回*/
现在一个 595 的驱动函数已经写完,本来可以休息一下了,但我们能不能有更好的办法来写 这个程序呢?为了追求更加精练的程序,暂时先不休息,我们接着分析更好的方法。
{
PDATA_H = ( ACC & 0x08 );
PCLK_H = 0;
PCLK_H = 1;
}
} 为什么没有了 Data<<=1;这条语句呢,看看汇编就知道了。 在这个方法里面我们引入 ACC 这个变量,这个在汇编里是常用的,在 C 里面也可以用,不 过要慎用,好了我们来看看它的汇编有什么好的效果,能不能比上面的两个方法有改进呢?
PDATA_H(0xA0.0),C
27:
PCLK_H = 0;
C:0x0326 C2A2 CLR
PCLK_H(0xA0.2)
28:
PCLK_H = 1;
C:0x0328 D2A2 SETB PCLK_H(0xA0.2)
29:
Data<<=1;
C:0x032A 25E0 ADD
A,ACC(0xE0)
C:0x032C FF
相关文档
最新文档