//单片机晶振12M
//显示0-9中国
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define count 16 //级联个数
unsigned char s, f,j,k,c5,c4,c3,c2,c1,c0,m,n=1;
unsigned char pp;
//定义Max7219端口
sbit Max7219_pinCLK = P2^2;
sbit Max7219_pinCS = P2^1;
sbit Max7219_pinDIN = P2^0;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
uchar code disp1[10][8]=
{
{0x18,0x24,0x24,0x24,0x24,0x24,0x24,0x18},//0
{0x10,0x30,0x50,0x10,0x10,0x10,0x10,0x38},//1
{0x0,0x1C,0x24,0x4,0x8,0x10,0x20,0x3C},//2
{ 0x18,0x24,0x4,0x8,0x18,0x4,0x24,0x18},//3
//{0x0,0x3e,0x2,0x2,0x3e,0x2,0x02,0x3e},//3
//{0x8,0x18,0x28,0x48,0xFE,0x8,0x8,0x00},//4
{ 0x0,0x4,0xC,0x14,0x24,0x3E,0x4,0x4 },//4
{ 0x0,0x3C,0x20,0x38,0x4,0x4,0x24,0x38},//5
//{0x0,0x3C,0x20,0x20,0x3C,0x4,0x4,0x3C},//5
{ 0x18,0x24,0x20 ,0x38,0x24,0x24,0x24,0x18},//6
//{0x0,0x3C,0x20,0x20,0x3C,0x24,0x24,0x3C},//6
{0x0,0x3E,0x22,0x4, 0x8, 0x8, 0x8, 0x8},//7
{ 0x0,0x18,0x24,0x24,0x18,0x24,0x24,0x18},//8
//{0x0,0x3E,0x22,0x22,0x3E,0x22,0x22,0x3E},//8
{ 0x18,0x24,0x24,0x24,0x1C,0x4,0x24,0x18}//9
//{0x0,0x3e,0x22,0x22,0x3e,0x2,0x2,0x3e},//9
/*{0x0,0x8,0x14,0x22,0x3E,0x22,0x22,0x22},//A
{0x0,0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C},//B
{0x0,0x3C,0x40,0x40,0x40,0x40,0x40,0x3C},//C
{0x0,0x7C,0x42,0x42,0x42,0x42,0x42,0x7C},//D
{0x7C,0x40,0x40,0x7C,0x40,0x40,0x7c,0x00},//E
{0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x40},//F
{0x00,0x3C,0x40,0x40,0x40,0x44,0x44,0x3C},//G
{0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44},//H
{0x00,0x10,0xFE,0x92,0x92,0xFE,0x10,0x10},//中
{0xFE,0xBA,0x92,0xBA,0x92,0x9A,0xBA,0xFE},//国*/
};
uchar code disp2[10][8]=
{
{ 0x60,0x93,0x93,0x90,0x90,0x90,0x93,0x63},//0
{0x20,0x63,0xA3,0x20,0x20,0x20,0x23,0x73 },//1
{ 0x0,0xE3,0x93,0x10,0x20,0x40,0x83,0xF3},//2
{ 0x60,0x93,0x13,0x20,0x60,0x10,0x93,0x63},//3
{ 0x0,0x13,0x33,0x50,0x90,0xF8,0x13,0x13},//4
{ 0x0,0xF3,0x83,0xE0,0x10,0x10,0x93,0xE3},//5
{0x63,0x93,0x80,0xE0,0x90,0x90,0x93,0x63},//6
{ 0x0,0xF3,0x93,0x20,0x40,0x40,0x43,0x43},//7
{0x0,0x63,0x93,0x90,0x60,0x90,0x93,0x62},//8
{ 0x63,0x93,0x90,0x90,0x70,0x10,0x93,0x63},//9
};
void Delay_xms(uint x);
void delay1(unsigned char i);
void Write_Max7219_byte(uchar DATA);//写入一字节
void Write_Max7219(uchar address1,uchar dat1,uchar address2,uchar dat2);
void Init_MAX7219(void);
// 锁存进相应寄存器
void keyscan()
{
if(k1==0)
{
delay1(10);
if(k1==0)
{
f++;
if(f>=60)
f=0;
while(k1==0);
}
}
if(k2==0)
{
delay1(10);
if(k2==0)
{
f--;
if(f==1)
f=60;
while(k2==0);
}
}
if(k3==0)
{
delay1(10);
if(k3==0)
{
s++;
if(s>=24)
s=0;
while(k3==0);
}
}
if(k4==0)
{
delay1(10);
if(k4==0)
{
s--;
if(s==1)
s=24;
while(k4==0);
}
}
}
//开总中断
void main(void)
{
uchar i,j;
Delay_xms(50);
Init_MAX7219();
TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
TR0=1; //打开定时器
TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
//ET0=1; //开定时器0中断
// EA=1;
while(1)
{
keyscan();
if(TF0==1) //单片机一直在查询定时器0的溢出标志位TF0状态
{
TF0=0;
pp++;
TH0=(65536-65080)/256;
TL0=(65536-65080)%256;
}
if(pp==8)
{ pp=0;
m++;
n++;
P1=n;//闪烁灯
if(m==60)
{
m=0;
f++;
if(f==60)
{
f=0;
s++;
if(s==24)
{
s=0; //若到了60s,则归零
}
}
}
}
c0=m%10; //取出当前描述的个位与十位
c1=m/10;
c2=f%10; //取出当前描述的个位与十位
c3=f/10;
c4=s%10;
c5=s/10;
// for(i=1;i<9;i++)
// Write_Max7219(i,disp1[1][i-1],i,disp1[0][i-1]);
for(i=1;i<9;i++)
{
// Write_Max7219(i,disp1[1][i-1],i,disp1[0][i-1]);
Max7219_pinCS=0;
for(j=0;j<count;j++)
{
Write_Max7219_byte(i); //写入地址,即数码管编号
Write_Max7219_byte(disp1[c5][i-1]); //写入数据,即数码管显示数字
Write_Max7219_byte(i); //写入地址,即数码管编号
Write_Max7219_byte(disp2[c4][i-1]);
Write_Max7219_byte(i); //写入地址,即数码管编号
Write_Max7219_byte(disp1[c3][i-1]);
Write_Max7219_byte(i); //写入地址,即数码管编号
Write_Max7219_byte(disp1[c2][i-1]);
_nop_();
}
Max7219_pinCS=1;
}
Delay_xms(2);
}
}
void Init_MAX7219(void)
{
/* Write_Max7219(0x09, 0x00,0x09, 0x00); //译码方式:BCD码
Write_Max7219(0x0a, 0x03,0x0a, 0x03); //亮度
Write_Max7219(0x0b, 0x07,0x0b, 0x07); //扫描界限;8个数码管显示
Write_Max7219(0x0c, 0x01,0x0c, 0x01); //掉电模式:0,普通模式:1
Write_Max7219(0x0f, 0x00,0x0f, 0x00); //显示测试:1;测试结束,正常显示:0
*/
uchar i;
Max7219_pinCS=0;
for(i=0;i<count;i++)
{
Write_Max7219_byte(0x09); //译码方式:BCD码
Write_Max7219_byte(0x00);
}
Max7219_pinCS=1;
_nop_();
Max7219_pinCS=0;
for(i=0;i<count;i++)
{
Write_Max7219_byte(0x0a); //亮度
Write_Max7219_byte(0x03);
}
Max7219_pinCS=1;
_nop_();
Max7219_pinCS=0;
for(i=0;i<count;i++)
{
Write_Max7219_byte(0x0b); // //扫描界限;8个数码管显示
Write_Max7219_byte(0x07);
}
Max7219_pinCS=1;
_nop_();
Max7219_pinCS=0;
for(i=0;i<count;i++)
{
Write_Max7219_byte(0x0c); // //掉电模式:0,普通模式:1
Write_Max7219_byte(0x01);
}
Max7219_pinCS=1;
Max7219_pinCS=0;
for(i=0;i<count;i++)
{
Write_Max7219_byte(0x0f); //显示测试:1;测试结束,正常显示:0
Write_Max7219_byte(0x00);
}
Max7219_pinCS=1;
_nop_();
}
void Write_Max7219(uchar address1,uchar dat1,uchar address2,uchar dat2)
{
Max7219_pinCS=0;
Write_Max7219_byte(address1); //写入地址,即数码管编号
Write_Max7219_byte(dat1); //写入数据,即数码管显示数字
Write_Max7219_byte(address2); //写入地址,即数码管编号
Write_Max7219_byte(dat2); //写入数据,即数码管显示数字
_nop_();
Max7219_pinCS=1;
}
//--------------------------------------------
//功能:向MAX7219(U3)写入字节
//入口参数:DATA
//出口参数:无
//说明:
void Write_Max7219_byte(uchar DATA)
{
uchar i;
for(i=8;i>=1;i--)
{
Max7219_pinCLK=0;
Max7219_pinDIN=DATA&0x80;
DATA=DATA<<1;
Max7219_pinCLK=1;
}
}
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
void delay1(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
|