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

📄 main.c

📁 32*16点阵显示例程 模拟奥运会开幕式的
💻 C
字号:
/*********************************************************
程序名称:LED3216点阵流动显示汉字
简要说明:最大可显示16*16汉字
          P0口接上行线,P2口接下行线,P3口接扫描线
		  P3.0接左屏译码器使能端(CS1)
		  P3.1接右屏译码器使能端(CS2)
编    写:JiangX.net
*********************************************************/
#include <AT89X52.h>
#include "ziku.h"						//字库“再别康桥”
//#include "test_ziku.h"					//字库“LED屏测试”,切换这两个字库可方便切换已存储于程序中的显示内容
#define uchar unsigned char
#define uint unsigned int			
#define ulong unsigned long				//宏定义
#define hang1 		P0				    //上行线
#define hang2 		P2				    //下行线
#define lie			P1				    //列线
#define CS1			P3_0			    //接左屏154译码器使能端
#define	CS2			P3_1			    //接右屏154译码器使能端
#define sum			sizeof(hanzi)/32	//自动计算汉字字数

/*****参数设置*****/
#define ziti    	16					//字体大小(宽度)
#define	light		50				    //显示亮度
#define	move_speed	25			    	//移动速度

uint	k=0,j;			   				//移位变量,k:移位个数
uint	a=0;			    	 		//用于软件延时		
ulong	s=(sum+1)*ziti;					//s为全部列数
uchar 	disbuf[32][2];					//定义显示缓冲区(32行两列的二维数组以开辟2个16*16汉字的空间)
bit		move_st;						//移动标志

/*****可变延时*****/
void delay(void)		 			   	//用来改变扫描延时以调节亮度
{
	uchar i;
	for(i=0;i<light;i++);
}

/*****初始化子程序*****/
void init(void)	              		 	//定时器初始化,设置定时器0工作方式1,定时时间1ms
{			 
 	TMOD=0x1;
 	TH0=0xfc;
 	TL0=0x18;
}

/*****计数器中断程序*****/
void timer0(void) interrupt 1    		//中断处理
{
 	TH0=0xfc;
 	TL0=0x18;
 	a++;					     	
}

/*****汉字循环显示*****/
void run_move(void)
{
	uchar 	k1,k2;
	if(a>=move_speed)	      			//move_speed控制移动速度
	{				
							
		if(k>s-ziti-1)k=0;	  			//整屏移动列数		
		k1=k/ziti;
		k2=k%ziti;
		j=ziti*2*k1+k2;					//显示指针
		k++;
		move_st=1;
		a=0;
	} 
}

/*****装载显示数据至缓冲区*****/
void load_hanzi(void)
{		
	uchar i;
	run_move();
	if(move_st)
	{	
		for(i=0;i<31;i++)
		{
			disbuf[i][0]=disbuf[i+1][0];//移位处理
			disbuf[i][1]=disbuf[i+1][1];//移位处理
		} 
		disbuf[31][0]=hanzi[j];
		disbuf[31][1]=(hanzi[ziti+j]);			
		move_st=0;	 	 			   
	}		
}

/*****扫描显示数据缓冲区的内容*****/
void display(void)
{		
	uchar i;
	CS2=1;				   		 		//关右屏
	CS1=0;			   		 			//开左屏
	for (i=0;i<16;i++)
	{
		lie=i;							
		hang1=disbuf[i][0];
		hang2=disbuf[i][1];
		delay();
		hang1=0;
		hang2=0;			   
	}
	CS1=1;								//关左屏
	CS2=0;		             			//开右屏
	for (i=0;i<16;i++)
	{
		lie=i<<4;
		hang1=disbuf[i+16][0];
		hang2=disbuf[i+16][1];
		delay();
		hang1=0;
		hang2=0;
	}

}

/*****主程序*****/
void main (void)
{
	init();
	EA=1;								//开中断
	TR0=1;				    		
	ET0=1;							
	while(1)
	{
		load_hanzi();
		display();
	}
}

/*****END*****/
/*****欢迎到作者博客交流:http://www.jiangx.net*****/	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -