📄 lcddisp.c
字号:
/*
管脚对应表
液晶模块 44b0开发板
4 4
5 5
6 6
其余都是电源,和信号无关,具体看说明
*/
/* File:LCDDISP.C
* 功能:使用硬件SPI接口输出LCD显示。
****************************************************************************/
#include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"
#include "picturemap.h"
#define displaycommand 0xfa
#define LCD_CS 0x80 /* vd4 LCD的片选 */
#define controlcommand 0xf8
typedef unsigned long uint32;
typedef unsigned char uint8;
typedef unsigned short uint16;
short displaybuffer[64][8];
void delay(unsigned long dly);
void Blink(int row);
void TextDisplayInit(void);
void displaypicture(void);
#define LCDDATA 0x40 //p0.19 vd5
#define LCDCLK 0x20 //p0.17 vd6
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<500000; i++);
}
/****************************************************************************
* 名称:LCDIni()
****************************************************************************/
void LCDIni(void)
{
// 管脚功能设置
rPCONC&=0xffff00ff;
rPCONC|=0x5500; //
}
/****************************************************************************
* 名称:SendData()
* 功能:向LCD发送数据。
* 入口参数:data 待发送的数据
****************************************************************************/
void SendData(uint8 data)
{ int i;
for(i=0;i<8;i++){
if(((data<<i)&0x80)==0x80)
rPDATC|=LCDDATA;//set dataline high
else
rPDATC&=~LCDDATA;
delay(2);
rPDATC&=~LCDCLK;
delay(2);
rPDATC|=LCDCLK;
; //set dataline low
// SSPDR = data;
// while( 0==(SSPSR&0x80) ); // 等待SPIF置位,即等待数据发送完毕
}
}
/****************************************************************************
*名称 SendLCD()
* 功能:向LCD发送数据或命令。
* 入口参数:data 待发送的数据,命令/数据选择 1 命令 0 数据
***************************************************************************/
void SendLcd(uint8 data,uint8 flag)
{
uint8 firstbyte,secondbyte;
LCDIni() ; // 初始化LCD接口
firstbyte=data&0xf0;
secondbyte=data<<4;
secondbyte=secondbyte&0xf0;
rPDATC|= LCD_CS; // 片选
if(flag==1)
SendData(controlcommand);
if(flag==0)
SendData(displaycommand);
SendData(firstbyte);
SendData(secondbyte);
rPDATC&=~LCD_CS;
}
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 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;
//LCD初始化开始
DelayNS(2);
SendLcd(0x06,1); //;DDRAM的地址计数器(AC)加1
//LCD初始化结束
for( i=0;i<8;i++)
{
temp1=(unsigned short int)*p++;
temp2=(unsigned short int)*p++;
chineseword=temp1;
chineseword=(chineseword<<8)|(unsigned int)temp2;
//chineseword=(unsigned int);
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(0x0c,1); //显示打开,光标关,反白显示关
SendLcd(0x01,1); //清除屏幕显示,将DDRAM的地址计数器归零
SendLcd(0x02,1);
}
void displaypicture( )
{
int i,j,temp1,temp2;
// linex(0,0,20);
for(i=0;i<64;i++)
for(j=0;j<8;j++)
{
temp1 =0x00;
temp2=temp1|picture[i][j*2];
temp2=temp2<<8;
temp1=temp2|picture[i][j*2+1];
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 location){
if(location!=0)
{
SendLcd(0x30,1);//基本指令
//SendLcd(0x,1);//
SendLcd(0xf,1);//游标开
SendLcd(0x7,1);
SendLcd(0x80+location,1);
}
;
}
void delay(unsigned long i)
{
for(i;i>0;i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -