📄 51-pic.c
字号:
#include <pic.h>
//该程序用于HS12864-1液晶显示功能的演示
//运行程序后,液晶上显示"欢迎光临!"和"谈益强"字样
//芯片采用PIC16F877A
#define RS RC5 //DI
#define RW RC4
#define E RC3
#define CS1 RE0
#define CS2 RE1
#define RST RE2
unsigned char PAGEADD; //存放页地址寄存器
unsigned char PAGENUM; //存放总页数寄存器
unsigned char CLMSUM; //存放总列数寄存器
unsigned char CLMADD; //存放列地址寄存器
unsigned char WRITE; //存放显示数据寄存器
unsigned char row; //存放显示起始行寄存器
unsigned char i,k; //通用寄存器
const char table[]=
{
0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,
0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,
0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,
0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00,//0"欢"
0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,
0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,
0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00,//1"迎"
0x00,0x40,0x42,0x44,0x5C,0xC8,0x40,0x7F,
0x40,0xC0,0x50,0x4E,0x44,0x60,0x40,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00,//2"光"
0x00,0xF8,0x00,0x00,0xFE,0x40,0x30,0x8F,
0x0A,0x08,0x18,0x68,0x08,0x88,0x08,0x00,
0x00,0x1F,0x00,0x00,0x7F,0x00,0x00,0x7F,
0x21,0x21,0x3F,0x21,0x21,0x7F,0x01,0x00,//3"临"
0x40,0x41,0xCE,0x04,0x00,0x90,0x4C,0x20,
0x10,0x8F,0x10,0x28,0x46,0x44,0x00,0x00,
0x00,0x00,0x7F,0x20,0x10,0x80,0x44,0x23,
0x18,0x07,0x08,0x14,0x63,0xC0,0x40,0x00,//4"谈"
0x00,0x10,0x90,0x92,0x54,0x38,0x10,0x10,
0x18,0x14,0x33,0x52,0x90,0x90,0x00,0x00,
0x41,0x41,0x40,0x7E,0x42,0x42,0x7E,0x42,
0x42,0x7E,0x42,0x42,0x7E,0x41,0x40,0x00,//5"益"
0x00,0xF2,0x12,0x12,0x1E,0x00,0xC0,0x5E,
0x52,0xF2,0x52,0x52,0x5E,0xC0,0x00,0x00,
0x00,0x01,0x41,0x81,0x7F,0x00,0x87,0x84,
0x84,0xFF,0x44,0x44,0x54,0xE7,0x40,0x00,//6"强"
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7"!"
};
//****************************************************************
//延时程序(x*0.5ms)(1ms*93)
void delay(unsigned int x)
{
unsigned int j;
for(j=x*50;--j;)
continue;
}
//****************************************************************
//系统各口的输入输出状态初始化子程序
void INITIAL()
{
ADCON1=0X87; //设置PORTA口和PORTE口为数字I/O口
TRISC=0X00;
TRISD=0X00;
TRISE=0X00;
PORTD=0X00;
PORTC=0X00; //设置液晶的4个控制脚为输出
RST=0; //Reset.
NOP();
delay(2);
RST=1;
NOP();
delay(2);
RC7=1;
RC6=1;
}
//*******************************************************************
//*******************E1边的处理部分**********************************
//*******************************************************************
//*****************写命令程序*******************************
void send_com1(unsigned char command )
{
delay(1);// check_busy1();
CS1=1; //左边
CS2=0;
RS=0;
RW=0;
PORTD=command;
E =1;
NOP();
NOP();
E =0;
}
//***********对液晶显示器写数据子程序************************
void send_data1(unsigned char data )
{
delay(1); // check_busy1(); //查询液晶是否为空闲
CS1=1; //左边
CS2=0;
RS=1;
RW=0;
PORTD=data; //需要写入的数据放入D口
E =1; //E1=0,写入数据
NOP();
E =0;
}
//************E1边清屏子程序***************************
void CLEAR1()
{
PAGEADD=0xB8; //设置页地址代码0页
for(PAGENUM=0X08;PAGENUM>0;PAGENUM--) //8页
{
send_com1(PAGEADD);
CLMADD=0x00; //设置起始列
for(CLMSUM=0X40;CLMSUM>0;CLMSUM--) //64列
{
send_data1(0x00); //写入00H以清屏
}
PAGEADD++; //页号增1
}
}
//************E1边初始化**********************************
void lcd1()
{
send_com1(0XC0); //起始行0
send_com1(0X3F); //开显示
CLEAR1(); //清屏
}
//*******************************************************************
//*******************E2边的处理部分**********************************
//*******************************************************************
//*****************写命令程序*******************************
void send_com2(unsigned char command )
{
delay(1); //check_busy2();
CS1=0; //右边
CS2=1;
RS=0;
RW=0;
PORTD=command;
E =1;
NOP();
NOP();
E =0;
}
//***********对液晶显示器写数据子程序************************
void send_data2(unsigned char data )
{
delay(1); //check_busy2();
CS1=0; //右边
CS2=1;
RS=1;
RW=0;
PORTD=data; //需要写入的数据放入D口
E =1; //E1=0,写入数据
NOP();
E =0;
}
//************E2边清屏子程序************************
void CLEAR2()
{
PAGEADD=0xB8; //设置页地址代码0页
for(PAGENUM=0X08;PAGENUM>0;PAGENUM--) //8页
{
send_com2(PAGEADD);
CLMADD=0x40; //设置起始列0
for(CLMSUM=0X40;CLMSUM>0;CLMSUM--) //64列
{
send_data2(0x00); //写入00H以清屏
}
PAGEADD++; //页号增1
}
}
//************E2边初始化**********************************
void lcd2()
{
send_com2(0XC0); //起始行0
send_com2(0X3F); //开显示
CLEAR2(); //清屏
}
//******************************************************************
//******************************************************************
//LCD的E1边显示函数,调用一次该函数,则在相应的位置显示相应的字
void dis1()
{
send_com1(CLMADD); //设置起始列
send_com1(PAGEADD);
i=i*32; //i变成数组指示指针
for(k=0;k<=15;k++)
{
WRITE=table[i+k]; //查得需要显示的字节
send_data1(WRITE); //在WRITE1子程序里面,列地址加1
CLMADD++;
}
CLMADD=CLMADD-16;//恢复列地址
send_com1(CLMADD); //设置起始列
PAGEADD=PAGEADD+1;//页地址加1
send_com1(PAGEADD);
for(;k<32;k++)
{
WRITE=table[i+k]; //查得需要显示的字节
send_data1(WRITE); //列地址加1
}
}
//*******************************************************************
//LCD的E2边显示函数,调用一次该函数,则在相应的位置显示相应的字
void dis2()
{
send_com2(CLMADD); //设置起始列
send_com2(PAGEADD);
i=i*32; //i变成数组指示指针
for(k=0;k<16;k++)
{
WRITE=table[i+k]; //查得需要显示的字节
send_data2(WRITE); //列地址加1
CLMADD++;
}
CLMADD=CLMADD-16; //恢复列地址
send_com2(CLMADD); //设置起始列
PAGEADD=PAGEADD+1; //页地址加1
send_com2(PAGEADD);
for(;k<32;k++)
{
WRITE=table[i+k]; //查得需要显示的字节
send_data2(WRITE); //在WRITE1子程序里面,列地址已经加1
}
}
//*************************************************************************
//*****************************主程序**************************************
//*************************************************************************
main()
{
INITIAL(); //系统初始化
lcd1(); //E1边初始化
lcd2(); //E2边初始化
//******以下显示不同的字符*************************************************
RC6=0;
PAGEADD=0XB8; //显示起始页为第0页
CLMADD=0X40; //起始列为第0列
i=0; //欢
dis1(); //调用显示函数
PAGEADD=0XB8; //显示起始页为第0页
CLMADD=0X60; //起始列为第32列
i=1; //迎
dis1(); //调用显示函数
PAGEADD=0XB8; //显示起始页为第0页
CLMADD=0X40; //起始列为第0列
i=2; //光
dis2(); //调用显示函数2
PAGEADD=0XB8; //显示起始页为第0页
CLMADD=0X60; //起始列为第32列
i=3; //临
dis2(); //调用显示函数2
PAGEADD=0XB8; //显示起始页为第0页
CLMADD=0X70; //起始列为第48列
i=7; //!
dis2(); //调用E2边显示函数
PAGEADD=0XBC; //显示起始页为第4页
CLMADD=0X50; //起始列为第16列
i=4; //显示数组中对应的第一个字
dis1(); //调用显示函数
PAGEADD=0XBC; //显示起始页为第4页
CLMADD=0X70; //起始列为第48列
i=5; //显示数组中对应的第六个字
dis1(); //调用显示函数
PAGEADD=0XBC; //显示起始页为第4页
CLMADD=0X50; //起始列为第16列
i=6; //显示数组中对应的第三个字
dis2(); //调用显示函数
while(1)
{
delay(1000);
RC1=!RC1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -