📄 12864
字号:
/******************************************************************/
/* P2.0控制RS,并行的指令/数据选择信号,串行的片选信号 */
/* P2.1控制RW,并行的读/写选择信号,串行的数据口 */
/* P2.2控制E,并行的使能信号,串行的同步时钟 */
/* P2.3控制bsp,并/串行接口选择,高电平是并行,低电平是串行 */
/* P2.4控制rst,液晶复位控制位,低电平有效 */
/* P1.0---P1.7为数据传送端口 */
/******************************************************************/
#include<msp430g2553.h>
#define uint unsigned int
#define uchar unsigned char
uchar busy,Col,Line;
void init_430();
void delay_1ms();
void delay_nms();
void read_busy(void);
void Reset_lcm(void);
void write_zhl(uchar n);
void write_data(uchar a);
void init_lcm(void);
void Clear_Lcm(void);
void Display(uchar *ptr,uchar ddram);
void display_lcm();
uchar STR1[]= "2012年7 月 20 号";
uchar STR2[]= "文理学院";
uchar STR3[]= "第三实验楼";
uchar STR4[]= "1 楼 112";
/*************主函数***************/
main()
{
init_430(); //单片机初始化
init_lcm(); //屏幕初始化
display_lcm(); //显示函数
while(1);
}
/*************单片机初始化函数***************/
void init_430()
{
WDTCTL = WDTPW + WDTHOLD;//关狗
P1DIR = 0xff; //设置为输出,数据传送
P2DIR = 0xff; //设置为输出,控制口
P1OUT = 0x00; //P1输出为0
P2OUT = 0x00; //P2输出为0
P2OUT |=BIT3; //设置为并行传输方式
}
/*************延时函数***************/
void delay_1ms()
{
uint i;
for(i=0;i<1140;i++);
}
void delay_nms(uint n)
{
uint i = 0;
for(i = n;i > 0;i--)
delay_1ms();
}
/*************测忙函数****************/
void read_busy(void)
{
P2OUT &=~BIT0; //写或读指令1
P2OUT |=BIT1; //读允许打开
do
{
P1DIR=0x00; //将P1口转为输入
P2OUT |=BIT2; //打开并行传输使能
busy=P1IN; //读取P1的值
P2OUT &=~BIT2; //关闭并行传输使能
P1DIR=0xff; //将P1口转为输出
}
while(busy>0x7f); //是否空闲
}
/*************清屏函数****************/
void Reset_lcm(void)
{
P2OUT &=~BIT4; //给个低电平清屏
delay_nms(1);
P2OUT |=BIT4; //关闭清零端口
delay_nms(200);
}
/*************写指令函数***************/
void write_zhl(uchar n)
{
read_busy(); //测忙
P2OUT &=~BIT0; //为0,写指令允许打开
P2OUT &=~BIT1; //为0,写允许打开
P2OUT |=BIT2; //为1,打开并行传输使能,相当于片选
P1OUT =n; //写入指令
P2OUT &=~BIT2; //关闭并行传输
}
/*************写数据函数***************/
void write_data(uchar a)
{
read_busy(); //等待液晶空闲
P2OUT |=BIT0; //为1,写数据允许打开
P2OUT &=~BIT1; //为0,写允许打开
P2OUT |=BIT2; //为1,打开并行传输使能,相当于片选
P1OUT =a; //写入数据
P2OUT &=~BIT2; //关闭并行传输
}
/*************初始化函数***************/
void init_lcm(void)
{
Reset_lcm(); //清屏
Clear_Lcm(); //清指令
delay_nms(5);
write_zhl(0x30); //基本指令集
delay_nms(10);
write_zhl(0x02); //地址归位
delay_nms(1);
write_zhl(0X0C); //整体显示打开,关闭游标
delay_nms(5);
write_zhl(0x01); //清除显示,地址计数器清零
delay_nms(2);
write_zhl(0x06); //游标右移
delay_nms(1);
}
/*************清指令显示函数***************/
void Clear_Lcm(void)
{
read_busy(); //等待液晶空闲
P2OUT &= ~BIT0; //读或写指令打开
P2OUT &=~BIT1; //写允许打开
P2OUT |=BIT2; //并行传输打开
P1OUT =0x01; //写入指令,清除显示
P2OUT &=~BIT2; //并行传输关闭
}
/*************显示数组函数***************/
void Display(uchar *ptr,uchar ddram)
{
uchar i,j=0,x;
if(ddram<0x88)
Line=0; //定位行地址:第一行
else if(ddram<0xA0)
Line=2; //定位行地址:第三行
else if(ddram<0xA8)
Line=1; //定位行地址:第二行
else
Line=3; //定位行地址:第四行
Col=0x0f&ddram; //定位列地址
if(Col>0x07)
Col=Col-0x08;
x=Col*2;
write_zhl(ddram); // 定位显示起始地址
while ((ptr[j])!='\0')
j++; //判断数组ptr中字符的个数
for (i=0;i<j;i++)
{
write_data(ptr[i]); //输出单个字符
x++;
if (x==0x10)
{
x=0;
Line++;
switch (Line)
{
case 0:write_zhl(0x80);break;
case 1:write_zhl(0xA0);break;
case 2:write_zhl(0x88);break;
case 3:write_zhl(0xA8);break;
}
if (Line>3)
{
write_zhl(0x80);
Line=0;
}
}
}
}
/*************显示函数***************/
void display_lcm()
{
Display(STR1,0X80);
delay_nms(10);
Display(STR2,0X90);
delay_nms(10);
Display(STR3,0X88);
delay_nms(10);
Display(STR4,0X98);
delay_nms(10);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -