📄 595-165ic.lst
字号:
C51 COMPILER V7.10 595_165IC 03/20/2009 17:55:45 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE 595_165IC
OBJECT MODULE PLACED IN 595-165IC.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 595-165IC.C BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /**********此部分为74HC595的驱动程序使用SPI总线连接********************
3 *
4 *阅读此处时,请大家参考74HC595 74HC165(并入串出)的芯片手册查看各引脚的功能
5 *
6 ***********************************************************************/
7
8 #include <reg52.H>
9 #include <absacc.h>
10 #include <intrins.h>
11
12 #define NOP() _nop_() /* 定义空指令 */
13 #define _Nop() _nop_() /*定义空指令*/
14 //SPI IO
15 sbit MOSIO =P1^5; //管脚定义,74HC595数据通过P1.5脚移进单片
16 sbit R_CLK =P1^6; /*将数据保存到存储寄存器中的脉冲*/
17 sbit S_CLK =P1^7; /*时钟脉冲,使数据输入74HC595移位寄存器的脉冲*/
18
19 sbit IN_PL =P3^4; //管脚定义,74HC165 shiftload 把数据加载到锁存器中
20 sbit IN_Dat=P3^5; //管脚定义,IN_Dat是74HC165的串行数据输出端口
21 sbit OE =P3^6; /*74HC595输出使能*/
22 /*********************************************************************************************************
23 ** 函数名称: ReHC74165 (并入串出)
24 ** 功能描述: 将单片机并行总线上的数据转换成串行数据输出
25 ** 并行数据从输入74HC165并行数据输入端输入-->74HC165的串行数据输出端IN_Dat输出串行数据
26 ** 管脚描述:请参考相关的芯片资料(学习光盘中已配)
27 ** 入口参数: 无,数据从74HC165的8位并行数据输入端输入
28 ** 出口参数:
29 ** 返回值 : ~indata
30 *********************************************************************************************************/
31 unsigned long ReHC74165(void)
32 {
33 1 unsigned char i; /*变量定义*/
34 1 unsigned long indata;
35 1
36 1 IN_PL=0; /*产生占空比为50%脉冲方波,把并行总线上的数据加载到74HC165内部锁存器中 */
37 1 NOP();
38 1 IN_PL=1;
39 1 NOP();
40 1 /****************以下for循环实现将数据从74HC165中移出***************/
41 1 indata=0; /*初始化变量indata=0*/
42 1 for(i=0; i<25; i++) /*循环25次*/
43 1 {
44 2 indata=indata<<1; /*indata左移1位,目的:空出最低位用于保留从74HC165的IN_Dat管脚移出的数据*/
45 2 if(IN_Dat==1)indata=indata|1; /*IN_Dat是74HC165的串行数据输出端口*/
46 2 /*判断74HC165的串行数据输出端口的状态。
47 2 如果是1,将保存74HC165的串行数据的变量或上1;如果是0,则取初始化的值*/
48 2 S_CLK=1; /*S_CLK下降沿*/
49 2 NOP(); /*S_CLK是74HC595的时钟输入端,使数据输入74HC595移位寄存器*/
50 2 S_CLK=0; /*将每一位74HC165的串行输出数据(变量indata的最低位)
51 2 都保存到了74HC595移位寄存器*/
52 2 }
53 1
54 1 return(~indata); /*返回;indata取反,这里的取反没有什么特殊目的
55 1 只是为了配合此开发板的功能实现.如果仅仅是驱动74HC165则根本部用取反*/
C51 COMPILER V7.10 595_165IC 03/20/2009 17:55:45 PAGE 2
56 1
57 1 }
58
59
60 /*********************************************************************************
61 ** 函数名称: HC595SendData
62 ** 功能描述: 单片机的并行数据SendVal-->串行移到74HC595中-->74HC595并行数据输出
63 ** 单片机只用一个IO口和74HC595相连,通过74HC595,最终实现了8位数据的并行输出.
64 ** 简言之: 单片机只用一个IO口,就实现了8位数据并行输出到总线.
65 ** 入 口:SendVal要发送的数据
66 ** 出 口:
67 ***********************************************************************************/
68 void HC595SendData(unsigned int SendVal)
69 {
70 1 unsigned char i; /*定义变量;i定义为unsigned char 数据类型,占16位存储空间*/
71 1
72 1 for(i=0;i<16;i++) /*因为数据类型unsigned char,占16位存储空间*/
73 1 {
74 2 if((SendVal<<i)&0x8000)/*判断要发送的数据的最高位*/
75 2 { MOSIO=1; /*要发送的数据的最高位为1,向74HC595的数据口是送1*/
76 3
77 3 }
78 2 else MOSIO=0; /*要发送的数据的最高位为0,向74HC595的数据口是送0*/
79 2 /*以上if--else语句通过将要发送的数据左移,然后取该数据的最高位,实现将要发送的
80 2 数据从高到低,一位一位的发送到74HC595。74HC595串行输入并行输出*/
81 2 S_CLK=0; /*产生一个上升沿*/
82 2 NOP(); /*S_CLK是74HC595的时钟输入端,使数据输入74HC595移位寄存器*/
83 2 NOP();
84 2 S_CLK=1;
85 2 }
86 1 /*以上for()循环,把16位的数据全部保存到了74HC595的内部寄存器*/
87 1
88 1 R_CLK=0; /*产生一个上升沿*/
89 1 NOP(); /*R_CLK是74HC595的控制端*/
90 1 NOP();
91 1 R_CLK=1; /*将数据保存到存储寄存器中去*/
92 1 /* 注意:如果两个时钟R_CLK,S_CLK连在一起,则移位寄存器总是比存储寄存器早一个脉冲。*/
93 1 OE=0; /*当使能OE时(为低电平),存储寄存器的数据输出到总线。
94 1 也就是允许并行数据的输出,实现了把串行数据输入转换为并行数据输出*/
95 1
96 1 }
97
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 92 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -