单片机学习小组
直播中

刘埃生

7年用户 1709经验值
私信 关注

STC8A8K64S4A12静态数码管驱动的方法是什么

STC8A8K64S4A12静态数码管驱动的方法是什么

回帖(1)

范云力

2022-2-9 15:28:44
静态数码管的驱动

终于搞完了期末可以开始搞单片机了!我自己的板子只有四个按键和四个led
某宝买了一块普中的开发板,可惜板子上带的是STC89C52,
好在我原来的板子把所有IO都引了出来,所以我选择转接的方法↓↓↓↓↓(请忽略灵魂走线)

这篇文章我将介绍一下,STC8A8K64S4A12静态数码管驱动的方法
一、数码管
数码管
8段数码管,每段相当于一个led,前7段用于显示数字,最后一段是小数点,通过这8个led的不同组合实现数字显示的功能。
分为共阴共阳两种,手里这块板子上的是共阴数码管,二者在编写程序时需要注意的是码表不一样,下面给出共阴和共阳的码表:
typedef unsigned char u8;//共阳数码管 0~f  // code 可以减少空间使用u8 code smgtable[] = {0xc0,0xf9,0xa4,0xb0,                                           0x99,0x92,0x82,0xf8,                                          0x80,0x90,0x88,0x83,                                          0xc6,0xa1,0x86,0x8e}//共阴数码管 0~fu8 code smgtable[] = {0x3f,0x06,0x5b,0x4f,                                          0x66,0x6d,0x7d,0x07,                                          0x7f,0x6f,0x77,0x7c,                                          0x39,0x5e,0x79,0x71};



  • 数码管a,b,c,d,e,f,g,dp分别对应IO口的第0到第7个IO口线



  • “0x”是啥:因为这个单片机的每个IO口有8个IO口线,十六进制1位对应二进制4位,就用2位十六进制数来代表这8个IO口线,前面的0x代表十六进制,拿共阴数码管显示数字 “ 1 ” 举例,显示数字1需要上图中的B,C这两段亮起,共同使用的阴极是低电平,要想亮起就要使对应的IO口线输出高电平,所以用8位二进制数表示就是 0000 0110转换成十六进制就是 0x06。
  • 小数点问题:通过前一点中所讲的如何通过二进制表示哪段管子亮起,可以得出,如果想让上图中的小数点位亮起,就要控制小数点对应位为1,所以只需要在要显示的数后面加上0x80就可以了↓↓↓(显示“ 1. ”)


二、硬件显示
单片机运行速度相对于人眼的识别速度非常快,所以要加入延时函数,延时函数可以直接用stc_isp里面的软件延时计算器直接计算




  • 注意选择和所用mcu匹配的指令集,正确选择系统频率。

三、代码部分
功能:开机之后数码管以1秒钟为间隔,轮流显示从0~f

#include        //头文件
#include                 //头文件


typedef unsigned int u16;                //定义无符号整型为u16,方便写代码
typedef unsigned char u8;                //同理


***it smgA = P2^2;                                //这三行是因为开发板上使用了74HC138来选
***it smgB = P2^3;                                //择数码管的第几位,在下一篇动态数码管里会
***it smgC = P2^4;                                //详细解释,如果你的数码管直接连在mcu上                                                                   
                                                                //就不要写这三行。


u8 code smgtable[] = {0x3f,0x06,0x5b,0x4f,
                                          0x66,0x6d,0x7d,0x07,
                                          0x7f,0x6f,0x77,0x7c,
                                          0x39,0x5e,0x79,0x71};


void Delay1000ms()                //@11.0592MHz  时长1秒的延时函数
{
        unsigned char i, j, k;


        _nop_();
        i = 8;
        j = 1;
        k = 243;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


void main()
{
        u16 i;
        smgA = 0;
        smgB = 0;
        smgC = 0;
        while(1)//死循环,防止程序“跑飞”
        {
                for(i = 0;i<16;i++)
                {
                        P0 = smgtable;//通过开头定义的码表来给端口赋值
                        Delay1000ms();//调用延时函数
                }
        }
}
如有错误欢迎指正,新手才疏学浅,请各位大佬见谅。
举报

更多回帖

×
20
完善资料,
赚取积分