TA的每日心情![](source/plugin/dsu_paulsign/img/emot/kx.gif) | 开心 6 小时前 |
---|
签到天数: 96 天 [LV.6]常住居民II
高级会员
- 积分
- 542
|
楼主 |
发表于 2024-5-12 17:55:53
|
显示全部楼层
三,数码管
官方的例子数码管编码取反和位选那里(7-位置)不好理解,容易混淆,既然查表了,还要取反再做其他运算,和流水灯的查表就违背了, 这样流水灯还不如用循环。
找了个数码管的原理图,重新编码了一下,显示函数逻辑就清晰了。
#include "../STC8H.h"
#include "stc8h_timer.h"
//共阳数码管编码0-16,最后一个位熄灭状态, 高位 dp g f e d c b a 低位
unsigned char code display_array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned char code display_we[]={0x7F, 0xbf, 0xdf, 0xef,0xf7, 0xfb, 0xfd, 0xfe}; //位码
typedef struct
{
unsigned char hour; //时
unsigned char minute; //分
unsigned char second; //秒
}Timetype_t;
Timetype_t Time_count = {23, 59, 57};
unsigned int g_scanflag; //刷新时间标志位
unsigned char g_display_index; //显示位索引
unsigned char Ledbuff[6]; //显示缓存
bit g_bms; //1毫秒标志
void displayrtc(void)
{
if(Time_count.hour >= 10)
{
Ledbuff[0] = Time_count.hour / 10;
}
else
Ledbuff[0] = 16; //编码数组最后一个,熄灭状态,0xFF
Ledbuff[1] = Time_count.hour % 10;
Ledbuff[2] = Time_count.minute / 10;
Ledbuff[3] = Time_count.minute % 10;
Ledbuff[4] = Time_count.second / 10;
Ledbuff[5] = Time_count.second % 10;
}
void rtc (void)
{
if (++Time_count.second >= 60)
{
Time_count.second = 0;
if (++Time_count.minute >= 60)
{
Time_count.minute = 0;
if (++Time_count.hour >= 24)
{
Time_count.hour = 0;
}
}
}
}
void displayscan(void)
{
P7 = display_we[g_display_index];
P6 = display_array[Ledbuff[g_display_index]];
g_display_index++;
g_display_index %= 6;
}
void main(void)
{
P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
Timer0_Init();
ET0 = 1;
EA = 1;
rtc();
displayrtc();
while (1)
{
if(g_bms)
{
g_bms = 0;
if(++g_scanflag >= 1000) //1秒刷新一次时间
{
g_scanflag = 0;
rtc();
displayrtc();
}
}
}
}
void Time0_ISR(void) interrupt TMR0_VECTOR//定时器0中断函数
{
displayscan();
g_bms = 1 ;
}
|
-
|