📄 lcd_inf.c
字号:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd_inf.h"
#include "img.h"
#define uch unsigned char
#define uint unsigned int
extern uch shu[];
extern uch or_by;
void shu_s(unsigned int x,unsigned char *y);//把一个字拿来分为5个数
void dlay(void){ //短延时
NOP();NOP();NOP();
return;
}
void w_com(uch a){ //写左右屏指令
DDRD=0xff;
while(busy());
s_b(cont,CS1);
s_b(cont,CS2);
c_b(cont,RW);
c_b(cont,RS);
DATA=a;
s_b(cont,E);
dlay();
c_b(cont,E);
dlay();
}
void w_by(uch x,uch y){//写左右屏显示数据,0为左屏1为右屏
DDRD=0xff;
if(y==1){s_b(cont,CS2);c_b(cont,CS1);}
else{s_b(cont,CS1);c_b(cont,CS2);}
s_b(cont,RS);
c_b(cont,RW);
DATA=x;
s_b(cont,E);
//dlay();
c_b(cont,E);
//dlay();
}
uch r_by(uch x){ //读屏数据,X=0读左屏x=1读右屏
while(busy());
DDRD=0;
if(x==1){
s_b(cont,CS2);
c_b(cont,CS1);
}
else{
s_b(cont,CS1);
c_b(cont,CS2);
}
s_b(cont,RS);
s_b(cont,RW);NOP();NOP();
s_b(cont,E);NOP();NOP();
c_b(cont,E);NOP();NOP();
s_b(cont,E);NOP();NOP();
return PIND;
}
uch r_s(void){ //读LCD状态
DDRD=0;
s_b(cont,CS1);
s_b(cont,CS2);
s_b(cont,RW);
c_b(cont,RS);
s_b(cont,E);
dlay();
c_b(cont,E);
dlay();
return PIND;}
uch busy(void){ //判断忙标志 忙返回1 空闲返回0;
uch x;
x=r_s();
if(x&0x80)return 1;
else return 0;
}
void xyini(uch x,uch y){//设置坐标
while(busy());
x&=0x3f;
x|=0x40;
w_com(x);
while(busy());
y&=0x07;
y|=0xb8;
w_com(y);
}
void openlcd(void){ //开LCD
while(busy());
w_com(0x3f);
}
void offlcd(void){ //关LCD
while(busy());
w_com(0x3e);
}
void satline(uch x){ //设置起始行
x&=0x3f;
x|= 0xc0;
while(busy());
w_com(x);
}
void dis(const uch *bmp){//显示一个128*64的图片
uch x,z,y,i;
uint zz=0;
xyini(0,0);
for(y=0;y<8;y++)
{
for(z=0;z<128;z++)
{
if(z>63){i=1;xyini(z-64,y);}
else {xyini(z,y);i=0;}
x=pgm_read_byte(bmp+zz);zz++;
w_by(x,i);
}
}
}
void dis_tu(uch x,uch y,uch w,uch h,const uch *bmp){//x,坐标X,Y,坐标Y,W图片宽度,H图片高度BMP 指向的图片a=1时反色显示b=1时清除屏幕
uch i=0;
uch yy;
uch bmp_x;
uint bmp_w=0;
for(;h!=0;h--)
{
for(yy=0;yy<w;yy++)
{
bmp_x=yy+x;
if(bmp_x==128)break;//如果写到了边,就退出本次循环
if(bmp_x>63)
{bmp_x-=64;i=1;}
else {i=0;}
xyini(bmp_x,y);
bmp_x=*(bmp+yy+bmp_w);//pgm_read_byte(bmp+yy+bmp_w);
w_by(bmp_x,i);
}
y++;
if(y==8)return;
bmp_w+=w;
}
}
void wef(uch z,uch i){//显示一个8*6的字符
//输出一个8*6的字母 z为字符号,a为正反显标志i=0,第一屏i=1为第二屏h为参与显示的*/
uch xx;
uch bmp_x;
for(xx=0;xx<5;xx++)
{
bmp_x=char85[z][xx];
w_by(bmp_x,i);
}
}
static uint jindu[8]={
0x0000,0x0080,0x00a0,0x00a8,
0x00aa,0x80aa,0xa0aa,0xa8aa,};
void jindu_dis(uch a){
uch x;
uint y;
y=jindu[a];
for(x=0;x<19;x++){
xyini(x+41,4);
w_by((y&0xff00)>>8,1);
xyini(x+41,5);
w_by(y&0xff,1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -