?? ocm4x8c.c
字號:
//******************************************************//
//FILE: ocm4x8c.c
// 液晶顯示程序
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
#include "DSP281x_GlobalPrototypes.h"
#define BF GpioDataRegs.GPBDAT.bit.GPIOB7
#define RS GpioDataRegs.GPBDAT.bit.GPIOB8 //H=data; L=command
#define RW GpioDataRegs.GPBDAT.bit.GPIOB9 //H=read; L=write
#define EN GpioDataRegs.GPBDAT.bit.GPIOB10 //input enable
#define RESET_LCD GpioDataRegs.GPEDAT.bit.GPIOE2 //Reset Signal 低電平有效
#define COMM 0 //command
#define DATA 1 //data
// Prototype statements for functions found within this file.
void Gpio_select(void);
void InitSystem(void);
void InitLcd(void);
void Wr_lcd(Uchar data_comm,Uchar data);//寫指令或數(shù)據(jù)
void Chn_Disp(Uchar *chn); //OK
void Img_Dispfull(Uchar *img);//全屏顯示圖形 OK
void Img_Disp(int x,int y,Uint16 height,Uint16 width,Uchar *img);//區(qū)域顯示圖形 OK
void Img_clr(int x,int y,Uint16 height,Uint16 width);//清除圖形 OK
void Con_Disprow(int row);//反白顯示 OK
void con_disp(Uchar data1,Uchar data2,int x0,int y0,int x1,int y1);
void Con_disparea(int x, int y, int height,int width);
void lat_disp(Uchar data1,Uchar data2); //data1=data2=0x00--clear screen
void origin_cur(void);
void cur_disp(Uchar data1,Uchar data2,Uchar x,Uchar y); //光標(biāo)顯示
void Move_cur(int dir);
void OnOff_cur(Uchar cur_con,Uchar cur_on);
void Chk_Busy(void);//測試忙狀態(tài)
void Clr_ram(void);//Clear Scream/DDRam
Uchar Read_lcd(void);
void delay (int delay);
void delay_s(int ss);
int Max(int x,int y);
int Min(int x,int y);
Uchar addr[]={0x80,0x90,0x88,0x98};
Uchar tab1[]={
"本系列中文模塊ke"
"任意位置反白顯sh"
"置二級字庫,可在"
"使用更方便更靈活"
};
/*Uchar tab2[]={
"金鵬科技有限公司"
"Golden Palm TECH"
"奧可拉液晶顯示器"
"TEL:0758-2263858"
};*/
Uchar tab3[]={
" 科技有限 "
" "
"TEL:0758-2263858"
"0x00,0x000x000x00,0x00"
};
//bmp圖2:小的太陽
//Uchar tab4[]={
/*-- 調(diào)入了一幅圖像:C:\Documents and Settings\mirror\桌面\bmp\www.imagebt.bmp --*/
/*-- 寬度x高度=64x64 --*/
/*0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xF7,0xFF,
0xFF,0xCF,0xFF,0x7F,0xF7,0xFF,0xE3,0xFF,0xFF,0xE7,0xFF,0x7F,0xF7,0xFF,0xE7,0xFF,
0xFF,0xF7,0xFF,0x3F,0xF7,0xFF,0xCF,0xFF,0xFF,0xF3,0xFF,0xBF,0xF7,0xFF,0x8F,0xFF,
0xFF,0xF9,0xFF,0xBF,0xF7,0xFF,0x9F,0xFF,0xFF,0xFD,0xFF,0xBF,0xF7,0xFF,0x3F,0xFF,
0xFF,0xFC,0xFF,0x9F,0xF7,0xFE,0x3F,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,
0xFF,0xFF,0x7F,0xFF,0xFF,0xFC,0xFF,0xFF,0xF7,0xFF,0x3F,0xFF,0xFF,0xF9,0xFF,0xFF,
0xE3,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xF8,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0x9F,
0xFC,0x7F,0xFF,0x80,0x00,0xFF,0xFF,0x1F,0xFE,0x3F,0xFE,0x00,0x00,0x3F,0xFE,0x3F,
0xFF,0x1F,0xF8,0x00,0x00,0x0F,0xFC,0xFF,0xFF,0xBF,0xE0,0x00,0x00,0x07,0xFF,0xFF,
0xFF,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x7F,0xFF,
0xFF,0xFC,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x1F,0xFF,
0xFF,0xF8,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x0F,0xFF,
0xFF,0xF0,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x07,0xFF,
0xFF,0xF0,0x00,0x00,0x00,0x78,0x07,0xFF,0xFF,0xE0,0x00,0x00,0x00,0xFC,0x07,0xFF,
0xFF,0xE0,0x78,0x00,0x00,0xFC,0x03,0xFF,0xFF,0xE0,0xFC,0x00,0x00,0xFC,0x03,0xFF,
0xFF,0xE0,0xFE,0x00,0x00,0xFC,0x03,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0xFC,0x03,0xFF,
0xFF,0xC0,0xFE,0x00,0x00,0x10,0x03,0xFF,0xFF,0xC0,0xFC,0x00,0x00,0x00,0x03,0xFF,
0xFF,0xC0,0x38,0x00,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x03,0xFF,
0xFF,0xE0,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x01,0xFF,0x03,0xFF,
0xFF,0xE0,0x00,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xFF,0x07,0xFF,
0xFF,0xF0,0xFF,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,
0xFF,0xF8,0x7F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xF8,0x1F,0xFF,
0xFF,0xFC,0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xE0,0x3F,0xFF,
0xFF,0xFE,0x07,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0x80,0x7F,0xFF,
0xFF,0xFF,0x80,0x7F,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xC0,0x07,0xF0,0x01,0xFF,0xFF,
0xFF,0xFF,0xE0,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x0F,0xFF,0xFF,
0xFF,0xFF,0xFC,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
*/
////////////////////////////////////////////////////////////////////
//fuction:顯示漢字或字符->第二行反白顯示->全屏顯示圖形->清除圖形->
//->顯示圖形->
/*void main()
{
//Uchar i;
InitSystem();
DINT;
IER = 0x0000;
IFR = 0x0000;
// Initialize Pie Control Registers To Default State:
InitPieCtrl();
InitPieVectTable();
Gpio_select();
RESET_LCD = 0;
delay(1500);
RESET_LCD = 1;
InitLcd();
delay(3000);
Chn_Disp(tab2);
delay_s(5);
Con_Disprow(1);
delay_s(5);
Clr_ram();
Img_Dispfull(tab5);
delay_s(3);
Img_Disp(10,10,64,64,tab4);
delay_s(5);
Img_clr(0,0,20,20);
for(;;)
{}
}*/
// 子程序
/*void Gpio_select(void)
{
EALLOW;
GpioMuxRegs.GPBMUX.all = 0x0;
GpioMuxRegs.GPEMUX.all = 0x0;
GpioMuxRegs.GPBDIR.all = 0xFFFF; // GPIO Ports---- output
GpioMuxRegs.GPEDIR.all = 0xFFFF; // GPIO PORT as input//IOE2--/RST
GpioMuxRegs.GPBQUAL.all = 0x0;
GpioMuxRegs.GPEQUAL.all = 0x0;
EDIS;
} */
/*void InitSystem(void)
{
Uint16 i;
EALLOW;
// 禁止看門狗模塊
SysCtrlRegs.WDCR= 0x0068;
//初始化鎖相環(huán)
SysCtrlRegs.PLLCR.bit.DIV = 10; // 配置處理器鎖相環(huán),倍頻系數(shù)為5
//等待鎖相環(huán)穩(wěn)定
for(i=0;i<5000;i++){}
SysCtrlRegs.HISPCP.all = 0x0001; // Setup Highspeed Clock Prescaler to divide by 2 (75MHz)
SysCtrlRegs.LOSPCP.all = 0x0002; // Setup Lowspeed CLock Prescaler to divide by 4 (37.5MHz)
// Peripheral clock enables set for the selected peripherals.
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;
SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
EDIS;
}
*/
//LCD初始化子程序
void InitLcd(void)
{ RESET_LCD=1;
Wr_lcd (COMM,0x30); /* 30---基本指令動作 */
delay(1500);
Wr_lcd (COMM,0x01); /* 清除顯示,DDRAM地址指針指向00H */
delay(1500);
Wr_lcd (COMM,0x06); /* 光標(biāo)右移 */
delay(1500);
Wr_lcd (COMM,0x0c); /* 開顯示,關(guān)光標(biāo) */
}
/*---------------顯示漢字或字符----------------*/
void Chn_Disp(Uchar *chn)
{
Uchar i,j;
Wr_lcd(COMM,0x30);
Wr_lcd(COMM,0x80);
for (i=0;i<4;i++)
{
for (j=0;j<16;j++)
Wr_lcd(DATA,chn[i*16+j]);
}
}
/****************************************************/
/*----------------顯示圖形-----------------*/
//顯示的步驟:
//1. 先將垂直的字節(jié)坐標(biāo)(Y)寫入繪圖RAM 地址。
//2. 再將水平的字節(jié)坐標(biāo)(X)寫入繪圖RAM 地址。
//3. 將D15~D8 寫入到RAM 中(寫入第一個Bytes)。
//4. 將D7~D0 寫入到RAM 中(寫入第二個Bytes)。
void Img_Dispfull(Uchar *img)
{
Uchar i,j,k=0;
//上半屏
for(i=0;i<32;i++)
{
for(j=0;j<8;j++)
{
Wr_lcd(COMM,0x34); //擴(kuò)充指令 繪圖顯示
Wr_lcd(COMM,0x80+i); //設(shè)定繪圖地址80H~FFH
Wr_lcd(COMM,0x80+j);//80H~87H
Wr_lcd(COMM,0x30); //變更指令集
Wr_lcd(DATA,img[k]); //一個字節(jié)
Wr_lcd(DATA,img[k+1]); //一個字節(jié)
k=k+2;
}
}
//下半屏
for(i=32;i<64;i++)
{
for(j=0;j<8;j++)
{
Wr_lcd(COMM,0x34); //
Wr_lcd(COMM,0x80+i-32);
Wr_lcd(COMM,0x88+j);
Wr_lcd(COMM,0x30);
Wr_lcd(DATA,img[k]); //D15-D8
Wr_lcd(DATA,img[k+1]); //D7-D0
k=k+2;
}
}
Wr_lcd(COMM,0x36); //送顯示圖形指令
}
//顯示圖形:起點(diǎn)(x,y) width X height
void Img_Disp(int x,int y,Uint16 height,Uint16 width,Uchar *img)
{
Uchar i,j,m,n,k;
//if(x<0||x>31||y<0||height%16!=0||width%16!=0)return;
for(i=x;i<Min(x+height,64);i++) //row
{
for(j=y;j<Min(y+width,128);j+=16) //col
{
if (i>=32)
{ m = i-32;
n=j/16; //0x80
k=1; }
else
{m=i;
n=j/16;
k=0;}
Wr_lcd(COMM,0x34);//擴(kuò)展指令
Wr_lcd(COMM,0x80+m);
Wr_lcd(COMM,0x80+0x08*k+n);
Wr_lcd(COMM,0x30);
Wr_lcd(DATA,img[(i-x)*width/8+(j-y)/8]); //image i,j---點(diǎn)陣表示
Wr_lcd(DATA,img[(i-x)*width/8+(j-y)/8+1]);//
}
}
Wr_lcd(COMM,0x36);//顯示圖形
}
//清除圖形:起點(diǎn)(x,y) width X height
void Img_clr(int x,int y,Uint16 height,Uint16 width)
{
Uchar i,j,m,n,k;
//if(x<0||x>31||y<0||height%16!=0||width%16!=0)return;
for(i=x;i<Min(x+height,64);i++) //row
{
for(j=y;j<Min(y+width,128);j+=16) //col
{
if (i>=32)
{m = i-32;
n=j/16; //0x80
k=1; }
else
{m=i;
n=j/16;
k=0;}
Wr_lcd(COMM,0x34);//擴(kuò)展指令,關(guān)閉圖形
Wr_lcd(COMM,0x80+m);
Wr_lcd(COMM,0x80+0x08*k+n);//設(shè)地址
Wr_lcd(COMM,0x30);//基本指令
Wr_lcd(DATA,0x0);
Wr_lcd(DATA,0x0);
}
}
Wr_lcd(COMM,0x36);//顯示圖形
}
/*---------------反白顯示---------------------------*/
//ocm4x8c 的一三行為反白選擇的第一行,二四行為反白選擇的第二行
//Function1:
//某一行反白顯示 04H~07H
void Con_Disprow(int row)
{
if(row<0||row>4)return;
Wr_lcd(COMM,0x34); //擴(kuò)展指令 關(guān)閉圖形
row&=0x03;
Wr_lcd(COMM,0x04+row);//
Wr_lcd(COMM,0x30); //基本指令
}
//當(dāng)data1=0xFF,data2=0xFF時(shí),在x0,y0處反白顯示16x1*y1.
//當(dāng)data1=0xff,data2=0x00時(shí),在x0,y0處前半反白顯示8x1*y1.
//當(dāng)data1=0x00,data2=0xff時(shí),在x0,y0處后半反白顯示8x1*y1.
void con_disp(Uchar data1,Uchar data2,int x0,int y0,int x1,int y1)
{
Uchar i,j;
for(j=0;j<y1;j++)
{
for(i=0;i<x1;i++)
{
Wr_lcd(COMM,0x34);
Wr_lcd(COMM,y0+j);
Wr_lcd(COMM,x0+i);
Wr_lcd(COMM,0x30);
Wr_lcd(DATA,data1);
Wr_lcd(DATA,data2);
}
}
Wr_lcd (COMM,0x36); // 繪圖顯示
}
//某一區(qū)域反白顯示
void Con_disparea(int x, int y, int height,int width)
{
Uchar i,j,m,n,k,data1,data2;
if(y<0||y>15||x<0||x>31||0!=(height%16)||0!=(width%16)) return;
for(i=x;i<Max(x+height,64);i++)
{
for(j=y;j<Max(y+width,128);j+=16)
{
if (i>=32)
{m=i-32;
n=j/16;
k=1;}
else{m=i;
n= j/16;
k=0;}
Wr_lcd(COMM,0x34);//擴(kuò)展指令,關(guān)閉圖形
Wr_lcd(COMM,0x80+m);
Wr_lcd(COMM,0x80+0x08*k+n);//設(shè)地址
Wr_lcd(COMM,0x30);//基本指令
data1= Read_lcd();
data2= Read_lcd();
Wr_lcd(DATA,data1^0xFF); //
Wr_lcd(DATA,data2^0xFF);
}
}
Wr_lcd(COMM,0x36);//顯示圖形
}
/*--------------顯示點(diǎn)陣----------------*/
// data1=0x00,data2=0x00-----clear screen
void lat_disp(Uchar data1,Uchar data2)
{
Uchar i,j;
//上半屏
for(i=0;i<32;i++)
{
for(j=0;j<8;j++)
{
Wr_lcd(COMM,0x34); //擴(kuò)充指令 繪圖顯示
Wr_lcd(COMM,0x80+i); //設(shè)定繪圖地址80H~FFH
Wr_lcd(COMM,0x80+j);//
Wr_lcd(COMM,0x30); //變更指令集
Wr_lcd(DATA,data1);
Wr_lcd(DATA,data1);
}
}
//下半屏
for(i=32;i<64;i++)
{
for(j=0;j<8;j++)
{
Wr_lcd(COMM,0x34); //
Wr_lcd(COMM,0x80+i-32);
Wr_lcd(COMM,0x88+j);
Wr_lcd(COMM,0x30);
Wr_lcd(DATA,data2); //D15-D8
Wr_lcd(DATA,data2); //D7-D0
}
}
Wr_lcd(COMM,0x36); //送顯示圖形指令
}
/*-------------------光標(biāo)顯示---------------------------*/
//當(dāng)data1=0xff,data2=0x00時(shí),在x,y處顯示前半光標(biāo).
//當(dāng)data1=0x00,data2=0xff時(shí),在x,y處顯示后半光標(biāo).
//當(dāng)data1=0x00,data2=0x00時(shí),在x,y處不顯示光標(biāo).
//y0=0x8f or y0=0x9f.
void cur_disp(Uchar data1,Uchar data2,Uchar x,Uchar y)
{
Wr_lcd (COMM,0x34);
Wr_lcd (COMM,y);
Wr_lcd (COMM,x);
Wr_lcd (COMM,0x30);
Wr_lcd (DATA,data1);
Wr_lcd (DATA,data2);
Wr_lcd (COMM,0x36);
}
//光標(biāo)回到原點(diǎn)---地址歸位
void origin_cur(void)
{
Wr_lcd (COMM,0x30);
Wr_lcd (COMM,0x02);
Wr_lcd (COMM,0x06);
}
//、顯示狀態(tài) 開/關(guān)(08H/0CH/ODH/0EH/0FH)
void OnOff_cur(Uchar cur_con,Uchar cur_on)
{ Uchar data;
if((cur_con==0)&&(cur_on==0))data=0x0C; //
if((cur_con==1)&&(cur_on==0))data=0x0D; //
if((cur_con==0)&&(cur_on==1))data=0x0E; // show&¬-con
if((cur_con==1)&&(cur_on==1))data=0x0F; //con&&show
Wr_lcd(COMM,data);
}
void Move_cur(int dir) //dir=1/0
{ Uchar data;
if(dir==1)data=0x14;
if(dir==0)data=0x10;
Wr_lcd(COMM,data);
}
//write command or data
void Wr_lcd(Uchar data_comm,Uchar data)
{ Uchar m;
Chk_Busy();
RS=data_comm;
delay(1500);
RW=0;
delay(1500);
GpioMuxRegs.GPBDIR.all=0x00;
m=GpioDataRegs.GPBDAT.all;
m&=0xFF00;
data&=0x00FF;
GpioMuxRegs.GPBDIR.all=0xFFFF;
GpioDataRegs.GPBDAT.all=m|data;
delay(1500);
EN=1 ;
delay(1500);
EN=0 ;
}
//---------------------------------------
Uchar Read_lcd(void)
{
Uchar data;
Chk_Busy();
RS=1;
delay(1500);
RW=1;
delay(1500);
data=GpioDataRegs.GPBDAT.all;
return data;
}
/*清DDRAM--清屏子程序*/
void Clr_ram(void)
{
Wr_lcd(COMM,0x30);
Wr_lcd(COMM,0x01);
delay(1500);
}
void Chk_Busy(void)
{
RS=0; //
delay(1500);
RW=1; //Read
delay(1500);
EN=1;
EALLOW;
GpioMuxRegs.GPBDIR.bit.GPIOB7 = 0;
EDIS;
if(BF==1){}
EALLOW;
GpioMuxRegs.GPBDIR.bit.GPIOB7 =1;
EDIS;
EN=0;
}
//延時(shí),取大取小子程序
void delay (int delay) //delay time
{
while(delay--);
}
//延時(shí)秒程序
void delay_s(int ss)
{ int i;
while(ss--)
{i=40;
do
{delay(30000);}
while(i--);
}
}
int Max(int x,int y)
{
int max;
if(x>=y)max=x;
else max=y;
return max;
}
int Min(int x,int y)
{
int min;
if(x<=y)min=x;
else min=y;
return min;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -