📄 led点阵显示屏源程序.c
字号:
for(m=0;m<num;m++)
{
if(showbuf_sign==0) //正在显示显示缓冲区show_buffer1中的内容,
//则更新show_buffer2中的内容
{
for(i=0;i<=m;i++) //上展开屏显示移动的第m次,需要移动m列数据
//需要移位的个数,如第一次仅需更新显示缓冲区的第一位
{
for(j=0;j<16;j++)
{
show_buffer2[i][j]=storep6[i][j]; //一行行的更新
}
}
}
else
{
for(i=0;i<=m;i++) //上展开屏显示移动的第m次,需要移动m列数据
//需要移位的个数,如第一次仅需更新显示缓冲区的第一位
{
for(j=0;j<16;j++)
{
show_buffer1[i][j]=storep6[i][j];
}
}
//数据完成一次移动
showbuf_sign=~showbuf_sign; //显示区标志位取反,
//显示另外一个显示缓冲区中的内容
}
for(i=0;i<50;i++)
for(j=0;j<20;j++)
{
if(showbuf_sign==0)
{
show_static(show_buffer1); //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
}
else
{
show_static(show_buffer2);
}
}
}
for(i=0;i<100;i++) //全部数据已经移到显示缓冲区,需要全屏
//静态显示一段时间
{
if(showbuf_sign==0)
{
show_static(show_buffer1); //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
}
else
{
show_static(show_buffer2);
}
}
}
/*------------------------------下展开屏子程序------------------------*/
/*
*************************************************************************
**子程序入口:需要进行下展开屏显示的数据的首地址,不可以是显示缓冲区的地址,
** 数据必须是二维数组,字节数只能16*8字节
**子程序功能:字体从下到上逐渐展开显示,只可以显示4个汉字(或等量的字符),开** 完屏后进行一段时间的静态显示
**************************************************************************
*/
void show_downspread(storep7)
uchar xdata **storep7;
{
uint num=16; //显示缓冲区更新的次数为16次 ,即:屏幕的宽度
uint i,j,m;
for(i=0;i<16;i++) //对两个显示缓冲区清零
{
for(j=0;j<8;j++)
{
show_buffer1[i][j]=0x00;
show_buffer2[i][j]=0x00;
}
}
TMOD=TMOD&&0xf0; //计数器0工作在方式1,计数器1,2工作方式保持不变
TMOD=TMOD||0x01;
TH0=(65536-25000)/256; //晶振12MHZ,计数20000次,1S中断50次
TL0=(65536-25000)%256;
EA=1 ; //CPU开中断,定时器0开中断
ET0=1;
TR0=1; //启动定时器0
showbuf_sign=0; //程序开始时使用show_buffer1显示缓冲区
for(m=0;m<num;m++)
{
if(showbuf_sign==0) //正在显示显示缓冲区show_buffer1中的内容,
//则更新show_buffer2中的内容
{
for(i=m-1;i>=0;i--) //下展开屏显示移动的第m次,需要移动m列数据
//需要移位的个数,如第一次仅需更新显示缓冲区的最后一位
{
for(j=0;j<16;j++)
{
show_buffer2[i][j]=storep7[i][j];
//一行行的更新,先更新最后一行,然后是倒第二行
}
}
}
else
{
for(i=m-1;i>=0;i--)
//下展开屏显示移动的第m次,需要移动m列数据
//需要移位的个数,如第一次仅需更新显示缓冲区的最后一位
{
for(j=0;j<16;j++)
{
show_buffer1[i][j]=storep7[i][j];
}
}
//数据完成一次移动
showbuf_sign=~showbuf_sign; //显示区标志位取反,显示另外一个
//显示缓冲区中的内容
}
for(i=0;i<50;i++)
for(j=0;j<20;j++)
{
if(showbuf_sign==0)
{
show_static(show_buffer1); //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
}
else
{
show_static(show_buffer2);
}
}
}
for(i=0;i<100;i++)//全部数据已经移到显示缓冲区,需要全屏静态显示一段时间
{
if(showbuf_sign==0)
{
show_static(show_buffer1); //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
}
else
{
show_static(show_buffer2);
}
}
}
/*---------------------------中间开屏子程序---------------------------*/
/*
***************************************************************************
**子程序入口:需要进行中间开屏显示的数据的首地址,不可以是显示缓冲区的地址,
** 数据必须是二维数组,字节数只能16*8字节
**子程序功能:字体从中间向两边开屏,只可以显示4个汉字(或等量的字符),开完屏** 后进行一段时间的静态显示
***************************************************************************
*/
void show_middle(storep8)
uchar xdata **storep8;
{
uint num=8; //显示缓冲区更新的次数为8次 ,即:屏幕的宽度的一半
//定义变量num是为了以后程序扩展的方便,若屏幕增长,则只需改变num值
uint i,j,m;
for(i=0;i<16;i++) //对两个显示缓冲区清零
{
for(j=0;j<8;j++)
{
show_buffer1[i][j]=0x00;
show_buffer2[i][j]=0x00;
}
}
TMOD=TMOD&&0xf0; //计数器0工作在方式1,
TMOD=TMOD||0x01;
TH0=(65536-25000)/256; //晶振12MHZ,计数25000次,1S中断40次
TL0=(65536-25000)%256;
EA=1 ; //CPU开中断,定时器0开中断
ET0=1;
PT0=0; //定时器0为中断低优先级
TR0=1; //启动定时器0
showbuf_sign=0; //程序开始时使用show_buffer1显示缓冲区
for(m=0;m<num;m++)
{
if(showbuf_sign==0) //正在显示显示缓冲区show_buffer1中的内容,
//则更新show_buffer2中的内容
{
for(i=0;i<=m;i++) //中间开屏显示移动的第m次,需要移动m列数据
//需要移位的个数,如第一次仅需更新显示缓冲区的中间两位
{
for(j=0;j<16;j++)
{
show_buffer2[j][num/2-i-1]=storep8[j][num/2-i-1]; //一列列的更新
}
}
}
else
{
for(i=0;i<=m;i++) //中间开屏显示移动的第m次,需要移动m列数据
//需要移位的个数,如第一次仅需更新显示缓冲区的第一位
{
for(j=0;j<16;j++)
{
show_buffer1[j][num/2-i-1]=storep8[j][num/2-i-1];
}
}
//数据完成一次移动
showbuf_sign=~showbuf_sign; //显示区标志位取反,
//显示另外一个显示缓冲区中的内容
}
for(i=0;i<50;i++)
for(j=0;j<20;j++)
{
if(showbuf_sign==0)
{
show_static(show_buffer1); //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
}
else
{
show_static(show_buffer2);
}
}
}
for(i=0;i<100;i++)//全部数据已经移到显示缓冲区,需要全屏静态显示一段时间
{
if(showbuf_sign==0)
{
show_static(show_buffer1); //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
}
else
{
show_static(show_buffer2);
}
}
}
/*----------------------定时器0中断子程序------------------------------*/
void timer0() interrupt 1 using 1 //定时器0中断子程序,使用第一组寄存器
{
TH0=(65536-25000)/256;
TL0=(65536-25000)%256;
if(showbuf_sign==0)
{
show_static(show_buffer1); //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
}
else
{
show_static(show_buffer2);
}
}
/*-------------------------------移位子程序-----------------------------*/
/**********************************************************************
** 子程序入口:8字节数据的首地址
** 子程序功能:子程序通过74HC165实现8字节数据信息并行输入串行输出
***********************************************************************/
#define AD_138 XBYTE[0x7fff]
sbit RCLK=P0^5;
void shift_165(uchar *value) // 编程时须注意cs_6116_138的值得更替
{
uint i,j;
cs_6116_138=1 ;//选中138,G1=1
cs_138=0 ; // G2B=0
for(i=7;i<0;i++) //共需要移动8字节,先移动数据的最后一个字节
{
AD_138=0x00; //选中第二个165
P0=value[i]; //送入并行数据
AD_138=0x01; //选中第三个165,第二个已锁定
P0=0xaa; //将移位脉冲送入第三个165
AD_138=0x10; //将第二个和第三个165锁定,然后就可以移位了 SH2=SH3=1
for(j=0;j<8;j++) //ALE信号产生8次 ,移位完成一次
{
P0=P0;
}
}
AD_138=0x07; //选中74LS374
RCLK=0;
P0=P0; //等待芯片反应时间
RCLK=1; //产生上升沿脉冲,数据由74LS595并行输出
}
/*
*****************************************************************
** 子程序show_pcprocess入口参数:有效数据个数
** 子程序功能:处理有效的显示数据和显示模式,调用相应的显示函数
*****************************************************************
*/
void show_pcprocess(uint effectnum)
{
uint funs;
*show_pcdata=&show_pc[0][12]; //指向有效显示数据首地址
funs=*(&show_pc[0][12]+effectnum); //提取显示模式控制字
switch(funs)
{
case 0: show_left(show_pcdata,effectnum); break;
//可以滚动显示所有内容
case 1: show_right(show_pcdata); break;
//只可以显示前面4汉字的容量数据
case 2: show_up(show_pcdata); break;
//只可以显示前面4汉字的容量数据,下同
case 3: show_down(show_pcdata); break;
case 4: show_upspread(show_pcdata); break;
case 5: show_downspread(show_pcdata); break;
case 6: show_middle(show_pcdata); break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -