📄 jdl162a.c
字号:
#include <msp430x16x.h>
#include "JDL162A.h"
/********************************************************
*毫秒级延时
*MSP430中,一个for循环耗费8个时钟周期
*本列中系统频率为8MHZ,因此1000个for循环约为1ms
*********************************************************/
void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<1000;j++);
}
/************************************
* write_Command(),用于写命令到LCD
busy_sc为0时忽略忙检测
************************************/
void write_Command(unsigned char cmd,unsigned char busy_sc)
{
if(busy_sc)
lcd_check_busy();
data_port_dir = 0xff; //数据端口为输出模式
//CLR_LCD_EN;
// data_port_out =cmd;
CLR_LCD_RS; //rs=0 ,指令
CLR_LCD_RW; //rw=0写操作
data_port_out =cmd;
CLR_LCD_EN;
CLR_LCD_EN;
SET_LCD_EN;
}
/***************************************************
* write data
****************************************************/
void write_Data(unsigned char content)
{
lcd_check_busy(); //查忙
data_port_dir = 0xff; //数据端口为输出模式
//CLR_LCD_EN;
// data_port_out =content;
SET_LCD_RS; //rs=1数据
CLR_LCD_RW; //rw=0写操作
data_port_out =content;
CLR_LCD_EN;
CLR_LCD_EN;
SET_LCD_EN;
}
/************************************************************
* 在指定的位置显示单个字符
SMC16O2A是16(列)*2(行)
************************************************************/
void LCD_write_char( unsigned X,unsigned char Y,unsigned char dat)
{
unsigned char address;
X &=0x0f;
Y &=0x01; //限制X不能大于15,Y不能大于1
if(Y==0)
address=X+0x80; //第一行的首地址是0x80
else
address=X+0xc0; //第二行的首地址是0xc0
write_Command(address,1); //发送地址码
write_Data(dat);
}
/**************************************
* 在指定的位置显示字符串
***************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *str)
{
X &=0x0f;
Y &=0x01; //限制X不能大于15,Y不能大于1
if(Y==0)
{
if(X<16)
{
write_Command(X+0x80,1); //发送地址码
for(;(X<16)&&(*str!='\0');X++)
{
write_Data(*str);
str++;
}
if(*str!='\0')
{
X=0;
Y=1;
}
}
}
if(Y==1)
{
write_Command(X+0xc0,1); //发送地址码
for(;(X<16)&&(*str!='\0');X++)
{
write_Data(*str);
str++;
}
}
}
/******************************************************
初始化
******************************************************/
void init_LCD()
{
data_port_dir |=0xff; //设置数据端口为输出
control_port_dir |=0x07; //控制端口设置为输出模式
delay_ms(15); //延时 15MS
write_Command(0x38,0); //三次显示模式设置,不检测忙信号
delay_ms(5); //延时5ms
write_Command(0x38,0);
delay_ms(5);
write_Command(0x38,0);
delay_ms(5);
write_Command(0x38,1); //设置16*2显示,5*7点阵,8位数据转换 ,要检测忙信号
write_Command(0x08,1); //关闭显示
write_Command(0x01,1); //清屏
write_Command(0x06,1); //设定输入方式,增量方式
write_Command(0x0c,1); //显示开,光标开,光标所在字符不闪烁
}
/***********************************
*查忙函数
***********************************/
void lcd_check_busy()
{
data_port_dir &= 0x00; //输入模式
CLR_LCD_RS; //RS=0,指令操作
SET_LCD_RW; //读操作
CLR_LCD_EN; //若晶振频率太高,可以在此加短暂的延时
CLR_LCD_EN; //延时作用
SET_LCD_EN; //选通
while(P4IN & 0x80); //检测忙信号
}
unsigned char ReadData(void)
{
data_port_dir &= 0x00; //输入模式
SET_LCD_RS;
SET_LCD_RW;
CLR_LCD_EN; //若晶振频率太高,可以在此加短暂的延时
CLR_LCD_EN; //延时作用
SET_LCD_EN;
return(P4IN);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -