📄 lcd.c
字号:
#include "LCD.h"
//液晶传送命令/数据函数
void wr_lcd(uchar adc, uchar bits,uchar n)
{
unsigned char i,temp;
uchar wrn;
if(n==1)
wrn=WR1;
else
wrn=WR2;
LCDOUT &= ~CS;
delay(5);
for(i=0;i<bits;i++)
{
//LCDOUT &= ~WR1; //wr1/2 上升沿写入
LCDOUT |= wrn;
delay(5);
temp = adc&0x80;
if(temp==0x80) //判断高位是否为1
LCDOUT |= DATA; //为1则写入1
else
LCDOUT &= ~DATA; //为0则写入0
delay(5);
LCDOUT &= ~wrn; //wr1/2 上升沿写入
delay(5);
LCDOUT |= wrn;
adc=adc<<1;
delay(5);
}
}
uchar rd_lcd(uchar adc,uchar n)//读显示ram
{
unsigned char i,temp;
uchar wrn;
if(n==1)
wrn=WR1;
else
wrn=WR2;
LCDOUT &= ~CS;
delay(5);
wr_lcd(0xc0,3,wrn);
adc=adc<<2;
wr_lcd(adc,6,wrn);
for(i=0;i<4;i++)
{
//LCDOUT &= ~WR1; //wr1/2 上升沿写入
LCDOUT |= wrn;
delay(5);
temp = adc&0x80;
if(temp==0x80) //判断高位是否为1
LCDOUT |= DATA; //为1则写入1
else
LCDOUT &= ~DATA; //为0则写入0
delay(5);
LCDOUT &= ~wrn; //wr1/2 上升沿写入
delay(5);
LCDOUT |= wrn;
adc=adc<<1;
delay(5);
}
return 1;
}
//*********************************************//
// 5, 液晶显示数据函数 //
//入口参数:地址,BCD码。0---9显示数字;10无显示;11o;12F,13C,14E,15P.16L,17H,18A
void WRITE_LCD(unsigned int add,unsigned char num,unsigned char point,uchar n)
{
wr_lcd(DDATA,3,n);//wr1选择模式
add=add<<2;
wr_lcd(add,6,n);//wr1 选地址
switch (num)
{
case 0: //0:显示数字 0 //
if(point==0)
wr_lcd(0xd7,8,n); //发送八位数字
else
wr_lcd(0xdf,8,n); //发送八位数字
break;
case 1:
if(point==0)
wr_lcd(0x06,8,n); //发送八位数字
else
wr_lcd(0x0e,8,n); //发送八位数字
break;
case 2:
if(point==0)
wr_lcd(0xe3,8,n); //发送八位数字
else
wr_lcd(0xeb,8,n); //发送八位数字
break;
case 3:
if(point==0)
wr_lcd(0xa7,8,n); //发送八位数字
else
wr_lcd(0xaf,8,n); //发送八位数字
break;
case 4:
if(point==0)
wr_lcd(0x36,8,n); //发送八位数字
else
wr_lcd(0x3e,8,n); //发送八位数字
break;
case 5:
if(point==0)
wr_lcd(0xb5,8,n); //发送八位数字
else
wr_lcd(0xbd,8,n); //发送八位数字
break;
case 6:
if(point==0)
wr_lcd(0xf5,8,n); //发送八位数字
else
wr_lcd(0xfd,8,n); //发送八位数字
break;
case 7:
if(point==0)
wr_lcd(0x07,8,n); //发送八位数字
else
wr_lcd(0x0f,8,n); //发送八位数字
break;
case 8:
if(point==0)
wr_lcd(0xf7,8,n); //发送八位数字
else
wr_lcd(0xff,8,n); //发送八位数字
break;
case 9:
if(point==0)
wr_lcd(0xb7,8,n); //发送八位数字
else
wr_lcd(0xbf,8,n); //发送八位数字
break;
case 10: //10:无显示 //
if(point==0)
wr_lcd(0x00,8,n);
else
wr_lcd(0x08,8,n);
break;
case 11: //11:显示字母 O //
if(point==0)
wr_lcd(0x33,8,n);
else
wr_lcd(0x3b,8,n);
break;
case 12: //12:显示字母F //
if(point==0)
wr_lcd(0x71,8,n);
else
wr_lcd(0x79,8,n);
break;
case 13: //13:显示字母C //
if(point==0)
wr_lcd(0xd1,8,n);
else
wr_lcd(0xd9,8,n);
break;
case 14: //14:显示字母E //
if(point==0)
wr_lcd(0xf1,8,n);
else
wr_lcd(0xf9,8,n);
break;
case 15: //15:显示字母P //
if(point==0)
wr_lcd(0x73,8,n);
else
wr_lcd(0x7b,8,n);
break;
case 16: //16:显示字母L //
if(point==0)
wr_lcd(0xd0,8,n);
else
wr_lcd(0xd8,8,n);
break;
case 17: //17:显示字母H //
if(point==0)
wr_lcd(0x76,8,n);
else
wr_lcd(0x7e,8,n);
break;
case 18: //18:显示字母A //
if(point==0)
wr_lcd(0x77,8,n);
else
wr_lcd(0x7f,8,n);
break;
case 19: //19:显示字母U //
if(point==0)
wr_lcd(0xd6,8,n);
else
wr_lcd(0xde,8,n);
break;
case 20: //20:显示- //
if(point==0)
wr_lcd(0x20,8,n);
else
wr_lcd(0x28,8,n);
break;
default: //默认无显示 //
if(point==0)
wr_lcd(0x00,8,n);
else
wr_lcd(0x08,8,n);
break;
}
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
}
//************************************************//
//*********************************************//
// 5.5, 液晶上电初始化 //
void LCD_INIT(void){
uint i;
for(i=0;i<60000;i++)
;
LCDDIR |= (CS+WR1+WR2+DATA);//cs、sclk、std脚为输出
LCDOUT |= (CS+WR1+WR2+DATA);
//wr1初始化
wr_lcd(COMMAND,3,1);//wr1选择模式
wr_lcd(0x29,9,1);//wr1 写初始化命令字0010 1001:8位,命令代码+0=9位。专用初始化命令
//LCDOUT |= CS;
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
delay(60);
wr_lcd(COMMAND,3,1);//wr1选择模式
wr_lcd(0x18,9,1);//wr1 定义RC振荡方式:选内部振荡器
//LCDOUT |= CS;
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
delay(60);
wr_lcd(COMMAND,3,1);//wr1选择模式
wr_lcd(0x01,9,1);//wr1 开振荡器
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
delay(60);
wr_lcd(COMMAND,3,1);//wr1选择模式
wr_lcd(0x03,9,1);//wr1 开显示器
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
delay(60);
//wr2初始化
wr_lcd(COMMAND,3,2);//wr1选择模式 100
wr_lcd(0x29,9,2);//wr1 写初始化命令字:8位,命令代码+0=9位。
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
delay(60);
wr_lcd(COMMAND,3,2);//wr1选择模式
wr_lcd(0x18,9,2);//wr1 定义RC振荡方式:选内部振荡器
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
delay(60);
wr_lcd(COMMAND,3,2);//wr1选择模式
wr_lcd(0x01,9,2);//wr1 开振荡器
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
delay(60);
wr_lcd(COMMAND,3,2);//wr1选择模式
wr_lcd(0x03,9,2);//wr1 开显示器
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
}
void delay(uint n)
{
uint i;
for(i=0;i<n;i++)
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -