📄 hnr_s2.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 + -