⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pointled.c

📁 用keil环境和proteus实现的16*16四字点阵显示
💻 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 + -