用51单片机连接max7219芯片做秒计时器,求帮看下程序
发布网友
发布时间:2022-06-09 03:48
我来回答
共2个回答
热心网友
时间:2023-09-14 13:43
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sbitpinDIN= P3^0;//DIN 串行数据输入端口。在时钟上升沿时数据被载入内部的16位寄存器。
sbitpinLOAD= P3^1;//LOAD (MAX7219) 载入数据。连续数据的后16位在LOAD端的上升沿时被锁定。
sbitpinCLK= P3^2;//在时钟的上升沿, 数据移入内部移位寄存器。 下降沿时, 数据从DOUT端输出。
uchar codeLEDcode[]= { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, 0x00 };
/*
void delay1000( void )
{
unsigned char a, b, c; for ( c = 1; c > 0; c-- )
for ( b = 142; b > 0; b-- )
for ( a = 2; a > 0; a-- )
;
}
*/
//【增加】 延时1秒 函数
void delay1s(void) //@12MHz
{
unsigned char a,b,c;
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void sendbyte( uchar dat )
{
uchar i, temp;
_nop_();
for ( i = 0; i < 8; i++ )
{
temp= dat & 0x80;
dat= dat << 1;
if ( temp )
pinDIN = 1;
else
pinDIN = 0;
pinCLK = 0;
_nop_();
pinCLK = 1;
}
}
void sendword( uchar addr, uchar dat )
{
pinLOAD = 0;
_nop_();
sendbyte( addr );
_nop_();
sendbyte( dat );
_nop_();
pinLOAD = 1;
delay1000();
}
void init7219( void )
{
sendword( 0x0c, 0x01 );
sendword( 0x0a, 0x09 );
sendword( 0x0b, 0x03 );
sendword( 0x09, 0x00 );
sendword( 0x0f, 0x00 );
}
void clear7219( void )
{
uchar i; for ( i = 8; i > 0; i-- )
{
sendword( i, 0x00 );
}
}
void main( void )
{
int n = 60;
int s = 0;
int g = 0;
init7219();
while ( 1 )
{
//clear7219(); //【屏蔽】不然不显示
if ( n > 0 )
{
n = n - 1;
s = n / 10;
g = n % 10;
//LEDcode[s]; //【屏蔽】
//LEDcode[g]; //【屏蔽】
}
sendword( 0x01, LEDcode[s] );//【增加】显示十位数
sendword( 0x02, LEDcode[g] );//【增加】 显示个位数
delay1s();//【增加】 延时一下,不然变化太快,看不到效果
/*//【屏蔽以下语句】
sendword( 0x01, LEDcode[1] );
sendword( 0x02, LEDcode[2] | 0x80 );
sendword( 0x03, LEDcode[3] );
sendword( 0x04, LEDcode[4] );
sendword( 0x05, LEDcode[5] );
sendword( 0x06, LEDcode[6] );
sendword( 0x07, LEDcode[7] );
sendword( 0x08, LEDcode[8] );
//*/
}
}
已在protues中仿真通过。
热心网友
时间:2023-09-14 13:44
程序没有格式,太乱,没法看