打印
[复制链接]
1708|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shangjin66733|  楼主 | 2011-9-30 14:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
ZLG7289U.c
数码管显示与键盘管理芯片ZLG7289的NUC1XX驱动程序。
2011年9月21日
*/
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "ZLG7289U.h"
/*
函数:ZLG7289_SPI_Write()
功能:向SPI总线写入1个字节的数据。
参数:dat:要写入的数据
*/
void ZLG7289_SPI_Write(uint8_t dat)
{
uint8_t i;
for (i=0;i<8;i++)           
{                           
            if (dat&0x80)
            {
            SET_DIO ;         
            }
            else
            {
            CLR_DIO;
            }     
     SET_CLK;                 
     DrvSYS_Delay(50);   
     CLR_CLK;                                
     DrvSYS_Delay(50);  
     dat=dat<<=1;
}           
}
/*
函数:ZLG7289_SPI_Read()
功能:从SPI总线读取1个字节的数据。
返回值:dat:读取到的数据。
*/
char ZLG7289_SPI_Read()
{
char dat;
uint8_t t=8;
SET_DIO;
do
{
  SET_CLK;
  DrvSYS_Delay(50);
  dat<<=1;
  INPUT_DIO;
  if(GETBIT_DIO)dat++;
  CLR_CLK;
  DrvSYS_Delay(50);
}
while(--t!=0);
QUA_DIO;
return (dat);
}
/*
函数:ZLG7289_cmd()
功能:执行ZLG7289纯指令。
参数:cmd:命令字。
*/
void ZLG7289_cmd(uint8_t cmd)
{
CLR_CS;
DrvSYS_Delay(180);
ZLG7289_SPI_Write(cmd);
SET_CS;
DrvSYS_Delay(180);
}
/*
函数:ZLG7289_cmd_dat()
功能:执行ZLG7289带数据指令。
参数:cmd:命令字,dat:数据。
*/
void ZLG7289_cmd_dat(uint8_t cmd,uint8_t dat)
{
CLR_CS;
DrvSYS_Delay(180);
ZLG7289_SPI_Write(cmd);
DrvSYS_Delay(180);
ZLG7289_SPI_Write(dat);
SET_CS;
DrvSYS_Delay(180);  
}
/*
函数:ZLG7289_Download()
功能:在指定位显示指定段码
参数:
x:数码管编号(横坐标),取值0~7
mod=0:下载数据且按方式0 译码
mod=1:下载数据且按方式1 译码
mod=2:下载数据但不译码
d:要显示的数据
dp=0:小数点不亮
dp=1:小数点亮
*/
void ZLG7289_Download(uint8_t mod,uint8_t x,uint8_t dp,uint8_t dat)
{
uint8_t ModDat[3] = {0x80,0xC8,0x90};
uint8_t d1;
uint8_t 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);
}
/*
函数:char ZLG7289_Key()
功能:执行ZLG7289键盘命令
返回值:返回读到的键盘值:0~63。
*/
char ZLG7289_Key()
{
char key;
CLR_CS;
DrvSYS_Delay(180);
ZLG7289_SPI_Write(0x15);
DrvSYS_Delay(180);
key=ZLG7289_SPI_Read();
SET_CS;
DrvSYS_Delay(180);
return key;
}
/*
函数:ZLG7289_Init()
功能:ZLG7289初始化。
*/
void ZLG7289_Init(void)
{
uint8_t x;
FMQ_OUT;
OUT_CS;                        
     QUA_DIO;
     QUA_KEY;
     OUT_CLK;
FMQ_SET;
SET_CS;
CLR_CLK;
SET_DIO;
SET_KEY;
for(x=0;x<8;x++)
{
  ZLG7289_Download(1,x,1,8);
}
}

相关帖子

沙发
hotpower| | 2011-9-30 19:38 | 只看该作者
为何不用硬件spi?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