📄 lcd12232基本实现备份.txt
字号:
/******************************************
基本功能:练习LCD12232的静态显示,实现显示
多个汉字的功能。
Author: CHANG MING
Create Time: 2009/3/7
*****************************************/
#include<c8051f020.h>
#include<intrins.h>
sbit LCD_A0 = P2^6;
sbit LCD_RW = P0^7;
sbit LCD_E1 = P2^4;
sbit LCD_E2 = P2^7;
//sbit LCD_RST= P3^0;
#define DATA P3
#define N 8
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
0x00,0x00,0x02,0x02,0x0A,0x12,0x22,0x62,0x02,0x82,0x82,0x42,0x02,0xFE,0x00,0x00,
0x00,0x00,0x00,0x00,0x7E,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xCC,0x08,0x00,
0x40,0x41,0xCE,0x04,0x00,0x20,0x22,0xA2,0x62,0x22,0xA2,0x22,0x22,0x22,0x20,0x00,
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00
};
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,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//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
0x00,0x00,0x04,0x0C,0x04,0x02,0x02,0x01,0x01,0x00,0x20,0x40,0x80,0x7F,0x00,0x00,
0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x24,0x46,0x44,0x20,0x1F,0x00,0x00,
0x40,0x20,0x1F,0x20,0x28,0x4C,0x4A,0x49,0x48,0x4C,0x44,0x45,0x5E,0x4C,0x40,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,
0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00
};
//延时程序*******************************
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);
}
if(process_i==3)
{
LCD_A0 = 1;
LCD_RW = 0;
DATA = process_data;
LCD_E2 = 1;
LCD_E2 = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_E2 = 0;
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 //起始行,第0行
#define LCD_direction 0xa0 //显示方向
#define LCD_page 0xb8 //显示起始页,第0页
#define LCD_column 0x00 //显示起始列,第0列
#define LCD_end 0xee
void LCD_inite(void)
{
LCD_writecommand(LCD_on & 0xfe);
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);
}
//清除残余黑点******************************
void LCD_clearpoint(unsigned char i)
{
unsigned char j=0;
if(N>=7)
{
if(i%112==111)
{ //LCD_writecommand((LCD_page | 2)); //起始地址设置
//LCD_writecommand(LCD_column | 112 );
LCD_writedata(2,0x00);
LCD_writedata(2,0x00);
}
if(i==N*16-1)
{
j=(122-N%7*16)/8+1;
while(j-->0)
LCD_writedata(3,0x00);
}
}
if(N<7)
{
j=(122-N*16)/8+1;
if(i==(N*16-1))
while(j-->0)
LCD_writedata(3,0x00);
}
}
//main()*************************************
void main(void)
{
unsigned char i=0;
unsigned char flag=0; //控制上下屏
unsigned char flag1=0; //控制左右屏
unsigned char k=0,n=0,p=0; //k控制交界次数
WDTCN = 0XDE; //关闭看门狗
WDTCN = 0XAD;
OSCXCN= 0x67; //设置外部晶振频率,使用外部振荡器时应先设置OSCXCN,后设置OSCICN
while(OSCXCN==0x67);//必须等待使时钟稳定,XTLVLD由0变为1
OSCICN= 0x08; //设置时钟使用外部晶振频率11.0592MHZ
XBR0 = 0X00; //配置交叉开关
XBR1 = 0X00;
XBR2 = 0X40;
P0MDOUT = 0XFF; //输出方式选择
P2MDOUT = 0XFF;
P3MDOUT = 0XFF;
LCD_inite();
while(i<(N*16)) //字符的上半部分
{
if((i/112)%2==0) //page0、page2选择
{ flag=0x01;
n=0x00;
}
else
{ flag=0x03;
n=0x10;
}
if((i/16%7) >= 4) //左右屏选择
flag1=0x02;
else
flag1=0x01;
//LCD_clearpoint(i);
if(i%16==0 && i/16%7==0) //确定字符起始位置
{
LCD_writecommand((LCD_page | flag)); //起始地址设置
LCD_writecommand((LCD_line | n));
LCD_writecommand(LCD_column );
}
if(i/16%7==3) //交界处字符特殊处理
{
for(;i<=(60+112*k);i++)
LCD_writedata(1,strru[i]); //左区有效
for(;i<=(63+112*k);i++)
LCD_writedata(2,strru[i]); //右区有效
k++;
}
LCD_writedata(flag1,strru[i]);
i++;
}
i=0;
k=0;
while(i<(N*16)) //写字符的下半部分
{
if((i/112)%2==0)
{ flag=0x02;
n=0x08;
}
else
{ flag=0x00;
n=0x18;
}
if(i/16%7>=4)
flag1=0x02;
else
flag1=0x01;
//LCD_clearpoint(i);
if(i%16==0 && i/16%7==0)
{
LCD_writecommand((LCD_page | flag));
LCD_writecommand((LCD_line | n));
LCD_writecommand(LCD_column );
}
if(i/16%7==3)
{
for(;i<=(60+112*k);i++)
LCD_writedata(1,strrd[i]);
for(;i<=(63+112*k);i++)
LCD_writedata(2,strrd[i]);
k++;
}
LCD_writedata(flag1,strrd[i]);
i++;
}
p=1;
while(1) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -