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

📄 dianzhen.c

📁 笔者自己弄的一个32*16的点阵模块,使用51单片机以及74hc595和74hc138实现,内有动态显示程序和静态显示程序,以及Protel99SE原理图和PCB图.
💻 C
字号:
#include"reg51.h"
#include"for51.h"

uchar start;
uchar CS_3_8_0, CS_3_8_1;

void SendData(uchar ddata);//向74HC595发送数据
void DisplayPic(uchar* Pic, uchar num);  
void Delayms(uint ticks);

//图片数据
uchar code pic[] = {
/*--  文字:  中  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,

/*--  空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  国  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00,

/*--  空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  人  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x01,0x06,0x0C,0x18,0x30,0x60,0x20,0x00,

/*--  空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  民  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x9E,0x80,0x80,0x00,0x00,
0x00,0x00,0xFF,0x40,0x20,0x10,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0xF0,0x00,0x00,

/*--  空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  解  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0xF4,0x57,0x54,0xFC,0x54,0xF0,0x42,0xA2,0x1E,0x02,0xA2,0x62,0x3E,0x00,0x00,
0x80,0x7F,0x02,0x02,0x5F,0x82,0x7F,0x0A,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x00,

/*--  空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  放  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x08,0xF8,0x49,0x4E,0xC8,0x88,0x40,0x38,0xCF,0x0A,0x08,0x88,0x78,0x08,0x00,
0x40,0x30,0x0F,0x40,0x80,0x7F,0x00,0x40,0x20,0x10,0x0B,0x0E,0x31,0x60,0x20,0x00,

/*--  空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  军  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x18,0x26,0x22,0xA2,0x72,0x2E,0xAA,0x22,0x22,0x22,0x32,0x22,0x0A,0x06,0x00,
0x00,0x10,0x10,0x12,0x13,0x12,0x12,0xFF,0x12,0x12,0x12,0x13,0x12,0x18,0x10,0x00,

};


void main(void) {
	while(1) {
		start = 0;
  		DisplayPic(pic, 112);//显示pic1
  		Delayms(10);
 	}
}

/**************************************************
函数名称: 串行数据发送函数
参数含义: ddata - 字节显示数据
函数功能: 主机向从机发送一个字节串行数据
返 回 值: 无返回
**************************************************/							 
void SendData(uchar ddata) {
	uchar count=0;
	for(; count != 8; count++) {
		SCK = 0;
		if(ddata & 0x80)
			MOSI=1;	//发送数据
  		else
			MOSI=0;
  		SCK = 1;				//发送时钟
  		ddata <<= 1;				//数据右移一位
 	}
 	SS = 0;
  	SS = 1;					//锁存数据
 	SS = 0;
}

/**************************************************
函数名称: 延时函数
参数含义: 延长时间
函数功能: 延时
返 回 值: 无返回
**************************************************/
void Delayms(uint ticks) {
	uchar i;
	for(; ticks != 0; ticks--)
	for(i = 100; i != 0; i--);
}


/**************************************************
函数名称: 图片显示函数
参数含义: start - 从哪一列开始显示
		  pic - 图片数据指针
	      num - 图片数组字节数
函数功能: 从某一列开始显示一副图片
返 回 值: bool类型,正确显示返回TURE,异常返回FALSE
**************************************************/
void DisplayPic(uchar* Pic, uchar num) {
	uchar temp_cs0, temp_cs1;
	uchar i, j, k;
	uchar tempdata;
	for(i = 0; i < 32; i++) {//图片从最右边一列移动到最左边一列的显示代码
		for(k = 0; k < 10; k++) {			
			if(i < 8) {//图片从最右边向左移动,所以最开始在最右边
				CS_3_8_0 = 3;
				CS_3_8_1 = (7 - i) % 8;
			}
			if(i >= 8 && i < 16) {//当向左移动到第二块范围
				CS_3_8_0 = 2;
				CS_3_8_1 = (7 - (i - 8)) % 8;
			}
			if(i >= 16 && i < 24) {//当向左移动到第三块范围
				CS_3_8_0 = 1;
				CS_3_8_1 = (7 - (i - 16)) % 8;
			}
			if(i >= 24 && i < 32) {//当向左移动到第四块范围
				CS_3_8_0 = 0;
				CS_3_8_1 = (7 - (i - 24)) % 8;
			}
			
			tempdata = start;//第一排起始数据偏移量
			for(j = i; j >= 0; j--) {//显示一副画面的上半部分
				if(j == i) { 
					temp_cs0 = CS_3_8_0;
					temp_cs1 = CS_3_8_1;
				}
				if(((j + 1) % 8 == 0) && j != i) {
					CS_3_8_0 += 1;//此点阵块显示完,显示下一块
					CS_3_8_1 = 0;//
				}
				
				P1 &= 0xf0;//第几块点阵译码器
				P1 |= 1;//关总显示
				SendData(Pic[tempdata++]);
				P2 = CS_3_8_1++;//第几列译码器数据
				P1 = CS_3_8_0 << 1;//第几块译码器数据
				P1 &= 0xfe;//开块译码器
				Delayms(1);
			}
			tempdata = start + 16;//第二排起始数据偏移量
			for(j = i; j >= 0; j--) {//显示一幅画面的下半部分
				if(j == i) {
					CS_3_8_0 = temp_cs0 + 4;
					CS_3_8_1 = temp_cs1;
				}
				if(((j + 1) % 8 == 0) && j != i) {
					CS_3_8_0 += 1;//此点阵块显示完,显示下一块
					CS_3_8_1 = 0;
				}

				P1 &= 0xf0;//第几块点阵译码器
				P1 |= 1;//关总显示
				SendData(Pic[tempdata++]);
				P2 = CS_3_8_1++;//第几列译码器数据
				P1 = CS_3_8_0 << 1;//第几块译码器数据
				P1 &= 0xfe;//开块译码器
				Delayms(1);
			}
		}
	}

	for(i = 0; i < num - 32; i++) {//显示占满点阵显示块的代码
		start++;//显示数据每次向左移一位
		for(k = 0; k < 10; k++) {
			tempdata = start;
			CS_3_8_0 = 0;
			for(j = 0; j < 32; j++) {//显示第一排
				if(j == 0) {
					temp_cs0 = CS_3_8_0;
					CS_3_8_1 = 0;
				}
				if(j != 0 && j % 8 == 0) {
					CS_3_8_0++;
					CS_3_8_1 = 0;
				}

				P1 &= 0xf0;//第几块点阵译码器
				P1 |= 1;//关总显示
				SendData(Pic[tempdata++]);
				P2 = CS_3_8_1++;//第几列译码器数据
				P1 = CS_3_8_0 << 1;//第几块译码器数据
				P1 &= 0xfe;//开块译码器
				Delayms(1);
			}
			
			tempdata = start + 16;//显示第二排			
			for(j = 0; j < 32; j++) {
				if(j == 0) {
					CS_3_8_0 = temp_cs0 + 4;
					CS_3_8_1 = 0;
				}
				if(j != 0 && j % 8 == 0) {
					CS_3_8_0++;
					CS_3_8_1 = 0;
				}

				P1 &= 0xf0;//第几块点阵译码器
				P1 |= 1;//关总显示
				SendData(Pic[tempdata++]);
				P2 = CS_3_8_1++;//第几列译码器数据
				P1 = CS_3_8_0 << 1;//第几块译码器数据
				P1 &= 0xfe;//开块译码器
				Delayms(1);
			}
		}
	}
	
	start = tempdata - 16 - 1;
	for(i = 32; i != 0; i--) {
		start++;
		for(k = 0; k < 10; k++) {
			tempdata = start;
			CS_3_8_0 = 0;//显示最后结尾画面
			for(j = i; j != 0; j--) {
				if(j == i) { 
					temp_cs0 = CS_3_8_0;
					CS_3_8_1 = 0;
				}
				if(j != i && j % 8 == 0) {
					CS_3_8_0++;
					CS_3_8_1 = 0;
				}

				P1 &= 0xf0;//第几块点阵译码器
				P1 |= 1;//关总显示
				SendData(Pic[tempdata++]);
				P2 = CS_3_8_1++;//第几列译码器数据
				P1 = CS_3_8_0 << 1;//第几块译码器数据
				P1 &= 0xfe;//开块译码器
				Delayms(1);
			}
			tempdata = start + 16;
			for(j = i; j != 0; j--) {
				if(j == i) {
					CS_3_8_0 = temp_cs0 + 4;
					CS_3_8_1 = 0;
				}
				if(j != i && j % 8 == 0) {
 			    	CS_3_8_0++;
					CS_3_8_1 = 0;
				}
				
				P1 &= 0xf0;//第几块点阵译码器
				P1 |= 1;//关总显示
				SendData(Pic[tempdata++]);
				P2 = CS_3_8_1++;//第几列译码器数据
				P1 = CS_3_8_0 << 1;//第几块译码器数据
				P1 &= 0xfe;//开块译码器
				Delayms(1);
			}
		}
	}
}





⌨️ 快捷键说明

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