📄 ocmj12232c-1(并口).h
字号:
#ifndef _OCMJ12232_H_
#define _OCMJ12232_H_
//引脚定义
//p2 ---- 并口数据通信
#define DB_DIR P2DIR
#define DB_OUT P2OUT
#define DB_IN P2IN
#define DB_SEL P2SEL
//控制引脚 ---- P3
//E ---- P3.0
//RW ---- P3.1
//RS ---- P3.2
// RW:H -- 读取 L -- 写
// RS:H -- 数据 L -- 命令
#define E_H P3OUT |= 0X01
#define E_L P3OUT &= ~0X01
#define RW_H P3OUT |= 0X02
#define RW_L P3OUT &= ~0X02
#define RS_H P3OUT |= 0X04
#define RS_L P3OUT &= ~0X04
#define COMMAND 0
#define DATA 1
void init_port(void);
unsigned char read_RAM(void);
unsigned char read_BF(void);
void check_BF(void);
void write_lcd(unsigned char data_com,unsigned char value);
void init_lcd (void);
void write_data(unsigned char *data);
void delay_xus(int us);
void delay_xms(int ms);
void clrram (void);
void go(unsigned char xxx, unsigned char yyy);
/****************** 引脚初始化 ******************/
void init_port(void)
{
DB_OUT = 0X00;
DB_DIR = 0X00;
P3DIR = 0X07;
P3OUT = 0X00;
}
/****************** 读取RAM数据 ******************/
//没有完成
unsigned char read_RAM(void)
{
unsigned char ret = 0;
_NOP();
return ret;
}
/****************** 读取busy标志位 ******************/
//BF = H 忙 BF = L 空闲 (bit7)
//读取BF标志位,读取了两次,不知道对不对
unsigned char read_BF(void)
{
unsigned char ret;
DB_DIR = 0X00;
RS_L;
RW_H;
E_H;
_NOP();
_NOP();
ret = DB_IN;
E_L;
_NOP();
_NOP();
_NOP();
_NOP();
E_H;
_NOP();
_NOP();
ret = DB_IN;
E_L;
_NOP();
_NOP();
_NOP();
_NOP();
return ret;
}
/****************** 检查BF标志位,直到 BF = 0 ******************/
void check_BF(void)
{
unsigned char temp;
do
{
temp = read_BF();
}while((temp & 0x80) == 0x80);
}
/****************** 写数据或命令 ******************/
void write_lcd(unsigned char data_com,unsigned char value)
{
//check_BF();
unsigned char temp;
do
{
temp = read_BF();
}while((temp & 0x80) == 0x80);
DB_DIR = 0XFF;
if(data_com == DATA)
{
RS_H;
RW_L;
}
else if(data_com == COMMAND)
{
RS_L;
RW_L;
}
else
return ;
DB_OUT = value;
E_H;
_NOP();
E_L;
DB_DIR = 0X00;
/*if((data_com == COMMAND) && (value == 0x01))
delay_xms(10);
else
delay_xus(75);*/
}
/****************** 初始化******************/
void init_lcd (void)
{
write_lcd (COMMAND,0x30); /*30---基本指令动作*/
write_lcd (COMMAND,0x01); /*清屏,地址指针指向00H*/
write_lcd (COMMAND,0x06); /*光标的移动方向*/
write_lcd (COMMAND,0x0c); /*开显示,关游标*/
}
/*------------------- 写数据 --------------------*/
void write_data(unsigned char *data)
{
//写数据之前必须先指定AC值
write_lcd(COMMAND,0x30);//基本指令集
//write_lcd(COMMAND,0X80);//设定DDRAM AC值 = 0
while(*data)
{
write_lcd(DATA,*data);
data++;
}
}
/*-------------- 清DDRAM ------------------*/
void clrram (void)
{
write_lcd (COMMAND,0x30);//基本指令集动作
write_lcd (COMMAND,0x01);//清除显示
}
/*-------------- 光标定位 ---------------*/
void go(unsigned char xxx, unsigned char yyy)
{
write_lcd(COMMAND,0x30);
if(yyy==0)
write_lcd(COMMAND,0x80+xxx);
else if(yyy==1)
write_lcd(COMMAND,0x90+xxx);
}
/*------------------- 延 时 --------------------*/
void delay_xus (int us) //delay time
{
do
{
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}while(us--);
}
void delay_xms(int ms)
{
do
{
delay_xus(1000);
}while(ms--);
}
#endif /*_OCMJ12232_H_*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -