📄 595led.c
字号:
//========================================================================
// 文件名: 595LED.c
// 作 者: xinqiang Zhang(小丑) (email: xinqiang@Mzdesign.com.cn)
// 日 期: 2007/06/29
// 描 述: 通过四个595,共两组,驱动12个LED数码管的显示驱动程序集
//
// 参 考: 无
// 版 本:
// 2007/06/29 First version Mz Design
//========================================================================
#include "LPC213x.H" /* LPC21xx definitions */
#include "type.h"
#define SIOG0_SDA 1<<6
#define SIOG0_SCK 1<<4
#define SIOG0_LOCK 1<<7
#define SIOG1_SDA 1<<19
#define SIOG1_SCK 1<<17
#define SIOG1_LOCK 1<<18
#define SIO_LED_PORTSEL PINSEL0
#define SIO_LED_PORTDIR IODIR0
#define SIO_LED_PORTSET IOSET0
#define SIO_LED_PORTCLR IOCLR0
unsigned char LED_Show_Seg[12]; //12个LED的段码显示数据,每个char 表示一个LED数码管的
unsigned char LED_Seg_Mask[12]; //12个数码管的掩膜数据,用在控制哪个管亮或者不亮的控制
//数码管闪烁时用
unsigned char LED_RG_flag=0; //红绿两个数码管的显示控制,第7和第6位有效
unsigned char LED_Show_Com=1; //数码管扫描显示公共端控制(0x01~0x20)
unsigned char LED_Show_Index=0;
//unsigned int LED_Flash_flag = 0; //LED数码管闪烁标识,从第0位开始每一个位对应一个数码管
unsigned char LED_Flash_Mask[12]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
const unsigned char LEDSegTable[15]={0xbb,0x0a,0xd9,0x5b,0x6a,0x73,0xf3,0x1a,0xfb,0x7b,0x04,0x00,0xf0,0x40,0xf1};
//0,1,2,3,4,5,6,7,8,9,., ,F,-,E//
void SIOLED_Initial(void)
{
unsigned char i=0;
PINSEL0 &= ~0x0c00f300;//
PINSEL1 &= ~0x000003f0;//
IODIR0 |= (SIOG0_SDA|SIOG0_SCK|SIOG0_LOCK|SIOG1_SDA|SIOG1_SCK|SIOG1_LOCK)+(1<<13);
IOSET0 = (SIOG0_SDA|SIOG0_SCK|SIOG0_LOCK|SIOG1_SDA|SIOG1_SCK|SIOG1_LOCK);
for(i=0;i<12;i++)
{
LED_Seg_Mask[i] = 0xff;
LED_Show_Seg[i] = LEDSegTable[0];
}
/* LED_Show_Seg[0] = 0x01;
LED_Show_Seg[1] = 0x01<<1;
LED_Show_Seg[2] = 0x01<<2;
LED_Show_Seg[3] = 0x01<<3;
LED_Show_Seg[4] = 0x01<<4;
LED_Show_Seg[5] = 0x01<<5;
LED_Show_Seg[6] = 0x01<<6;
LED_Show_Seg[7] = 0x01<<7; */
}
void SIOLED_G0Send(unsigned int SIO_D0)
{
unsigned char i;//
SIO_LED_PORTCLR = SIOG0_LOCK;
for(i=0;i<16;i++)
{
SIO_LED_PORTCLR = SIOG0_SCK;
if(SIO_D0&0x8000)
{
SIO_LED_PORTSET = SIOG0_SDA;
}//
else
{
SIO_LED_PORTCLR = SIOG0_SDA;
}
SIO_LED_PORTSET = SIOG0_SCK;
SIO_D0 = SIO_D0<<1;
}
SIO_LED_PORTSET = SIOG0_LOCK;
}
void SIOLED_G1Send(unsigned char SIO_D1)
{
unsigned char i;//
SIO_LED_PORTCLR = SIOG1_LOCK;
for(i=0;i<8;i++)
{
SIO_LED_PORTCLR = SIOG1_SCK;
if(SIO_D1&0x80)
{
SIO_LED_PORTSET = SIOG1_SDA;
}//
else
{
SIO_LED_PORTCLR = SIOG1_SDA;
}
SIO_LED_PORTSET = SIOG1_SCK;
SIO_D1 = SIO_D1<<1;
}
SIO_LED_PORTSET = SIOG1_LOCK;
}
//
//==============================================================================//
unsigned int Flash_Counter=0;
unsigned char LED_Flash_flag_All=0;
unsigned char LED_Flash_Counter = 0;
void LEDFlash_Serive(void)
{
unsigned char i;
Flash_Counter++;
if(Flash_Counter>=200)
{
Flash_Counter=0;
LED_Flash_Counter--;
if(LED_Flash_Counter==0)
{
LED_Flash_flag_All=0;
for(i=0;i<12;i++)
{
LED_Flash_Mask[i] = 0x00;
LED_Seg_Mask[i] = 0xff;
}
}
else
for(i=0;i<12;i++)
LED_Seg_Mask[i] ^= LED_Flash_Mask[i];
}
}
void SIOLED_Service(void)
{
unsigned int uiTemp=0;
unsigned char ucTemp=0;
if(LED_Flash_flag_All!=0)
{
LEDFlash_Serive();
}
uiTemp = (LED_Show_Seg[LED_Show_Index]&LED_Seg_Mask[LED_Show_Index])|
((LED_Show_Seg[LED_Show_Index+6]&LED_Seg_Mask[LED_Show_Index+6])<<8);//
SIOLED_G0Send(uiTemp^0xffff);//
ucTemp = LED_Show_Com|LED_RG_flag;
ucTemp = ucTemp^0x3f;
SIOLED_G1Send(ucTemp);
LED_Show_Index++;
if(LED_Show_Index>=6) LED_Show_Index=0;
LED_Show_Com = LED_Show_Com<<1;
if(LED_Show_Com>0x20) LED_Show_Com = 0x01;
}
void RGLED_Switch(unsigned char Light_RG)
{
switch(Light_RG)
{
case 0:
LED_RG_flag = 0;
break;
case 1:
LED_RG_flag = 0x40;
break;
case 2:
LED_RG_flag = 0x80;
break;
default:break;
}
}
void Flash_LED(unsigned char LED_Nor,unsigned char ON_OFF)
{
if(ON_OFF)
{
// LED_Flash_flag |= 1<<LED_Nor;
LED_Flash_Mask[LED_Nor]=0xff;
// LED_Flash_flag |= 1<<LED_Nor;
}
else
{
// LED_Flash_flag &= ~(1<<LED_Nor);
LED_Flash_Mask[LED_Nor] = 0x00;
LED_Seg_Mask[LED_Nor] = 0xff;
// LED_Flash_flag &= ~(1<<LED_Nor);
}
}
void Flash_LED_SetTimer(unsigned char F_Timers)
{
if(F_Timers!=0)
{
LED_Flash_Counter = F_Timers;
LED_Flash_flag_All=1;
}
}
void SetShow_LED(unsigned char LED_Index,unsigned char Show_Data)
{
if(Show_Data&0x10)
{
LED_Show_Seg[LED_Index] = LEDSegTable[Show_Data&0x0f];
LED_Show_Seg[LED_Index] |= LEDSegTable[10];
}
else LED_Show_Seg[LED_Index] = LEDSegTable[Show_Data];//
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -