键盘控制LCD图像显示

浅笑花开花落云卷云舒 2017-06-12 10:33:52
有些代码看不懂,求各位大神帮忙分析一下哪块具体实现了什么功能,运用了什么方式,急需要帮忙,谢谢!!!!
如果在此基础上改,怎么改,求提供思路

#include <string.h>
#include <stdio.h>
#include "2410addr.h"
#include "INT.h"
#include "consol.h"
#include "2410lib.h"
#include "def.h"
#include "lcdlib.h"
#include"math.h"
void __irq KB_LISR(void); //中断
void keyinit(void); //键盘初始化
int KeyScan(void); //键盘扫描
void KB_Enable(int flag);
void delay(int time);
void WIN_keyboard(void);
char ch[1];
void drawturnkey(int key);
void waitputupkey(int key);

void Rectancle(int x0,int y0,int x1,int y1,COLOR mcolor);
void circle(double x0,double y0,double r,COLOR mcolor);
void circle2(double x0,double y0,double r,COLOR mcolor);
void circle1(double x0,double y0,double r,COLOR mcolor);
void triangle(int x0,int y0,int x1,int y1,int x2,int y2,COLOR mcolor);




int main()
{
ChangeClockDivider(1,1); // 1:2:4
ChangeMPllValue(0xa1,0x3,0x1); // FCLK=202.8MHz
Port_Init();
__vInitHaltHandlers();

keyinit();
KB_Enable(TRUE); //中断使能函数
ISRVector[5] = KB_LISR;

LCD_Init();
WIN_keyboard();
drawtext(20,21,"计算机科学与技术",1,1,RGB(255,255,255));
drawascii168(155,19,"1501",1,1,RGB(255,255,255));
drawtext(190,21,"班",1,1,RGB(255,255,255));

while(1);

}




void __irq KB_LISR(void)
{
int value,temp;
unsigned int save_intmsk;

save_intmsk = rINTMSK;
rINTMSK = BIT_ALLMSK;

value = KeyScan(); //扫描键盘
if (-1 != value)
{

drawturnkey(value);

// waitputupkey(value);

drawturnkey(value);
}

rGPGCON = rGPGCON&~(0x300000)|(0x200000); //设置GPG10=EINT18
rGPECON=rGPECON&~(0X3FC00)|(0x15400); //GPE[5:8]=OUTPUT
rGPEUP=0x3fe0; //关闭上拉电阻
rGPEDAT=rGPEDAT&0xfe1f; //GPE[5:8]初始为低电平
rEINTPEND=0x40000; //中断源请求关闭
rSRCPND=0x20; //中断源请求关闭
rINTPND=0X20;

temp = rSUBSRCPND;
rSUBSRCPND=temp;
temp = rSRCPND;
rSRCPND = temp;
temp = rINTPND;
rINTPND = temp;

rINTMSK = save_intmsk;
}



void keyinit(void)
{
rGPECON=0xfffd57ff; //GPE[5:8]=OUTPUT
rGPEUP=0x1e0; //关闭上拉电阻
rGPEDAT=rGPEDAT&0xfe1f; //GPE[5:8]初始为低电平

rGPGCON=rGPGCON&~(0x300000)|(0x200000); //设置GPG10=EINT18
rGPGUP=rGPGUP|0x400; //关闭GPG10上拉电阻
}


