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

📄 leds.c

📁 南京沁恒公司的SPI接口LED数码管驱动及键盘接口芯片的应用
💻 C
字号:
#include "leds.h"  
#include "..\main\ext_reg.h"
#include "..\main\port.h"
#include "..\comm\serial.h"
#include <intrins.h>	

#define NOP() {_nop_(); _nop_();}

#define CH451_RESET     0x0201    //复位
#define CH451_LEFTMOV   0x0300    //设置移动方式_左移
#define CH451_LEFTCYC   0x0301    //设置移动方式-左循
#define CH451_RIGHTMOV  0x0302    //设置移动方式-右移
#define CH451_RIGHTCYC  0x0303    //设置移动方式-右循	
#define CH451_SYSOFF    0x0400    //关显示、键盘、看门狗
#define CH451_SYSON1    0x0401    //开显示
#define CH451_SYSON2    0x0403    //开显示、键盘
#define CH451_SYSON3    0x0407    //开显示、键盘、看门狗功能
#define CH451_DSP       0x0500    //设置默认显示方式
#define CH451_BCD       0x0580    //设置BCD译码方式
#define CH451_TWINKLE   0x0600    //设置闪烁控制
#define CH451_DIG0      0x0800    //数码管位0显示
#define CH451_DIG1      0x0900    //数码管位1显示 
#define CH451_DIG2      0x0a00    //数码管位2显示
#define CH451_DIG3      0x0b00    //数码管位3显示
#define CH451_DIG4      0x0c00    //数码管位4显示
#define CH451_DIG5      0x0d00    //数码管位5显示	
#define CH451_DIG6      0x0e00    //数码管位6显示	
#define CH451_DIG7      0x0f00    //数码管位7显示

#define LEDsTOTALPOWER      0x08
#define LEDsTOTALMONEY      0x10
#define LEDsROOMNUMBER      0x20
#define LEDsDATETIME        0x08
#define LEDsBLANCE          0x10
#define LEDsCHARGE          0x20

sbit  SPI_DO = P2^0;
sbit  SPI_DI = P2^4;
sbit  SPI_CLK = P2^2;
sbit  SPI_CS_L = P2^3;
sbit  SPI_CS_R = P2^1; 
                           // f a b c d e g h
                           // 0    1    2    3    4    5    6    7
                           // 8    9    -    E    F    P    H    L
uchar code LEDs_Code[32] = { 0xfc,0x30,0x6e,0x7a,0xb2,0xda,0xde,0x70,                 
						     0xfe,0xfa,0x02,0xce,0xc6,0xe6,0xb6,0x8c,
                             0xfd,0x31,0x6f,0x7b,0xb3,0xdb,0xdf,0x71, 
                             0xff,0xfb,0x02,0xce,0xc6,0xe6,0xb6,0x00};

void LEDs_Init()
{    
    SPI_CS_L = 0;
    SPI_CS_R = 0;
    SPI_DI =  0;            // 先低后高,定义4线输入 
    SPI_DI =  1;   
    SPI_CLK = 1;
    SPI_CS_L = 1;
    SPI_CS_R = 1;
    LEDs_SendCmd(1,CH451_RESET);
    LEDs_SendCmd(2,CH451_RESET); 
    LEDs_SendCmd(1,CH451_SYSON2);    // 开显示、键盘
    LEDs_SendCmd(2,CH451_SYSON2); 
    LEDs_SendCmd(1,CH451_DSP);        
    LEDs_SendCmd(2,CH451_DSP); 

	m_RoomNumber_Count=0;
	m_RoomNumber_Value=0; 
	m_RoomMoney_Count=0;
	m_RoomMoney_Value=0; 

    m_LEDsState = TOTALPOWER;
}

void LEDs_Update()
{             
   switch(m_LEDsState)
    {
     case TOTALPOWER:  //16
	   LEDs_DisTotalPower();
       if(b_DATE)
		 { // 显示、调整日期
           LEDs_DisDate();
		 }
		 else
		 { // 显示、调整时间
           LEDs_DisTime();
		 }
       m_LEDsL[6] = LEDsTOTALPOWER; 
	   break;

	 case TOTALMONEY:  //17
	   LEDs_DisTotalMoney();
       if(b_DATE)
		 { // 显示、调整日期
           LEDs_DisDate();
		 }
		 else
		 { // 显示、调整时间
           LEDs_DisTime();
		 }
       m_LEDsL[6] = LEDsTOTALMONEY; 
	   break;

  	 case ROOMNUMBER:  //18
       LEDs_DisRoomNumber(); 
       m_LEDsL[6] = LEDsROOMNUMBER;  
	   break;

	 case DATETIME:  //19
	   LEDs_DisTotalPower();
         if(b_DATE)
		 { // 显示、调整日期
           LEDs_DisDate();
		 }
		 else
		 { // 显示、调整时间
           LEDs_DisTime();
		 }
       m_LEDsL[6] = LEDsTOTALPOWER;
       m_LEDsR[6] = LEDsDATETIME;
	   break;

	 case BLANCE:  //20
	   m_RoomNumber_Count = 4; 
       LEDs_DisRoomNumber(); 
	   LEDs_DisBlance(); 
       m_LEDsL[6] = LEDsROOMNUMBER;
       m_LEDsR[6] = LEDsBLANCE;
	   break;

	 case CHARGE:  //21
	   m_RoomNumber_Count = 4; 
       LEDs_DisRoomNumber();  
	   LEDs_DisCharge(); 
       m_LEDsL[6] = LEDsROOMNUMBER;
       m_LEDsR[6] = LEDsCHARGE;
	   break;

	 default:
       m_LEDsState = LEDSTATUS;      // 0 = idle 
	   break;
   }

   LEDs_SendCmd(2,CH451_DIG0|LEDs_Code[m_LEDsL[0]]); 
   LEDs_SendCmd(2,CH451_DIG1|LEDs_Code[m_LEDsL[1]]); 
   LEDs_SendCmd(2,CH451_DIG2|LEDs_Code[m_LEDsL[2]]); 
   LEDs_SendCmd(2,CH451_DIG3|LEDs_Code[m_LEDsL[3]]);  
   LEDs_SendCmd(2,CH451_DIG4|LEDs_Code[m_LEDsL[4]]);
   LEDs_SendCmd(2,CH451_DIG5|LEDs_Code[m_LEDsL[5]]);
   LEDs_SendCmd(2,CH451_DIG6|m_LEDsL[6]);	

   LEDs_SendCmd(1,CH451_DIG0|LEDs_Code[m_LEDsR[0]]); 
   LEDs_SendCmd(1,CH451_DIG1|LEDs_Code[m_LEDsR[1]]); 
   LEDs_SendCmd(1,CH451_DIG2|LEDs_Code[m_LEDsR[2]]);
   LEDs_SendCmd(1,CH451_DIG3|LEDs_Code[m_LEDsR[3]]);  
   LEDs_SendCmd(1,CH451_DIG4|LEDs_Code[m_LEDsR[4]]);  
   LEDs_SendCmd(1,CH451_DIG5|LEDs_Code[m_LEDsR[5]]); 
   LEDs_SendCmd(1,CH451_DIG6|m_LEDsR[6]); 
}
   
void LEDs_DisTotalPower()
{
    ulong  tmp;
	uchar  j;

    LEDs_SendCmd(2,CH451_TWINKLE);   //停止闪烁
    tmp = m_TotalPower;
	for(j=0;j<6;j++)
	{
      m_LEDsL[5-j] = tmp%10;
  	  tmp /= 10;
	}
    for(j=0;j<6;j++)
	{
       if(m_LEDsL[j] == 0)
	    { m_LEDsL[j] = 31; }
	   else
	    break;
	}
}

void LEDs_DisTotalMoney()
{
    ulong  tmp;
	uchar  j;

    LEDs_SendCmd(2,CH451_TWINKLE);   //停止闪烁
    tmp = m_TotalMoney;
	for(j=0;j<6;j++)
	{
      m_LEDsL[5-j] = tmp%10;
  	  tmp /= 10;
	}
	m_LEDsL[3] = m_LEDsL[3]+16;
    for(j=0;j<3;j++)
	{
       if(m_LEDsL[j] == 0)
	    { m_LEDsL[j] = 31; }
	   else
	    break;
	}
}

void LEDs_DisDate()
{  
    LEDs_SendCmd(1,CH451_TWINKLE);   //停止闪烁 1 = R 
    m_LEDsR[0] = Year_G/16; 
    m_LEDsR[1] = Year_G%16;   
    m_LEDsR[2] = Month_G/16;
    m_LEDsR[3] = Month_G%16; 
    m_LEDsR[4] = Day_G/16;
    m_LEDsR[5] = Day_G%16;
    m_LEDsR[6] = LEDsDATETIME;
}

void LEDs_DisTime()
{  
    m_LEDsR[0] = 31; 
    m_LEDsR[1] = Hour_G/16;
	if(m_LEDsR[1] == 0) 
	  { m_LEDsR[1] = 31; }
    m_LEDsR[2] = Hour_G%16; 
    m_LEDsR[3] = 10;   
    LEDs_SendCmd(1,CH451_TWINKLE|8);   //'-'闪烁
    m_LEDsR[4] = Minute_G/16;
    m_LEDsR[5] = Minute_G%16;
    m_LEDsR[6] = LEDsDATETIME;
}

void LEDs_DisRoomNumber()
{ 
   uint i;

   switch(m_RoomNumber_Count)
    {
	  case 0:
	    m_LEDsL[0] = 31;
        m_LEDsL[1] = 31;
        m_LEDsL[2] = 10;
        m_LEDsL[3] = 10;
        m_LEDsL[4] = 10;
        m_LEDsL[5] = 10;
        LEDs_SendCmd(2,CH451_TWINKLE|4);   //闪烁 2 = L
        m_LEDsR[0] = 31;
        m_LEDsR[1] = 31;
        m_LEDsR[2] = 31;
        m_LEDsR[3] = 31; 
        m_LEDsR[4] = 31;
        m_LEDsR[5] = 31; 
		m_LEDsR[6] = 0;
		break;

	  case 1:
        m_LEDsL[0] = 31;
        m_LEDsL[1] = 31;
        m_LEDsL[2] = m_RoomNumber_Value;
        m_LEDsL[3] = 10;
        m_LEDsL[4] = 10;
        m_LEDsL[5] = 10;
        LEDs_SendCmd(2,CH451_TWINKLE|8);   //闪烁
        break;

	  case 2:
        m_LEDsL[0] = 31;
        m_LEDsL[1] = 31;
        m_LEDsL[2] = m_RoomNumber_Value/10;
        m_LEDsL[3] = m_RoomNumber_Value%10;
        m_LEDsL[4] = 10;
        m_LEDsL[5] = 10;
        LEDs_SendCmd(2,CH451_TWINKLE|0x10);   //闪烁
        break;

	  case 3:
        m_LEDsL[0] = 31;
        m_LEDsL[1] = 31;
		i = m_RoomNumber_Value%100;
        m_LEDsL[2] = m_RoomNumber_Value/100;
        m_LEDsL[3] = i/10;
        m_LEDsL[4] = i%10;
        m_LEDsL[5] = 10;
        LEDs_SendCmd(2,CH451_TWINKLE|0x20);   //闪烁 
        break;

	  case 4:
        m_LEDsL[0] = 31;
        m_LEDsL[1] = 31;
        m_LEDsL[2] = m_RoomNumber_Value/1000;
		i = m_RoomNumber_Value%1000;
        m_LEDsL[3] = i/100;
		i = i%100;
        m_LEDsL[4] = i/10;
        m_LEDsL[5] = i%10;  
        LEDs_SendCmd(2,CH451_TWINKLE);   //停止闪烁  2=L 
        break;
	  default:
	    break;
	 }
}

void LEDs_DisBlance()
{
   uint i;

   LEDs_SendCmd(1,CH451_TWINKLE);   //停止闪烁  1=R

// 调用查询余额函数????????????

   i = m_RoomNumber_Value*5;

   m_LEDsR[0] = 31;
   m_LEDsR[1] = i/10000;
   i = i%10000;
   m_LEDsR[2] = i/1000;
   i = i%1000;
   m_LEDsR[3] = i/100;
   i = i%100;
   m_LEDsR[3] += 16;
   m_LEDsR[4] = i/10;
   m_LEDsR[5] = i%10;
   m_LEDsR[6] = LEDsBLANCE; 
}


void LEDs_DisCharge()
{ 
   uint i; 

   if(m_RoomMoney_Count==0)
    { 
        m_LEDsL[0] = 31;
        m_LEDsL[1] = 31;
        m_LEDsL[2] = m_RoomNumber_Value/1000;
		i = m_RoomNumber_Value%1000;
        m_LEDsL[3] = i/100;
		i = i%100;
        m_LEDsL[4] = i/10;
        m_LEDsL[5] = i%10;  
		LEDs_SendCmd(1,CH451_TWINKLE);   //停止闪烁
        LEDs_SendCmd(2,CH451_TWINKLE);   //停止闪烁 

        m_LEDsR[0] = 31;
        m_LEDsR[1] = 31;
        m_LEDsR[2] = 31;
        m_LEDsR[3] = 31; 
        m_LEDsR[4] = 31;
        m_LEDsR[5] = 0;
        m_LEDsR[6] = LEDsCHARGE;
	 }
	else
	 {   
        m_LEDsR[0] = 0; 
        m_LEDsR[1] = m_RoomMoney_Value/10000;
		i = m_RoomMoney_Value%10000;
        m_LEDsR[2] = i/1000;
		i = i%1000;
        m_LEDsR[3] = i/100; 
        m_LEDsR[3] += 16;
		i = i%100;
        m_LEDsR[4] = i/10;
        m_LEDsR[5] = i%10;  
      }
 
	if(m_LEDsR[0] == 0)
	 {
	   if(b_NEGATIVE)
	    {
          m_LEDsR[0] = 10;
		}
	   else
	    {
          m_LEDsR[0] = 31;
		}
	 }
	else
	 {
        return;
	 }
	if(m_LEDsR[1] == 0)
	 {
	   if(b_NEGATIVE)
	    {
          m_LEDsR[1] = 10;
          m_LEDsR[0] = 31;
		}
	   else
	    {
          m_LEDsR[1] = 31;
		}
	 }
	else
	 {
        return;
	 }
	if(m_LEDsR[2] == 0)
	 {
	   if(b_NEGATIVE)
	    {
          m_LEDsR[2] = 10;
          m_LEDsR[1] = 31;
          m_LEDsR[0] = 31;
		}
	   else
	    {
          m_LEDsR[2] = 31;
		}
	 }
	else
	 {
        return;
	 }
}

void LEDs_DisRFlash(uchar x)
{
   if(x)
    { LEDs_SendCmd(1,CH451_TWINKLE|0x3f); }  //闪烁 
   else
    { LEDs_SendCmd(1,CH451_TWINKLE); }  //停止闪烁 
}

void LEDs_SendCmd(uchar cs, uint cmd)
{ 
   uchar j;
 
   if(cs == 1)
    { SPI_CS_L = 0; SPI_CS_R = 1; }
   else
    {
      if(cs == 2)
	   { SPI_CS_L = 1; SPI_CS_R = 0; }
	  else
	   { return; }
    }                     

   for(j=0;j<12;j++)
    { 
	  NOP();
	  SPI_CLK = 0;                        
      SPI_DI = cmd&1;				      
      cmd >>= 1;
      SPI_CLK = 1;                           
    }   
   SPI_CS_L = 1;  
   SPI_CS_R = 1;              
   NOP();  
   NOP();   
}
  
uchar LEDs_GetKey(uchar cs)
{
   uchar j,cmd,keycode;  
 
   cmd = 0x07;		// 读CH451命令字
 
   if(SPI_DO) return 0xff;

   if(cs == 1)
    { SPI_CS_L = 0; }
   else
    {
      if(cs == 2)
	   { SPI_CS_R = 0; }
	  else
	   { return 0xff; }
    }      

   for(j=0;j<4;j++)
    {
	  NOP();
      SPI_CLK = 0;
	  SPI_DI = cmd&1;		    
      cmd >>= 1;	  
      SPI_CLK = 1;		
    }

   if(cs == 1)
    { SPI_CS_L = 1; }
   if(cs == 2)
    { SPI_CS_R = 1; }  
 
   keycode=0;				    
   for(j=0;j<7;j++)
   {
     NOP();
     SPI_CLK = 0;	
     keycode <<= 1;	  
     keycode |= SPI_DO;
     SPI_CLK = 1;
   }
   return keycode;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -