📄 lcd 带字库编程.txt
字号:
//航标灯MSP430F247函数定义头文件.h
#define uchar unsigned char
#define uint unsigned int
void msec(int x) //LPC935 7.3728 MHz
{
int j=0;
while(x>=0)
{
for (j=0; j<669; j++);
x--;
}
}
void init()
{
long int i;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
//BCSCTL1&= ~XT2OFF; // 打开XT2
BCSCTL2|=SELM_2+SELS; //mclk,smclk选择XT2
BCSCTL3 |= XT2S_2; // 选择XT2的范围为3~16MHZ
do //判断晶振是否起振
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0x47FF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2+SELS; // MCLK 和 SMCLK 选择 XT2时钟源
caozuoyemian=0; //操作页面标志赋初值
chucijinruyemian=1; //初次进入页面标志赋初值
caozuoneirongxuanzebianliang=0; //操作内容选择变量赋初值
caozuogongnengbiaozhi=7; //操作功能标志赋初值
zhidongceshibiaozhi=0; //自动测试标志=0
dianliuxuanzebianliang=0; //电流选择变量赋初值
dianliuxuanzebiaozhi=0; //电流选择标志赋初值
xuanzetiaozhengbiaozhi=1; //选择调整标志赋初值
nianyuerishifenmiaoxuanzebianliang=0; //年月日时分秒选择变量
dayinshujuxuanzebiaozhi=0; //打印数据选择标志赋初值
quedinghaomabiaozhi=1; //确定号码选择标志赋初值
dayanxuanzexunhuan=0; //打印选择循环用于打印选择测试数据函数循环标志的判断
io_init();
USCI_B0_SPI_init();
USCI_B1_IIC_init();
USCI_A0_UART_init();
yejing_init(); //液晶初始化
adc12_init(); //adc12初始化
//P6OUT|=(BIT3+BIT4); //将数字电位器MCP4261的CS端和AD转换器ADS1255的CS端置高,即不选中这两个芯片
//USCI_A1_UART_init();
time_a0_init();
}
void io_init()
{
///档位P1.4(200倍) P1.5(100倍) P3.0(50倍) P4.4(25倍) P4.6(12.5倍) P4.5(6倍) w0,w1网络接口P4.7 P5.3 ////
P1DIR=0XFC; //P1。0,P1,1口为输入,其他口为输出
P1REN=BIT0;
P1OUT=0XCF; //p1.0口输入上拉
//P1IE|=BIT0;
//P1IES|=BIT0; //p1.0打开中断,下降沿有效
P3SEL=0XFE;
P3DIR=0X5B; //p3.2 p3.4 p3.7输入上拉其他输出上拉
P3REN=0XF0;
P3OUT=0XFe;
P4DIR=0XFF; //p4.7输入上拉
P4REN=0x00;
P4OUT=0x00; //p4.0~p4.3输出开漏 高电平时灯亮
P5SEL=0X06;
P5DIR=0X0F;
P5REN=0XF0;
P5OUT=0XF0; //p5.4输入上拉 p5.3输出
P6SEL=BIT1; //使能A0、A1端寇输入模拟电压
P6DIR=0XFc;
P6REN=0X00;
P6OUT=0X1c;
__bis_SR_register( GIE); // enable interrupts
}
void USCI_B0_SPI_init()
{
UCB0CTL0 |=UCMST+UCSYNC; // 3-pin, 8-bit SPI master不活动时钟为低电平,4261为00模式
UCB0CTL1 |= UCSSEL_2; // SMCLK
UCB0BR0 |= 0x02; // /2
UCB0BR1 = 0; //
UCB0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
//IE2 |= UCB0RXIE; // Enable USCI1 RX interrupt
}
void USCI_B1_IIC_init()
{
UCB1CTL0|=UCMODE_3+UCSYNC; //选择IIC功能和同步模式
UCB1CTL1 |= UCSSEL_2+ UCSWRST+UCMST; // SMCLK,I2C Master, synchronous mode
UCB1BR0 |= 12; // /12
UCB1BR1 = 0; //
//UCB1I2CSA = 0x4E; // Set slave address
P5OUT&=~BIT0; //将时钟芯片的RST置为位为低电平
UCB1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
//IE2 |= UCB1RXIE; // Enable RX interrupt
}
void USCI_A0_UART_init() //波特率为9600
{
UCA0CTL1 |= UCSSEL_1+UCMSB+ UCSWRST; // CLK = ACLK MSB先发送
UCA0BR0 = 0x03; // 32kHz/9600 = 3.41
UCA0BR1 = 0x00; //
UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
//IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
}
/*void USCI_A1_UART_init()
{
}*/
void yejing_init()
{
uchar cmd;
P2DIR=0XFF;
P2OUT=0X00;
cmd=0x30; //功能设置 8位数据,基本指令
WriteCom(cmd); //写指令
cmd=0x0d; //显示状态 ON,游标Off,反白On
WriteCom(cmd); //写指令
cmd=0x01; //清除显示
WriteCom(cmd); //写指令
cmd=0x02; //地址归位
WriteCom(cmd); //写指令
cmd=0x80; //设置DDRAM地址
WriteCom(cmd); //写指令
msec(1); //延时
}
void Set_RS() //置位RS端
{
P6OUT|=BIT5;
}
void Clr_RS() //复位RS端
{
P6OUT&=~BIT5;
}
void Set_RW()
{
P6OUT|=BIT6;
}
void Clr_RW()
{
P6OUT&=~BIT6;
}
void Set_EN()
{
P6OUT|=BIT7;
}
void Clr_EN()
{
P6OUT&=~BIT7;
}
void WriteCom (uchar CMD) //写控制命令函数
{
while(CheckBusy()); //检测液晶内部是否忙
Clr_RS();
Clr_RW();
P2OUT=CMD;
Set_EN();
void _no_operation(void); //空操作
void _no_operation(void);
Clr_EN();
}
void WriteDat(uchar DAT) //写数据函数
{
while(CheckBusy()); //检测液晶内部是否忙
Set_RS();
Clr_RW();
P2OUT=DAT; //将数据从P2口发送出去
Set_EN();
void _no_operation(void);
void _no_operation(void);
Clr_EN();
}
uchar CheckBusy() //检测液晶内部是否在忙的状态
{
uchar temp;
P2OUT=0XFF;
Clr_RS();
void _no_operation(void); //这里的nop不能省略,否则不行
Set_RW();
void _no_operation(void);
Set_EN();
void _no_operation(void);
P2DIR=0X00;
void _no_operation(void);
temp = P2IN;
void _no_operation(void);
Clr_EN();
void _no_operation(void);
P2DIR=0XFF;
temp&=0x80;
return(temp);
}
void Char_Set_XY (uint x, uint y, char *p) //显示函数,X列数0~16,Y行数0~3,
{
if(y == 0)
{
WriteCom((0x80+x));
}
if(y == 1)
{
WriteCom((0x90+x));
}
/*if(y == 2)
{
WriteCom((0xa0+x));
}
if(y == 3)
{
WriteCom((0xB0+x));
}*/
while(*p != 0)
{
WriteDat(*p++);
}
}
void adc12_init()
{
P6SEL = 0x03; // Enable A/D channel inputs
ADC12CTL0 = ADC12ON+MSC+SHT0_8; // Turn on ADC12, extend sampling time
// to avoid overflow of results
ADC12CTL1 = SHP+CONSEQ_1; // Use sampling timer, repeated sequence
ADC12MCTL0 = INCH_0; // ref+=AVcc, channel = A0
ADC12MCTL1 = INCH_1+EOS; // ref+=AVcc, channel = A1
ADC12IE=0X0003; //打开A1 A0通道中断
ADC12CTL0 |= ENC; // Enable conversions
}
void time_a0_init()
{
TACTL=0x0000; //复位TA控制寄存器
TACTL=0X0110; //ACLK 增模式 开中断
TACCR0=0X028F; //大概10ms
TACCTL1=0x0090; //比较模式,翻转
TACCR1=0X028F;
}
//////////////////////////////////键盘函数//////////////////////////////////////////////
void jianpan() //键盘函数
{
anjianbianliang=0x00; //清按键标志,实现一次按键执行一次动作
if((P5IN&BIT4)==0) //判断左移键是否按下
{
while((P5IN&BIT4)==0); //判断按键是否松开
anjianbianliang|=0x01;
}
else anjianbianliang&=0xFE;
if((P5IN&BIT5)==0) //判断右移键是否按下
{
while((P5IN&BIT5)==0);
anjianbianliang|=0x02;
}
else anjianbianliang&=0xFD;
if((P5IN&BIT6)==0) //判断确认键是否按下
{
while((P5IN&BIT6)==0);
anjianbianliang|=0x04;
}
else anjianbianliang&=0xFb;
if((P5IN&BIT7)==0) //判断取消键是否按下
{
while((P5IN&BIT7)==0);
anjianbianliang|=0x08;
}
else anjianbianliang&=0xF7;
}
///////////////////////////////////操作内容选择函数/////////////////////////////////////////////
void chaozuoneirongxuanze() //操作内容选择函数
{
if(caozuoyemian==0) //如果操作页面标志为0则进入初始页面
{
if(chucijinruyemian) //如果初次进入页面,则发送显示字符进入液晶屏
{
WriteCom(0x01); //清除液晶屏
Char_Set_XY (1, 0, "江苏科技大学"); //在第一行第六个字开始显示江苏科技大学
Char_Set_XY (0, 1, "08年电子设计竞赛"); //在第二行第二个字开始显示 2008年江苏省电子设计竞赛
Char_Set_XY (8, 0, "作品:电阻测试仪");
Char_Set_XY (9, 1, "请按确认键 ");
chucijinruyemian=0;
}
if(anjianbianliang&0X04)
{
caozuoyemian=1; //确认键按下操作页面标志置1
chucijinruyemian=1; //将初次进入页面标志置,以便下个页面使用
anjianbianliang&=0xFb;
}
}
if(caozuoyemian==1) //如果操作页面标志为1则进入操作页面
{
if(chucijinruyemian) //如果初次进入页面,则发送显示字符进入液晶屏
{
WriteCom(0x01); //清除液晶屏
Char_Set_XY (1, 0, "操作内容选择");
Char_Set_XY (10, 1, "开始测试");
Char_Set_XY (10, 0, "自动设置");
Char_Set_XY (2, 1, "手动设置");
//Char_Set_XY (1, 2, "内存");
// Char_Set_XY (6, 2, "时钟调整");
//Char_Set_XY (11, 2, "打印数据");
chucijinruyemian=0; //将初次进入页面标志置为0,以便下次不重复发送字符过来
}
if(anjianbianliang&0x01) //左移键按下操作内容选择变量减1
{
if(caozuoneirongxuanzebianliang==0) caozuoneirongxuanzebianliang=2;
else caozuoneirongxuanzebianliang--;
anjianbianliang&=0xFE;
}
if(anjianbianliang&0x02) //右移键按下操作内容选择变量加1
{
if(caozuoneirongxuanzebianliang==2) caozuoneirongxuanzebianliang=0;
else caozuoneirongxuanzebianliang++;
anjianbianliang&=0xFD;
}
if(anjianbianliang&0x04) //确认键按下则回在下回循环中跳出该页面,并进入下个页面
{
caozuogongnengbiaozhi=caozuoneirongxuanzebianliang; //将操作内容选择变量赋值给操作功能标志,以便进入子页面
caozuoyemian=2; //将操作页面标志写入2,下次循环不进入该页面
chucijinruyemian=1; //将初次进入页面标志置,以便下个页面使用
anjianbianliang&=0xFb;
}
if(anjianbianliang&0x08) //取消键按下返回初始页面
{
caozuoyemian=0;
caozuoneirongxuanzebianliang=0; //操作内容选择变量置0
chucijinruyemian=1; //将初次进入页面标志置,以便下个页面使用
anjianbianliang&=0xF7;
}
switch(caozuoneirongxuanzebianliang) //在操作内容选择变量对应的地方闪烁
{
case 0: Char_Set_XY (10, 1, "开始测试");break;
case 1: Char_Set_XY (10, 0, "自动设置");break;
case 2: Char_Set_XY (2, 1, "手动设置");break;
// case 3: Char_Set_XY (1, 2, "内存显示");break;
// case 4: Char_Set_XY (6, 2, "时钟调整");break;
// case 5: Char_Set_XY (11, 2, "打印数据");break;
default: break;
}
if(caozuogongnengbiaozhi==1)
{
caozuoneirongxuanzebianliang=0; //操作内容选择变量置0
caozuogongnengbiaozhi=7; //清操作功能标志
caozuoyemian=1; //操作页面标志=1
zhidongceshibiaozhi=1; //自动测试标志=1
}
}
}
//////////////////////////////////手动设置函数//////////////////////////////////////////////
void shoudongshezhi() //手动设置函数
{
if(caozuogongnengbiaozhi==2)
{
zhidongceshibiaozhi=0; //自动测试标志=0
if(chucijinruyemian) //如果初次进入页面,则发送显示字符进入液晶屏
{
WriteCom(0x01); //清除液晶屏
Char_Set_XY (1, 0, "手动电流选择");
Char_Set_XY (1, 1, "5A");
Char_Set_XY (5, 1, "1A");
Char_Set_XY (8, 0, " 100mA");
Char_Set_XY (12, 0, "10mA");
chucijinruyemian=0; //将初次进入页面标志置为0,以便下次不重复发送字符过来
}
if(anjianbianliang&0x01) //左移键按下电流选择变量减1
{
if(dianliuxuanzebianliang==0)dianliuxuanzebianliang=3;
else dianliuxuanzebianliang--;
anjianbianliang&=0xFe;
}
if(anjianbianliang&0x02) //右移键按下电流选择变量加1
{
if(dianliuxuanzebianliang==3) dianliuxuanzebianliang=0;
else dianliuxuanzebianliang++;
anjianbianliang&=0xFd;
}
if(anjianbianliang&0x04) //确认键按下则选定测量电流,并返回操作页面
{
dianliuxuanzebiaozhi=dianliuxuanzebianliang; //将电流选择变量赋值给电流选择标志
caozuoyemian=1; //返回操作页面
chucijinruyemian=1; //将初次进入页面标志置,以便下个页面使用
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -