📄 pointled.c
字号:
/*--------------------------------------------------
工程名字:LEDPoint
工程功能:16×64 LED点阵显示
作者:小琅
时间:2008-7-29 11:39
---------------------------------------------------*/
#include "myinclude.h"
#define WordNum 4 //点阵字个数
#define LedNum 4 //点阵个数
//汉字点阵图
code uint16 ShowData[WordNum][16]={
{0x1020,0x1024,0x93FE,0x5420,
0x19FC,0xFC20,0x13FE,0x1004,
0x39FE,0x3504,0x51FC,0x9104,
0x11FC,0x1104,0x1104,0x110C}, //精
{0x0100,0x0108,0x3FFC,0x2108,
0x2108,0x2108,0x3FF8,0x2108,
0x0100,0x0100,0x1200,0x5104,
0x5112,0x9012,0x0FF0,0x0000}, //忠
{0x1008,0x11FC,0x1108,0x1108,
0xFD28,0x1110,0x1500,0x19F8,
0x3108,0xD190,0x1150,0x1120,
0x1150,0x118E,0x5104,0x2100}, //报
{0x0004,0x7FFE,0x4024,0x5FF4,
0x4104,0x4104,0x4144,0x4FE4,
0x4104,0x4144,0x4124,0x4104,
0x5FF4,0x4004,0x7FFC,0x4004} //国
};
#define TranCon P1
sbit MR = P3^6;
sbit clock = P3^7;
#define KeepTime 4 //动态显示保持时间
uint8 MODE = 0; //点阵显示模式
uint8 State = 0; //动态显示时的状态记录
uint8 MoveState = 0; //流动显示的状态记录
void Init();
void SerSend(uint8 senddata);
void Delay(uint8 count);
void DisplayAll();
void MODE0();
void MODE1();
/*---------------------------------------------------
函数功能:主函数
----------------------------------------------------*/
void main()
{
Init(); //初始化
while(1)
{
switch(MODE)
{
case 0:
DisplayAll();
break;
case 1:
MODE0();
break;
case 2:
MODE1();
break;
default:
break;
}
}
}
/*----------------------------------------
**函数功能:初始化
**输入:无
**输出:无
-----------------------------------------*/
void Init()
{
TMOD = 0x11; //定时器1和0,工作方式都为1
TCON = 0x01; //外中断0,下降沿触发
TH0 = 0x3C; //50毫秒定时,初始化时钟值
TL0 = 0xB0;
TH1 = 0x3C;
TL1 = 0xB0;
IE |= 0x8B; //开总中断,定时器0 1中断,外0中断
if(MODE == 1) //根据不同的模式开不同的时钟
{
TR0 = 1;
}
else if(MODE == 2)
{
TR1 = 1;
}
}
/*--------------------------------------------
**函数功能:用查询方式从串口发送一个8位数据
**输入: senddata:要发送的数据
**输出:无
--------------------------------------------*/
#pragma disable
void SerSend(uint8 senddata)
{
TI=0;
SBUF = senddata;
while(TI=0);
TI=0;
}
/*--------------------------------------------
**函数功能:点阵四字静态显示
**输入:无
**输出:无
--------------------------------------------*/
void DisplayAll()
{
uint8 i,j;
for(i=0; i<16; i++)
{
MR = 0; //清除端口数据
clock = 0;
_nop_();
clock = 1;
MR = 1;
TranCon = i; //片选信号
for(j=0; j<4; j++) //发送数据
{
SerSend((uint8)(ShowData[j][i]>>8));
SerSend((uint8)ShowData[j][i]);
}
clock=0; //锁存
nop3;
nop3;
clock=1;
Delay(1);
}
}
/*--------------------------------------------
**函数功能:点阵显示模式1:文字从上向下动态显示
--------------------------------------------*/
#pragma disable
void MODE0()
{
uint8 i,j;
for(i=0; i<=State; i++)
{
MR = 0; //清除端口数据
clock = 0;
_nop_();
clock = 1;
MR = 1;
TranCon = i; //片选信号
for(j=0; j<4; j++)
{
SerSend((uint8)(ShowData[j][15-State+i]>>8));
SerSend((uint8)ShowData[j][15-State+i]);
}
clock=0;
nop3;
nop3;
clock=1;
Delay(1);
}
if(State == 15) //稳定后暂停
{
TR0 = 0;
DisplayAll();
DisplayAll();
DisplayAll();
TR0 = 1;
}
}
/*----------------------------------------
**函数功能:整体流动显示汉字
-----------------------------------------*/
void MODE1()
{
uint8 i,j;
uint8 temp;
data uint16 LastData[4]; //记录移位后的最终数据
for(i=0; i<=15; i++)
{
LastData[0] = 0;
LastData[1] = 0;
LastData[2] = 0;
LastData[3] = 0;
temp = 15 - MoveState%16; //要取得的汉字的位数
if(MoveState <= 15)
{
LastData[3] = ShowData[0][i] >> temp;
}
else if(MoveState >= 16 && MoveState <=31)
{
LastData[3] = (ShowData[0][i] << (16 - temp)) | (ShowData[1][i] >> temp);
LastData[2] = ShowData[0][i] >> temp;
}
else if(MoveState >= 32 && MoveState <=47)
{
LastData[3] = (ShowData[1][i] << (16 - temp)) | (ShowData[2][i] >> temp);
LastData[2] = (ShowData[0][i] << (16 - temp)) | (ShowData[1][i] >> temp);
LastData[1] = ShowData[0][i] >> temp;
}
else
{
LastData[3] = (ShowData[2][i] << (16 - temp)) | (ShowData[3][i] >> temp);
LastData[2] = (ShowData[1][i] << (16 - temp)) | (ShowData[2][i] >> temp);
LastData[1] = (ShowData[0][i] << (16 - temp)) | (ShowData[1][i] >> temp);
LastData[0] = ShowData[0][i] >> temp;
}
MR = 0; //清除端口数据
clock = 0;
_nop_();
_nop_();
clock = 1;
MR = 1;
TranCon = i; //片选信号
for(j=0; j<4; j++)
{
SerSend((uint8)(LastData[j]>>8));
SerSend((uint8)LastData[j]);
}
clock=0; //锁存
nop3;
nop3;
clock=1;
Delay(1);
}
if(MoveState >= 63)
{
TR1 = 0;
DisplayAll();
DisplayAll();
DisplayAll();
DisplayAll();
TR1 = 1;
}
}
/*----------------------------------------
**函数功能:定时器0的中断处理
**输入:无
**输出:无
-----------------------------------------*/
void Timer0_int() interrupt 1 using 1
{
static flag=0;
flag++;
if (MODE == 1)
{
if(flag == KeepTime)
{
flag=0;
State++; //汉字状态标志
State %= 16;
}
}
TR0 = 0;
TH0 += 0x3C;
TL0 += 0xB7;
TR0 = 1;
}
/*----------------------------------------
**函数功能:定时器1的中断处理
**输入:无
**输出:无
-----------------------------------------*/
void Timer1_int() interrupt 3 using 2
{
static flag=0;
flag++;
if(flag == KeepTime)
{
flag = 0;
MoveState++;
MoveState %= 64;
}
TR1 = 0;
TH1 += 0x3C;
TL1 += 0xB7;
TR1 = 1;
}
/*-----------------------------------------
**函数功能:外中断0处理函数
**输入:无
**输出:无
------------------------------------------*/
void Out0_int() interrupt 0
{
MODE++;
MODE %= 3;
switch(MODE)
{
case 0:
TR0 = 0;
TR1 = 0;
break;
case 1:
TR0 = 1;
TR1 = 0;
break;
case 2:
TR0 = 0;
TR1 = 1;
break;
default:
break;
}
}
/*-----------------------------------------
**函数功能:延时
------------------------------------------*/
void Delay(uint8 count)
{
uint8 i=80;
while(count--)
for(;i>0;i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -