注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

瘋人院

lunatic asylum

 
 
 

日志

 
 

ZLG7289B 的80C51 单片机C51 驱动程序软件包  

2009-09-07 17:21:44|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
ZLG7289B 的80C51 单片机C51 驱动程序软件包由两个文件组成:“ZLG7289.h”和
“ZLG7289.c”。头文件“ZLG7289.h”包括ZLG7289B 的I/O 接口定义和用户指令集声明,
C 语言文件“ZLG7289.c”是这些指令的具体实现。
以Keil C51 为例,该软件包的具体用法是:
(1)    将文件“ZLG7289.c”和“ZLG7289.h”一起复制到您的工程文件夹下;
(2)    根据电路的实际情况,在文件“ZLG7289.h”中重新定义I/O 接口;
(3)    把文件“ZLG7289.c”添加进工程中,在需要的地方包含头文件“ZLG7289.h”;
(4)    在main()函数的开始处应当调用一次初始化函数ZLG7289_Init();
(5)    以后在程序中可以直接使用ZLG7289B 的用户指令集了;
(6)    读取键值时使用函数ZLG7289_Key(),查询方式、中断方式皆可。
用户指令集汇总:
(1)    复位指令:ZLG7289_Reset();
(2)    测试指令:ZLG7289_Test();
(3)    左移指令:ZLG7289_SHL();
(4)    右移指令:ZLG7289_SHR();
(5)    循环左移:ZLG7289_ROL();
(6)    循环右移:ZLG7289_ROR();
(7)    下载数据:ZLG7289_Download(mod, x, dp, dat);
(8)    闪烁控制:ZLG7289_Flash(x);
(9)    消隐控制:ZLG7289_Hide(x);
(10)    段点亮控制:ZLG7289_SegOn(seg);
(11)    段关闭控制:ZLG7289_SegOff(seg);
(12)    读键盘数据指令:char ZLG7289_Key()。

使用说明:
1、以下函数必须去除其可重入属性,否则程序不能正常运行
函数:ZLG7289_SPI_Write(), ZLG7289_SPI_Read(),ZLG7289_Key()
2、ZLG7289芯片的晶体振荡器的频率应在4-12MHz之间。

8.2 头文件的程序清单
程序清单 8.1 ZLG7289B 的C51 驱动程序头文件(ZLG7289.h)
/*
ZLG7289.h
数码管显示与键盘管理芯片ZLG7289 的标准80C51 驱动程序头文件
Copyright (c) 2005,广州周立功单片机发展有限公司
All rights reserved.
本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的。
*/
#ifndef _ZLG7289_H_
#define _ZLG7289_H_
#include <reg52.h>
//定义I/O 接口
sbit ZLG7289_pinCS = P1^0; //片选信号,低电平有效
sbit ZLG7289_pinCLK = P1^1; //时钟信号,上升沿有效
sbit ZLG7289_pinDIO = P1^2; //数据信号,双向
sbit ZLG7289_pinINT = P3^2; //键盘中断请求信号,低电平(负边沿)有效
//执行ZLG7289 纯指令
extern void ZLG7289_cmd(char cmd);
//执行ZLG7289 带数据指令
extern void ZLG7289_cmd_dat(char cmd, char dat);
//以下是ZLG7289 的用户指令集
//复位(清除)指令
#define ZLG7289_Reset() ZLG7289_cmd(0xA4)
//测试指令
#define ZLG7289_Test() ZLG7289_cmd(0xBF)
//左移指令
#define ZLG7289_SHL() ZLG7289_cmd(0xA0)
//右移指令
#define ZLG7289_SHR() ZLG7289_cmd(0xA1)
//循环左移指令
#define ZLG7289_ROL() ZLG7289_cmd(0xA2)
//循环右移指令
#define ZLG7289_ROR() ZLG7289_cmd(0xA3)
//下载数据
extern void ZLG7289_Download(unsigned char mod, char x, bit dp, char dat);
//闪烁控制
// x 的8 个位分别对应数码管的8 个位,0-闪烁,1-不闪烁
#define ZLG7289_Flash(x) ZLG7289_cmd_dat(0x88,(x))
//消隐控制
// x 的8 个位分别对应数码管的8 个位,0-消隐,1-显示
#define ZLG7289_Hide(x) ZLG7289_cmd_dat(0x98,(x))
//段点亮指令
//seg=0~63,8 只数码管被看成64 只独立的LED
//每只数码管中各段的点亮顺序按照“g,f,e,d,c,b,a,dp”进行
#define ZLG7289_SegOn(seg) ZLG7289_cmd_dat(0xE0,(seg))
//段关闭指令
//seg=0~63,8 只数码管被看成64 只独立的LED
//每只数码管中各段的熄灭顺序按照“g,f,e,d,c,b,a,dp”进行
#define ZLG7289_SegOff(seg) ZLG7289_cmd_dat(0xC0,(seg))
//执行ZLG7289 键盘命令
extern char ZLG7289_Key() reentrant;
//ZLG7289 初始化
extern void ZLG7289_Init(unsigned char t);
#endif //_ZLG7289_H_

8.3 C 语言文件的程序清单

程序清单 8.2 ZLG7289B 的C51 驱动程序C 语言文件(ZLG7289.c)
/*
ZLG7289.c
数码管显示与键盘管理芯片ZLG7289 的标准80C51 驱动程序(C51)
Copyright (c) 2005,广州周立功单片机发展有限公司
All rights reserved.
本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的。
*/


#include "ZLG7289.h"
//定义一个全局变量,用于延时
//该变量在调用函数ZLG7289_Init()时被初始化
unsigned char ZLG7289_Delay_t;
/*
宏定义:ZLG7289_ShortDelay()
功能:短延时
说明:延时(ZLG7289_Delay_t*2+2)个机器周期
*/
#define ZLG7289_ShortDelay() \
{\
unsigned char t = ZLG7289_Delay_t;\
while ( --t != 0 );\
}
/*
宏定义:ZLG7289_LongDelay()
功能:长延时
说明:延时(ZLG7289_Delay_t*12+8)个机器周期
*/
#define ZLG7289_LongDelay() \
{\
unsigned char t = ZLG7289_Delay_t * 6;\
while ( --t != 0 );\
}
/*
函数:ZLG7289_SPI_Write()
功能:向SPI 总线写入1 个字节的数据
参数:
dat:要写入的数据
*/
void ZLG7289_SPI_Write(char dat)    //reentrant 去除可重入属性,否则程序不能正常运行
{
unsigned char t = 8;
do
{
ZLG7289_pinDIO = (bit)(dat & 0x80);
dat <<= 1;
ZLG7289_pinCLK = 1;
ZLG7289_ShortDelay();
ZLG7289_pinCLK = 0;
ZLG7289_ShortDelay();
} while ( --t != 0 );
}
/*
函数:ZLG7289_SPI_Read()
功能:从SPI 总线读取1 个字节的数据
返回:
读取到的数据
*/
char ZLG7289_SPI_Read()     // reentrant    去除可重入属性,否则程序不能正常运行
{
char dat;
unsigned char t = 8;
ZLG7289_pinDIO = 1; //读取数据之前DIO 引脚要置1 以切换到输入状态
do
{
ZLG7289_pinCLK = 1;
ZLG7289_ShortDelay();
dat <<= 1;
if ( ZLG7289_pinDIO ) dat++;
ZLG7289_pinCLK = 0;
ZLG7289_ShortDelay();
} while ( --t != 0 );
return dat;
}
/*
函数:ZLG7289_cmd()
功能:执行ZLG7289 纯指令
参数:
cmd:命令字
*/
void ZLG7289_cmd(char cmd)
{
char sav = IE;
IE &= 0xFA; //关闭外部中断
ZLG7289_pinCS = 0;
ZLG7289_LongDelay();
ZLG7289_SPI_Write(cmd);
ZLG7289_pinCS = 1;
ZLG7289_LongDelay();
IE = sav; //恢复IE
}
/*
函数:ZLG7289_cmd_dat()
功能:执行ZLG7289 带数据指令
参数:
cmd:命令字
dat:数据
*/
void ZLG7289_cmd_dat(char cmd, char dat)
{
char sav = IE;
IE &= 0xFA; //关闭外部中断
ZLG7289_pinCS = 0;
ZLG7289_LongDelay();
ZLG7289_SPI_Write(cmd);
ZLG7289_LongDelay();
ZLG7289_SPI_Write(dat);
ZLG7289_pinCS = 1;
ZLG7289_LongDelay();
IE = sav; //恢复IE
}
/*
函数:ZLG7289_Download()
功能:下载数据
参数:
mod=0:下载数据且按方式0 译码
mod=1:下载数据且按方式1 译码
mod=2:下载数据但不译码
x:数码管编号(横坐标),取值0~7
dp=0:小数点不亮
dp=1:小数点亮
dat:要显示的数据
说明:
译码方式的具体含义请参考数据手册
*/
void ZLG7289_Download(unsigned char mod, char x, bit dp, char dat)
{
code char ModDat[3] = {0x80,0xC8,0x90};
char d1;
char d2;
if ( mod > 2 ) mod = 2;
d1 = ModDat[mod];
x &= 0x07;
d1 |= x;
d2 = dat & 0x7F;
if ( dp ) d2 |= 0x80;
ZLG7289_cmd_dat(d1,d2);
}
/*
功能:执行ZLG7289 键盘命令
返回:
返回读到的按键值:0~63
如果返回0xFF 则表示没有键按下
*/
char ZLG7289_Key()     //reentrant   去除可重入属性,否则程序不能正常运行
{
char key;
ZLG7289_pinCS = 0;
ZLG7289_LongDelay();
ZLG7289_SPI_Write(0x15);
ZLG7289_LongDelay();
key = ZLG7289_SPI_Read();
ZLG7289_pinCS = 1;
ZLG7289_LongDelay();
return key;
}
/*
函数:ZLG7289_Init()
功能:ZLG7289 初始化
参数:
t:SPI 总线的延时值设置,取值1-40(超出范围可能导致错误)
说明:
t的取值可以参照以下公式:t >= 5 * f1 / f2,其中f1 表示80C51 的
晶振频率,f2 表示ZLG7289 的晶振频率
*/
void ZLG7289_Init(unsigned char t)
{
unsigned char x;
//I/O 口初始化
ZLG7289_pinCS = 1;
ZLG7289_pinCLK = 0;
ZLG7289_pinDIO = 1;
ZLG7289_pinINT = 1;
//延时初始化
ZLG7289_Delay_t = t;
//点亮所有数码管
for ( x=0; x<8; x++ )
{
ZLG7289_Download(1,x,1,8);
}
}

在这里开始书写日记、心情 …
  评论这张
 
阅读(1292)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017