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

📄 12864

📁 msp430g2553的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 + -