📄 8_8led.c
字号:
#include<reg52.h>
#include<rtx51tny.h>
#include"inc/define.h"
#include"inc/8_8led.h"
#include"inc/utility.h"
#include"inc/font.h"
#define dataP P0
#define scanP P2
sbit sel=P2^6; //选择数据通道 0:选通上 1:选通下
sbit clr=P2^7; //清零数据 0有效
vu8 idata for_showh[6]={0,8, 1,1, 3,0}; //年 月 日
vu8 idata for_showl[6]={2,2, 4,9, 5,6}; //时 分 秒
//---16*16的空格 周 四 8*16的空格 2 7 摄氏度符号
vu8 idata week_tempert[8]={8, 0 , 4, 11, 2, 7, 10};
vu8 code * idata time_tab=time_tab_cgst[0];
vu8 code * idata week_tab=week_tab_cgst[0];
vu8 code * idata tempert=tempert_cgst[0];
u8 idata scroll_bp=0,scroll_bpt=0;
bit show_menu=0;
u8 * pmenu=menu[0];
struct Pad ph[6],pl[6];
/*****************************************************************
*程序运行的起始点,之后各个被创建的任务以5ms的时间片轮流运行
*函数名称:init()
*说明:这是一个RTX51任务,也是第一个被运行的任务
******************************************************************/
void init() _task_ 0
{
EA=0;
EX0=1; //使能外部中断0,用以侦测按键
IT0=1; //外部中断0设置为下降沿触发
os_create_task(1);
os_create_task(2);
os_create_task(3);
os_create_task(6);
os_create_task(7);
os_create_task(8);
os_delete_task(0);
}
/*********************************************************************
*在LED点阵屏上显示时间、日期、和温度 或者 菜单命令
*函数名称:show()
*说明:这是一个RTX51任务,os_create_task(1)后开始运行
***********************************************************************/
void show(void ) _task_ 1
{
setShowStyle();
while(1)
{
if(show_menu)
showMenu();
else
showTime();
}
}
void showTime(void )
{
u8 word,sect; //word:可显示数字、汉字的个数 sect:每个字符的部分,
//具体讲即每个字符的列
for(word=0;word<7;word++) //7:六个8*8数字 一个16*16汉字
{
if(word<6)
{
for(sect=0;sect<8;sect++)
{
scanP=word*8+sect;
putData(word,sect);
delay20US(10);
clr=0; //消隐
}
}
else
{
for(sect=0;sect<16;sect++)
{
scanP=word*8+sect;
putData(word,sect);
delay20US(10);
clr=0; //消隐
}
}
}
//以下内容用以文字移动,即动态显示内容基址的确定
scroll_bpt++;
if(scroll_bpt>8)
{
scroll_bpt=0;
scroll_bp+=2;
}
if(scroll_bp>(16*3+8*4)) // 三个16*16汉字,四个8*16数字、字符
{
scroll_bp=0;
}
}
extern u8 chge_time;
extern u8 idata chgeh[6];
extern u8 idata chgel[6];
void showMenu(void )
{
u8 word,sect;
if(chge_time)
{
for(word=0;word<6;word++)
{
for(sect=0;sect<8;sect++)
{
scanP=word*8 + sect;
clr=1;
if(sect<pl[word].pn)
dataP=pl[word].pad[sect];
else if(!(sect<(pl[word].pn + 5)))
dataP=pl[word].pad[sect-5];
else
dataP=m_time[chgel[word]][sect-pl[word].pn];
sel=1;
if(sect<ph[word].pn)
dataP=ph[word].pad[sect];
else if(!(sect<(ph[word].pn + 5)))
dataP=ph[word].pad[sect-5];
else
dataP=m_time[chgeh[word]][sect-ph[word].pn];
sel=0;
delay20US(10);
clr=0;
}
}
}
else
{
for(word=0;word<4;word++)
{
for(sect=0;sect<16;sect++)
{
scanP=word*16+sect;
clr=1;
dataP=pmenu[word*32+sect+16];
sel=1;
dataP=pmenu[word*32+sect];
sel=0;
delay20US(10);
clr=0;
}
}
}
}
/*******************************************************************
*设置时间、日期的显示格式
*函数名称:setShowStyle()
*说明:
********************************************************************/
void setShowStyle()
{
//设置显示 年月日 的格式:08:11:24
ph[0].pn=2;
ph[0].pad[0]=ph[0].pad[1]=ph[0].pad[2]=0x00;
ph[1].pn=1;
ph[1].pad[0]=ph[1].pad[1]=0x00;
ph[1].pad[2]=0x66;
ph[2].pn=2;
ph[2].pad[0]=0x66;
ph[2].pad[1]=ph[2].pad[2]=0x00;
ph[3].pn=1;
ph[3].pad[0]=ph[3].pad[1]=0x00;
ph[3].pad[2]=0x66;
ph[4].pn=2;
ph[4].pad[0]=0x66;
ph[4].pad[1]=ph[4].pad[2]=0x00;
ph[5].pn=1;
ph[5].pad[0]=ph[5].pad[1]=ph[5].pad[2]=0x00;
//设置显示 时分秒 的格式:22:23:56
pl[0].pn=2;
pl[0].pad[0]=pl[0].pad[1]=pl[0].pad[2]=0x00;
pl[1].pn=1;
pl[1].pad[0]=pl[1].pad[1]=0x00;
pl[1].pad[2]=0x66;
pl[2].pn=2;
pl[2].pad[0]=0x66;
pl[2].pad[1]=pl[2].pad[2]=0x00;
pl[3].pn=1;
pl[3].pad[0]=pl[3].pad[1]=0x00;
pl[3].pad[2]=0x66;
pl[4].pn=2;
pl[4].pad[0]=0x66;
pl[4].pad[1]=pl[4].pad[2]=0x00;
pl[5].pn=1;
pl[5].pad[0]=pl[5].pad[1]=pl[5].pad[2]=0x00;
}
/*****************************************************************
*将待显示数据送到P0口,并锁入适当的锁存器在上排或下排8*8LED显示他们
*函数名称:putData()
*说明;每排前六个LED点阵与后两个LED点阵放置数据方式不同
******************************************************************/
void putData(u8 word,u8 sect)
{
u8 row,col;
clr=1;
if(word<6) //先放上行在仿真中只显示下行,不知道为社么
{
if(sect<pl[word].pn)
dataP=pl[word].pad[sect];
else if(!(sect<(pl[word].pn + 5)))
dataP=pl[word].pad[sect-5];
else
dataP=*(time_tab + 6*for_showl[word] + sect - pl[word].pn);
sel=1;
if(sect<ph[word].pn)
dataP=ph[word].pad[sect];
else if(!(sect<(ph[word].pn + 5)))
dataP=ph[word].pad[sect-5];
else
dataP=*(time_tab + 6*for_showh[word] + sect-ph[word].pn);
sel=0;
}
else
{
if((scroll_bp+sect)<16*3)
{
row=(scroll_bp+sect)/16;
col=(scroll_bp+sect)%16;
dataP=*(week_tab + 32*week_tempert[row] + col+16);
sel=1;
dataP=*(week_tab + 32*week_tempert[row] + col);
sel=0;
}
else if((scroll_bp+sect)<(16*3+8*4))
{
row=(scroll_bp+sect)/8-3;
col=(scroll_bp+sect)%8;
dataP=*(tempert + 16*week_tempert[row] + col+8);
sel=1;
dataP=*(tempert + 16*week_tempert[row] + col);
sel=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -