本帖最后由 kuangnan 于 2011-12-20 16:56 编辑
我用51做产品,做了块HD7279驱动的键盘,LED显示,LED指示板,现用NUC120来实现点亮。
用HD7279的好处是3个IO口就能搞定LED显示,对于用51单片机的同志们来说,是多么好的东西,而且还外带搞定64个键盘。HD7279工作电压在4.5V-5V之间,所以用M0来实现,你必须给HD7279单独供电。
本例中我用得端口是 PA.2;PA.3;PA.4这三个端口,主要是学习板上LED灯也是这个IO口,图个方便,好观察而已。
连线:PA.2----CS;PA.3---CLK,PA.4---DATA; HD7279电源:5V另接
接下来就要改HD7279头文件了:
很简单,直接删掉原先C51的所有头文件,用以下替换就可
#ifndef __nuc1xx_H__
#include "nuc1xx.h"
#endif
并把各管脚换成新唐的脚(呵呵 M0的脚);延时函数都省略了,直接用 DrvSYS_Delay(10);//delayus(10);替换。
程序下载,一次成功。
为什么要做这个简单的显示呢?因为有了板子后,我们总得有个观察数据的地方呀,你可能用LCD,也可能直接串口到你的电脑显示器,所以拿到板子后,我还是弄51的习惯,就点个LED数码管吧先。附上完整的 HD7279.H文件。由于是接触板子才2-3天,有改进的地方希望同志们指正。
//HD7279A指令
#ifndef __nuc1xx_H__
#include "nuc1xx.h"
#endif
/* HD7279_CS=GPA2;
HD7279_CLK=GPA3;
HD7279_Data=GPA4;
HD7279_key=GPA5;//用INT0触发检测键盘是否有按键
*/
#define CMD_RESET 0xa4//复位
#define CMD_TEST 0xbf//测试
#define DECODE0 0x80//
#define DECODE1 0xc8//
#define CMD_READ 0x15//读取键盘指令
#define HD7279_UNDECODE 0x90//
#define RTL_CYCLE 0xa3//循环左移指令
#define RTR_CYCLE 0xa2//循环右移指令
#define RTL_UNCYL 0xa1//左移指令
#define RTR_UNCYL 0xa0//右移指令
#define ACTCTL 0x98//消隐
#define SEGON 0xe0//段点亮
#define SEGOFF 0xc0//段关闭
#define BLINKCTL 0x88//闪烁控制
#define DIGIT1 HD7279_UNDECODE+0
#define DIGIT2 HD7279_UNDECODE+1
#define DIGIT3 HD7279_UNDECODE+2
#define DIGIT4 HD7279_UNDECODE+3
#define DIGIT5 HD7279_UNDECODE+4
#define DIGIT6 HD7279_UNDECODE+5
#define DIGIT7 HD7279_UNDECODE+6
#define DIGIT8 HD7279_UNDECODE+7
#define NOTHING 0xFF
/***********微秒**************
void delayus(uint16 t)
{
uint16 d=0;
d=t;
do
{
NOP();
}while(--d>0);
}
/***************************/
uint8 HD7279_Read_Byte()
{
uint8 i, Byte=0;
DrvGPIO_SetBit(E_GPA, 4);//HD7279_Data=1;
DrvSYS_Delay(10);//delayus(10);
for(i=0;i<8;i++)
{
DrvGPIO_SetBit(E_GPA, 3);//HD7279_CLK=1;
DrvSYS_Delay(2);//delayus(2);
Byte<<=1;
if(DrvGPIO_GetBit(E_GPA,4))//if(HD7279_Data)
{
Byte=Byte|0x01;
}
DrvGPIO_ClrBit(E_GPA, 3);//HD7279_CLK=0;
DrvSYS_Delay(4);//delayus(2);
}
return Byte;
}
/*************发送一个字节****************************/
void send_byte(uint8 out_byte)
{
uint8 i;
//HD7279_CS=0;
//delayus(50);//long_delay();
for(i=0;i<8;i++)
{
if(out_byte&0x80)//逻辑与全1出1,否则为0
{
DrvGPIO_SetBit(E_GPA, 4);// HD7279_Data=1;
}
else
{
DrvGPIO_ClrBit(E_GPA, 4);// HD7279_Data=0;
}
DrvGPIO_SetBit(E_GPA, 3);//HD7279_CLK=1;
DrvSYS_Delay(4);//delayus(4);
DrvGPIO_ClrBit(E_GPA, 3);//HD7279_CLK=0;
DrvSYS_Delay(4);//delayus(4);
out_byte=out_byte*2;//左移一位
}
DrvGPIO_ClrBit(E_GPA, 4);//HD7279_Data=0;
}
/***********************/
uint8 HD7279_Read_Data(uint8 Command)
{
uint8 Temp=0;
DrvGPIO_ClrBit(E_GPA, 2);//HD7279_CS=0;
DrvSYS_Delay(50);//delayus(50);
send_byte(Command);
Temp=HD7279_Read_Byte();
DrvSYS_Delay(1);//_nop_();
DrvGPIO_SetBit(E_GPA, 2);//HD7279_CS=1;
return(Temp);
}
/******************************************/
/*********读取一个字节**************
UINT8 read_byte(UINT8 command)
{
send_byte(command);
delayus(4);
return(receive_byte());
}
/***********写入一个字节************************/
void write7279(uint8 cmd,uint8 dta)
{
DrvGPIO_ClrBit(E_GPA, 2);//HD7279_CS=0;
DrvSYS_Delay(50);//delayus(50);
send_byte(cmd);// HD7279_Write_Byte(Command);
send_byte(dta);//HD7279_Write_Byte(Data);
DrvGPIO_SetBit(E_GPA, 2);//HD7279_CS=1;
} |