📄 zlg7289.lst
字号:
C51 COMPILER V8.02 ZLG7289 03/19/2008 16:21:44 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE ZLG7289
OBJECT MODULE PLACED IN zlg7289.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE zlg7289.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*ZLG7289.c
2 数码管显示与键盘管理芯片ZLG7289 的标准80C51 驱动程序(C51)
3 Copyright (c) 2005,广州周立功单片机发展有限公司
4 All rights reserved.
5 本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的。
6 */
7
8 #include "ZLG7289.h"
9 #include "intrins.h"
10 //定义一个全局变量,用于延时
11 //该变量在调用函数ZLG7289_Init()时被初始化
12
13 /*宏定义:ZLG7289_ShortDelay()
14 功能:短延时
15 说明:延时(ZLG7289_Delay_t*2+2)个机器周期*/
16
17 #define ZLG7289_ShortDelay() {unsigned char t = ZLG7289_Delay_t;while ( --t != 0 );}
18
19 /*宏定义:ZLG7289_LongDelay()
20 功能:长延时
21 说明:延时(ZLG7289_Delay_t*12+8)个机器周期*/
22
23 #define ZLG7289_LongDelay() {unsigned char t = ZLG7289_Delay_t * 6;while ( --t != 0 );}
24
25 /*
26 函数:ZLG7289_SPI_Write()
27 功能:向SPI 总线写入1 个字节的数据
28 参数:
29 dat:要写入的数据
30 */
31
32 void ZLG7289_SPI_Write(char dat) reentrant
33 {
34 1 unsigned char t = 8;
35 1 do
36 1 {
37 2 ZLG7289_pinDIO = (bit)(dat & 0x80);
38 2 dat <<= 1;
39 2 ZLG7289_pinCLK = 1;
40 2 ZLG7289_ShortDelay();
41 2 ZLG7289_pinCLK = 0;
42 2 ZLG7289_ShortDelay();
43 2 } while ( --t != 0 );
44 1 }
45
46 /*函数:ZLG7289_SPI_Read()
47 功能:从SPI 总线读取1 个字节的数据
48 返回:
49 读取到的数据*/
50
51 char ZLG7289_SPI_Read() reentrant
52 {
53 1 char dat;
54 1 unsigned char t = 8;
55 1 ZLG7289_pinDIO = 1; //读取数据之前DIO 引脚要置1 以切换到输入状态
C51 COMPILER V8.02 ZLG7289 03/19/2008 16:21:44 PAGE 2
56 1 do
57 1 {
58 2 ZLG7289_pinCLK = 1;
59 2 ZLG7289_ShortDelay();
60 2 dat <<= 1;
61 2 if ( ZLG7289_pinDIO ) dat++;
62 2 ZLG7289_pinCLK = 0;
63 2 ZLG7289_ShortDelay();
64 2 } while ( --t != 0 );
65 1 return dat;
66 1 }
67
68 /*
69 函数:ZLG7289_cmd()
70 功能:执行ZLG7289 纯指令
71 参数:
72 cmd:命令字
73 */
74
75 void ZLG7289_cmd(char cmd)
76 {
77 1 char sav = IE;
78 1 IE &= 0xFA; //关闭外部中断
79 1 ZLG7289_pinCS = 0;
80 1 ZLG7289_LongDelay();
81 1 ZLG7289_SPI_Write(cmd);
82 1 ZLG7289_pinCS = 1;
83 1 ZLG7289_LongDelay();
84 1 IE = sav; //恢复IE
85 1 }
86
87 /*
88 函数:ZLG7289_cmd_dat()
89 功能:执行ZLG7289 带数据指令
90 参数:
91 cmd:命令字
92 dat:数据
93 */
94
95 void ZLG7289_cmd_dat(char cmd, char dat)
96 {
97 1 char sav = IE;
98 1 IE &= 0xFA; //关闭外部中断
99 1 ZLG7289_pinCS = 0;
100 1 ZLG7289_LongDelay();
101 1 ZLG7289_SPI_Write(cmd);
102 1 ZLG7289_LongDelay();
103 1 ZLG7289_SPI_Write(dat);
104 1 ZLG7289_pinCS = 1;
105 1 ZLG7289_LongDelay();
106 1 IE = sav; //恢复IE
107 1 }
108
109 /*
110 函数:ZLG7289_Download()
111 功能:下载数据
112 参数:
113 mod=0:下载数据且按方式0 译码
114 mod=1:下载数据且按方式1 译码
115 mod=2:下载数据但不译码
116 x:数码管编号(横坐标),取值0~7
117 dp=0:小数点不亮
C51 COMPILER V8.02 ZLG7289 03/19/2008 16:21:44 PAGE 3
118 dp=1:小数点亮
119 dat:要显示的数据
120 说明:
121 译码方式的具体含义请参考数据手册
122 */
123
124 void ZLG7289_Download(unsigned char mod, char x, bit dp, char dat)
125 {
126 1 code char ModDat[3] = {0x80,0xC8,0x90};
127 1 char d1;
128 1 char d2;
129 1 if ( mod > 2 ) mod = 2;
130 1 d1 = ModDat[mod];
131 1 x &= 0x07;
132 1 d1 |= x;
133 1 d2 = dat & 0x7F;
134 1 if ( dp ) d2 |= 0x80;
135 1 ZLG7289_cmd_dat(d1,d2);
136 1 }
137 /*
138 功能:执行ZLG7289 键盘命令
139 返回:
140 返回读到的按键值:0~63
141 如果返回0xFF 则表示没有键按下
142 */
143 char ZLG7289_Key() reentrant
144 {
145 1 char key;
146 1 ZLG7289_pinCS = 0;
147 1 ZLG7289_LongDelay();
148 1 ZLG7289_SPI_Write(0x15);
149 1 ZLG7289_LongDelay();
150 1 key = ZLG7289_SPI_Read();
151 1 ZLG7289_pinCS = 1;
152 1 ZLG7289_LongDelay();
153 1 return key;
154 1 }
155
156 /*
157 函数:ZLG7289_Init()
158 功能:ZLG7289 初始化
159 参数:
160 t:SPI 总线的延时值设置,取值1-40(超出范围可能导致错误)
161 说明:
162 t的取值可以参照以下公式:t >= 5 * f1 / f2,其中f1 表示80C51 的
163 晶振频率,f2 表示ZLG7289 的晶振频率
164 */
165
166 void ZLG7289_Init()
167 {
168 1 //I/O 口初始化
169 1 ZLG7289_pinCS = 1;
170 1 ZLG7289_pinCLK = 0;
171 1 ZLG7289_pinDIO = 1;
172 1 ZLG7289_pinINT = 1;
173 1 }
174 /*
175 函数:dis( unsigned char r,unsigned char num,unsigned char *pdis)
176 功能:数码管的常规显示
177 参数:num:数码管显示的位数
178 *pdis:数码管组显示的数字指针
179 */
C51 COMPILER V8.02 ZLG7289 03/19/2008 16:21:44 PAGE 4
180 void ZLG7289_dis( unsigned char num,unsigned char *pdis)
181 {
182 1 unsigned char bdata i,dat;
183 1 bit dp;
184 1 for (i=num;i>0; i--)
185 1 {
186 2 dat=pdis[num-i];
187 2 dp=(bit)(dat&0x80); //最高位为小数点位
188 2 ZLG7289_Download(0,num-i,dp,dat);
189 2 }
190 1 }
191 /*
192 函数:dis( unsigned char r,unsigned char num,unsigned char *pdis)
193 功能:数码管消隐显示
194 参数:num:数码管显示的位数
195 *pdis:数码管组显示的数字指针
196 */
197 void ZLG7289_dissapear(unsigned char num,unsigned char *pdis)
198 {
199 1 unsigned int bdata dis_x=0xff;//消隐控制位
200 1 unsigned char i=num-1,dis_num=num;
201 1 dis_x=_iror_(dis_x,8-num);
202 1 while((pdis[i]==0)&(i!=0))
203 1 {
204 2 dis_x=_iror_(dis_x,1);
205 2 dis_num--;
206 2 i--;
207 2 }
208 1 i=dis_x;
209 1 ZLG7289_Hide(i);
210 1 ZLG7289_dis( 6,pdis);
211 1 }
212
213
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 506 ----
CONSTANT SIZE = 3 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 11
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -