求教怎样用C语言做人机交互界面,谢谢前辈指点!

qiaobenshan 2006-05-10 02:41:24
各位前辈:
你们好,公司目前安排我做PIC单片机的软件界面,就是菜单界面,小弟我现在还无从下手,单片机采用Microchip公司的单片机,C编译器是Hitech-PICC ,集成开发平台是MPLAB-IDE,请问前辈们指点小弟我应该怎么去做,应该看哪方面的资料,谢谢前辈们啦,我QQ214327661,E-mail:leixinlin@126.com谢谢前辈们指点啊,在此再次先谢谢了。
...全文
1291 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2006-05-11
  • 打赏
  • 举报
回复
C 语言简单菜单程序:(TC)

#include "stdio.h"
#include "dos.h"
#include "stdlib.h"
#include "graphics.h"
#define WAITING 0xff00
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define MOUSEMOVE 0xff08
int Keystate;/*这里的开始都与鼠标有关*/
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;
void *save;/*储存一块地方用的*/
struct time now;/*这里开始的变量都是时间有关*/
int old,new;
char ss[10];
struct caidan/*用来检验是否菜单已经打开*/
{
int on;/*菜单打开1,否则0*/
char ml[5][20];/*子目录*/
}c[4];
/*鼠标光标形状定义*/
typedef struct
{
unsigned int shape[32];
char hotx;
char hoty;
}SHAPE;
/*箭头型*/
SHAPE ARROW={
{
0x3fff,0x1fff,0x0fff,0x07ff,
0x03ff,0x01ff,0x00ff,0x007f,
0x003f,0x00ff,0x01ff,0x10ff,
0x30ff,0xf87f,0xf87f,0xfc3f,
0x0000,0x7c00,0x6000,0x7000,
0x7800,0x7c00,0x7e00,0x7f00,
0x7f80,0x7e00,0x7c00,0x4600,
0x0600,0x0300,0x0300,0x0180
},
0,0,
};
void TimeDelay(unsigned long microsec); /*延时函数 传入微秒数*/
void MouseOn();/*鼠标光标显示*/
void MouseOff();/*鼠标光标掩示*/
void MouseReset();/*鼠标状态值初始化*/
void MouseSetXY(int x,int y);/*设置鼠标当前位置*/
int LeftPress();/*获取鼠标按下键的信息*/
void MouseGetXY();/*获取鼠标当前位置*/
void prtime();/*输出时间的函数*/
void cdbegain();/*菜单各参数初始状态*/
void Init();/*开始画面*/
void delcd();/*先把已有的菜单删除了*/
void drawcdml(int n);/*输出菜单中的具体内容*/
void drawcd(int l,int u,int r,int d,int n);/*画菜单*/
void mouseleft();/*左键按下画菜单具体内容*/
void Move();/*测试过程*/
void main(void)
{
Init();
Move();
MouseOff();
closegraph();
}
void TimeDelay(unsigned long microsec) /*延时函数 传入微秒数*/
{
union REGS r;
r.h.ah=0x86;
r.x.cx=microsec>>16;
r.x.dx=microsec;
int86(0x15,&r,&r);
}
void MouseOn()/*鼠标光标显示*/
{
_AX=0x01;
geninterrupt(0x33);
}
void MouseOff()/*鼠标光标掩示*/
{
_AX=0x02;
geninterrupt(0x33);
}
void MouseReset()/*鼠标状态值初始化*/
{
_AX=0x00;
geninterrupt(0x33);
}
void MouseSetXY(int x,int y)/*设置鼠标当前位置*/
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}
int LeftPress()/*获取鼠标按下键的信息*/
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
}
void MouseGetXY()/*获取鼠标当前位置*/
{
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;
}
void prtime()/*输出时间的函数*/
{
gettime(&now);
new=now.ti_sec;
if(abs(new-old)>=1)
{
setfillstyle(SOLID_FILL,7);/*把原来的老时间给去除*/
bar(500,8,620,18);
old=new;
sprintf(ss,"%02d:%02d:%02d",now.ti_hour,now.ti_min,now.ti_sec);
setcolor(0);
outtextxy(500,8,ss);
}
}
void cdbegain()/*菜单各参数初始状态*/
{int i;
for(i=0;i<4;i++)/*所有菜单都已经关闭*/
c[i].on=0;
strcpy(c[0].ml[0],"Open");/*各菜单的各选项*/
strcpy(c[0].ml[1],"New");
strcpy(c[0].ml[2],"Save");
strcpy(c[0].ml[3],"Save as");
strcpy(c[0].ml[4],"Exit");
strcpy(c[1].ml[0],"Undo");
strcpy(c[1].ml[1],"Cut");
strcpy(c[1].ml[2],"Copy");
strcpy(c[1].ml[3],"Paste");
strcpy(c[1].ml[4],"Properties");
strcpy(c[2].ml[0],"Styles");
strcpy(c[2].ml[1],"L Icons");
strcpy(c[2].ml[2],"S Icons");
strcpy(c[2].ml[3],"\0");
strcpy(c[2].ml[4],"\0");
strcpy(c[3].ml[0],"Textcolor");
strcpy(c[3].ml[1],"Backcolor");
strcpy(c[3].ml[2],"Clearscr");
strcpy(c[3].ml[3],"\0");
strcpy(c[3].ml[4],"\0");
}
void Init()/*开始画面*/
{
int gd=DETECT,gm;
unsigned size;
initgraph(&gd,&gm,"c:\\tc");
gettime(&now);/*获取时间*/
old=now.ti_sec;
prtime();/*输出时间*/
setcolor(15);
size=imagesize(40,21,140,130);
save=malloc(size);/*开辟存储空间*/
setbkcolor(BLUE);/*以下是开始界面初始化*/
rectangle(2,25,638,470);
outtextxy(10,40,"Because of c,I make a lot of friends.");/*测试菜单不覆盖原来的东西*/
outtextxy(10,60,"Because of c,I'm afraid I can do ......");
outtextxy(10,80,"Thank you for all the friends in the c classroom.");
outtextxy(400,110,"milo_zy");
outtextxy(390,130,"2003.9.20");
setfillstyle(SOLID_FILL,7);
bar(0,0,640,20);
setcolor(RED);
outtextxy(50,8,"File");
outtextxy(150,8,"Edit");
outtextxy(250,8,"Tool");
outtextxy(350,8,"Color");
cdbegain();/*菜单各参数初始状态*/
MouseOn();
}
void delcd()/*先把已有的菜单删除了*/
{
int i;
for(i=0;i<4;i++)
if(c[i].on==1)
{
if(i==0)/*开始恢复原来的样子*/
putimage(40,21,save,COPY_PUT);
else if(i==1)
putimage(140,21,save,COPY_PUT);
else if(i==2)
putimage(240,21,save,COPY_PUT);
else
putimage(340,21,save,COPY_PUT);
c[i].on=0;
break;
}
}
void drawcdml(int n)/*输出菜单中的具体内容*/
{
int i,j=30,k;
switch(n)
{
case 0:k=50;break;
case 1:k=150;break;
case 2:k=250;break;
case 3:k=350;break;
}
setcolor(6);
for(i=0;i<5;i++)
{
outtextxy(k,j,c[n].ml[i]);/*第一个菜单*/
j+=20;
}
}
void drawcd(int l,int u,int r,int d,int n)/*画菜单*/
{ /*前面4个参数是上下左右位置,最后一个参数是第几个菜单目录*/
getimage(l-10,u,r+60,d,save);
setfillstyle(SOLID_FILL,7);
bar(l-10,u,r+60,d);
setcolor(4);
rectangle(l-8,u+1,r+58,d-2);
if(n==1)/*这里开始用n判断输入哪个菜单的选项*/
drawcdml(0);
else if(n==2)
drawcdml(1);
else if(n==3)
drawcdml(2);
else drawcdml(3);
}
void mouseleft()/*左键按下画菜单具体内容*/
{
delcd();/*先把已有的菜单删除了*/
if(MouseX>=50&&MouseX<=80)/*第1个菜单*/
{
c[0].on=1;
drawcd(50,21,80,130,1);
}
else if(MouseX>=150&&MouseX<=180)/*第2个菜单*/
{
c[1].on=1;
drawcd(150,21,180,130,2);
}
else if(MouseX>=250&&MouseX<=280)/*第3个菜单*/
{
c[2].on=1;
drawcd(250,21,280,130,3);
}
else if(MouseX>=350&&MouseX<=390)/*第4个菜单*/
{
c[3].on=1;
drawcd(350,21,380,130,4);
}
}
void Move()/*测试过程*/
{int x,y;/*为了让鼠标先离原位就先将他们离开前的坐标记下*/
while(!kbhit())
{
prtime();/*输出时间*/
if(LeftPress())/*按左键盘了*/
{
MouseGetXY();
if(MouseY>=5&&MouseY<=15)/*在菜单栏上*/
{
MouseOff();
x=MouseX;y=MouseY;
MouseSetXY(200,200);
mouseleft();
MouseSetXY(x,y);
MouseOn();
}
else
{
MouseOff();
delcd();/*删除原有的菜单*/
MouseOn();
}
prtime();
TimeDelay(500000);/*按了鼠标一次以后就停些时间才可以按*/
}
}
free(save);
}
lujun-cc 2006-05-11
  • 打赏
  • 举报
回复
楼主整的高深赫
Schnecke 2006-05-11
  • 打赏
  • 举报
回复
FSM(Finite State Machine)
or
HSM(Heriachel State Machine)
liuguangzhou 2006-05-11
  • 打赏
  • 举报
回复
to jinjiajie(leorio)
我又没说要让他跑Windows?!
在单片机上,我还用汇编做过菜单呢,能用C算方便的了。
jinjiajie 2006-05-10
  • 打赏
  • 举报
回复
..没见人家用的是单片机吗,windows能跑?嗬嗬
liuguangzhou 2006-05-10
  • 打赏
  • 举报
回复
见识过一些C语言的程序,主要就是用图形库画菜单什么的。
动手之前要先画好菜单的位置,大小。

做完这个之后,你就知道windows的伟大之处了。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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