📄 lcddisp.c
字号:
#include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"
#include "picturemap.h"
#include "stdio.h"
typedef unsigned long uint32;
typedef unsigned short uint16;
short displaybuffer[64][8];
void delay(unsigned long dly);
void Blink(int row);
void TextDisplayInit(void);
void displaypicture(int m);
#define displaycommand 0xfa
#define controlcommand 0xf8
#define RS_L rPDATC&=~(1<<6)
#define RS_H rPDATC|=(1<<6)
#define RW_L rPDATC&=~(1<<4)
#define RW_H rPDATC|=(1<<4)
#define EN_L rPDATC&=~(1<<2)
#define EN_H rPDATC|=(1<<2)
#define LCD_CS 0x80 //p2.5 vd4 112 RS
#define LCDDATA 0x20 //p2.6 vd6 114 R/W
#define LCDCLK 0x08 //p2.7 iisclk 116 E
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<500000; i++);
}
void LCDIni(void)
{
// 管脚功能设置
rPCONC&=0xffff00ff;
rPCONC|=0x5500; //
}
/****************************************************************************
*名称 SendLCD()
* 功能:向LCD发送数据或命令。
* 入口参数:data 待发送的数据,命令/数据选择 1 命令 0 数据
***************************************************************************/
void SendLcd(unsigned char ldate, char flag)
{
unsigned char send_data[3];
unsigned char i, j;
send_data[0] = (flag == 1) ? 0xF8 : 0xFA;
send_data[1] = ldate & 0xF0;
send_data[2] = (ldate << 4) & 0xF0;
EN_L;
RS_H;;
for (i = 0; i < 3; i++) {
for(j = 0; j < 8; j++) {
EN_L;
if(((send_data[i]<<j)&0x80)==0x80)
RW_H;
else
RW_L;
EN_H;
}
}
EN_L;
RS_L;
delay(20);
return;
}
void DisplayChineseword(unsigned short int x,unsigned short int y,unsigned int chineseword) //在x,y位置的一个汉字显示
{
unsigned int i;
char i1,i2;
i=(unsigned int)chineseword;
i2=i;
i1=i>>8;
switch(x){
case 0:
SendLcd(0x80+y,1); //DD RAM 地址给定
break;
case 1:
SendLcd(0x90+y,1); //DD RAM 地址给定
break;
case 2:
SendLcd(0x88+y,1); //DD RAM 地址给定
break;
case 3:
SendLcd(0x98+y,1); //DD RAM 地址给定
break;
}
SendLcd(i1,0);
SendLcd(i2,0);
}
void DisplayChar(unsigned short int x,unsigned short int y,char *CharString) //在x,y位置的一个汉字显示
{
U8 i;
char DATA;
switch(x){
case 0:
SendLcd(0x80+y,1); //DD RAM 地址给定
break;
case 1:
SendLcd(0x90+y,1); //DD RAM 地址给定
break;
case 2:
SendLcd(0x88+y,1); //DD RAM 地址给定
break;
case 3:
SendLcd(0x98+y,1); //DD RAM 地址给定
break;
}
while(*CharString!='@')
{
DATA=*CharString;
SendLcd(DATA,0);
*CharString++;
}
}
void printsentence(unsigned short int x,char *p)//xdenotes the start line the 12864module is 4 line and 8 column
{
unsigned int chineseword;
unsigned short int temp1,temp2,i;
DelayNS(2);
SendLcd(0x06,1); //;DDRAM的地址计数器(AC)加1
for( i=0;i<8;i++)
{
temp1=(unsigned short int)*p++;
temp2=(unsigned short int)*p++;
chineseword=temp1;
chineseword=(chineseword<<8)|(unsigned int)temp2;
DisplayChineseword(x,i,chineseword);
}
}
void printdot(int x,int y)//x and y is 128*64
{
displaybuffer[x][y/16]|=0x8000>>(y%16);
}
void clearpicture()
{
int i,j;
SendLcd(0x32,1); // 功能设置---8BIT控制界面,绘图显示ON
SendLcd(0x36,1); //功能设置---8BIT控制界面,扩充指令集
SendLcd(0x34,1); //关显示
for(i=0;i<64;i++)
for(j=0;j<8;j++)
displaybuffer[i][j]=0;
SendLcd(0x36,1); //开显示
}
void clearsentence()
{
SendLcd(0x30,1); //功能设置---8BIT控制界面,基本指令集
SendLcd(0x0c,1); //显示打开,光标关,反白显示关
SendLcd(0x01,1); //清除屏幕显示,将DDRAM的地址计数器归零
DelayNS(2);
}
void printxy(int x,int y,int Bold)
{
if(x<0) x=0;
if(y<0) y=0;
if(x>127) x=127;
if(y>63) y=63;
if(Bold==0)
printdot(64-y,x);
else {printdot(64-y,x);
printdot(64-y+1,x);
}
}
void line_y(int startX,int startY,int length)
{
int i;
for (i=startX;i<length;i++)
printdot(i,startY);
}
void line_x(int startX,int startY,int length)
{
int i;
SendLcd(0x34,1); //关显示
for (i=startY;i<length;i++)
printdot(startX,i);
SendLcd(0x36,1); //关显示
}
void graphshow() //在LCD输出显示buffer的内容
{ int i,j;
SendLcd(0x30,1); //基本命令
SendLcd(0x02,1); //地址归位
SendLcd(0x36,1); //8BIT控制界面,扩充指令集
SendLcd(0x32,1); // 功能设置---8BIT控制界面,绘图显示ON
SendLcd(0x34,1); //关显示
SendLcd(0x34,1); //关显示
for(i=0;i<64;i++)
for(j=0;j<8;j++)
{
SendLcd(0x80+i%32,1); //设置绘图区的Y地址坐标
SendLcd(0x80+(j+((int)(i/32))*8)%128,1) ; //设置绘图区的X地址坐标
SendLcd(displaybuffer[i][j]>>8,0);
SendLcd(displaybuffer[i][j],0);
}
SendLcd(0x36,1); //开显示
}
void TextDisplayInit()
{
SendLcd(0x30,1); //功能设置---8BIT控制界面,基本指令集
SendLcd(0x08,1);
SendLcd(0x0c,1); //显示打开,光标关,反白显示关
SendLcd(0x06,1);
SendLcd(0x01,1); //清除屏幕显示,将DDRAM的地址计数器归零
SendLcd(0x02,1);
}
void displaypicture(int m )
{
int i,j,temp1,temp2;
line_x(0,0,20);
for(i=0;i<64;i++)
for(j=0;j<8;j++)
{
temp1 =0x00;
switch(m){
case 0:temp2=temp1|picture0[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture0[i][j*2+1];
break;
case 1:temp2=temp1|picture1[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture1[i][j*2+1];
break;
case 2:temp2=temp1|picture2[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture2[i][j*2+1];
break;
case 3:temp2=temp1|picture3[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture3[i][j*2+1];
break;
case 4:temp2=temp1|picture4[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture4[i][j*2+1];
break;
case 5:temp2=temp1|picture5[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture5[i][j*2+1];
break;
case 6:temp2=temp1|picture6[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture6[i][j*2+1];
break;
case 7:temp2=temp1|picture7[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture7[i][j*2+1];
break;
case 8:temp2=temp1|picture8[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture8[i][j*2+1];
break;
case 9:temp2=temp1|picture9[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture9[i][j*2+1];
break;
default: break; }
displaybuffer[i][j]=temp1;
}
}
//发白显示
void Blink(int row)
{ int i,j;
SendLcd(0x34,1); //关显示
for(i=0;i<64;i++)
for(j=0;j<8;j++)
{
SendLcd(0x80+i%32,1); //设置绘图区的Y地址坐标
SendLcd(0x80+j+((int)(i/32))*8,1) ; //设置绘图区的X地址坐标
if((row*16<i)&&(i<(row+1)*16) ){ SendLcd(0xff,0);
SendLcd(0xff,0);
}
else{
SendLcd(0x0,0);
SendLcd(0x0,0);
};
SendLcd(0x36,1); //功能设置---8BIT控制界面,扩充指令集
}
}
void flash(int row,int location)
{
if(location!=0)
{
SendLcd(0x30,1);//基本指令
SendLcd(0x0C,1);//
SendLcd(0xf,1);//游标开
SendLcd(0x7,1);
switch(row){
case 1:SendLcd(0x80+location,1);
break;
case 2:SendLcd(0x90+location,1);
break;
case 3:SendLcd(0x88+location,1);
break;
case 4:SendLcd(0x98+location,1);
break;
default: break;
}
}
}
void delay(unsigned long int i)
{
for(i;i>0;i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -