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

📄 main.c

📁 MSP430单片机C语言应用程序设计实例精讲
💻 C
字号:
#include <MSP430X14X.h>
#include "SM.h"

//拼音串总数
#define PY_NUM			421
//所在SM卡的页数
#define PYTABLE			0x1
//所在SM卡的页数
#define NEIMATABLE		0x2000
//所在SM卡的页数
#define DIANZHENTABLE   0x6000

void Init_CLK(void);
int GetNeiMaAddr(char *PY,int PY_Len,int *StartNeiMa,int *EndNeiMa);
void GetNeiMa(int StartNeiMa,int EndNeiMa,char *pBuf);
void GetDianZhen(int NeiMa,char *DianZhen);

void main(void)
{
	// 关闭看门狗
	WDTCTL = WDTPW + WDTHOLD;   
	// 关闭中断
    _DINT();	
	
	// 初始化
	Init_CLK();
	SM_Port_Init();

	// 打开中断
	_EINT(); 			
	
}
///////////////////////////////////////////////////
//                                               //
// 拼音对应的所有汉字的内码的起始位置和结束位置  //
//                                               //
///////////////////////////////////////////////////
int GetNeiMaAddr(char *PY,int PY_Len,int *StartNeiMa,int *EndNeiMa)
{
    char buf[6];
	char buf_temp[8];
	int i;
	int j;
	int PYCount;
	int PageCount;
	char buf_sm[528];
	int nStart;
	int nEnd;
	
	for(i = 0;i < 6;i++)
	{
		buf[i] = '\0';
		buf_temp[i] = '\0';
	}
	//错误拼音输入
	if((PY_Len > 6) && (PY_Len <= 0))
	{
		return -1;
	}
	for(i = 0;i < PY_Len;i++)
	{
		buf[i] = PY[i];
	}
	//错误拼音输入
	if(buf[0] == 'i')
	{
		return -1;
	}
	if(buf[0] == 'u')
	{
		return -1;
	}
	if(buf[0] == 'v')
	{
		return -1;
	}

	//搜索表
	PYCount = 0;
	PageCount = 0;
	nStart = 0;
	nEnd = 0;
	while(PYCount < PY_NUM)
	{
		if(PageCount >= 8)
		{
			break;
		}
		//读出一页数据
	    PageRead(0,PageCount + PYTABLE,buf_sm);
        for(i = 0;i < 64;i++)
		{
			for(j = 0;j < 8;j++)
			{
				buf_temp[j] = buf_sm[i * 8 + j];
			}
			//比较
			for(j = 0;j < PY_Len;j++)
			{
				if(buf[j] != buf_temp[j])
				{
					break;
				}
			}
			//相等
			if(j == PY_Len - 1)
			{
				//得到开始地址
                nStart = buf_temp[6] * 256 + buf_temp[7];
				//取下一个拼音串
				if(i == 63)
				{
					//该页的末尾,读下一页数据
					PageRead(0,PageCount + 1 + PYTABLE,buf_sm);
					for(j = 0;j < 8;j++)
					{
				        buf_temp[j] = buf_sm[j];
					}
					nEnd = buf_temp[6] * 256 + buf_temp[7];
				}
				else
				{
					//不是页的末尾数据
					for(j = 0;j < 8;j++)
					{
				        buf_temp[j] = buf_sm[(i + 1) * 8 + j];
					}
					nEnd = buf_temp[6] * 256 + buf_temp[7];
				}
			}
			else
			{
				//没找到,继续搜索
				PYCount++;
			}			
		}		
		PageCount++;		
	}
	//没有搜索到数据
	if(PageCount >= 8)
	{
		return -1;
	}
	*StartNeiMa = nStart;
	*EndNeiMa = nEnd;
	return 1;
}
//////////////////////////////////////
//                                  //
// 内码数据获取                     //
//                                  //
//////////////////////////////////////
void GetNeiMa(int StartNeiMa,int EndNeiMa,char *pBuf)
{
	int i;
	int nTemp;
	int nTmp;
	long nRow;

	nTemp = (int)(StartNeiMa / 512);
	nTmp = (int)(EndNeiMa / 512);
	if(nTemp == nTmp)
	{
		//在同一页上
		nTmp = EndNeiMa % 512;
		nTemp = StartNeiMa % 512;
		nRow = NEIMATABLE + StartNeiMa / 512;
		if((nTemp < 256) && (nTmp < 256))
		{			
			for(i = nTemp;i < nTmp;i++)
			{
				pBuf[i] = ReadByte(0,i,nRow);
			}
		}
		else if((nTemp < 256) && (nTmp >= 256))
		{
			for(i = nTemp;i < 256;i++)
			{
				pBuf[i] = ReadByte(0,i,nRow);
			}
			for(i = 256;i < nTmp;i++)
			{
				pBuf[i] = ReadByte(1,256 - i,nRow);
			}
		}
		else
		{
			for(i = nTemp;i < nTmp;i++)
			{
				pBuf[i] = ReadByte(1,i,nRow);
			}
		}
	}
	else
	{
		//在不同一页上
		nTmp = EndNeiMa % 512;
		nTemp = StartNeiMa % 512;
		nRow = NEIMATABLE + StartNeiMa / 512;
		if((nTemp < 256) && (nTmp < 256))
		{			
			for(i = nTemp;i < 512;i++)
			{
				pBuf[i] = ReadByte(0,i,nRow);
			}
			for(i = 0;i < nTmp;i++)
			{
				pBuf[i + 512 - nTemp] = ReadByte(0,i,nRow + 1);
			}
		}
		else if((nTemp >= 256) && (nTmp < 256))
		{
			for(i = nTemp;i < 512;i++)
			{
				pBuf[i] = ReadByte(1,i,nRow);
			}
			for(i = 0;i < nTmp;i++)
			{
				pBuf[512 - nTemp + i] = ReadByte(1,i,nRow);
			}			
		}
	}
	return;
}
//////////////////////////////////////
//                                  //
// 点阵数据获取                     //
//                                  //
//////////////////////////////////////
void GetDianZhen(int NeiMa,char *DianZhen)
{
	int i;
	int nTemp;
	int nTmp;
	long nRow;
	char chrHi;
	char chrLo;
	long offset;

	chrHi = NeiMa / 256 - 0xB0;
	chrLo = NeiMa % 256 - 0xA1;
	offset = (chrHi * 94 + chrLo) * 32;
	offset = offset + DIANZHENTABLE;
	nRow = offset / 512;
	nTemp = offset % 512;
	nTmp = nTemp + 32;
	//在SM卡的第1区
	if(nTmp <= 255)
	{
		for(i = 0;i < 32;i++)
		{
			DianZhen[i] = ReadByte(0,nTemp + i,nRow);
		}
	}
	else if((nTmp > 255) && (nTmp < 512))
	{
		//在SM卡的第1区
		if(nTemp < 256)
		{
			for(i = 0;i < 32;i++)
			{
			    DianZhen[i] = ReadByte(0,nTemp + i,nRow);
			}
		}
		else
		{
			//在SM卡的第2区
			for(i = nTemp;i < 256;i++)
			{
			    DianZhen[i] = ReadByte(0,i,nRow);
			}
			for(i = 0;i < 32 - (256 - nTemp);i++)
			{
			    DianZhen[i + 256 - nTemp] = ReadByte(1,i,nRow);
			}
		}		
	}
	else
	{
		//不在同一页
		for(i = nTemp;i < 512;i++)
		{
			DianZhen[i] = ReadByte(1,i,nRow);
		}
		for(i = 0;i < 32 - (512 - nTemp);i++)
		{
			DianZhen[i + 512 - nTemp] = ReadByte(1,i,nRow + 1);
		}
	}
	return;
}
void Init_CLK(void)
{
    unsigned int i;
    BCSCTL1 = 0X00;	//将寄存器的内容清零
					//XT2震荡器开启
					//LFTX1工作在低频模式
					//ACLK的分频因子为1
					
    do 
    {
		// 清除OSCFault标志
	    IFG1 &= ~OFIFG;    
	    for (i = 0x20; i > 0; i--);                
    }
    while ((IFG1 & OFIFG) == OFIFG);// 如果OSCFault =1   
					
	//将寄存器的内容清零
    BCSCTL2 = 0X00;		
	//MCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELM1;	
	//SMCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELS;	
}

⌨️ 快捷键说明

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