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

📄 1.c

📁 此文件是单片机控制LED滚动显示。开发环境keil c.
💻 C
字号:
#include 	<reg52.h>
#include    <string.h>
#include 	"zkFunc.h"
#define false 		0
#define true		1
#define bool        bit
extern void ShT_LEDBoard_ColShiftOut(uchar ucExtShiftCount);
extern void ShT_LEDBoard_RowShiftOut(uint uiWriteValue);
extern code HZ_MODEL ZK_Data[];
extern code unsigned char   ASCII816[][16];//标准的asc码
extern uchar ucDispDataBuff[128];
uchar ucLoopCount;
uchar ucRTCData[16];
uchar ucColDataBuff_High[17];
uchar ucColDataBuff_Low[17];
uint uiRowControlValue;
uchar ucRowLineCount;
//控制移动数量计数器
uchar ucShiftCount;
bool bMoveEnable;	//是否流动显示允许标志位
sbit c_Col_SOE  = P1^2; //显示开关 0为显示,1为关闭
uchar xdata ucLEDDisplayMemory[17*32];		//显示存储器
#define c_LineWidth  18				//行宽
#define c_MaxLineByteCount 18		//每行占用显示存储器字节数
#define c_MaxColNumber  128
#define c_MaxLineCount  16				//行的高度
#define c_HalfScreenMemoryOffset  16*c_LineWidth		//半屏占用存储器单元 
uchar ucDispTemperatureCount;
void RefreshLEDScreen(uchar ucLoopCount)//刷新屏幕
{
	uchar ucRowLineCount;
	uchar ucRefreshCount;
	for(ucRefreshCount=0; ucRefreshCount<ucLoopCount; ucRefreshCount++)
	{
		uiRowControlValue = 0x0001;
		for(ucRowLineCount=0; ucRowLineCount<16; ucRowLineCount++)
		{
			memcpy(ucColDataBuff_Low,ucLEDDisplayMemory+ucRowLineCount*c_LineWidth,17);
			memcpy(ucColDataBuff_High,ucLEDDisplayMemory+c_HalfScreenMemoryOffset+ucRowLineCount*c_LineWidth,17);
			if(bMoveEnable)
			{
				ShT_LEDBoard_ColShiftOut(ucShiftCount);
		   	}
			else
			{
				ShT_LEDBoard_ColShiftOut(0);
			}
			ShT_LEDBoard_RowShiftOut(uiRowControlValue);		
			c_Col_SOE = 0;				//打开显示
			uiRowControlValue <<= 1;
		}
	}
	//补偿最后一行的亮度不够
	memcpy(ucColDataBuff_Low,ucLEDDisplayMemory+15*c_LineWidth,17);
	memcpy(ucColDataBuff_High,ucLEDDisplayMemory+c_HalfScreenMemoryOffset+15*c_LineWidth,17);
	if(bMoveEnable)
	{
		ShT_LEDBoard_ColShiftOut(ucShiftCount);
   	}
	else
	{
		ShT_LEDBoard_ColShiftOut(0);
	}

	c_Col_SOE = 1;				//关闭显示
}

bool GetHzModelInMem(uint uiHZCode,HZ_MODEL  ** pHzModel)
{
	//顺序查找法
	uint uiIndex;
	bool bResultFlag;
	uiIndex = 0;
	while(1)
	{
		if(ZK_Data[uiIndex].uiHZcode == 0xFFFF)
		{
			*pHzModel = (HZ_MODEL *)&(ZK_Data[uiIndex]);
			bResultFlag = false;
			break;
		}
		if(ZK_Data[uiIndex].uiHZcode == uiHZCode)
		{
			//-找到
			*pHzModel = (HZ_MODEL *)&(ZK_Data[uiIndex]);
			bResultFlag = true;
			break;
		}
		else
		{
			uiIndex++;
		}
	}
	return bResultFlag;
}
void GetHZDot(uint uiHZCode,uchar *ucHZDotData)
{
	HZ_MODEL *pHzModel;
	bool bReturnValue;
	bReturnValue =  GetHzModelInMem(uiHZCode,&pHzModel);
	memcpy(ucHZDotData,&pHzModel->model,32);
}

//取字并显示
void LED_DispHZ(uchar ucDispRow,uchar HzNo,uchar *pucDispString)
{
	uchar HzNoC=16;
	uchar ucZMData;
	uchar ucColOffset;		//列偏移量
	uchar uci;
	uchar ucStartPosition;
	uint uiHZCode;
	uchar xdata ucHZDataBuff[128];
	ucColOffset = 0;
	bMoveEnable = true;
	HzNoC *=HzNo;
	while(*pucDispString != '\0')
	{
		//取字模
		uiHZCode = *pucDispString++;
		uiHZCode <<=8;
		uiHZCode += *pucDispString++;
		GetHZDot(uiHZCode,ucHZDataBuff);

		for(uci=0; uci<16; uci++)
		{
			//左半边字
			ucZMData = ucHZDataBuff[uci*2];
			if(ucDispRow == 1)
			{
				ucLEDDisplayMemory[uci*c_MaxLineByteCount+ucColOffset] =ucZMData;
			}
//			else
//			{
//				ucLEDDisplayMemory[uci*c_MaxLineByteCount+c_HalfScreenMemoryOffset+ucColOffset] =ucZMData;
//			}
			//右半边字
			ucZMData = ucHZDataBuff[uci*2+1];

			if(ucDispRow == 1)
			{
				ucLEDDisplayMemory[uci*c_MaxLineByteCount+ucColOffset+1] =ucZMData;
			}
//			else
//			{
//				ucLEDDisplayMemory[uci*c_MaxLineByteCount+c_HalfScreenMemoryOffset+ucColOffset+1] =ucZMData;
//			}
		}			
		ucColOffset++;
		ucColOffset++;
		*pucDispString = pucDispString[ucStartPosition + ucColOffset];
	}
	for(ucShiftCount=0; ucShiftCount<HzNoC; ucShiftCount++)
	{
		RefreshLEDScreen(10);
	}
	//	ucStartPosition++;
	bMoveEnable = false;
}
//
void LED_ScrollDispString(uchar ucDispRow,uchar ucRefreshCount,uchar *pucDispString)//1
{
	uchar ucDispChar;	
	uchar ucZMData;
	uchar ucColOffset;	//列偏移量
	uchar uci;
	uchar ucStartPosition;
	bMoveEnable = true;
	ucDispChar = *pucDispString;
	ucColOffset = 0;
	ucStartPosition =0;
	ucDispChar = pucDispString[ucStartPosition + ucColOffset];
	while(ucDispChar != '\0')
	{
		for(ucColOffset = 0; ucColOffset<16; ucColOffset++)
		{
			for(uci=0; uci<17; uci++)
			{
				ucZMData = ASCII816[ucDispChar - 0x20][uci];

				if(ucDispRow == 1)
				{
					ucLEDDisplayMemory[uci*c_MaxLineByteCount+ucColOffset] =ucZMData;
				}
				else
				{
					ucLEDDisplayMemory[uci*c_MaxLineByteCount+c_HalfScreenMemoryOffset+ucColOffset] =ucZMData;
				}
			}			
			ucDispChar = pucDispString[ucStartPosition + ucColOffset];
	  	}
		for(ucShiftCount=0; ucShiftCount<0x08; ucShiftCount++)
		{
			RefreshLEDScreen(ucRefreshCount);
		}
		ucStartPosition++;
	}
	bMoveEnable = false;
}
void main (void) 
	{	
		while(1)
		{	
	//		LED_ScrollDispString(1, 15, "Hello");
			//下面两行为清屏用
			memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
			LED_DispHZ(1,4,"南师泰院");
//			RefreshLEDScreen(100);
			memset(ucLEDDisplayMemory,0,c_LineWidth*c_MaxLineCount);
			LED_DispHZ(1,8,"谢谢使用南师泰院");
			RefreshLEDScreen(100);
		}
	}
//字库
code HZ_MODEL ZK_Data[]=
{
	{	0xD0BB,  //谢
		0x02,0x08,0x44,0x88,0x2F,0xC8,0x28,0x88,0x0F,0x88,0x08,0xFE,0xEF,0x88,0x28,0x88,
		0x28,0xC8,0x3F,0xA8,0x21,0xA8,0x2A,0x88,0x34,0x88,0x28,0x88,0x12,0xA8,0x01,0x10},

	{	0xCAB9,  //使
		0x10,0x40,0x10,0x44,0x1F,0xFE,0x20,0x40,0x27,0xFC,0x64,0x44,0xA4,0x44,0x24,0x44,
		0x27,0xFC,0x24,0x44,0x22,0x40,0x21,0x80,0x20,0xC0,0x21,0x30,0x26,0x0E,0x28,0x04},

	{	0xD3C3,  //用
		0x00,0x08,0x3F,0xFC,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,
		0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x41,0x08,0x41,0x28,0x80,0x10},		

	{	0xC4CF,  //南
		0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x00,0x3F,0xFC,0x24,0x24,0x22,0x44, 
		0x2F,0xF4,0x21,0x04,0x3F,0xFC,0x21,0x04,0x21,0x04,0x21,0x14,0x21,0x08,0x00,0x00},

	{	0xCAA6,  //师
		0x08,0x00,0x0B,0xFE,0x48,0x20,0x48,0x20,0x4B,0xFE,0x4A,0x22,0x4A,0x22,0x4A,0x22, 
		0x4A,0x22,0x52,0x22,0x52,0x2A,0x12,0x24,0x20,0x20,0x40,0x20,0x80,0x20,0x00,0x20},

	{	0xCCA9,  //泰
		0x02,0x00,0x7F,0xFC,0x02,0x00,0x3F,0xF8,0x02,0x00,0xFF,0xFE,0x04,0x40,0x09,0x20,
		0x11,0x18,0x29,0x2E,0xC7,0x44,0x05,0xC0,0x19,0x20,0x61,0x18,0x05,0x00,0x02,0x00},

	{	0xD4BA, //院
		0x00,0x80,0xF8,0x40,0x8F,0xFE,0x94,0x04,0xA0,0x00,0xA3,0xF8,0x90,0x00,0x88,0x00,
		0x8F,0xFE,0xA9,0x20,0x91,0x20,0x81,0x20,0x82,0x22,0x82,0x22,0x84,0x22,0x88,0x1E},

	{	0xFFFF,  //字库结尾标志符
		0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
		0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
};


⌨️ 快捷键说明

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