📄 7219.c
字号:
#define _7219_CLOCK_DOWN() *_7219_PORT_DATA&=(_7219_CLOCK^0xffff)
#define _7219_CLOCK_UP() *_7219_PORT_DATA|=_7219_CLOCK
#define _7219_LOAD_DOWN() *_7219_PORT_DATA&=(_7219_LOAD^0xffff)
#define _7219_LOAD_UP() *_7219_PORT_DATA|=_7219_LOAD
#define CODE_MODE 0x0900
#define INTENSITY 0x0a00
#define SCAN_LIMIT 0x0b00
#define SHUT_DOWN 0x0c00
#define TEST 0xf00
#define BLANK 0xf
unsigned int *_7219_PORT_DATA;
unsigned int *_7219_PORT_ATRRIB;
unsigned int *_7219_PORT_DIR;
unsigned int _7219_CLOCK;
unsigned int _7219_DATA;
unsigned int _7219_LOAD;
unsigned int LED_data[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};
unsigned long int b[6]={1,10,100,1000,10000,100000};
volatile unsigned int *P_WatchDog_Clear = (unsigned int*)(0x7012);
void Reverse(unsigned int *temp,unsigned int *array,unsigned int num)
{
unsigned int i;
for (i=1;i<=num;i++)
{
temp[i-1]=array[num-i];
}
}
void send_data(unsigned int data)
{
unsigned int i;
_7219_LOAD_DOWN();
*P_WatchDog_Clear=1;
for(i=0;i<16;i++)
{
_7219_CLOCK_DOWN();
if(data&0x8000) *_7219_PORT_DATA|=_7219_DATA;
else *_7219_PORT_DATA&=(_7219_DATA^0xffff);
_7219_CLOCK_UP();
data<<=1;
}
_7219_LOAD_UP();
}
void ini_7219(char port,unsigned int data,unsigned int load,unsigned int clock,unsigned int lightness)
{
if(port=='B'||port=='b')
{
_7219_PORT_DATA=(unsigned int*)(0x7005);
_7219_PORT_ATRRIB=(unsigned int*)(0x7008);
_7219_PORT_DIR=(unsigned int*)(0x7007);
}
else
{
_7219_PORT_DATA=(unsigned int*)(0x7000);
_7219_PORT_ATRRIB=(unsigned int*)(0x7003);
_7219_PORT_DIR=(unsigned int*)(0x7002);
}
_7219_CLOCK=clock;
_7219_DATA=data;
_7219_LOAD=load;
*_7219_PORT_DIR|=(_7219_CLOCK|_7219_DATA|_7219_LOAD);
*_7219_PORT_ATRRIB|=(_7219_CLOCK|_7219_DATA|_7219_LOAD);
*_7219_PORT_DATA&=((_7219_CLOCK|_7219_DATA|_7219_LOAD)^0xffff);
send_data(SHUT_DOWN|1);
send_data(INTENSITY|lightness);
send_data(CODE_MODE|0xff);
}
void show_array(unsigned int *data,unsigned int num,unsigned int dot,unsigned int reverse)
{
int i;
unsigned int temp[8];
if(num>0)
{
if (reverse) Reverse(temp,data,num);
else
{
for (i=0;i<num;i++) temp[i]=data[i];
}
send_data(SHUT_DOWN|1);
send_data(SCAN_LIMIT|(num-1));
if (!dot)
{
for(i=0;i<num;i++)
send_data(((i+1)<<8)|temp[i]);
}
else
{
for(i=0;i<num;i++)
{
if (i==dot)
send_data(((i+1)<<8)|temp[i]|128);
else
send_data(((i+1)<<8)|temp[i]);
}
}
}
else send_data(SHUT_DOWN|0);
}
void IntToArray(unsigned int a,unsigned int *array,unsigned int *num)
{
unsigned long int j=0;
long int temp,i=1,c[5]={0,0,0,0,0};
if (a==0)
{
array[0]=0;
*num=1;
}
else
{
while(1)
{
i=b[j];
if (i>a) break;
j++;
}
for (i=j-1;i>=0;i--)
{
temp=a-c[3]-c[2]-c[1]-c[0]-c[4];
c[i]=b[i];
array[i]=1;
while(1)
{
if ((temp-c[i])<0)
{
array[i]=0;
c[i]=0;
}
if ((temp-c[i])<b[i]) break;
c[i]+=b[i];
array[i]++;
}
}
*num=j;
}
}
void show_number(unsigned int data,unsigned int dot)
{
unsigned int array[8]={0,0,0,0,0,0,0,0},num,i;
IntToArray(data,array,&num);
if (num<=dot)
num=dot+1;
show_array(array,num,dot,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -