[通用8051核FLASH系列] 【芯圣电子HC89S105A测评报告】+MAX7219

[复制链接]
1300|2
 楼主| 比神乐 发表于 2023-5-17 21:58 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-19 16:43 编辑

今天搞了一下MAX7219,是一种驱动数码管的芯片。
MAX7219模块是我自己制作的。
原理图如下:
0.jpg
CLK接P3.6,LOAD接P3.4,DIN接P3.2
代码:
  1. #define ALLOCATE_EXTERN
  2. #include "HC89S105AC8.h"

  3. #define uchar unsigned char  
  4. #define uint unsigned int
  5. /** @addtogroup 425_GPIO_led_toggle GPIO_led_toggle
  6.   * @{
  7.   */


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

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

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




  29. #define CLK_1 P3_6=1
  30. #define CLK_0 P3_6=0
  31. #define LOAD_1 P3_4=1
  32. #define LOAD_0 P3_4=0
  33. #define DIN_1 P3_2=1
  34. #define DIN_0 P3_2=0

  35. #define _nop_()  i=i
  36. uchar i;

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

  94. }
  95. /***************************************************************************************
  96.   * @实现效果        设置各个IO口的工作状态
  97. ***************************************************************************************/
  98. void main(void)        
  99. {        
  100. /********************************系统初始化*******************************************/               
  101.         WDTCCR = 0x00;                           //关闭看门狗
  102.                                                            //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
  103.         CLKCON = 0x02;                           //选择内部高频RC为系统时钟, Fosc=32MHz
  104.         CLKDIV = 0x02;                           //Fosc 2分频得到Fcpu,Fcpu=16MHz
  105.         
  106. /***********************************设置IO口模式***************************************/
  107.         
  108.         P3M1 = 0xF8;                                 //P32设置为带上拉开漏输出
  109.         P3M2 = 0xF8;                             //P34设置为推挽输出
  110.         P3M3 = 0xF8;                             //P34设置为推挽输出
  111.         
  112.         InitDisplay (); // MAX7219初始化
  113.     //WriteWord(DisplayTest,TestMode);  // 开始显示测试,点亮所有LED
  114.     delay(15);                      // 延时约1.5s
  115.     WriteWord (DisplayTest,TextEnd);  // 退出显示测试模式
  116.     WriteWord (Digit0,0);
  117.     WriteWord (Digit1,1);
  118.     WriteWord (Digit2,2);
  119.     WriteWord (Digit3,3);                 
  120.      
  121.         while(1)
  122.         {
  123.                  InitDisplay (); // MAX7219初始化
  124.    
  125.             delay(15);                      // 延时约1.5s
  126.             WriteWord (DisplayTest,TextEnd);  // 退出显示测试模式
  127.             WriteWord (Digit0,0);
  128.             WriteWord (Digit1,1);
  129.             WriteWord (Digit2,2);
  130.             WriteWord (Digit3,3);
  131.         }
  132. }

效果图:
1.jpg
laocuo1142 发表于 2023-5-23 09:16 | 显示全部楼层
代码框为啥搞个黑底白字了
 楼主| 比神乐 发表于 2023-5-23 09:18 | 显示全部楼层
laocuo1142 发表于 2023-5-23 09:16
代码框为啥搞个黑底白字了

这不是我搞得,传上去,发表出来就这样。你也可以试一试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

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