📄 led.c
字号:
{
IO0SET=BIT_8; /*COLCLK*/
IO0CLR=BIT_8;
}
void Col_Data_Clk(void) //送列的8位数据
{
INT8U i;
for(i=0;i<8;i++)
{
IO0SET=BIT_5|BIT_6; /*COLCLK*/
IO0CLR=BIT_5|BIT_6;
}
}
void ROW_DATA_LATCH(void)
{
IO0SET=BIT_7; /*显示*/
IO0CLR=BIT_7; /**/
}
/****************************************************************************
* 名称:LED_Reflash(INT8U light)
* 功能:刷新LED
* 入口参数:
* 出口参数:无
****************************************************************************/
void LED_Reflash(INT8U light)
{
INT16U i,j,k,l;
for(l=0;l<8;l++) //送1/8帧,j=16 每行16个字节
{
for(j=0;j<16;j+=4) //送1/8帧,j=16 每行16个字节
{
for(i=0;i<32;i+=8) //每块板一次送四列
{
for(k=0;k<4;k++) //送一列 k=LED_XSIZE/8
{
LED_Add0 = P_FRAME[i+l][k+j];
LED_Add1 = P_FRAME[32+i+l][k+j];
LED_Add2 = P_FRAME[64+i+l][k+j];
// LED_Add3 = P_FRAME[96+i+l][k+j];
Col_Data_Clk();
}
}
}
ROW_DATA_LATCH();
Disp_Open();
Time0_Startup(light); //亮度控制
DelayNS(13); //行延时,满足每秒大于等于120帧
}
Frame_Data();
WdtFeed(); //看门狗喂狗信号
}
/****************************************************************************
* 名称:LEDReflashTimeTest()
* 功能:测试行周期时间,单位微秒
* 入口参数:
* 出口参数:无
****************************************************************************/
INT32U LEDReflashTimeTest(void)
{
INT32U i,j,k,l;
TimeInit0(1);
Time0_Startup(0xffffffff);
for(l=0;l<1;l++) //送1/8帧,j=16 每行16个字节
{
for(j=0;j<16;j+=4) //送1/8帧,j=16 每行16个字节
{
for(i=0;i<32;i+=8) //每块板一次送四个字节
{
for(k=0;k<4;k++) //送一列 k=LED_XSIZE/8
{
LED_Add0 = P_FRAME[i+l][k+j];
LED_Add1 = P_FRAME[32+i+l][k+j];
LED_Add2 = P_FRAME[64+i+l][k+j];
// LED_Add3 = P_FRAME[96+i+l][k+j];
Col_Data_Clk();
}
}
}
ROW_DATA_LATCH();
Disp_Open();
DelayNS(13); //延时,满足每秒大于等于120帧
}
i=Time0_Read();
return(i);
}
/****************************************************************************
* 名称:LED_Full()
* 功能:立即全屏显示指定帧的内容
* 入口参数:
* 出口参数:无
****************************************************************************/
void LED_Full(P_FRAME_DATA p)
{
INT8U i,j;
for(i=0;i<LED_YSIZE;i++) //
{
for(j=0;j<16;j++) //每行16个字节128像素
{
if(UART_DATA_COUNT>5) return;
DISP_BUFFER_DATA.frame[i][j] = p->frame[i][j];
}
}
}
/****************************************************************************
* 名称:LED_UpMove()
* 功能:显示向上移动
* 入口参数:
* 出口参数:无
****************************************************************************/
void LED_UpMove(P_FRAME_DATA p)
{
INT8U i,j,k,l;
for(k=0;k<LED_YSIZE;k++) //
{
for(i=0;i<LED_YSIZE;i++) //
{
for(j=0;j<16;j++) //每行16个字节128像素
{
if(i<(LED_YSIZE-1)) DISP_BUFFER_DATA.frame[i][j] = DISP_BUFFER_DATA.frame[i+1][j];
else DISP_BUFFER_DATA.frame[i][j] = p->frame[k][j];
}
}
for(l=0;l<p->move_time;l++)
{
if(UART_DATA_COUNT>5) return;
LED_Reflash(p->disp_light);
}
}
}
/****************************************************************************
* 名称:LED_DownMove()
* 功能:显示向下移动
* 入口参数:
* 出口参数:无
****************************************************************************/
void LED_DownMove(P_FRAME_DATA p)
{
signed char i,j,k,l;
for(k=(LED_YSIZE-1);k>-1;k--) //
{
for(i=(LED_YSIZE-1);i>-1;i--) //
{
for(j=0;j<16;j++) //每行16个字节128像素
{
if(i>0) DISP_BUFFER_DATA.frame[i][j] = DISP_BUFFER_DATA.frame[i-1][j];
else DISP_BUFFER_DATA.frame[i][j] = p->frame[k][j];
}
}
for(l=0;l<p->move_time;l++)
{
if(UART_DATA_COUNT>5) return;
LED_Reflash(p->disp_light);
}
}
}
/****************************************************************************
* 名称:LED_LeftMove()
* 功能:显示向左 移动
* 入口参数:
* 出口参数:无
****************************************************************************/
void LED_LeftMove(P_FRAME_DATA p)
{
INT8U i,j,k,l;
INT8S m;
for(k=0;k<16;k++) //
{
for(m=7;m>-1;m--) //
{
for(i=0;i<LED_YSIZE;i++) //
{
for(j=0;j<16;j++) //每行16个字节128像素
{
if(j<15) DISP_BUFFER_DATA.frame[i][j] = (DISP_BUFFER_DATA.frame[i][j]<<1)|((DISP_BUFFER_DATA.frame[i][j+1]>>7)&0x01);
else DISP_BUFFER_DATA.frame[i][j] =(DISP_BUFFER_DATA.frame[i][j]<<1)|((p->frame[i][k]>>m)&0x01);
}
}
for(l=0;l<p->move_time;l++)
{
if(UART_DATA_COUNT>5) return;
LED_Reflash(p->disp_light);
}
}
}
}
/****************************************************************************
* 名称:LED_Num_LeftMove()
* 功能:指定行向左 移动
* 入口参数:
* 出口参数:无
***************************************************************************
void LED_Num_LeftMove(void)
{
INT8U i,j,k,l;
static INT8U s;
INT8S m;
P_FRAME_DATA p;
if(s==0)
{
p=&FRAME_DATA[1];
s=1;
}
else
{
p=&FRAME_DATA[2];
s=0;
}
for(k=0;k<16;k++) //
{
for(m=7;m>-1;m--) //
{
for(i=80;i<LED_YSIZE;i++) //
{
for(j=0;j<16;j++) //每行16个字节128像素
{
if(j<15) DISP_BUFFER_DATA.frame[i][j] = (DISP_BUFFER_DATA.frame[i][j]<<1)|((DISP_BUFFER_DATA.frame[i][j+1]>>7)&0x01);
else DISP_BUFFER_DATA.frame[i][j] =(DISP_BUFFER_DATA.frame[i][j]<<1)|((p->frame[i][k]>>m)&0x01);
}
}
for(l=0;l<FRAME_DATA[1].move_time;l++)
{
if(UART_DATA_COUNT>5) return;
LED_Reflash(FRAME_DATA[1].disp_light);
}
}
}
}*/
/****************************************************************************
* 名称:LED_RightMove()
* 功能:显示向右移动
* 入口参数:
* 出口参数:无
****************************************************************************/
void LED_RightMove(P_FRAME_DATA p)
{
INT8U i,l;
INT8S j,k,m;
for(k=15;k>-1;k--) //
{
for(m=7;m>-1;m--) //
{
for(i=0;i<(LED_YSIZE-1);i++) //
{
for(j=15;j>-1;j--) //每行16个字节128像素
{
if(j>0) DISP_BUFFER_DATA.frame[i][j] = (DISP_BUFFER_DATA.frame[i][j]>>1)|((DISP_BUFFER_DATA.frame[i][j-1]<<7)&0x80);
else DISP_BUFFER_DATA.frame[i][j] =(DISP_BUFFER_DATA.frame[i][j]>>1)|((p->frame[i][k]<<m)&0x80);
}
}
for(l=0;l<p->move_time;l++)
{
if(UART_DATA_COUNT>5) return;
LED_Reflash(p->disp_light);
}
}
}
}
/****************************************************************************
* 名称:LED_Disp()
* 功能:把显示数据送入内存
* 入口参数:
* 出口参数:无
****************************************************************************/
void LED_Disp(void)
{
static INT8U i;
INT32U j;
if(P_CURRENT_FRAME_DATA)
{
switch(P_CURRENT_FRAME_DATA->disp_mode)
{
case '1':
LED_UpMove(P_CURRENT_FRAME_DATA);
break;
case '2':
LED_DownMove(P_CURRENT_FRAME_DATA);
break;
case '3':
LED_LeftMove(P_CURRENT_FRAME_DATA);
break;
case '4':
LED_RightMove(P_CURRENT_FRAME_DATA);
break;
default:
LED_Full(P_CURRENT_FRAME_DATA);
break;
}
for(j=0;j<P_CURRENT_FRAME_DATA->disp_time;j++)
{
if(UART_DATA_COUNT>5) return;
LED_Reflash(P_CURRENT_FRAME_DATA->disp_light);
}
}
while(1)
{
if(i>10) i=0;
for(;i<11;i++)
{
if(UART_DATA_COUNT>5){return;}
if(FRAME_DATA[i].disp_en=='1')
{
if(i==0){P_FRAME=FRAME_DATA[0].frame; OpenRTC_IRQ();} else{ CloseRTC_IRQ(); P_FRAME=DISP_BUFFER_DATA.frame;}
switch(FRAME_DATA[i].disp_mode)
{
case '1':
LED_UpMove(&FRAME_DATA[i]);
break;
case '2':
LED_DownMove(&FRAME_DATA[i]);
break;
case '3':
LED_LeftMove(&FRAME_DATA[i]);
break;
case '4':
LED_RightMove(&FRAME_DATA[i]);
break;
default:
LED_Full(&FRAME_DATA[i]);
break;
}
for(j=0;j<FRAME_DATA[i].disp_time;j++)
{
if(UART_DATA_COUNT>5){ CloseRTC_IRQ(); P_FRAME=DISP_BUFFER_DATA.frame;return;}
LED_Reflash(FRAME_DATA[i].disp_light);
if((IO1PIN&BIT_19)==0)
{
if((IO1PIN&BIT_22)==0) Disp_X(); else Disp_Y();
}
//if(UART_DATA[1]<='9') LED_Num_LeftMove();
}
}
WdtFeed(); //看门狗喂狗信号
if(UART_DATA_COUNT>5){ CloseRTC_IRQ(); P_FRAME=DISP_BUFFER_DATA.frame;return;}
}
}
}
/****************************************************************************
* 名称:IRQ_Time0()
* 功能:定时器0中断服务程序,取反BEEPCON控制口。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_Time0(void)
{
Disp_Close();
T0TCR = 0x00; // 复位中断,禁止计数
T0IR = 0x01; // 清除中断标志
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -