搜索

[8/16位单片机] 【CuriosityNano测评报告】+ 2、MAX7219

[复制链接]
2139|6
 楼主 | 2020-8-2 15:13 | 显示全部楼层 |阅读模式
今天捣鼓了一下MAX729DIN: PB2
LOAD:PB1
CLK:PB0
代码:
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. #define CLK_0           PORTB.OUT&=0xfe
  6. #define CLK_1           PORTB.OUT|=1
  7. #define LOAD_0          PORTB.OUT&=0xfd
  8. #define LOAD_1          PORTB.OUT|=0x02
  9. #define DIN_0           PORTB.OUT&=0xfb
  10. #define DIN_1           PORTB.OUT|=0x04

  11. #define NoOp   0x00           //空操作寄存器
  12. #define Digit0 0x01           // 数码管1寄存器
  13. #define Digit1 0x02           // 数码管2寄存器
  14. #define Digit2 0x03           // 数码管3寄存器
  15. #define Digit3 0x04           // 数码管4寄存器
  16. #define Digit4 0x05           // 数码管5寄存器
  17. #define Digit5 0x06           // 数码管6寄存器
  18. #define Digit6 0x07           // 数码管7寄存器
  19. #define Digit7 0x08           // 数码管8寄存器

  20. #define DecodeMode 0x09       // 译码模式寄存器
  21. #define Intensity 0x0a        // 亮度寄存器
  22. #define ScanLimit 0x0b        // 扫描位数寄存器
  23. #define ShutDown 0x0c         // 低功耗模式寄存器

  24. #define DisplayTest 0x0f      // 显示测试寄存器
  25. #define ShutdownMode 0x00     // 低功耗方式
  26. #define NormalOperation 0x01  // 正常操作方式
  27. #define ScanDigit 0x07        // 扫描位数设置,显示8位数码管
  28. #define DecodeDigit 0xff      // 译码设置,8位均为BCD码
  29. #define IntensityGrade 0x0a   // 亮度级别设置
  30. #define TestMode 0x01         // 显示测试模式
  31. #define TextEnd 0x00          // 显示测试结束,恢复正常工作模式


  32. static void PORT_init(void);
  33. static void EVSYS_init(void);

  34. static void SYSTEM_init(void);


  35. /*****************************************************************************
  36. * Function implementation - global ('extern') and local ('static')
  37. ******************************************************************************/
  38. uchar DisBuffer[8]={0,0,0,0,0,0,0,0};    // 显示缓存区
  39. //******************延时t毫秒**************************************
  40. void delay(uint t)
  41. {
  42.        uint i;
  43.        while(t--)
  44.        {
  45.               /* 对于12M时钟,约延时1ms */
  46.               for (i=0;i<125;i++)
  47.               {}
  48.        }
  49. }
  50. //*************向MAX7219写入字节(8位)********************
  51. void SendChar (uchar ch)
  52. {
  53.     uchar i,temp;
  54.     delay(1);
  55.     for (i=0;i<8;i++)
  56.     {
  57.          temp=ch&0x80;
  58.          ch=ch<<1;
  59.          if(temp)
  60.          {
  61.             DIN_1;
  62.             CLK_0;
  63.             CLK_1;
  64.          }
  65.          else
  66.          {
  67.             DIN_0;
  68.             CLK_0;
  69.             CLK_1;
  70.          }
  71.     }
  72. }
  73. //**************向MAX7219写入字(16位)*****************************
  74. void WriteWord (uchar addr,uchar num)
  75. {
  76.     LOAD_0;
  77.     delay(1);
  78.     SendChar(addr);
  79.     delay(1);
  80.     SendChar(num);
  81.     delay(1);
  82.     LOAD_1;                            // 锁存进相应寄存器
  83. }
  84. //*********************** MAX7219初始化 ******************
  85. void InitDisplay (void)
  86. {
  87.     WriteWord (ScanLimit,ScanDigit);         // 设置扫描界限
  88.     WriteWord (DecodeMode,DecodeDigit);      // 设置译码模式
  89.     WriteWord (Intensity,IntensityGrade);    // 设置亮度
  90.     WriteWord (ShutDown,NormalOperation);    // 设置为正常工作模式

  91. }

  92. static void PORT_init(void)
  93. {
  94.     PORTB.DIR = 0x07;
  95.     PORTC.DIR = 0x40;
  96.        
  97.    
  98. }

  99. static void EVSYS_init(void)
  100. {
  101.     EVSYS.CHANNEL3 = EVSYS_CHANNEL3_PORTC_PIN7_gc;
  102.     EVSYS.USERTCB0CAPT = EVSYS_USER_CHANNEL3_gc;
  103. }



  104. static void SYSTEM_init(void)
  105. {
  106.     PORT_init();
  107.     EVSYS_init();
  108.    
  109. }





  110. int main(void)
  111. {
  112.        
  113.        
  114.     SYSTEM_init();
  115.        
  116.         InitDisplay (); // MAX7219初始化
  117.         WriteWord(DisplayTest,TestMode);  // 开始显示测试,点亮所有LED
  118.         delay(1500);                      // 延时约1.5s
  119.         WriteWord (DisplayTest,TextEnd);  // 退出显示测试模式
  120.         WriteWord (Digit0,0);
  121.         WriteWord (Digit1,1);
  122.         WriteWord (Digit2,2);
  123.         WriteWord (Digit3,3);

  124.     while (1)
  125.     {
  126.         InitDisplay (); // MAX7219初始化
  127.         delay(150);                      // 延时约1.5s
  128.         WriteWord (DisplayTest,TextEnd);  // 退出显示测试模式
  129.         WriteWord (Digit0,0);
  130.         WriteWord (Digit1,1);
  131.         WriteWord (Digit2,2);
  132.         WriteWord (Digit3,3);
  133.                
  134.     }
  135. }
复制代码
效果图:
1.jpg

使用特权

评论回复
| 2020-8-5 13:48 | 显示全部楼层
厉害啊~~ 感谢支持~ 顶一下~

使用特权

评论回复
| 2020-8-7 15:54 | 显示全部楼层
测评里相对复杂的帖子,顶一个.

使用特权

评论回复
| 2020-8-7 17:05 | 显示全部楼层

使用特权

评论回复
| 2020-8-9 21:59 | 显示全部楼层
楼主的代码很规范呀,赞一个,是我学习的榜样。

使用特权

评论回复
| 2020-8-9 22:10 | 显示全部楼层
看见插了一个usb就是可以下载的,这么小的板子还带下载器的吗?

使用特权

评论回复
 楼主 | 2020-8-10 11:42 | 显示全部楼层
电子xiaocainiao 发表于 2020-8-9 22:10
看见插了一个usb就是可以下载的,这么小的板子还带下载器的吗?

是啊

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表