?? zlg7289.h
字號:
/*
程序名稱:
數碼管顯示與鍵盤管理芯片ZLG7289的標準80C51驅動程序(C51)
文件名:
ZLG7289.h
作者:
廣州周立功單片機發展有限公司 王大星,2005年6月
說明:
本程序已經調試通過
程序的可移植性很好,僅做少量修改就可以直接包含使用
程序占用資源少,僅使用4根必須I/O口線,不占用定時器等其它資源
所有全局性的標識符都以ZLG7289_開頭,不必擔心命名沖突問題
程序結構清晰,思路明確,結合ZLG7289的數據手冊很容易理解
用法:
1、重新定義I/O接口
2、如果CPU的主頻比較高,則要適當調整延時,詳見ZLG7289_Delay()函數
3、在用戶程序中包含本頭文件
4、在main()函數的開始處添加初始化函數ZLG7289_Init()
5、以后在程序中可以直接使用ZLG7289的用戶指令集
6、讀取鍵盤掃描碼使用函數ZLG7289_Key(),查詢方式、中斷方式皆可
用戶指令集匯總:
復位指令:void ZLG7289_Reset();
測試指令:void ZLG7289_Test();
左移指令:void ZLG7289_SHL();
右移指令:void ZLG7289_SHR();
循環左移:void ZLG7289_ROL();
循環右移:void ZLG7289_ROR();
下載數據:void ZLG7289_Download(char mod,char addr,bit dp,char dat);
閃爍控制:void ZLG7289_Flash(char dat);
消隱控制:void ZLG7289_Hide(char dat);
段點亮控制:void ZLG7289_SegOn(char dat);
段關閉控制:void ZLG7289_SegOff(char dat);
讀鍵盤數據指令:char ZLG7289_Key();
*/
#ifndef _ZLG7289_H_
#define _ZLG7289_H_
#include <reg52.h>
#include <intrins.h>
//定義I/O接口
sbit ZLG7289_pinCS = P1^0; //片選信號,低電平有效
sbit ZLG7289_pinCLK = P1^1; //時鐘信號:上升沿有效
sbit ZLG7289_pinDIO = P1^2; //數據信號:雙向
sbit ZLG7289_pinKEY = P3^2; //鍵盤中斷請求信號,低電平有效
/*
功能:專用的延時函數,延時幾微秒到幾百微秒
參數:
t:決定延時長短
說明:
本程序在12MHz主頻的標準80C51上調試通過。
如果實際的CPU速度較快,則要適當增加_nop_()語句的個數;
*/
static void ZLG7289_Delay(unsigned char t) reentrant
{
do
{
_nop_();
}while ( --t );
}
/*
功能:通過SPI總線寫一個字節
參數:
dat:要發送的數據
*/
static void ZLG7289_SPI_Write(char dat) reentrant
{
unsigned char t;
t = 8;
do
{
ZLG7289_pinDIO = (bit)(dat & 0x80);
dat <<= 1;
ZLG7289_pinCLK = 1;
ZLG7289_Delay(8);
ZLG7289_pinCLK = 0;
ZLG7289_Delay(6);
} while ( --t );
}
/*
功能:通過SPI總線讀一個字節
*/
static char ZLG7289_SPI_Read() reentrant
{
char dat;
unsigned char t;
ZLG7289_pinDIO = 1;
t = 8;
do
{
ZLG7289_pinCLK = 1;
ZLG7289_Delay(8);
dat <<= 1;
if ( ZLG7289_pinDIO ) dat++;
ZLG7289_pinCLK = 0;
ZLG7289_Delay(7);
} while ( --t );
return dat;
}
/*
功能:執行ZLG7289純指令
參數:
cmd:命令字
*/
static void ZLG7289_cmd(char cmd)
{
ZLG7289_pinCS = 0;
ZLG7289_Delay(50);
ZLG7289_SPI_Write(cmd);
ZLG7289_pinCS = 1;
ZLG7289_Delay(10);
}
/*
功能:執行ZLG7289帶數據指令
參數:
cmd:命令字
dat:數據
*/
static void ZLG7289_cmd_dat(char cmd, char dat)
{
ZLG7289_pinCS = 0;
ZLG7289_Delay(50);
ZLG7289_SPI_Write(cmd);
ZLG7289_Delay(25);
ZLG7289_SPI_Write(dat);
ZLG7289_pinCS = 1;
ZLG7289_Delay(10);
}
//以下定義ZLG7289的用戶指令集
//復位(清除)指令
#define ZLG7289_Reset() ZLG7289_cmd(0xA4)
//測試指令
#define ZLG7289_Test() ZLG7289_cmd(0xBF)
//左移指令
#define ZLG7289_SHL() ZLG7289_cmd(0xA1)
//右移指令
#define ZLG7289_SHR() ZLG7289_cmd(0xA0)
//循環左移指令
#define ZLG7289_ROL() ZLG7289_cmd(0xA3)
//循環右移指令
#define ZLG7289_ROR() ZLG7289_cmd(0xA2)
/*
功能:下載數據
參數:
mod=0:下載數據且按方式0譯碼
mod=1:下載數據且按方式1譯碼
mod=2:下載數據但不譯碼
addr:數碼管地址位,取值0~7
dp=0:小數點不亮
dp=1:小數點亮
dat:要顯示的數據,取值0~15,詳見數據手冊
*/
extern void ZLG7289_Download(char mod, char addr, bit dp, char dat)
{
code char ModDat[3] = {0x80,0xC8,0x90};
char d1;
char d2;
if ( ( mod < 0 ) || ( mod > 2 ) ) mod = 2;
d1 = ModDat[mod];
addr &= 0x07;
d1 |= addr;
d2 = dat & 0x7F;
if ( dp ) d2 |= 0x80;
ZLG7289_cmd_dat(d1,d2);
}
//閃爍控制
#define ZLG7289_Flash(dat) ZLG7289_cmd_dat(0x88,dat)
//消隱控制
#define ZLG7289_Hide(dat) ZLG7289_cmd_dat(0x98,dat)
//段點亮指令
#define ZLG7289_SegOn(dat) ZLG7289_cmd_dat(0xE0,dat)
//段關閉指令
#define ZLG7289_SegOff(dat) ZLG7289_cmd_dat(0xC0,dat)
/*
功能:執行ZLG7289鍵盤命令
返回值:
返回讀到的按鍵值
說明:
本函數已經被定義成再入屬性,因此在中斷服務程序里也可以調用
當有鍵按下時,ZLG7289的KEY引腳將出現低電平,向主機提出中斷申請
主機采用查詢方式或中斷方式去處理都是可以的
應當在KEY引腳出現低電平時立即用本函數去讀取鍵值
讀取鍵值后,KEY引腳不會自動恢復為高電平,一定要等到按鍵抬起為止
如果沒有及時讀取按鍵值,當按鍵抬起時,KEY引腳也將恢復高電平
在ZLG7289的KEY引腳處于高電平期間,試圖去讀取鍵值將得不到有意義的數據
如果采用中斷方式,建議選擇負邊沿觸發模式
*/
extern char ZLG7289_Key() reentrant
{
char key;
ZLG7289_pinCS = 0;
ZLG7289_Delay(50);
ZLG7289_SPI_Write(0x15);
ZLG7289_Delay(25);
key = ZLG7289_SPI_Read();
ZLG7289_pinCS = 1;
ZLG7289_Delay(10);
return key;
}
/*
功能:ZLG7289初始化
*/
extern void ZLG7289_Init()
{
unsigned char addr;
//I/O口初始化
ZLG7289_pinCS = 1;
ZLG7289_pinCLK = 0;
ZLG7289_pinDIO = 1;
ZLG7289_pinKEY = 1;
//點亮所有數碼管
for ( addr=0; addr<8; addr++ )
{
ZLG7289_Download(1,addr,1,8);
}
}
#endif //_ZLG7289_H_
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -