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

📄 hnr_s2.c

📁 msp430开发版程序
💻 C
字号:
//-----段位式液晶显示操作------//

/*
需要将段位式LCD板接到P5口上
*/

#include  <msp430x14x.h>

#define		UCHAR		unsigned char
#define 	UNIT		unsigned int 

/*===============LCD CTRL IO=======================*/
#define		LCDDIR		P5DIR |= 0X0F
#define		LCDOUT		P5OUT
#define		CSLCD		P5OUT &=~BIT0
#define		NOLCD		P5OUT |= BIT0
#define		LCDRDH		P5OUT |= BIT1
#define		LCDRDL		P5OUT &=~BIT1
#define		LCDWRH		P5OUT |= BIT2
#define		LCDWRL		P5OUT &=~BIT2
#define		LCDDATAH	P5OUT |= BIT3
#define		LCDDATAL	P5OUT &=~BIT3

/*==============LCD CTRL PARA ================*/
#define		LCDBIT0		0X00
#define		LCDBIT1		0X02
#define		LCDBIT2		0X04
#define		LCDBIT3		0X06
#define		LCDBSIG		0X08 
#define		SYSDIS		0X8000
#define		SYSEN		0X8020
#define		LCDOFF		0X8040
#define		LCDON		0X8060
#define		TIMERDIS	0X8080
#define		WDTDIS		0X80A0
#define		TIMEREN		0X80C0
#define		WDTEN		0X80E0
#define		TONEOFF		0X8100
#define		TONEON		0X8120
#define		CLRTIMER	0X8180
#define		CLRWDT		0X81C0
#define		LCDXTAL		0X8280
#define		LCDRC		0X8300
#define		LCDEXT		0X8380
#define		BTHCOM2		0X8420
#define		BTHCOM3		0X84A0
#define		BTHCOM4		0X8520
#define		TONE4K		0X8800
#define		TONE2K		0X8C00
#define		IRQDIS		0X9000
#define		IRQEN		0X9100
#define		LCDF1		0X9400 
#define		LCDF64		0X94C0
#define		LCDNORMAL	0X9C60


//数码管段位表
const unsigned char LCDTAB[] = 
{
//0
0X7E,
//1
0X30,
//2
0X6D,
//3
0X79,
//4
0X33,
//5
0X5B,
//6
0X5F,
//7
0X70,
//8
0X7F,
//9
0X7B,
//10 A	
0X77,
//11 B
0X1F,
//12 C
0X4E,
//13 D
0X3D,
//14 E
0X4F,
//15 F
0X47,
//16 H
0X37,
//17 I
0X10,
//18 L
0X0E,
//19 N
0X76,
//20 O
0X7E,
//21 P
0X67,
//22 R	
0X77,
//23 S
0X5B,
//24 T
0X46,
//25 U
0X3E,
//26 Y
0X3B,
//27 Z
0X6D,
//28 -
0X01,
//29 NULL
0X00,
//30 BIT
0X80,
};

void Port_init(void);
void Clk_init(void);
void Lcd_init(void);
void Lcdcmd(UNIT LCDcode);
void Disbyte(UCHAR LCDbit,UCHAR LCDdisval);
void Delayus(UNIT delaytimeus);
void Delayms(UNIT delaytimems);
void Disnum(UNIT numval);

void Port_init(void)	//端口初始化
{
	P1DIR = 0X00;		//设置P1口为输入端口,但只采用了P1.0~P1.3作为按键的输入
	P2DIR = 0X07;		//设置P2.0~P2.2为输出端口,其余为输入
	P5DIR = 0X0F;		//设置P5.4~P5.7为输出端口,驱动液晶的控制信号
	
	P2OUT = 0X00;		//P2.0~P2.2口输出低电平,其余管脚都是输入的管脚,在此不必管,可以任意设
	NOLCD;		//暂时不启动HT1621B,即关闭液晶显示
	LCDDATAH;
}

void Clk_init(void)		//时钟初始化
{
	UCHAR i;
	BCSCTL1 &= ~XT2OFF ; 	// XT2on
	do 						// 等待晶振开始工作
	{
		IFG1 &= ~OFIFG;		// Clear OSCFault flag
		for (i=0;i<10;i++); 
	}
	while ( (IFG1&OFIFG)!=0 ) ; // OSCFault flag still set? 	
	BCSCTL2 = 0x9A ; 			// MCLK=SMCLK=XT2/2=4MHZ
}

void Lcd_init(void)	//液晶初始化
{    
	Lcdcmd(SYSEN);
	Lcdcmd(LCDON);		
	Lcdcmd(BTHCOM4);
} 

void Lcdcmd(UNIT LCDcode)	
{
	UCHAR i;  
	LCDDIR;	//初始化输入输出端口
	CSLCD;	//使能HT1621
	Delayus(3);
	for (i=0;i<13;i++) 
	{
		if ((LCDcode&0x8000) == 0X8000) LCDDATAH;	//输送值的该位为1
		else LCDDATAL;	//输送值的该位为0
		LCDWRL;		//写信号
		Delayus(5);
		LCDWRH;
		Delayus(5);
		LCDcode = (LCDcode<<1);		//向左移一位
	}
	NOLCD;
	LCDDATAH; 
}

void Disbyte(UCHAR LCDbit,UCHAR LCDdisval)
{
	UCHAR i;  
	LCDDIR;	//初始化输入输出端口
	CSLCD;	//使能HT1621
	Delayus(3);
	LCDDATAH;	//输出数据位1
	LCDWRL;
	Delayus(5);
	LCDWRH;
	Delayus(5); 
	LCDDATAL;   //输出数据位0
	LCDWRL;
	Delayus(5);
	LCDWRH; 
	Delayus(5);
	LCDDATAH;   //1
	LCDWRL;
	Delayus(5);
	LCDWRH;	
	Delayus(5);
	
	for (i=0;i<6;i++) 
	{
		if ((LCDbit&0X20) == 0X20) LCDDATAH; //输送值的该位为1
		else LCDDATAL;	//输送值的该位为0
		LCDWRL;	//写信号
		Delayus(5);
		LCDWRH;
		Delayus(5);
		LCDbit = (LCDbit<<1);	//向左移一位
	}	
	for (i=0;i<8;i++) 
	{
		if ((LCDdisval&0X01) == 0X01) LCDDATAH;
		else LCDDATAL;
		LCDWRL;
		Delayus(5);
		LCDWRH; 
		Delayus(5);
		LCDdisval = (LCDdisval>>1);	//向右移一位
	}
	NOLCD;
	LCDDATAH; 
}  

void Delayus(UNIT delaytimeus)
{
	UNIT i;	
	for(i=0;i<delaytimeus;i++)
	{
		_NOP();
		_NOP();
	}	
}

void Delayms(UNIT delaytimems)
{
	UNIT i,t;
	for(i=0;i<delaytimems;i++)
		for(t=0;t<900;t++)
		{
			_NOP();
			_NOP();
		}
}

void Disnum(UNIT numval)	//液晶显示数据函数
{
	UNIT numvaltmp;
	UCHAR numvalbuf[4] = {0x00,0x00,0x00,0x00};

	numvaltmp = numval;
	if(numvaltmp>=9999) numvaltmp = 9999;	//限定能显示的最大值
	
	if((numvaltmp%2)==0) Disbyte(LCDBSIG,0x1f);	//偶数时显示各种标识符
	else Disbyte(LCDBSIG,0x00);	//各种标识符,显示为1,不显示为0
	
	numvalbuf[3] = (UCHAR)(LCDTAB[numvaltmp/1000]);
	Disbyte(LCDBIT3,numvalbuf[3]);	//显示第3位数据(最高位)
	numvalbuf[2] = (UCHAR)(LCDTAB[(numvaltmp%1000)/100]);
	Disbyte(LCDBIT2,numvalbuf[2]);	//显示第2位数据
	numvalbuf[1] = (UCHAR)(LCDTAB[((numvaltmp%1000)%100)/10]);
	Disbyte(LCDBIT1,numvalbuf[1]);	//显示第1位数据
	numvalbuf[0] = (UCHAR)(LCDTAB[((numvaltmp%1000)%100)%10]);
	Disbyte(LCDBIT0,numvalbuf[0]);	//显示第0位数据(最低位)
}

void main(void)
{
	UNIT lcdval = 0;
	UNIT dataval = 0;	//定义按键变量

	WDTCTL = WDTPW + WDTHOLD; 	// 停止看门狗

	Port_init();	//初始化端口
	Clk_init();		//初始化时钟
	Lcd_init();		//初始化液晶

	Delayms(500);	//延时500ms,大概的延时,不精确!
	Disnum(lcdval);	//液晶显示数据函数,液晶显示“0000”
	for (;;)
	{	  	
		if(dataval>9999) dataval=0;
		else dataval++;
		lcdval = dataval;	//显示dataval的值
		Disnum(lcdval);		//液晶显示数据函数
		Delayms(500);		//延时程序,根据需要调整,或放别的处理函数
	}
}

⌨️ 快捷键说明

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