int KeyScan(void)
{
int temp=0;

rGPEUP=0x1e0;
rGPGCON=rGPGCON&~(0x300000)|(0x0); //设置GPG10为输入

delay(50); //去抖动

//第一行检测
rGPECON=0xfffc07ff; //设置GPE5=OUTPUT,GPE[6:8]=INPUT
rGPEDAT=rGPEDAT&0xffdf; //设置GPE5低电平输出,GPE[6:8]输入


if (0 == (rGPGDAT&0x400))
{
switch ( (rGPEDAT&0x1c0) >> 5 )
{
case 0xe:
temp = 11;
break;
case 0xc:
temp = 12;
break;
/* case 0xa:
temp = 13;
break;
case 6:
temp = 14;
break;
*/
default :
temp = -1;
}

}
else
{
//第二行检测
rGPECON=0xfffc13ff; //设置GPE6=OUTPUT,GPE[5\7\8]=INPUT
rGPEDAT=rGPEDAT&0xffbf; //使GPE6输出低电平

if (0 == (rGPGDAT&0x400))
{
switch ( (rGPEDAT&0x1a0)>>5 )
{
case 0xc:
temp = 21;
break;
case 0xd:
temp = 22;
break;
/* case 9:
temp = 23;
break;
case 5:
temp = 24;
break;
*/
default :
temp = -1;
}
}
else
{
//第三行检测
rGPECON=0xfffc43ff; //设置GPE7=OUTPUT,GPE[5\6\8]=INPUT
rGPEDAT=rGPEDAT&0xff7f; //使GPE7输出低电平

if (0 == (rGPGDAT&0x400))
{
switch ( (rGPEDAT&0x160)>>5 )
{
case 0xa:
temp = 31;
break;
case 9:
temp = 32;
break;
/* case 0xb:
temp = 33;
break;
case 3:
temp = 34;
break;
*/
default :
temp = -1;
}
}
else
{
//第四行检测
rGPECON=0xfffd03ff; //设置GPE8=OUTPUT,GPE[5:7]=INPUT
rGPEDAT=rGPEDAT&0xfeff; //使GPE8输出低电平

if (0 == (rGPGDAT&0x400))
{
switch ( (rGPEDAT&0xe0)>>5 )
{
case 6:
temp = 41;
break;
case 5:
temp = 42;
break;
/* case 3:
temp = 43;
break;
case 7:
temp = 44;
break;
*/
default :
temp = -1;
}
}
else
temp = -1;
}
}
}

return temp;
}

void waitputupkey(int key)
{
while((rGPGDAT&(0x400))!=0x400);
delay(600);
}

void KB_Enable(int flag)
{
int temp;
if(flag == TRUE)
{

temp = rGPGCON;
rGPGCON = temp&~(0x300000)|(0x200000); //设置GPG10=EINT18
temp = rGPGUP;
rGPGUP = temp|0x400; //关闭GPG10上拉电阻

rSRCPND =0x20; //中断源请求
rINTMSK &= ~(BIT_EINT8_23); //中断源使能
temp = rEXTINT2;
rEXTINT2 &= 0xfffff8ff; //使EINT18为低电平触发
rEINTPEND = 0X40000; //外部中断源请求
rEINTMASK = 0xfbfff8; //使能外部中断EINT18
}
else
{
rINTMSK &= BIT_EINT8_23;
}
}


void delay(int time)
{
int i;
for(; time >= 0; time--)
for(i = 0; i < 255; i++);
}


void WIN_keyboard(void)
{
WIN_WaterTek("键盘控制LCD图像动态显示设计");


}


void drawturnkey(int key)
{

int mi;
mi= KeyScan();
if(mi==11)
{
circle(210,140,20,RGB(0,0,0xff));
circle(130,140,20,RGB(0,0,0xff));
circle(170,100,40,RGB(0xff,0,0));
}

else if(mi==12)
{
circle2(170,100,40,RGB(130,130,240));
circle2(210,140,20,RGB(130,130,240));
circle2(130,140,20,RGB(130,130,240));

}

else if(mi==21)
{
triangle(20,100,40,120,60,100,RGB(0,0xff,0));
triangle(10,80,40,100,70,80,RGB(0,0xff,0));
triangle(0,60,40,80,80,60,RGB(0,0xff,0));
Rectancle(32,30,48,60,RGB(0x80,0x60,0));
}
else if(mi==22)
{
triangle(20,100,40,120,60,100,RGB(130,130,240));
triangle(10,80,40,100,70,80,RGB(130,130,240));
triangle(0,60,40,80,80,60,RGB(130,130,240));
Rectancle(32,30,48,60,RGB(130,130,240));
}
else if(mi==31)
{
drawtext(150,50,"设计:小王",1,0,RGB(255,255,0));
}
else if(mi==41)
{
int i;
for(i=0;i<5;i++)
{

circle1(20,185,15,RGB(0x2f,0xaf,0x35));//1
circle1(120,180,10,RGB(130,130,240));//5

circle1(200,175,10,RGB(0x4f,0xf2,0));//6


circle1(40,145,10,RGB(0xf1,0,0xef));//2
circle1(20,185,15,RGB(130,130,240));//1

circle1(270,155,10,RGB(0xfa,0x32,0xfe));//7
circle1(200,175,10,RGB(130,130,240));//6

circle1(80,185,10,RGB(0xfd,0xff,0));//3
circle1(40,145,10,RGB(130,130,240));//2

circle1(310,185,10,RGB(0xfd,0xff,0));//8
circle1(270,155,10,RGB(130,130,240));//7

circle1(95,105,10,RGB(0xf5,0x5d,0xff));//4
circle1(80,185,10,RGB(130,130,240));//3
circle1(310,185,10,RGB(130,130,240));//8

circle1(290,125,10,RGB(0xf5,0x5d,0xff));//9
circle1(95,105,10,RGB(130,130,240));//4

circle1(120,180,10,RGB(0xfd,0x2f,0x33));//5
circle1(290,125,10,RGB(130,130,240));//9
circle1(120,180,10,RGB(130,130,240));//5





}
}
}


void Rectancle(int x0,int y0,int x1,int y1,COLOR mcolor){
int i,m;
line(x0,y0,x0,y1,mcolor);
line(x0,y0,x1,y0,mcolor);
line(x1,y0,x1,y1,mcolor);
line(x0,y1,x1,y1,mcolor);
for(i=y1-y0;i>0;i--)
{
line(x0,y1,x1,y1,mcolor);
y1=y1-1;
for(m=300;m>0;m--);
}

}


void circle(double x0,double y0,double r,COLOR mcolor){
double x1,y1,x2,y2,angle,r1;
x1 = x0 ;
y1 = y0;
for(r1 = 0;r1<r;r1++){
for(angle = 0;angle < 360;angle = angle+1){
x2 = x0 + r1*cos(angle);
y2 = y0 + r1*sin(angle);
line(x1,y1,x2,y2,mcolor);
x1 = x2;
y1 = y2;

}
}

}
void circle1(double x0,double y0,double r,COLOR mcolor){
double x1,y1,x2,y2,angle,r1;
x1 = x0 ;
y1 = y0;
for(r1 = 0;r1<r;r1++){
for(angle = 0;angle < 360;angle = angle+10){
x2 = x0 + r1*cos(angle);
y2 = y0 + r1*sin(angle);
line(x1,y1,x2,y2,mcolor);
x1 = x2;
y1 = y2;

}
}

}
void circle2(double x0,double y0,double r,COLOR mcolor){
double x1,y1,x2,y2,angle,r1;
x1 = x0 ;
y1 = y0;
for(r1 = r;r1>0;r1--)
{
for(angle = 360;angle >0;angle = angle-1){
x2 = x0 - r1*cos(angle);
y2 = y0- r1*sin(angle);
line(x1,y1,x2,y2,mcolor);
x1 = x2;
y1 = y2;

}
}

}
void triangle(int x0,int y0,int x1,int y1,int x2,int y2, COLOR mcolor){
int a,m;
line(x0,y0,x1,y1,mcolor);
line(x0,y0,x2,y2,mcolor);
line(x1,y1,x2,y2,mcolor);

for(a=1;a<20;a++)
{
line(x0,y0,x2,y2,mcolor);
x0=x0+1;
y0=y2=y2+1;
x2--;
for(m=300;m>0;m--);


}
}
...全文
476 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lachaobaicai 2017-07-04
  • 打赏
  • 举报
回复
需要对照头文件看,有些语句是根据头文件里的定义写的

6,127

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