找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4661|回复: 5
打印 上一主题 下一主题
收起左侧

本人淘了max7219点阵,经过几天的努力,终于完成了这个时钟程序,共享给大家,不足...

[复制链接]
跳转到指定楼层
楼主
ID:577423 发表于 2020-1-1 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   //单片机晶振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--);
}
       

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:22618 发表于 2020-1-1 14:25 | 只看该作者
楼主,把电路图发出来,会更香
回复

使用道具 举报

板凳
ID:929737 发表于 2021-11-21 13:58 | 只看该作者
楼主 能用max7219实现左右移吗
回复

使用道具 举报

地板
ID:57657 发表于 2021-11-21 22:37 | 只看该作者
fengyin123 发表于 2021-11-21 13:58
楼主 能用max7219实现左右移吗

左右移 属于 图像算法 与max7219没有任何关系
回复

使用道具 举报

5#
ID:1008225 发表于 2022-3-4 16:36 | 只看该作者
怎么用按键调整时间
回复

使用道具 举报

6#
ID:1008207 发表于 2022-3-4 22:10 来自手机 | 只看该作者
能把电路图分享一下吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表