📄 lcd.c
字号:
/****************************************************************************
* 文 件 名:lcd.c
* 功 能:lcd的显示。
* 说 明:。
****************************************************************************/
#define BEEPCON 0x1ff // P0.7控制BEEP
#define LCD 0x000001ff;//0x803ff
#define RW 1<<16
#define RS 1<<17
#define E 1<<30
#define B 0x80000000
uint16 i,j;
uint8 addr;
/*********************************************************************************************************
** Function name: DelayNS
** Descriptions: 长软件延时。
** 延时时间与系统时钟有关。
** Input: dly 延时参数,值越大,延时越久
** Output: 无
********************************************************************************************************/
void DelayNS(uint32 dly)
{
for(; dly > 0; dly--)
for(i = 0; i < 100;)
i++;
}
void delay(uint8 j)
{
for(i=3000;i>0;i--)
for(;j>0;j--);
}
/****************************************************************************************************
// 函数名称 EGodown
// 函数功能 产生下跳沿
****************************************************************************************************/
void EGodown()
{
IO3SET=E;
IO3CLR=E;
}
/****************************************************************************************************
// 函数名称 busy
// 函数功能 判忙
****************************************************************************************************/
void busy()
{
uint32 IO2;
IO2DIR=0x00000000;
while(1)
{
IO3CLR=RS; //RS=0;
IO3SET=RW; //RW=1;
IO3SET=E; //e=1;这是read指令状态
IO2=IO2PIN;
IO3CLR=E;
if((IO2&0x01)==0x00) break;
}
}
/******************************************************************************************************
** Function name:Crc()
**循环移位
**
******************************************************************************************************/
uint32 Crc(uint8 data)
{
uint8 a=0x00,b=0x00,c=0x00,d=0x00;
uint8 f=0x00,g=0x00,h=0x00,j=0x00,k=0x00;
a=(data&(0x81));
b=(data&(0x42));
c=(data&(0x24));
d=(data&(0x18));
f=(a<<7);
f=(f|(a>>7));
f=f&0x81;
g=(b<<5);
g=(g|(b>>5));
g=g&0x42;
h=(c<<3);
h=(h|(c>>3));
h=h&0x24;
j=(d<<1);
j=(j|(d>>1));
j=j&0x18;
k=(f|g|h|j);
return k;
}
/******************************************************************************************************
** Function name:SetInit()
**给LCD写命令
**
******************************************************************************************************/
void SetInit(uint8 com)
{
IO2DIR=0x000000ff;
IO3CLR=RW; // RW=0;
IO3CLR=RS; //RS=0;
IO2CLR=0x000000ff;
IO2SET=com;
EGodown(); //产生下跳沿
}
/******************************************************************************************************
** Function name:SetCom()
**给LCD写命令
**
******************************************************************************************************/
void SetCom(uint8 com)
{
busy();
IO2DIR=0x000000ff;
IO3CLR=RW; // RW=0;
IO3CLR=RS; //RS=0;
IO2CLR=0x000000ff;
IO2SET=com;
EGodown(); //产生下跳沿
}
/******************************************************************************************************
** Function name:SetCom()
**给LCD写命令
**
******************************************************************************************************/
void SetComd(uint8 com)
{
busy();
IO2DIR=0x000000ff;
IO3CLR=RW; // RW=0;
IO3CLR=RS; //RS=0;
IO2CLR=0x000000ff;
IO2SET=Crc(com);
EGodown(); //产生下跳沿
}
/******************************************************************************************************
** Function name:SetLcd()
**给LCD写命令
**
******************************************************************************************************/
void SetData(uint8 data)
{
busy();
IO2DIR=0x000000ff;
//IO3CLR=RS;
IO3CLR=RW; //RW=0;
IO3SET=RS; //RS=1;
IO2CLR=0x000000ff;
IO2SET=Crc(data);
EGodown(); //产生下跳沿
IO2CLR=0x000000ff;
return;
}
/******************************************************************************************************
** Function name:write()
**给LCD写命令
**
******************************************************************************************************/
void write(uint8 add,uint8 word[16])
{
int n;
uint8 p=' ';
char *err="OUT DISPLAY";
n=strlen(word);
if(n>32){
add=0x80;
for(i=0;i<11;i++){
p=err[i];
SetComd(add);
SetData(p);
add++;
}
return;
}else
if(n>16){
for(i=0;i<n;i++)
{
add=0x80;
if(i>16){
add=0xc0;
p=word[i];
SetComd(add);
SetData(p);
add++;
}
else{
p=word[i];
SetComd(add);
SetData(p);
add++;
}
}
}
else
{
for(i=0;i<n;i++)
{
p=word[i];
SetComd(add);
SetData(p);
add++;
}
}
}
/******************************************************************************************************
** Function name:InitLcd()
**LCD初始化
**
******************************************************************************************************/
void InitLcd(void)
{
SetInit(0x0c);
delay(5);
SetInit(0x0c);
delay(1);
SetInit(0x0c);
delay(2);
SetComd(0x38); //设置工作方式-8位总线 字符行数两行 5*7点阵
SetComd(0x08); //设置显示状态-关显示
SetComd(0x01); //清屏
delay(20);
SetComd(0x06); //设置输入方式-画面不动光标右移
SetComd(0x0e); //设置显示状态-画面显示,光标、闪烁显示
}
void Lcd_Bcd(uint8 ic_buff[16])
{
uint8 tp;
addr=0x80;
for(i=0;i<4;i++){
tp=ic_buff[i];
if(i<2)
tp=(tp&0x7f);
else
tp=(tp&0x3f);
tp=(tp>>4)+'0';
SetComd(addr);
SetData(tp);
addr++;
tp=ic_buff[i];
tp=(tp&0x0f)+'0';
SetComd(addr);
SetData(tp);
addr++;
}
addr=0xc0;
for(;i<7;i++){
tp=ic_buff[i];
if(i==4)
tp=(tp&0x07);
else
tp=(tp&0x1f);
tp=(tp>>4)+'0';
SetComd(addr);
SetData(tp);
addr++;
tp=ic_buff[i];
if(i==4)
tp=(tp&0x07);
tp=(tp&0x0f)+'0';
SetComd(addr);
SetData(tp);
addr++;
}
}
void lcdok(void)
{
PINSEL0 = 0x00000000;
PINSEL2 = 0x00000034;
PINSEL1 = 0x00000001;
IO2DIR=0x000000ff;
IO3DIR =0xc00301ff; //P3.31,P3.30,P3.17,P3.16;P3.0~3.8 ALL OUTPUT// IO3SET = LCD;
IO3SET=B;
IO3CLR=RS; //RS=1;ELCDB=1
IO3CLR=RW;
IO3CLR=E; //RS=1;RW=0;e=0;
DelayNS(100);
InitLcd();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -