标题:
P10广告牌移动单片机程序
[打印本页]
作者:
罗正男
时间:
2017-7-8 23:43
标题:
P10广告牌移动单片机程序
很久以前写P10的程序用51单片机写的!作为纪念分享给更多需要的人!
单片机源程序如下:
/******************************************************************
* *
* P10 Moving LED Demo Program 2012/2/2 *
* *
* 作者: DSL *
* *
******************************************************************/
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
/***********************字点阵码*************************/
uchar code CharTable[]=
{
//0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"黑屏"*/
0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"0"*/
0xFF,0xFF,0xFF,0xEF,0x8F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0x83,0xFF,0xFF,/*"1"*/
0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xFB,0xFB,0xF7,0xEF,0xDF,0xBD,0x81,0xFF,0xFF,/*"2"*/
0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xFB,0xE7,0xFB,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,/*"3"*/
0xFF,0xFF,0xFF,0xFB,0xF3,0xEB,0xDB,0xDB,0xBB,0xBB,0x81,0xFB,0xFB,0xE1,0xFF,0xFF,/*"4"*/
0xFF,0xFF,0xFF,0x81,0xBF,0xBF,0xBF,0xA7,0x9B,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,/*"5"*/
0xFF,0xFF,0xFF,0xE3,0xDB,0xBF,0xBF,0xA7,0x9B,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"6"*/
0xFF,0xFF,0xFF,0x81,0xBB,0xBB,0xF7,0xF7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,/*"7"*/
0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,/*"8"*/
0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xD9,0xE5,0xFD,0xFD,0xDB,0xC7,0xFF,0xFF,/*"9"*/
};
sbit RCK_595 = P2^0; //输出锁存器控制脉冲(L)
sbit SCLK_595 = P2^1; //移位时钟脉冲(S)
sbit Sdata_Red = P2^2; //串行数据输入(RED)
sbit G_74138 = P2^4; //显示允许控制信号端口(EN)
uint col;
uchar code CharTable[];
uchar Word, DispRow;
uchar CharBuf[40];
/**********************************************************
将显示数据送入74HC595内部移位寄存器
**********************************************************/
void WR_595(uchar buf)
{
uchar x;
for (x=0; x<8; x++)
{
Sdata_Red=buf&0x80;
buf = buf << 1; //数据左移一位
SCLK_595 = 1; //上升沿发生移位
_nop_();
SCLK_595 = 0;
}
}
/** Combine two byte to one byte to form shifting byte **/
uchar two_onebyte(uchar h1,uchar h2)
{
uchar temp;
temp=(h1<<col)|(h2>>(8-col)); //left shift
return (temp);
}
/***************发送一线点阵数据*******************/
void sendoneline()
{
uchar s,buf;
for(s=0; s<16; s++) //need to be 16 for 1/4 scan time
{
G_74138 = 1; //打开显示
buf=two_onebyte(CharBuf[s],CharBuf[s+4]);
WR_595(buf); //load 8 bit into shift register LS595
}
P1 = P1&0xf0;
RCK_595 = 1; //锁存数据
_nop_();
RCK_595 = 0;
G_74138 = 0; //打开显示
}
/**************装载一线点阵数据****************/
void loadoneline()
{
uchar s; //panel max display char plus 1, for 16x32 numeric display, s=4+1
for(s=0;s<5;s++)
{
CharBuf[4*s+0] = CharTable[Word+(16*s+3*4)+DispRow];
CharBuf[4*s+1] = CharTable[Word+(16*s+2*4)+DispRow];
CharBuf[4*s+2] = CharTable[Word+(16*s+1*4)+DispRow];
CharBuf[4*s+3] = CharTable[Word+(16*s+0*4)+DispRow];
}
}
/**********************************************************
主函数
**********************************************************/
void main()
{
uchar i,SPEED;
G_74138 = 0;
col=0;
Word=0;
SPEED=20;
P1=0;
while(1)
{
while(col<8) //Already load max display char + 1, this routine is to shift one char
//Total display will be max display char + 1, for 16x32, display char=5
//After display total shifting char, it will point to next char
{
for(i=0;i<SPEED;i++)//汉字在屏幕上的停留时间(即移动速度快慢)
{
for (DispRow=0;DispRow<4;DispRow++) //扫描4行
{
loadoneline(); //装载一线点阵数据
sendoneline(); //发送一线点阵数据
P1=DispRow;
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
P10 Moving LED.rar
(1.65 KB, 下载次数: 66)
2017-7-8 23:43 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
sxdy99
时间:
2017-9-1 15:42
这类资料不好找呢。感谢楼主了
作者:
happyner
时间:
2017-9-8 18:52
thanks,,,,,,
作者:
Akon4
时间:
2018-9-5 13:19
厉害!
作者:
saj123
时间:
2021-1-5 17:24
好资料,能否做成频谱??
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1