⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 菜鸟,详细NRF24E1运用,程序,电路
💻 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 + -