?? 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 + -