📄 lcd.c
字号:
///////////////////////////
//Designed by: xiu
//QQ:270570606
///////////////////////////
#include <reg51.h>
#include <intrins.h>
#include "ASCII.h"
#define uint unsigned int
#define uchar unsigned char
//功能引脚定义
sbit lcd_rs = P0^6;
sbit lcd_rw = P0^7;
sbit lcd_e = P3^5;
sbit lcd_reset = P3^4;
sbit lcd_cs1 = P3^7;
sbit lcd_cs2 = P3^6;
#define lcd_data P2
//命令表(lcd_rs=0,lcd_rw=0)
#define lcd_off 0x3e //0011 111X |0x1; D0
#define lcd_on 0x3f //0011 111X |0x1; D0
#define y_address 0xb8 //1011 1XXX |0x07; D0-D2 (0~7)
#define x_address 0x40 //01XX XXXX |0x3f; D0-D5 (0~63)
#define disp_start_line 0xc0 //11XX XXXX |0x3f; D0-D5 (0~63)
#define status_busy 0x80
#define NOP() _nop_()
void wait_ready(void); //等待ready
void send_i(uchar CS,uchar instruction);//写指令
void send_d(uchar CS,uchar c);//写数据
void Init_Lcd(void);//初始化LCD
void Clear_Lcd(void);//清屏
void WriteASCII(uchar x,uchar y,uchar ASCII);////写英文 取模顺序:CADB 右旋90度
void lcd_set(char);//设置LCD
void lcd_first_set(char datas);//LCD初始化设置
void delay(char mas){
char mastemp;
for(;mas>0;mas--)
{
for(mastemp=1000;mastemp>0;mastemp--);
}
}
//////////////////////////////////////////////////
////等待ready
void wait_ready(void){
lcd_rs=0;
lcd_rw=1;
lcd_data=0xff;
lcd_e=1;
_nop_();
while(lcd_data&status_busy);
lcd_e=0;
}
////////////////////////////////////////////////////
//////////////////////////////////////////////////
////写指令
void send_i(uchar CS,uchar instruction){//写指令,CS=0 左;CS=1 右
switch(CS){
case 0: lcd_cs1=1;lcd_cs2=0; break; //左
case 1: lcd_cs1=0;lcd_cs2=1; break; //右
default: return;
}
wait_ready();
lcd_rs=0;
lcd_rw=0;
NOP();
lcd_data=instruction;
lcd_e=1;
NOP();
lcd_e=0;
}
////////////////////////////////////////////////////
//////////////////////////////////////////////////
////写数据
void send_d(uchar CS,uchar c){//写数据,CS=0 左;CS=1 右
switch(CS){
case 0: lcd_cs1=1;lcd_cs2=0; break; //左
case 1: lcd_cs1=0;lcd_cs2=1; break; //右
default: return;
}
wait_ready();
lcd_rs=1;
lcd_rw=0;
NOP();
lcd_data=c;
lcd_e=1;
NOP();
lcd_e=0;
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
////设置LCD
void lcd_set(char datas)
{
lcd_rs=0;
lcd_rw=0;
lcd_data=datas;
lcd_e=1;
_nop_();
lcd_e=0;
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
////LCD初始化设置
void lcd_first_set(char datas)
{
lcd_cs1=1;
lcd_cs2=0;
lcd_set(datas);
delay(15);
lcd_cs1=0;
lcd_cs2=1;
lcd_set(datas);
delay(15);
}
//////////////////////////////////////////////////
////初始化LCD
void Init_Lcd(void){
uchar cbyte;
lcd_rw = 0;
lcd_rs = 0;
lcd_e = 0;
lcd_cs1 = 1;
lcd_cs2 = 1;
delay(200);
delay(15);
cbyte=0x3e;//关闭显示;
lcd_first_set(cbyte);
delay(20);
cbyte=0x3f;//开显示;
lcd_first_set(cbyte);
cbyte=0xc0;//设置起始行行号为0;
lcd_first_set(cbyte);
}
////////////////////////////////////////////////////
/////////////////////////////////////////////////
////清屏
void Clear_Lcd(void){
uchar a=0;
uchar b=0;
for (a=0;a<=7;a++){
send_i(0,y_address|a);
send_i(1,y_address|a);
send_i(0,x_address|0);
send_i(1,x_address|0);
for (b=0;b<=127;b++){
send_d(0,0x00);
send_d(1,0x00);
}
}
}
/////////////////////////////////////////////////////
//////////////////////////////////////////////////////
////写英文 取模顺序:CADB 右旋90度,5*8
void WriteASCII(uchar x,uchar y,uchar ASCII){
uint r;
uchar window=0;
for (r=(ASCII*5);r<=((ASCII*5)+4);r++){
if(x>123) return;//防止乱码
if(x>63){
window=1;
x=x%64;
}
send_i(window,y_address|(y/8));
send_i(window,x_address|x);
send_d(window,nAsciiDot[r]);
x++;
}
}
///////////////////////////////////////
//////////////////////////////////////////////////////
////画点
//void WritePoint(uchar x,uchar y,
void main(void){
Init_Lcd();
Clear_Lcd();
WriteASCII(0,8,'H'-0x20);
WriteASCII(5,8,'e'-0x20);
WriteASCII(10,8,'l'-0x20);
WriteASCII(15,8,'l'-0x20);
WriteASCII(20,8,'o'-0x20);
WriteASCII(25,8,'!'-0x20);
WriteASCII(45,16,'W'-0x20);
WriteASCII(50,16,'o'-0x20);
WriteASCII(55,16,'n'-0x20);
WriteASCII(60,16,'d'-0x20);
WriteASCII(65,16,'e'-0x20);
WriteASCII(70,16,'r'-0x20);
WriteASCII(75,16,'f'-0x20);
WriteASCII(80,16,'u'-0x20);
WriteASCII(85,16,'l'-0x20);
WriteASCII(50,48,'M'-0x20);
WriteASCII(55,48,'a'-0x20);
WriteASCII(60,48,'d'-0x20);
WriteASCII(65,48,'e'-0x20);
WriteASCII(70,48,' '-0x20);
WriteASCII(75,48,'b'-0x20);
WriteASCII(80,48,'y'-0x20);
WriteASCII(85,48,':'-0x20);
WriteASCII(90,48,' '-0x20);
WriteASCII(95,48,'W'-0x20);
WriteASCII(100,48,'a'-0x20);
WriteASCII(105,48,'n'-0x20);
WriteASCII(110,48,'g'-0x20);
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -