找回密码
 立即注册
搜索
热搜: 中医 针灸 咳嗽
查看: 189|回复: 0

动态扫描扫描管

[复制链接]

3711

主题

1

回帖

1万

积分

管理员

积分
11937
发表于 2023-3-11 08:04:44 | 显示全部楼层 |阅读模式
[C] 纯文本查看 复制代码
/*
降龙棍~8位数码管_动态扫描

~74HC573,4位数码管接线在P0口,数码管采用共阴极

同步89开发板的时钟,这里为了与89开发板同步做实验统一用11.0592晶振
*/

#include <STC32G.H>
#define OFF 0X00
#define ON 0xff
#define SMG_VAL_PORT P0                // 数码管端口
#define Ulong unsigned long // 无符号长整型

/*数码管段码表*/
unsigned char code DUAN_data[] = {

        0x3F, //"0"
        0x06, //"1"
        0x5B, //"2"
        0x4F, //"3"
        0x66, //"4"
        0x6D, //"5"
        0x7D, //"6"
        0x07, //"7"
        0x7F, //"8"
        0x6F, //"9"
        0x77, //"A"
        0x7C, //"B"
        0x39, //"C"
        0x5E, //"D"
        0x79, //"E"
        0x71, //"F"
        0x76, //"H"
        0x38, //"L"
        0x37, //"n"
        0x3E, //"u"
        0x73, //"P"
        0x5C, //"o"
        0x40, //"-"
        0x00, // 熄灭
        0x00  // 自定义

};
/*数码管位表*/
unsigned char code WEI_data[] = {
        0xfe, // 1111 1110        b
        0xfd, // 1111 1101        b
        0xfb, // 1111 1011        b
        0xf7, // 1111 0111        b
        0xef, // 1110 1111        b
        0xdf, // 1101 1111        b
        0xbf, // 1011 1111        b
        0x7f  // 0111 1111        b
};

// 函数声明

void Show_Duan_val(char DuanNum, char val);
void Convert_Display(Ulong VAL);
void Delay5ms();
void Delay1us();
bit Delay_chang(Ulong val);
sbit DUAN = P2 ^ 6; // 定义段引脚
sbit WEI = P2 ^ 7;        // 定义位引脚
void main()
{

        int i = 0;
        int j = 0;
        SMG_VAL_PORT = 0x00;
        P0M0 = 0x00;
        P0M1 = 0x00; // 将IO 设置为准双向模式
        WTST = 0X00;
        SMG_VAL_PORT = 0x00;
        P2M0 = 0x40;
        P2M1 = 0x00;                // 设置为推挽输出模式,给74HC573上点激活Q0-Q7口
        P2 = OFF;                        // 段位口初始化
        P23 = 1;                        // 关闭蜂鸣器
        SMG_VAL_PORT = OFF; // P0口初始化
        while (1)
        {
                if (Delay_chang(10) == 1)
                { // 数值变化控制

                        Convert_Display(j++); // 如果达到阈值将数值+1
                }
                else
                {
                        Convert_Display(j); // 只显示,不增加数值
                }
        }
}

/*扫描频率*/
bit Delay_chang(Ulong val)
{
        static Ulong timetry = 0;
        timetry++;
        Delay1us();
        if (timetry == val)
        {
                timetry = 0;
                return 1;
        }
        else
        {
                return 0;
        }
}
/*数值转换显示函数*/
void Convert_Display(Ulong VAL)
{
        char i;
        char VAL_arr[8];
        char count = 0;

        while (VAL != 0)
        {
                VAL_arr[count] = VAL % 10;
                VAL = VAL / 10;
                count++;

                for (i = 0; i < count; i++)
                {
                        Show_Duan_val((char)(7 - i), VAL_arr[i]);
                }

                Delay5ms();
        }
}
/*
//显示单位数码管
*参数1:Duan_Num,需要显示在第几位数码管上_取值范围:0-8
*参数2:val,需要显示的数字
*/
void Show_Duan_val(char DuanNum, char val)
{

        // 选择位
        WEI = 1;
        SMG_VAL_PORT = WEI_data[DuanNum];
        WEI = 0;

        // 选择段,显示段
        DUAN = 1;
        SMG_VAL_PORT = DUAN_data[val];
        DUAN = 0;
}

void Delay5ms() //@11.0592MHz
{
        unsigned long i;

        _nop_();
        _nop_();
        _nop_();
        i = 13822UL;
        while (i)
                i--;
}

void Delay1us() //@11.0592MHz
{
        volatile unsigned long i;

        _nop_();
        _nop_();
        i = 1UL;
        while (i)
                i--;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|私人站点 ( 冀ICP备2023028127号-2 )

GMT+8, 2025-7-3 11:16 , Processed in 0.084524 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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