您的位置:首页 > 其它

12864带字库显示屏按键选择菜单显示

2017-03-10 09:43 274 查看
/*****************************************************/

//描述:LCD12864的驱动

//作者:小四叶草

//时间:2015/07/16

//描述:显示与按键

//s2 ---------GPIO52 ;s3-----------GPIO54 ; s4 -------GPIO72 ; s5 ----GPIO71;

//两种写法:1.消抖;2.状态机

//按键消抖的是时间是20ms

/*****************************************************/

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File

#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#define LCD_DATA (*((volatile Uint16 *)0x45EF))

#define E GpioDataRegs.GPBDAT.bit.GPIO61

#define RW GpioDataRegs.GPADAT.bit.GPIO27

#define RS GpioDataRegs.GPBDAT.bit.GPIO60

#define LOW 0

#define HIGH 1

#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H

#define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置

#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)

#define FUN_MODE 0x30 //工作模式:8位基本指令集

#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白

#define DISPLAY_OFF 0x08 //显示关

#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1

#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH

#define SET_DD_AC 0x80

#define s2 GpioDataRegs.GPBDAT.bit.GPIO54

#define s3 GpioDataRegs.GPBDAT.bit.GPIO55

#define s4 GpioDataRegs.GPBDAT.bit.GPIO56

#define s5 GpioDataRegs.GPBDAT.bit.GPIO57

#define DELAY_MS(A) DELAY_US((long double)A * 1000.0L)

#define DELAY_100US(B) DELAY_US((long double)B * 100.0L)

void InitXintf(void);

void ConfigGpio(void);

void InitLcd(void);

void Read_Busy(void);

void WriteCmd12864(Uint16 cmd);

void WriteData12864(Uint16 dat);

void DisplayDdram(uchar *hz);

void DispBMP(uchar *adress);

void CLR_GDRAM(void);

void Disp(void);

void fanbai(uchar y,uchar x1,uchar x2);

void  key(void);

void xuanze();

void xunhuan(uchar hang);

void jiantou(uchar hang);

uchar tab1[]="设置参数值";

uchar tab2[]="查询参数值";

uchar tab3[]="查询历史故障";

uchar tab4[]="清除历史故障";

uchar tab5[]="第二级菜单显示";

uchar key2 = 0;

uchar key3 = 0;

uchar key4 = 0;

uchar key5 = 0;

uchar keyindex = 0; //初始化的时候是第一行,选择行的索引

uchar keycur = 0; //0,1,2,3 显示屏的当前行

void main(void)

{

InitSysCtrl();

InitXintf();

InitXintf16Gpio();

DINT;

InitPieCtrl();

IER = 0x0000;

IFR = 0x0000;

ConfigGpio();

InitLcd();

WriteCmd12864(CLEAR_SCREEN);

DELAY_US(50);

Disp();

WriteCmd12864(0x34); //开启扩展指令

fanbai(0,2,11);

WriteCmd12864(0x36);

WriteCmd12864(0x30); //返回到基本指令

while(1)

{

xuanze();

}

}

void ConfigGpio(void)

{

EALLOW;

//===12864====================================

GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0;

GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1;

GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0;

GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1;

GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0;

GpioCtrlRegs.GPADIR.bit.GPIO27 = 1;

//===12864====================================

//===key====================================

GpioCt
4000
rlRegs.GPBMUX2.bit.GPIO54 = 0; //s2 GPIO

GpioCtrlRegs.GPBDIR.bit.GPIO54= 0;  //input

GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0; //s2 GPIO

GpioCtrlRegs.GPBDIR.bit.GPIO55= 0;  //input

GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0; //s2 GPIO

GpioCtrlRegs.GPBDIR.bit.GPIO56= 0;  //input

GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0; //s2 GPIO

GpioCtrlRegs.GPBDIR.bit.GPIO57= 0;  //input

//disable pull-up

GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;

GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;

GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;

GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;

//===key====================================

EDIS;

}

void InitLcd(void)

{

DELAY_100US(5);

WriteCmd12864(FUN_MODE);

DELAY_US(5);

WriteCmd12864(FUN_MODE);

DELAY_US(5);

WriteCmd12864(0x0C);

DELAY_US(5);

WriteCmd12864(CLEAR_SCREEN);

DELAY_US(30);

WriteCmd12864(AC_INIT);

DELAY_US(4);

}

