📄 main.c
字号:
#include "reg24le1.h"
/*****************************************
/nRF24LE1和ZLG7289键盘管理和数码显示芯片
******************************************/
#define DIO P07
#define SCLK P02
#define INT P06 /*一定接上拉电阻*/
#define CS P00
#define Disableint do{EA=0;}while(0)
#define Enableint do{EA=1;}while(0)
#define BAUD_2400 2400
#define BAUD_4800 4800
#define BAUD_9600 9600
#define BAUD_14400 14400
#define BAUD_19200 19200
#define BAUD_38400 38400
typedef unsigned int uint;
typedef unsigned char uchar;
/*****************************************
/延时函数
*****************************************/
void Delay(uint x)
{
uchar l;
for(;x>0;x--)
for(l=12;l>0;l--)
{}
}
/*****************************************
/nRF24LE1时钟设置
******************************************/
void SetMcuClk()
{
CLKCTRL = 0x28; /*使用 XCOSC16M */
CLKLFCTRL = 0x01;
}
/*****************************************
/nRF24LE1的串口初始化
******************************************/
void Uartinit(uint baud)
{
P0DIR &= 0xF7; /* 设置P0.3(TxD)为输出 */
P0DIR |= 0x10; /* 设置P0.4(RxD)为输入 */
S0CON = 0x50; /* 串口模式选择允许接收*/
PCON |= 0x80; /* 波特率倍增 */
WDCON |= 0x80; /* 选用内部波特率发生器*/
switch(baud)
{
case 38400:
{
S0RELL = 0xF3;
S0RELH = 0x03;
}
break;
case 19200:
{
S0RELL =0xE6;
S0RELH =0x03;
}
break;
case 14400:
{
S0RELL =0xDE;
S0RELH =0x03;
}
break;
case 9600 :
{
S0RELL =0xCC;
S0RELH =0x03;
}
break;
case 4800 :
{
S0RELL =0x98;
S0RELH =0x03;
}
break;
case 2400 :
{
S0RELL =0x30;
S0RELH =0x03;
}
break;
default :
{
S0RELL =0xCC;
S0RELH =0x03;
}
break;
}
return ;
}
/****************************************
/nRF24LE1串口发送一个字符
*****************************************/
void putch(uchar ch)
{
S0BUF=ch;
while(!TI0);
TI0=0;
}
/****************************************
/nRF24LE1串口发送一个字符串
*****************************************/
void puts(char *str)
{
while(*str!='\0')
{
putch(*str++);
}
Delay(10);
}
/****************************************
/nRF24LE1的I/O口初始化函数
*****************************************/
void ZLG7289init()
{
P0DIR=(BIT_6|BIT_7);/*初始化INT1和DIO为输入*/
CS=1;
SCLK=1;
DIO=1;
INT=1;
/*开启外部中断接上拉电阻,输入端口选择INT*/
INTEXP|=BIT_4; /*INT1使能 */
IT0=1; /*下降沿触发*/
EX0=1; /*开启外部中断*/
}
/****************************************
/模拟spi接口传输一个字节
*****************************************/
void WriteSPI(uchar Dat)
{
uchar cT = 8;
P0DIR &=(~(BIT_7));
/*
* 循环写一个字节的数据
*/
do {
if((Dat & 0x80) == 0x80) {
DIO=1;
} else {
DIO=0;
}
Dat <<= 1;
SCLK=1;
Delay(5);
SCLK=0;
Delay(5);
} while (--cT != 0);
}
/***************************************
/从模拟的SPI读取一个字节
****************************************/
uchar ReadSPI(void)
{
uchar cDat = 0;
uchar cT = 8;
P0DIR|=BIT_7; /*设置为输入,需要接上拉电阻*/
/*
* 循环读一个字节的数据
*/
do {
SCLK=1;
Delay(5);
cDat <<= 1;
if (DIO) {
cDat++;
}
SCLK=0;
Delay(5);
} while (--cT != 0);
return cDat;
}
/****************************************
/给7289写指令
*****************************************/
void WriteCmd(uchar Cmd)
{
CS=0;
Delay(25);
WriteSPI(Cmd);
CS=1;
Delay(5);
}
/****************************************
/给7289写指令和数据
*****************************************/
void WriteCmdDat(uchar Cmd,uchar Dat)
{
CS=0;
Delay(25);
WriteSPI(Cmd);
Delay(15);
WriteSPI(Dat);
CS=1;
Delay(5);
}
/****************************************
/在数码管上显示内容
*****************************************/
void ZLG7289DownLoad(uchar Mod,uchar cX,uchar cDp,uchar cDat)
{
uchar ucModDat[3] = {0x80,0xC8,0x90};
uchar ucD1;
uchar ucD2;
if (Mod > 2)
{
Mod = 2;
}
ucD1 = ucModDat[Mod];
cX &= 0x07;
ucD1 |= cX;
ucD2 = cDat & 0x7F;
if (cDp == 1) {
ucD2 |= 0x80;
}
WriteCmdDat(ucD1, ucD2);
}
/****************************************
/读取一个按键值
*****************************************/
uchar GetKey()
{
uchar cKey;
CS=0;
Delay(25);
WriteSPI(0x15);
Delay(15);
cKey =ReadSPI();
CS=1;
Delay(5);
return cKey;
}
/****************************************
/7289用户指令集
/复位(清除)指令
*****************************************/
void zlg7289Reset()
{ WriteCmd(0xA4);
}
/***************************************
/测试指令
****************************************/
void zlg7289Test()
{
WriteCmd(0xBF);
}
/***************************************
/左移指令
****************************************/
void zlg7289SHL()
{
WriteCmd(0xA0);
}
/***************************************
/右移指令
****************************************/
void zlg7289SHR()
{
WriteCmd(0xA1);
}
/***************************************
/循环左移指令
****************************************/
void zlg7289ROL()
{
WriteCmd(0xA2);
}
/***************************************
/循环右移指令
****************************************/
void zlg7289ROR()
{
WriteCmd(0xA3);
}
/***************************************
/闪烁控制
***************************************/
void zlg7289Flash(uchar cX)
{
WriteCmdDat(0x88, (cX));
}
/**************************************
/消隐控制
**************************************/
void zlg7289Hide(uchar cX)
{
WriteCmdDat(0x98, (cX));
}
/*************************************
/段打开指令 8个数码管被看成64个独立LED
*************************************/ /* 0:消隐 1:显示 */
void zlg7289SegOn(uchar cSeg)
{
WriteCmdDat(0xE0, (cSeg));
}
/************************************
/段关闭指令 8个数码管被看成64个独立LED
************************************/
void zlg7289SegOff(uchar cSeg)
{
WriteCmdDat(0xC0, (cSeg));
}
/***********************************
/外部中断服务函数
************************************/
uchar KeyValue=0;
void EXTISR() interrupt INTERRUPT_IFP
{
EX0=0;
KeyValue=GetKey();
ZLG7289DownLoad (0, 0, 0, KeyValue);
ZLG7289DownLoad (0, 1, 0, KeyValue);
ZLG7289DownLoad (0, 2, 0, KeyValue);
ZLG7289DownLoad (0, 3, 0, KeyValue);
ZLG7289DownLoad (0, 4, 0, KeyValue);
ZLG7289DownLoad (0, 5, 0, KeyValue);
ZLG7289DownLoad (0, 6, 0, KeyValue);
ZLG7289DownLoad (0, 7, 0, KeyValue);
putch('0'+(KeyValue/10));
putch('0'+(KeyValue%10));
putch('\n');
EX0=1;
}
/***********************************
/主函数部分
************************************/
void main()
{
/*初始化*/
Disableint;
SetMcuClk();
Uartinit(BAUD_9600);
ZLG7289init();
zlg7289Reset();
Enableint;
Delay(100);
ZLG7289DownLoad (0, 0, 0, 0);
ZLG7289DownLoad (0, 1, 0, 1);
ZLG7289DownLoad (0, 2, 0, 2);
ZLG7289DownLoad (0, 3, 0, 3);
ZLG7289DownLoad (0, 4, 0, 4);
ZLG7289DownLoad (0, 5, 0, 5);
ZLG7289DownLoad (0, 6, 0, 6);
ZLG7289DownLoad (0, 7, 0, 7);
while(1);
}
/**************************************
/ 程序到此结束 /
***************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -