📄 lcd_picure.c
字号:
#include < reg52.h >
#include < intrins.h >
#define lcd_Data P0 //数据口
sbit LCD_RS = P2^2; //数据命令选择端
sbit LCD_RW = P2^1; //读写控制
sbit LCD_EN = P2^0; //使能端
sbit lcd_Data7=P0^7;
unsigned char count1,count2,lcd_x,lcd_y,data1,data2,i,j;
void initial(void);
void clear_LCD(void);
char read_data(void);
void send_data(unsigned char dat);
void send_cmd(unsigned char cmd);
void lcd_check_busy(void);
void display1(unsigned char x_addr,unsigned char dat1,unsigned char dat2);
void display2(unsigned char x_addr,unsigned char data1);
//void picture_display(const unsigned char *s);
void picture_display(unsigned char s1,unsigned char s2);
void set_dot(unsigned char x,unsigned char y);
void line(unsigned char start_x,unsigned char start_y,unsigned char end_x,unsigned char end_y);
unsigned char temp;
void main(void)
{
initial();
temp=0x80;
lcd_x=0x90;
lcd_y=0x80;
while(1)
{
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x90;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x91;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x92;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x93;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x94;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x95;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x96;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x97;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x98;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x99;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x9a;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x9b;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x9c;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x9d;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x9e;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
lcd_y=0x80; //设置液晶下半部分坐标
lcd_x=0x9f;
_nop_();_nop_();_nop_();
for(i=0;i<32;i++) //写入液晶下半图象部分
{
picture_display(0x00,0x00);
lcd_y++; //y轴地址加1
}
line(1,30,120,5);
line(5,5,50,50);
line(80,10,30,50);
while(1);
}
}
/******************************************************/
/******************* 液晶显示 ******************/
/******************************************************/
void lcd_check_busy(void)
{
_nop_();_nop_();_nop_();
LCD_RS =0;//RC5
_nop_();_nop_();_nop_();
LCD_RW =1;//RC4
while(1)
{
LCD_EN=1;//RC3
_nop_();_nop_();_nop_();
if(lcd_Data7==0)break;
_nop_();_nop_();_nop_();
}
LCD_EN=0;
}
void send_cmd(unsigned char cmd)
{
lcd_check_busy();
_nop_();_nop_();_nop_();
LCD_RS=0;
_nop_();_nop_();_nop_();
LCD_RW=0;
_nop_();_nop_();_nop_();
LCD_EN=1;
_nop_();_nop_();_nop_();
lcd_Data=cmd;
_nop_();_nop_();_nop_();
LCD_EN=0; //停止工作
}
void initial(void)
{
_nop_();_nop_();_nop_();
send_cmd(0x30);//基本指令集;
_nop_();_nop_();_nop_();
send_cmd(0x0c);//整体显示,关光标,不闪烁;
_nop_();_nop_();_nop_();
send_cmd(0x01);//清DDRAM;
_nop_();_nop_();_nop_();
send_cmd(0x02);//DDRAM地址归位;
_nop_();_nop_();_nop_();
send_cmd(0x80);//设定DDRAM 7位地址000,0000到地址计数器AC;
_nop_();_nop_();_nop_();
send_cmd(0x04);//指定在资料写入或读取时,光标的移动方向,
//DDRAM的地址计数器(AC)加一;
_nop_();_nop_();_nop_();
send_cmd(0x0c);//整体显示,开光标,开闪烁;
}
void clear_LCD(void)
{
send_cmd(0x01);
_nop_();_nop_();_nop_();
send_cmd(0x34);
_nop_();_nop_();_nop_();
send_cmd(0x30);
}
char read_data(void)
{
unsigned char read_data;
lcd_check_busy();
LCD_RS=1;
_nop_();_nop_();_nop_();
LCD_RW=1;
_nop_();_nop_();_nop_();
LCD_EN=1;
_nop_();_nop_();_nop_();
read_data=lcd_Data;
LCD_EN=0;
return (read_data);
}
void send_data(unsigned char dat)
{
lcd_check_busy();
LCD_RS =1;
_nop_();_nop_();_nop_();
LCD_RW =0;
_nop_();_nop_();_nop_();
LCD_EN =1;
_nop_();_nop_();_nop_();
lcd_Data =dat;
_nop_();_nop_();_nop_();
LCD_EN =0;
}
void display1(unsigned char x_addr,unsigned char data1,unsigned char data2)
{
send_cmd(x_addr);//1xxx,xxxx设定DDRAM7位地址xxx,xxxx到地址计数器AC;
send_data(data1);
send_data(data2);
}
void display2(unsigned char x_addr,unsigned char data1)
{
send_cmd(x_addr);//1xxx,xxxx设定DDRAM7位地址xxx,xxxx到地址计数器AC;
send_data(data1);
}
void picture_display(unsigned char s1,unsigned char s2)
{
//unsigned char dat1,dat2;
lcd_check_busy();
send_cmd(0x34); //扩充指令集,绘图显示关闭
_nop_();_nop_();_nop_();
// send_cmd(0x80);
send_cmd(lcd_y);
send_cmd(lcd_x);
// i=read_data();
// j=read_data();
// s2 =(s2|j);
// s1 =(s1|i);
_nop_();_nop_();_nop_();
send_data(s1);
_nop_();_nop_();_nop_();
send_data(s2);
_nop_();_nop_();_nop_();
send_cmd(0x36); //扩充指令集,绘图显示关闭
_nop_();_nop_();_nop_();
send_cmd(0x30); //恢复到基本指令集
}
/*
void set_dot(unsigned char x,unsigned char y)
{
unsigned char x1,x2;
if(y>31)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -