[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--;
}