动态数码管显示 有了前面静态数码管显示的基础 动态数码管只是直接复制了个工程 然后再多写一个动态数码管的函数而已(才发现这个方法这么好用,之前看江科大用这个方法快速创建工程 不过自己刚学 不想偷这个懒 就全部代码重新敲)在编写第一版动态数码管函数的时候 我发现如果在yue位使用长时间的delay(为了达到隔一段时间就增长一个数字的作用)会使得数码管显示异常 就是全都在等delay函数的执行 程序被卡住 板子上的现象就是 数码管一位一位的动 没有连续性 小蜜蜂老师的解决方案就是编写一个数码管专用的delay函数 在delay中不是让程序卡住不动 而是在里面执行数码管驱动函数 一直执行 不仅可以达到过一段时间就让数据变化的功能 也可以不让数码管驱动函数停止 在第一版的动态数码管显示是需要很多行代码的 后面第二版我发现可以用循环的方法 具体实现就是:将定义好的每一个数字位都用结构体变量来封装 然后用指针和循环遍历结构体 第二版在编写结构体定义的时候 犯了一些低级错误......例如直接在定义结构体的时候就给结构体赋值 还有后面忘记应该用结构体变量的值作为数组元素下标 而是直接用结构体的值来驱动数码管(导致数码管显示的很奇怪 当时我还一直以为是数码管动态驱动函数中的for循环没有成功执行) 结构体还挺好用的 👍OK 后面废话少说 上代码:
一主函数:
include <STC15F2K60S2.H>
include "HC138_F.h"
include "Nixie.h"
unsigned char yue=0;
void Nixie_Delay(unsigned char x)
{
while(x)
{
x--;
Nixie_DymDataDrive(2025,yue);
}
}
void main()
{
while(1)
{
Nixie_DymDataDrive(2025,yue);
yue++;
if(yue>12)
{
yue=1;
}
Nixie_Delay(150);
}
}
二:138设置函数
include <STC15F2K60S2.H>
sbit WR_138=P4^2;
sbit A_138=P2^5;
sbit B_138=P2^6;
sbit C_138=P2^7;
void Set_HC138_F(unsigned char x)
{
WR_138=0;
switch(x)
{
case 4:
{
C_138=1;
B_138=0;
A_138=0;
break;
}
case 5:
{
C_138=1;
B_138=0;
A_138=1;
break;
}
case 6:
{
C_138=1;
B_138=1;
A_138=0;
break;
}
case 7:
{
C_138=1;
B_138=1;
A_138=1;
break;
}
}
}
三、数码管驱动函数
include <STC15F2K60S2.H>
include "HC138_F.h"
include "Delay.h"
unsigned char code Content[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
//unsigned char j;
//unsigned char g;
//unsigned char f;
//unsigned char h;
//unsigned char v;
//unsigned char v1;
void Nixie_Drive(unsigned char pos,unsigned char content)
{
Set_HC138_F(6);
P0=0x01<<pos;
Set_HC138_F(7);
P0=Content[content];
Delay(100);
}
void ManyNixie_Drive(unsigned char content)
{
Set_HC138_F(6);
P0=0xff;
Set_HC138_F(7);
P0=Content[content];
Delay(100);
}
void Nixie_DynamicDrive(unsigned char pos,unsigned char content)
{
Set_HC138_F(6);
P0=0x01<<(pos-1);
Set_HC138_F(7);
P0=Content[content];
Delay(5);
P0=0xff;
}
void Nixie_DymDataDrive(unsigned int year,unsigned char month)
{//我能不能用结构体打一个组 然后用循环来实现依次显示 这应该要用到指针了
//unsigned int Year;
//Year=year;
unsigned char i;
unsigned char p;
typedef struct Day
{
unsigned char y1;
unsigned char y2;
unsigned char y3;
unsigned char y4;
unsigned char c1;
unsigned char c2;
unsigned char m1;
unsigned char m2;
}DAY;
DAY YM;
{
YM.y1=Content[year/1000];
YM.y2=Content[year/100%10];
YM.y3=Content[year/10%10];
YM.y4=Content[year%10];
YM.c1=Content[16];
YM.c2=Content[16];
YM.m1=Content[month/10];
YM.m2=Content[month%10];
}
p=&YM.y1;
for(i=0;i<8;i++)
{
Set_HC138_F(6);
P0=(0x01<<i);//用按位左移
Set_HC138_F(7);
P0=(p+i);
if(*p==YM.m1)
{
p=&YM.y1;
}
Delay(1);
P0=0xff;
}
}
(旧版Delay函数我就不放出来了)
下面配图是两版数码管动态驱动函数在篇幅上的区别(其实只节省了一点点的代码量 但是至少看着有一丢丢的技术含量了对吧(傻笑))
浙公网安备 33010602011771号