📄 saa1064.lst
字号:
C51 COMPILER V8.01 SAA1064 10/10/2007 09:48:36 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE SAA1064
OBJECT MODULE PLACED IN SAA1064.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SAA1064.c OPTIMIZE(9,SPEED) BROWSE INCDIR(..\SAA1064) DEBUG OBJECTEXTEND TA
-BS(8) PREPRINT
line level source
1 //......................................
2 //名称: SAA1064.c 4位LED驱动芯片的接口程序
3 //编程: 机灵小老鼠(QQ: 879381753)
4 //日期: 20071010
5 //
6 //发现问题请指点,谢谢!
7 //......................................
8 //CPU: 89C52 11.0592MHz
9 //环境: Keil C51 V8.01
10 //引脚定义:
11 // CPU_P2.0 --- SAA1064_SCL 时钟
12 // CPU_P2.1 --- SAA1064_SDA 数据
13 //......................................
14 #include <Public.h>
15 #include <Intrins.h>
16 #include "delay_s.h"
17 #include "saa1064.h"
18
19
20 //内部函数
21 static void i2c_start_cond(void);
22 static void i2c_stop_cond(void);
23 static uchar i2c_read_byte(void);
24 static uchar i2c_read_byte_nack(void);
25 static void i2c_write_byte(uchar da);
26
27 //=============================================================================
28 //接口调用函数部分
29 //*******************************************************
30 //序号:
31 // HD_SAA1064_S01
32 //功能:
33 // 读出芯片的复位状态
34 //输入:
35 // add 器件的子地址 0~3
36 //输出:
37 // =1 芯片已经复位,=0 芯片在复位中
38 //********************************************************
39 bit SAA1064_read_status(uchar add)
40 {
41 1 uchar i;
42 1 i2c_start_cond();
43 1
44 1 i2c_write_byte(SAA1064_READ |((add <<1) &0x06));//器件地址=0111 0 A1 A0 r/w
45 1 i =i2c_read_byte_nack(); //顺序读的方式读出一个字节
46 1 i2c_stop_cond();
47 1 return((i &0x80) ?1:0);
48 1 }
49
50 //*******************************************************
51 //序号:
52 // HD_SAA1064_S02
53 //功能:
54 // 写入指令字节和数据
C51 COMPILER V8.01 SAA1064 10/10/2007 09:48:36 PAGE 2
55 //输入:
56 // add_of_part: 器件的子地址 0~3
57 // add_of_reg: 器件内的寄存器地址
58 // len_of_all: 指定长度 1~5
59 // str: 存放写入指令和数据串的地址指针
60 //str中的数据排列决定于add_of_reg和len_of_all,完整的数据如下:
61 //ctl_byte, led1_byte, led2_byte, led3_byte, led4_byte,
62 //输出:
63 // 无
64 //********************************************************
65 void SAA1064_write_string_all(uchar add_of_part, uchar add_of_reg, uchar len_of_all, uchar *str)
66 {
67 1 uchar i;
68 1 if( (len_of_all ==0) ||
69 1 (len_of_all >5) ||
70 1 (add_of_reg >SAA1064_REGISTER_ADDR_MAX)
71 1 ) return;
72 1
73 1 i2c_start_cond();
74 1 i2c_write_byte(SAA1064_WRITE |((add_of_part <<1) &0x06)); //器件地址=01110 A1 A0 r/w
75 1 i2c_write_byte(add_of_reg);
76 1 for(i=0; i<len_of_all; i++)
77 1 {
78 2 i2c_write_byte(str[i]); //字节写方式写入一个字节
79 2 }
80 1 i2c_stop_cond();
81 1 delay_x1ms(5);
82 1 }
83
84 //==============
85 //内部调用函数部分
86 //==============
87
88 //----------------------------------------------
89 //I2C 发启始条件:时钟线为高时数据线发生下降沿跳变
90 //----------------------------------------------
91 static void i2c_start_cond(void)
92 {
93 1 CODE_SCL_LOW;
94 1 _DELAY_NOP3;
95 1 CODE_SDA_HIGH;
96 1 _DELAY_NOP3;
97 1 CODE_SCL_HIGH;
98 1 _DELAY_NOP3;
99 1 CODE_SDA_LOW;
100 1 _DELAY_NOP3;
101 1 }
102
103 //----------------------------------------
104 //I2C 发结束条件:时钟线为高时数据线发生上升沿跳变
105 //----------------------------------------
106 static void i2c_stop_cond(void)
107 {
108 1 CODE_SCL_LOW;
109 1 _DELAY_NOP3;
110 1 CODE_SDA_LOW;
111 1 _DELAY_NOP3;
112 1 CODE_SCL_HIGH;
113 1 _DELAY_NOP3;
114 1 CODE_SDA_HIGH;
115 1 _DELAY_NOP3;
116 1 }
C51 COMPILER V8.01 SAA1064 10/10/2007 09:48:36 PAGE 3
117
118 //----------------------------------------
119 // I2C 读取一个中间字节的数据
120 //----------------------------------------
121 static uchar i2c_read_byte(void)
122 {
123 1 uchar i;
124 1 uchar da=0;
125 1 for(i =0; i<8; i++)
126 1 {
127 2 da <<=1; //传输的数据高位在前
128 2 CODE_SCL_LOW;
129 2 _DELAY_NOP3;
130 2 CODE_SCL_HIGH; //时钟为高时读数据
131 2 //NOP3;
132 2 if (JUDGE_SAA1064_SDA) da++;
133 2 }
134 1 CODE_SCL_LOW;
135 1 _DELAY_NOP3;
136 1 CODE_SDA_LOW; //发送应答位
137 1 _DELAY_NOP3;
138 1 CODE_SCL_HIGH;
139 1 _DELAY_NOP3;
140 1 CODE_SCL_LOW;
141 1 _DELAY_NOP3;
142 1 CODE_SDA_HIGH;
143 1 return(da);
144 1 }
145
146 //----------------------------------------
147 // I2C 读取一个结尾字节的数据
148 //----------------------------------------
149 static uchar i2c_read_byte_nack(void)
150 {
151 1 uchar i;
152 1 uchar da =0;
153 1 for (i =0; i<8; i++)
154 1 {
155 2 da <<=1;
156 2 CODE_SCL_LOW;
157 2 _DELAY_NOP3;
158 2 CODE_SCL_HIGH;
159 2 //NOP3;
160 2 if(JUDGE_SAA1064_SDA) da++;
161 2 }
162 1 CODE_SCL_LOW;
163 1 _DELAY_NOP3;
164 1 CODE_SDA_HIGH;
165 1 _DELAY_NOP3;
166 1 CODE_SCL_HIGH;
167 1 _DELAY_NOP3;
168 1 CODE_SCL_LOW;
169 1 return( da );
170 1 }
171
172 //----------------------------------------
173 // I2C 写入一个字节的数据
174 //----------------------------------------
175 static void i2c_write_byte(uchar da )
176 {
177 1 uchar i;
178 1 for(i =0; i<8; i++)
C51 COMPILER V8.01 SAA1064 10/10/2007 09:48:36 PAGE 4
179 1 {
180 2 CODE_SCL_LOW;
181 2 if(da&0x80)
182 2 {
183 3 CODE_SDA_HIGH;
184 3 }
185 2 else
186 2 {
187 3 CODE_SDA_LOW;
188 3 }
189 2 CODE_SCL_HIGH;
190 2 da <<=1;
191 2 }
192 1 CODE_SCL_LOW; //第8个SCL下降沿,写入8位数据
193 1 _DELAY_NOP3;
194 1 CODE_SDA_HIGH;
195 1 _DELAY_NOP3;
196 1 CODE_SCL_HIGH;
197 1 }
198
199 //=============================================================================
200
201 //End Of File
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 282 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 9
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 + -