void Read_Busy() //读忙标志最高位为1,则busy,不能进行读写操作

{

RS = LOW;

RW = HIGH;

E = HIGH;

while(LCD_DATA & 0X80);

E = LOW;

}

void WriteCmd12864(Uint16 cmd)

{

Read_Busy();

RS = LOW;

RW = LOW;//写数据

E = HIGH;

LCD_DATA  = cmd;

E = LOW;

}

void WriteData12864(Uint16 dat)

{

Read_Busy();

RS = HIGH;

RW = LOW;//写数据

E = HIGH;

LCD_DATA  = dat;

E = LOW;

}

void DisplayDdram(uchar *hz)

{

while(*hz != '\0')

{

WriteData12864(*hz);//地址里面的值

hz++;

}

}

//初步显示的画面,选择第一行反白显示

void Disp()

{

WriteCmd12864(0x81);

DisplayDdram(tab1);

WriteCmd12864(0x91);

DisplayDdram(tab2);

WriteCmd12864(0x89);

DisplayDdram(tab3);

WriteCmd12864(0x99);

DisplayDdram(tab4);

}

//选择某一行反白显示,和某一行的几个数据显示(连续)

//y = {0,1,2,3}

//x = {0,...15} //修改数据 一行有16个数据

void fanbai(uchar y,uchar x1,uchar x2)

{

uchar x_adress;

uchar i;

uchar j;

switch(y)

{

case 0: x_adress = 0x80;break;

case 1: x_adress = 0x90;break;

case 2: x_adress = 0x88;break;

case 3: x_adress = 0x98;break;

default: x_adress = 0x80;break;

}

if(0x80 == x_adress) //显示屏的第一行

{

for(i = 0; i < 32; i++)

{

WriteCmd12864(0x80 + i); //y

WriteCmd12864(0x80);     //x

if(i < 16)

{

for(j =0;j < 16;j++)

{

if((j >= x1) & (j <= x2))

{

WriteData12864(0xff);

}

else

{

WriteData12864(0x00);

}

}

}

else //显示屏的第二行

{

for(j =0;j < 16;j++)

{

WriteData12864(0x00);

}

}

}

for(i = 0;i < 32; i++)//显示屏的第三四行

{

WriteCmd12864(0x80 + i);

WriteCmd12864(0x88);

for(j = 0;j <16; j++)

{

WriteData12864(0x00);

}

}

}

if(0x90 == x_adress) //第二行

{

for(i = 0; i < 32; i++)

{

WriteCmd12864(0x80 + i); //y

WriteCmd12864(0x80);     //x

if(i < 16)//显示屏第一行

{

for(j =0;j < 16;j++)

{

WriteData12864(0x00);

}

}

else

{

for(j =0;j < 16;j++)

{

if((j >= x1) & (j <= x2))

{

WriteData12864(0xff);

}

else

{

WriteData12864(0x00);

}

}

}

}

for(i = 0;i < 32; i++) //第三四行

{

WriteCmd12864(0x80 + i);

WriteCmd12864(0x88);

for(j = 0;j <16; j++)

{

WriteData12864(0x00);

}

}

}

if(0x88 == x_adress) //显示屏的第三行

{

for(i = 0;i < 32; i++) //显示屏的第一二行

{

WriteCmd12864(0x80 + i);

WriteCmd12864(0x80);

for(j = 0;j <16; j++)

{

WriteData12864(0x00);

}

}

for(i = 0; i < 32; i++)

{

WriteCmd12864(0x80 + i); //y

WriteCmd12864(0x88);     //x

if(i < 16)

{

for(j =0;j < 16;j++) //显示屏第三行

{

if((j >= x1) & (j <= x2))

{

WriteData12864(0xff);

}

else

{

WriteData12864(0x00);

}

}

}

else //显示屏第四行

{

for(j =0;j < 16;j++)

{

WriteData12864(0x00);

}

}

}

}

if(0x98 == x_adress) //显示屏的第三行

{

for(i = 0;i < 32; i++) //显示屏的第一二行

{

WriteCmd12864(0x80 + i);

WriteCmd12864(0x80);

for(j = 0;j <16; j++)

{

WriteData12864(0x00);

}

}

for(i = 0; i < 32; i++)

{

WriteCmd12864(0x80 + i); //y

WriteCmd12864(0x88);     //x

if(i < 16)

{

for(j =0;j < 16;j++) //显示屏第三行

{

WriteData12864(0x00);

}

}

else //显示屏第四行

{

for(j =0;j < 16;j++)

{

if((j >= x1) & (j <= x2))

{

WriteData12864(0xff);

}

else

{

WriteData12864(0x00);

}

}

}

}

}

}

//按上移下移键,发白显示那一行

//s4 --上移,s5 --下移

void key()

{

//1.设置对应IO为输入,在ConfigGpio()里面,已经设置。

if(0 == s4) //检测到被按下

{

DELAY_US(1000); //延时10MS,前消抖

if(0 == s4)

{

while(!s4); //确认被按下,等下释放

key5 ++;

}

}

if(0 == s5) //检测到被按下

{

DELAY_US(1000); //延时10MS,前消抖

if(0 == s5)

{

while(!s5); //确认被按下,等下释放

key5 ++;

}

}

}

void xuanze()

{

static int16 key_yidong = 0;

static k = 0;

if(0 == s4) //上移,检测到被按下

{

DELAY_US(1000); //延时10MS,前消抖

if(0 == s4)

{

while(!s4); //确认被按下,等下释放

key_yidong --;

if(-1 == key_yidong)

{

key_yidong = 3;

k++;

}

xunhuan(key_yidong);

}

}

if(0 == s5) //检测到被按下

{

DELAY_US(1000); //延时10MS,前消抖

if(0 == s5)

{

while(!s5); //确认被按下,等下释放

key_yidong ++;

if(4 == key_yidong)

{

key_yidong = 0;

}

xunhuan(key_yidong);

}

}

}

void xunhuan(uchar hang)

{

switch(hang)

{

case 0:

WriteCmd12864(0x34); //开启扩展指令

fanbai(0,2,11);

WriteCmd12864(0x36);

WriteCmd12864(0x30); //返回到基本指令

jiantou(0);

break;

case 1:

WriteCmd12864(0x34); //开启扩展指令

fanbai(1,2,11);

WriteCmd12864(0x36);

WriteCmd12864(0x30); //返回到基本指令

WriteCmd12864(0x90);

WriteData12864(0x10);

jiantou(1);

break;

case 2:

WriteCmd12864(0x34); //开启扩展指令

fanbai(2,2,13);

WriteCmd12864(0x36);

WriteCmd12864(0x30); //返回到基本指令

jiantou(2);

break;

case 3:

WriteCmd12864(0x34); //开启扩展指令

fanbai(3,2,13);

WriteCmd12864(0x36);

WriteCmd12864(0x30); //返回到基本指令

jiantou(3);

break;

default:

WriteCmd12864(0x34); //开启扩展指令

fanbai(0,2,13);

WriteCmd12864(0x36);

WriteCmd12864(0x30); //返回到基本指令

jiantou(0);

break;

}

}

void jiantou(uchar hang)

{

switch(hang)

{

case 0:

WriteCmd12864(0x80);

WriteData12864(0x10);

WriteCmd12864(0x90);

WriteData12864(0x20);

WriteCmd12864(0x88);

WriteData12864(0x20);

WriteCmd12864(0x98);

WriteData12864(0x20);

break;

case 1:

WriteCmd12864(0x80);

WriteData12864(0x20);

WriteCmd12864(0x90);

WriteData12864(0x10);

WriteCmd12864(0x88);

WriteData12864(0x20);

WriteCmd12864(0x98);

WriteData12864(0x20);

break;

case 2:

WriteCmd12864(0x80);

WriteData12864(0x20);

WriteCmd12864(0x90);

WriteData12864(0x20);

WriteCmd12864(0x88);

WriteData12864(0x10);

WriteCmd12864(0x98);

WriteData12864(0x20);

break;

case 3:

WriteCmd12864(0x80);

WriteData12864(0x20);

WriteCmd12864(0x90);

WriteData12864(0x20);

WriteCmd12864(0x88);

WriteData12864(0x20);

WriteCmd12864(0x98);

WriteData12864(0x10);

break;

default:

WriteCmd12864(0x80);

WriteData12864(0x10);

WriteCmd12864(0x90);

WriteData12864(0x20);

WriteCmd12864(0x88);

WriteData12864(0x20);

WriteCmd12864(0x98);

WriteData12864(0x20);

break;

}

}

有问题,请咨询,个人公众号。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: