设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 667|回复: 0
收起左侧

STC单片机 8个IO口强推挽动态扫描免消影驱动两位半188共阴数码管2354AS 显示数字0~199

[复制链接]
发表于 2022-12-1 16:33:16 | 显示全部楼层 |阅读模式
1.png
  1. #include "STC12C5A60S2.h"
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define IO_2354AS        P2                //P2口与2354AS数码管连接 左下角(第1脚):P2.0 右下角:P2.3 左上角:P2.7 右上角:P2.4 (没有小数点)
  6. //P2口模式配置寄存器
  7. #define M0_2354AS P2M0
  8. #define M1_2354AS P2M1

  9. #define T0 0xFC18           //1ms@12Mhz 定时器初值
  10. u8 code nbr[16] = {                //共阴数码管段码16进制
  11.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
  12. };

  13. u16 bdata seg = 0;      //188数码管段码数据 (可位寻址)
  14. //百位
  15. sbit b1 = seg ^ 8;
  16. sbit c1 = seg ^ 9;
  17. //十位
  18. sbit a2 = seg ^ 10;
  19. sbit b2 = seg ^ 11;
  20. sbit c2 = seg ^ 12;
  21. sbit d2 = seg ^ 13;
  22. sbit e2 = seg ^ 14;
  23. sbit f2 = seg ^ 15;
  24. sbit g2 = seg ^ 0;
  25. //个位
  26. sbit a3 = seg ^ 1;
  27. sbit b3 = seg ^ 2;
  28. sbit c3 = seg ^ 3;
  29. sbit d3 = seg ^ 4;
  30. sbit e3 = seg ^ 5;
  31. sbit f3 = seg ^ 6;
  32. sbit g3 = seg ^ 7;

  33. void InitTimer0(){      //初始化定时器0中断
  34.     TMOD = 0x01;
  35.     TH0 = T0>>8;
  36.     TL0 = T0;
  37.     EA = 1;
  38.     ET0 = 1;
  39.     TR0 = 1;
  40. }

  41. u16 dec2seg(u8 dec){    //将10进制数字0~199转换到188数码管专用段码
  42.     u16 ret = 0;
  43.     if(dec > 199) dec = 199;
  44.     if(dec >= 100) ret |= 3;                    //百位:大于等于100显示
  45.     if(dec >= 10) ret |= nbr[(dec/10)%10] << 2; //十位:大于等于10显示
  46.     return ret | (nbr[dec%10] << 9);            //个位:始终显示
  47. }

  48. void main(){
  49.     //强推挽输出
  50.     M0_2354AS = 0xFF;
  51.     M1_2354AS = 0x00;
  52.     WDT_CONTR = 0x27;   //开看门狗
  53.     InitTimer0();       //初始化定时器0中断
  54.         while(1){
  55.         _nop_();
  56.         _nop_();
  57.         WDT_CONTR |= 0x10;      //看门狗喂狗
  58.         _nop_();
  59.         _nop_();
  60.     }
  61. }
  62. u8 code m[8] = {0x7F,0xFE,0xDF,0xFB,0x1A,0x4A,0x52,0x58};       //严禁修改

  63. void Timer0Interrupt() interrupt 1{     //1ms定时器0中断
  64.     static u8 i=0;
  65.     u8 k,l;
  66.     static u8 ms=249;
  67.     TH0 = T0>>8;
  68.     TL0 = T0;
  69.     switch(i){
  70.         //一次只点亮一位段码,使亮度均匀
  71.         case 0x0:k = a2?0:64;break;
  72.         case 0x1:k = f2?0:64;break;
  73.         case 0x2:k = a3?0:64;break;
  74.         case 0x3:k = f3?0:64;break;
  75.         case 0x4:k = b2?0:16;break;
  76.         case 0x5:k = g2?0:16;break;
  77.         case 0x6:k = b3?0:16;break;
  78.         case 0x7:k = g3?0:16;break;
  79.         case 0x8:k = c2?0:8;break;
  80.         case 0x9:k = e2?0:8;break;
  81.         case 0xA:k = c3?0:8;break;
  82.         case 0xB:k = e3?0:8;break;
  83.         case 0xC:k = d2?0:2;break;
  84.         case 0xD:k = c1?0:2;break;
  85.         case 0xE:k = d3?0:2;break;
  86.         case 0xF:k = b1?0:2;break;
  87.     }
  88.     IO_2354AS = m[i&3] & ~(k | m[(i>>2)+4]);     //此数码相当于8个IO口驱动4*4个LED,不需要消影!
  89.     if(++i >= 16) {
  90.         i = 0;
  91.     }
  92.     if(++ms >= 250){
  93.         ms=0;
  94.         seg = dec2seg(l);
  95.         if(++l >199){
  96.             l=0;
  97.         }
  98.     }
  99. }
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-3-29 08:10 , Processed in 0.380022 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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