📄 扫描液晶.c
字号:
#include<reg52.h>
#include <absacc.h>
#include <math.h>
#include <INTRINS.H>
#define LCMCP XBYTE [0xdfff] // 命令口
#define LCMDP XBYTE [0xdbff] // 数据口
#define uchar unsigned char
#define uint unsigned int
uchar code font[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
};
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
void Delay(unsigned char CNT)
{
uchar i;
while (CNT-- !=0)
for (i=10000; i !=0; i--);
}
//读数据
uchar read_data(void)
{
uchar i;
i=LCMCP;
return i;
}
void write_data(uchar data_d)
{
LCMDP=data_d;
}
void write_contr(uchar data_c)
{
LCMCP=data_c;
}
void lcd_double_operator(uchar data1,uchar data2,uchar com){
uchar i;
i=0;
while(i!=0x02)
{
i=read_data();
i=i&0x02;
}
write_data(data1); /*参数1*/
i=0;
while(i!=0x02)
{
i=read_data();
i=i&0x02;
}
write_data(data2); /*参数2*/
i=0;
while(i!=0x01)
{
i=read_data();
i=i&0x01;
}
write_contr(com); /*指令*/
}
void lcd_single_operator(uchar data1,uchar com){
uchar i;
i=0;
while(i!=0x02)
{
i=read_data();
i=i&0x02;
}
write_data(data1); /*参数1*/
i=0;
while(i!=0x01)
{
i=read_data();
i=i&0x01;
}
write_contr(com); /*指令*/
}
void lcd_none_operator(uchar com){
uchar i;
i=0;
while(i!=0x01)
{
i=read_data();
i=i&0x01;
}
write_contr(com); /*指令*/
}
void lcd_ini(){
lcd_double_operator(0x00,0x00,0x40);
lcd_double_operator(0x1e,0x00,0x41);
lcd_double_operator(0x00,0x0c,0x42);
lcd_double_operator(0x1e,0x00,0x43);
lcd_none_operator(0xa0);
lcd_none_operator(0x84);
lcd_none_operator(0x9c);
}
void creat_cgram(uchar count){
uint i,x;
x=count*4;
x=x*8;
lcd_double_operator(0x03,0x00,0x22);
lcd_double_operator(0x00,0x1c,0x24);
for (i=0;i<x;i++){
lcd_single_operator(font[i],0xc0);
}
}
void lcd_clear(){
uint i;
lcd_double_operator(0x00,0x00,0x24); //首地址
for(i=0;i<0x1000;i++){
lcd_single_operator(0x00,0xc0);
}
}
void write_chinese(uchar cursor_x,uchar cursor_y,uchar ct_code,uchar attr){
uint x;
x=cursor_y*30;
x=x+cursor_x; //y=cursor_y*30+cursor_x
lcd_double_operator((x&0x00ff),(x/256),0x24);
lcd_single_operator(ct_code,0xc4);
lcd_double_operator((x&0x00ff),(x/256)+0x0c,0x24);
lcd_single_operator(attr,0xc4);
lcd_double_operator(((x&0x00ff)+1),(x/256),0x24);
lcd_single_operator(ct_code+2,0xc4);
lcd_double_operator(((x&0x00ff)+1),(x/256)+0x0c,0x24);
lcd_single_operator(attr,0xc4);
x+=30;
lcd_double_operator((x&0x00ff),(x/256),0x24);
lcd_single_operator(ct_code+1,0xc4);
lcd_double_operator((x&0x00ff),(x/256)+0x0c,0x24);
lcd_single_operator(attr,0xc4);
lcd_double_operator(((x&0x00ff)+1),(x/256),0x24);
lcd_single_operator(ct_code+3,0xc4);
lcd_double_operator(((x&0x00ff)+1),(x/256)+0x0c,0x24);
lcd_single_operator(attr,0xc4);
}
void main(void)
{
uchar i,j,k,l,m;
lcd_ini();
lcd_clear();
creat_cgram(0x02);
lcd_double_operator(0x08,0x00,0x21);
while(1)
{
for(i=0;i<16;i=i+2)
{for(j=0;j<19;j=j+2)
{write_chinese(j,i,0x84,0x00);
for(m=0;m<150;m++)
Delay(10000);
do
{if(key2==0)
{ for(k=0;k<16;k=k+2)
{for(l=0;l<19;l=l+2)
write_chinese(l,k,0x84,0x00);}
}
if(key3==0)
lcd_clear();
}
while(key1==1);
lcd_clear();
Delay(1000);
}
}
Delay(1000);
lcd_clear();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -