📄 main.c
字号:
/*
main.c
16×16 LED点阵的扫描显示:滚动显示文字
*/
#include "Zimo.h"
#include <reg51.h>
#include <ctype.h>
//设置屏幕滚动速度(单位:×10ms)
#define SCROLL_SPEED 15
//定义I/O端口
sbit STR = P1^3; //74HC595存储寄存器时钟(Storage register clock)
sbit SI = P1^4; //74HC595串行输入信号(Serial Input)
sbit SCK = P1^5; //74HC595移位寄存器时钟(Shift register clock)
//定义显示缓冲区(在T1定时中断里扫描)
unsigned char data DispBuf[32];
/*
函数:SysInit()
功能:系统初始化
*/
void SysInit()
{
unsigned char i;
for ( i=0; i<32; i++ )
{
DispBuf[i] = 0x00;
}
STR = 1;
SI = 0;
SCK = 0;
TMOD &= 0xF0;
TMOD |= 0x01;
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 0xFC;
TL1 = 0x66;
TR1 = 1;
ET1 = 1;
EA = 1;
}
/*
函数:Delay()
功能:延时10ms~2.56s
参数:
t>0时,延时(t*10)ms
t=0时,延时2.56s
*/
void Delay(unsigned char t)
{
do
{
TH0 = 0xDC;
TL0 = 0x66;
TR0 = 1;
while ( !TF0 );
TR0 = 0;
TF0 = 0;
}while ( --t != 0 );
}
/*
函数:PutChar()
功能:滚动显示一个字母或汉字
参数:
c:字母或汉字的编码
当c>=0x80时,视为一个汉字
*/
void PutChar(unsigned char c)
{
unsigned int a; //地址变量
unsigned char i,j; //循环变量
unsigned char t; //临时变量
unsigned char code *Tab; //指针,用于查表
t = 8;
if ( c >= 0x80 ) //如果c是汉字
{
t = 16;
a = 32 * ( c - 0x80 );
Tab = HanziTab;
}
else if ( isupper(c) ) //如果c是大写字母
{
a = 16 * ( c - 'A' );
Tab = UpperTab;
}
else if ( islower(c) ) //如果c是小写字母
{
a = 16 * ( c - 'a' );
Tab = LowerTab;
}
else //如果是其它字符
{
return;
}
for ( j=0; j<t; j++ )
{
for ( i=0; i<15; i++ )
{
DispBuf[i] = DispBuf[i+1];
DispBuf[16+i] = DispBuf[17+i];
}
DispBuf[i] = Tab[a+j];
DispBuf[16+i] = Tab[a+j+t];
Delay(SCROLL_SPEED);
}
}
/*
函数:PutStr()
功能:滚动显示一个文字串
参数:
*str:以'\0'结尾的文字串
*str可以同时包含字母和汉字,其中汉字必须是小汉字库内的汉字
*/
void PutStr(unsigned char code *str)
{
unsigned char c;
for (;;)
{
c = *str++;
if ( c == '\0' ) break;
PutChar(c);
}
}
/*
函数:T1INTSVC()
功能:T1中断服务函数
*/
void T1INTSVC() interrupt 3 using 2
{
code unsigned char Tab[] =
{//定义扫描数据表
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,
0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
static unsigned char n = 0; //局部静态变量,用于查表
unsigned char i,j; //循环变量
unsigned char d; //临时变量
unsigned char data buf[4]; //临时数组,用于向74HC595发送数据
//处理定时器T1
TR1 = 0;
TH1 = 0xFC;
TL1 = 0x66;
TR1 = 1;
//查表,取得要发送的数据
buf[0] = Tab[n];
buf[1] = Tab[16+n];
buf[2] = DispBuf[16+n];
buf[3] = DispBuf[n];
n++;
n &= 0x0F;
//向74HC595发送数据
STR = 0;
for ( i=0; i<4; i++ )
{
d = buf[i];
j = 8;
do
{
SI = (bit)(d & 0x01);
SCK = 1;
d >>= 1;
SCK = 0;
} while ( --j != 0 );
}
STR = 1;
}
void main()
{
//定义文字串
code unsigned char s[] =
{
0x81, //欢
0x82, //迎
0x83, //使
0x84, //用
'S','m','a','r','t','S','O','P','C',
0x85, //教
0x86, //学
0x87, //实
0x88, //验
0x89, //开
0x8A, //发
0x8B, //平
0x8C, //台
0x80, // (全角空白)
'\0'
};
SysInit();
for (;;)
{
PutStr(s);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -