📄 lcd12232先上后下送数据功能完成.txt
字号:
/******************************************
基本功能:练习LCD12232的静态显示,实现显示
多个汉字的功能。
Author: CHANG MING
Create Time: 2009/3/7
*****************************************/
#include<reg51.h>
#include<intrins.h>
sbit LCD_A0 = P3^4;
sbit LCD_RW = P3^3;
sbit LCD_E1 = P2^0;
sbit LCD_E2 = P2^1;
sbit LCD_RST= P3^0;
#define DATA P1
#define N 10
unsigned char code strru[]={
0x10,0x61,0x06,0xE0,0x18,0x84,0xE4,0x1C,0x84,0x65,0xBE,0x24,0xA4,0x64,0x04,0x00, //1上0
0x00,0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00,0x00, //2上0
0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00, //3上0
0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00, //4上0
0x00,0x00,0xFF,0x09,0x49,0x59,0xE9,0x49,0x49,0x49,0xE9,0x59,0x49,0x4F,0x00,0x00, //5上0
0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00, //6上0
0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00, //7上0
0x00,0x10,0x0C,0x24,0x24,0x24,0x25,0x26,0xA4,0x64,0x24,0x04,0x14,0x0C,0x00,0x00, //8上2
0x10,0x0C,0x03,0xC2,0x36,0x4A,0x42,0x52,0x48,0x47,0x42,0xF6,0x4A,0x42,0x42,0x00, //9上2
0x20,0x30,0xAE,0x64,0x30,0x00,0x04,0x24,0xE4,0x3F,0x24,0xE4,0x04,0x04,0x00,0x00, //10上2
};
unsigned char code strrd[]={
0x04,0x04,0xFF,0x00,0x01,0x00,0xFF,0x41,0x21,0x12,0x0C,0x1B,0x61,0xC0,0x40,0x00, //1下1
0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00, //2下1
0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00, //3下1
0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00, //4下1
0x40,0x30,0x0F,0x82,0x42,0x32,0x0F,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x00, //5下1
0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00, //6下1
0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00, //7下1
0x00,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00, //8下3
0x04,0x02,0x01,0xFF,0x00,0x00,0x01,0x06,0x0C,0x40,0x80,0x7F,0x00,0x00,0x00,0x00, //9下3
0x22,0x23,0x22,0x12,0x12,0x00,0x20,0x11,0x0D,0x41,0x81,0x7F,0x01,0x09,0x31,0x00,//10下3
};
//延时程序*******************************
void delay(unsigned int process_i)
{ unsigned int part_i;
for(;process_i>0;process_i--)
for(part_i=0;part_i<124;part_i++)
;
}
//判断是E1否处于忙状态********************
unsigned char LCD_busye1(void)
{
unsigned char result;
DATA=0xff;
LCD_A0 = 0;
LCD_RW = 1;
LCD_E1 = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = DATA & 0x80;
LCD_E1 = 0; //很重要,读完数据后将E电平拉低
return result;
}
//判断是E2否处于忙状态********************
unsigned char LCD_busye2(void)
{
unsigned char result;
DATA=0xff;
LCD_A0 = 0;
LCD_RW = 1;
LCD_E2 = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = DATA & 0x80;
LCD_E2 = 0;
return result;
}
//写数据*******************************
void LCD_writedata(unsigned char process_i,unsigned char process_data)
{
while(LCD_busye1()); //忙判断
while(LCD_busye2()!=0x00);
if(process_i==1)
{
LCD_A0 = 1;
LCD_RW = 0;
LCD_E1 = 1;
DATA = process_data;
//delay(5);
_nop_();
_nop_();
_nop_();
_nop_();
LCD_E1 = 0;
//delay(5);
}
if(process_i==2)
{
LCD_A0 = 1;
LCD_RW = 0;
DATA = process_data;
LCD_E2 = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_E2 = 0;
//delay(5);
}
}
//写指令*******************************
void LCD_writecommand(unsigned char process_data)
{
while(LCD_busye1()); //忙判断
while(LCD_busye2()!=0x00);
LCD_A0 = 0;
LCD_RW = 0;
LCD_E1 = 1;
DATA = process_data;
//delay(5);
_nop_();
_nop_();
_nop_();
_nop_();
LCD_E1 = 0;
delay(5);
LCD_A0 = 0;
LCD_RW = 0;
LCD_E2 = 1;
DATA = process_data;
//delay(5);
_nop_();
_nop_();
_nop_();
_nop_();
LCD_E2 = 0;
delay(5);
}
//端口初始化*********************************
#define LCD_rest 0xe2
#define LCD_on 0xaf
#define LCD_duty 0xa9 //占空比32
#define LCD_drive 0xa4 //驱动
#define LCD_line 0xc0 //起始行
#define LCD_direction 0xa1 //显示方向
#define LCD_page 0xb8 //显示起始页
#define LCD_column 0x00 //显示起始列
#define LCD_end 0xee
void LCD_inite(void)
{
LCD_writecommand(LCD_rest);
LCD_writecommand(LCD_on);
LCD_writecommand(LCD_duty);
LCD_writecommand(LCD_drive);
//LCD_writecommand(LCD_line);
LCD_writecommand(LCD_direction);
//LCD_writecommand(LCD_page);
//LCD_writecommand(LCD_column);
LCD_writecommand(LCD_end);
}
//main()*************************************
void main(void)
{
unsigned char i=0;
unsigned char flag=0; //控制上下屏
unsigned char flag1=0; //控制左右屏
unsigned char k=0; //控制交界次数
LCD_inite();
//字符的上半部分
while(i<N*16)
{
if(i/16/7%2==0) //page0、page2选择
flag=0;
else
flag=2;
if(i/16%7>=4) //左右屏选择
flag1=2;
else
flag1=1;
if(i%16==0 && i/16%7==0) //确定字符起始位置
{
LCD_writecommand(LCD_page | flag); //起始地址设置
LCD_writecommand(LCD_line);
LCD_writecommand(LCD_column );
}
if(i/16%7==3) //交界处字符特殊处理
{
for(;i<=(60+96*k);i++)
LCD_writedata(1,strru[i]); //左区有效
for(;i<=(63+96*k);i++)
LCD_writedata(2,strru[i]); //右区有效
k++;
}
LCD_writedata(flag1,strru[i]);
i++;
}
i=0;
k=0;
while(i<N*16) //写字符的下半部分
{
if(i/16/7%2==0)
flag=1;
else
flag=3;
if(i/16%7>=4)
flag1=2;
else
flag1=1;
if(i%16==0 && i/16%7==0)
{
LCD_writecommand(LCD_page | flag);
LCD_writecommand(LCD_line);
LCD_writecommand(LCD_column );
}
if(i/16%7==3)
{
for(;i<=(60+96*k);i++)
LCD_writedata(1,strrd[i]);
for(;i<=(63+96*k);i++)
LCD_writedata(2,strrd[i]);
k++;
}
LCD_writedata(flag1,strrd[i]);
i++;
}
while(1) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -