找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4072|回复: 1
打印 上一主题 下一主题
收起左侧

为小游戏机开发板写的系统

[复制链接]
跳转到指定楼层
楼主
ID:51090 发表于 2014-9-17 23:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xiaojuan 于 2014-9-18 00:02 编辑

#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler power_off:2
#define EN_ PORTB&=~BIT(2)
#define EN PORTB|=BIT(2)
#define LE PORTB|=BIT(3) //高电平选通573
#define LE_ PORTB&=~BIT(3) //低电平锁存573
#define LEDEN PORTB|=BIT(4) //高电平选通led4
#define LEDEN_ PORTB&=~BIT(4)//低电平禁止led4
#define RONCS PORTB|=BIT(5) //高电平选通rom
#define ROMCS_ PORTB&=~BIT(5) //低电平禁止rom
#define KEYEN DDRD|=BIT(7) //高电平选通导航键盘
#define KEYEN_ DDRD&=~BIT(7) //低电平禁止导航键盘
#define DATC PORTC
extern dat[]={1,9,3,7};
uchar tab1[4][4][16]={
{{"选项一:涂鸦板 "},{"选项二:摇奖机 "},{"选项四:贪吃蛇 "},{"选项三:退出游戏"}},
{{"涂鸦板使用规则—"},{"移动使用导航键 "},{"提放笔:按'ok'键"},{"返回请按:'B' 键"}},
{{"摇奖机使用规则—"},{" 'ok'键开始 "},{" 'ok'键停止 "},{"得分为最终停止值"}},
{{"贪吃蛇使用规则—"},{"移动使用导航键 "},{"结束游戏按:'B'键"},{"吃闪动的点会变长"}},
};

extern png[5][8]={
{0x00,0x40,0x42,0x7E,0x7E,0x42,0x40,0x00},
{0x0C,0x12,0x22,0x44,0x44,0x22,0x12,0x0C},
{0x02,0x3E,0x42,0x40,0x40,0x42,0x3E,0x02},
{0x00,0x04,0x02,0xA2,0x12,0x0C,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
};
const xy[]={0x80,0x90,0x88,0x98};
const xy3[]={0x83,0x93,0x8b,0x9b};
const tuan[]={0x05,0x00,0x0e,0x0f};
const tab_f[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xD8,0x80,0x90};
const wela_f[]={0x01,0X02,0X04,0X08};
uint dat_yj=0;
uchar dat_f=0x00,ILU=0,ILU1=0,tyx=0x00,tyy=0x00,tyb=0,yj_f=0,yj_y=0,yj_y1=0;
uchar flag=0x00,flag_right=0x00,dat_k=0x00,sleep=0;//flag=0,主菜单,1涂鸦,2摇奖机,3音乐4电子书9关机
void delay(uint zip)
{
zip=zip*10;
while(zip--);
}
void delayms(uint zip)
{
uint rar;
for(;zip>0;zip--)
for(rar=600;rar>0;rar--);
}
void reset()//任何子程序退出处理
{
PORTA=0X00;
DDRC=0X00;
LE_;
ROMCS_;
LEDEN_;
KEYEN_;
PORTD|=BIT(7);
}
void dat_san()
{
dat[0]=dat_yj/1000;
dat[1]=dat_yj%1000/100;
dat[2]=dat_yj%100/10;
dat[3]=dat_yj%10;
}
void dat_show()
{
uchar i;
DDRB=0XFF;LE;DDRC=0Xff;DDRA=0XFF;
dat_san();
for(i=0;i<4;i++)
{
LE;
PORTA=wela_f[ i];
LE_;
PORTA=0X00;
PORTC=tab_f[dat[ i]];
delay(100);
DATC=0Xff;
}
reset();
}
void write_com(uchar com)
{
PORTB&=~BIT(0);
PORTB&=~BIT(1);
LE;
PORTA=com;
LE_;
PORTA=0X00;
PORTB|=BIT(2);
delay(1);
PORTB&=~BIT(2);
delay(3);
}

void write_dat(uchar dat)
{
PORTB|=BIT(0);
PORTB&=~BIT(1);
LE;
PORTA=dat;
LE_;
PORTA=0X00;
PORTB|=BIT(2);
delay(1);
PORTB&=~BIT(2);
delay(3);
}
void init()
{
LE;
write_com(0X38);//设置16*2显示,5*7点阵,8位数据口
delay(5);
write_com(0X0c);//0000 1(100),开显示,不显光标,不闪光标
delay(5);
write_com(0X06);//0000 01(10),指针加1,整屏不移
delay(5);
}
void choose_flag()
{
uchar i;
for(i=0;i<4;i++)
{
write_com(xy3[ i]);
delay(4);
if(flag==i)write_dat(0x12);
else write_dat(0x20);
delay(5);
}
}
void printf(uchar ovi)
{
uchar ovm,ovp;
init();
for(ovm=0;ovm<4;ovm++)
{
write_com(xy[ovm]);
delay(5);
for(ovp=0;ovp<16;ovp++)
{
write_dat(tab1[ovi][ovm][ovp]);
delay(5);
}
}
if(flag_right==0)choose_flag();
reset();
}
void clean()
{
uchar pp,qq;
init();
for(pp=0;pp<4;pp++)
{
write_com(xy[pp]);
delay(10);
for(qq=0;qq<17;qq++)
{
write_dat(0x20);
delay(6);
}
}
delay(20);
reset();
}
void sends(uchar addxy,uchar *str)
{
uchar temp;
init();
write_com(xy[addxy-1]);
temp=*str;
while(temp!=0x00)
{
write_dat(temp);
temp=*(++str);
delay(4);
}
reset();
}
void png_show()
{
uchar i;
const tab[]={0xfe,0xfd,0xfb,0xF7,0xef,0xdf,0xbf,0x7F};
PORTC=0XFF;
for(i=0;i<8;i++)
{
PORTB|=BIT(3);
PORTA=tab[ i];
PORTB&=~BIT(3);
PORTA=png[ILU][ i];
delay(250);
PORTA=0X00;
}
if(flag_right==0)ILU1++;
if(ILU1==400){ILU1=0;ILU++;}
if(ILU>4)ILU=0;
reset();
}
void key_init()
{
LE;
PORTA=0X00;
LE_;
KEYEN;
PORTD&=~BIT(7);
DDRC=0X00;
PORTC=0XFF;
}
uchar diskey()
{
key_init();
if(PINC==0XFF);
else
{
dat_k=PINC;
while(PINC!=0XFF){dat_show();png_show();DDRC=0X00;key_init();};
}
reset();
return dat_k;
}
void power_down()
{
delay(100);
clean();
sends(2," Good_bye!");
sends(3,"Made_from_CuAuAl");
PORTD|=BIT(5);
delayms(6000);
PORTD&=~BIT(5);
clean();
asm("sleep");
}
void deal_keym()//主菜单处理
{
if(dat_k==247){if(flag<1)flag=3;else flag--;dat_k=0;printf(flag_right);}
if(dat_k==127){if(flag>2)flag=0;else flag++;dat_k=0;printf(flag_right);}
if(dat_k==223){if(flag==3)power_down();{flag_right=flag+1;dat_k=0;printf(flag_right);}}

}
void if_back()//是否返回
{
DDRD&=~BIT(6);
PORTD|=BIT(6);
if(!(PIND&0X40))flag_right=0;
}
void tuya()
{
ILU=4;
if(tyb)png[ILU][tyx]|=BIT(tyy);
if(!tyb)png[ILU][tyx]&=~BIT(tyy);
if(dat_k==191){if(tyx<7)tyx++;dat_k=0;}
if(dat_k==239){if(tyx>0)tyx--;dat_k=0;}
if(dat_k==127){if(tyy<7)tyy++;dat_k=0;}
if(dat_k==247){if(tyy>0)tyy--;dat_k=0;}
if(dat_k==223){tyb=!tyb;dat_k=0;}

}
void yj()
{
if(dat_k==223){yj_f=!yj_f;dat_k=0;}
//if(!yj_f)if(dat_k==223){yj_f=1;dat_k=0;}//
//if(yj_f)if(dat_k=223){yj_f=0;yj_y=12;dat_k=0;}
if(!yj_f){dat_yj++;yj_y=1;yj_y1=20;};
if(dat_yj>999)dat_yj=0;
if(yj_f&yj_y1){yj_y1--;dat_yj++;}
//if(!yj_y1)yj_y1--;
//if(!yj_y1)if((yj_y1<1)&(yj_y>0)){dat_yj++;yj_y1=((yj_y--)*yj_y);}
//if(yj_y<1)if(


}
void dis_show()
{
uchar i=50;
if(!tyb&flag_right==1){png[ILU][tyx]|=BIT(tyy);}
printf(flag_right);
while(i--)
{
dat_show();
png_show();
if_back();
dat_f=diskey();
if(flag_right==0)deal_keym();
if(flag_right==1)tuya();
if(i<30)if(!tyb&flag_right==1){png[ILU][tyx]|=BIT(tyy);}
if(flag_right==2)yj();
}
}
void power_off()
{
clean();
sends(2," Welcome");
sends(3," Hi_The_Boy!");
PORTD|=BIT(5);
delayms(5000);
//clean();
// PORTD&=~BIT(5);
WDTCR=0X18;
}
void main()
{
MCUCSR|=BIT(7);
MCUCSR|=BIT(7);
/////////////////
DDRB=0X3F;
DDRD|=BIT(4)|BIT(5)|BIT(7);
DDRD&=~BIT(2);
PORTD|=BIT(2);
//////////////////
TCCR1A=0X23;
TCCR1B=0X1d;
OCR1A=90000;
OCR1B=100;
/////////////////
EN;ROMCS_;LEDEN_;LE;
/////////////////*
MCUCR&=0X20;
GICR|=BIT(6);
SREG|=BIT(7);
///////////////
PORTD|=BIT(5);
//////////////////
printf(0);
while(1)
{
MCUCR|=BIT(6);
dis_show();
}
}






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:51090 发表于 2014-9-18 00:00 | 只看该作者
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler power_off:2
#pragma interrupt_handler time_base:12
#define EN_ PORTB&=~BIT(2)
#define EN PORTB|=BIT(2)
#define LE PORTB|=BIT(3) //高电平选通573
#define LE_ PORTB&=~BIT(3) //低电平锁存573
#define LEDEN PORTB|=BIT(4) //高电平选通led10
#define LEDEN_ PORTB&=~BIT(4)//低电平禁止led10
#define RONCS PORTB|=BIT(5) //高电平选通rom
#define ROMCS_ PORTB&=~BIT(5) //低电平禁止rom
#define KEYEN DDRD|=BIT(7) //高电平选通导航键盘
#define KEYEN_ DDRD&=~BIT(7) //低电平禁止导航键盘
#define MAC_ PORTD&=~BIT(0)//开启蜂鸣器
#define MAC PORTD|=BIT(0) //关闭蜂鸣器
#define DATC PORTC
extern dat[]={1,9,3,7};
uchar tab1[4][4][16]={
{{"选项一:涂鸦板 "},{"选项二:摇奖机 "},{"选项四:交通场景"},{"选项三:退出应用"}},
{{"涂鸦板使用规则—"},{"移动使用导航键 "},{"提放笔:按'ok'键"},{"返回请按:'B' 键"}},
{{"摇奖机使用规则—"},{" 'ok'键开始 "},{" 'ok'键停止 "},{"得分为最终停止值"}},
{{"--交通灯规则----"},{"东南通行均35秒 -"},{"提醒时间 5秒闪烁"},{"结束演示按:'B'键"}},
};

extern png[5][8]={
{0x00,0x40,0x42,0x7E,0x7E,0x42,0x40,0x00},
{0x0C,0x12,0x22,0x44,0x44,0x22,0x12,0x0C},
{0x02,0x3E,0x42,0x40,0x40,0x42,0x3E,0x02},
{0x00,0x04,0x02,0xA2,0x12,0x0C,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
};
const xy[]={0x80,0x90,0x88,0x98};
const xy3[]={0x83,0x93,0x8b,0x9b};
const tuan[]={0x05,0x00,0x0e,0x0f};
const tab_f[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xD8,0x80,0x90};
const wela_f[]={0x01,0X02,0X04,0X08};
uchar dat_yj=0,dat_yj1=0,ten_f=0;
uchar dat_f=0x00,ILU=0,ILU1=0,tyx=0x00,tyy=0x00,tyb=0;
uchar yj_f=0,yj_y=0,yj_y1=0,j_f=0,tb=0,fb=0,jb=0;
uchar flag=0x00,flag_right=0x00,dat_k=0x00,sleep=0;//flag=0,主菜单,1涂鸦,2摇奖机,3音乐4电子书9关机
void delay(uint zip)
{
zip=zip*10;
while(zip--);
}
void delayms(uint zip)
{
uint rar;
for(;zip>0;zip--)
for(rar=600;rar>0;rar--);
}
void reset()//任何子程序退出处理
{
PORTA=0X00;
DDRC=0X00;
LE_;
ROMCS_;
LEDEN_;
KEYEN_;
PORTD|=BIT(7);
}
void dat_san()
{
dat[0]=dat_yj%100/10;
dat[1]=dat_yj%10;
dat[2]=dat_yj1%100/10;
dat[3]=dat_yj1%10;
}
void dat_show()
{
uchar i;
DDRB=0XFF;LE;DDRC=0Xff;DDRA=0XFF;
dat_san();
for(i=0;i<4;i++)
{
LE;
PORTA=wela_f[ i];
LE_;
PORTA=0X00;
PORTC=tab_f[dat[ i]];
delay(100);
DATC=0Xff;
}
reset();
}
void gry_show(uchar green,uchar red,uchar yellow)
{
LE;
PORTA=0XF0;
LE_;
PORTA=0X00;
DDRC=0XFF;
PORTC=0X00;
delay(100);
reset();
}
void write_com(uchar com)
{
PORTB&=~BIT(0);
PORTB&=~BIT(1);
LE;
PORTA=com;
LE_;
PORTA=0X00;
PORTB|=BIT(2);
delay(1);
PORTB&=~BIT(2);
delay(3);
}

void write_dat(uchar dat)
{
PORTB|=BIT(0);
PORTB&=~BIT(1);
LE;
PORTA=dat;
LE_;
PORTA=0X00;
PORTB|=BIT(2);
delay(1);
PORTB&=~BIT(2);
delay(3);
}
void init()
{
LE;
write_com(0X38);//设置16*2显示,5*7点阵,8位数据口
delay(5);
write_com(0X0c);//0000 1(100),开显示,不显光标,不闪光标
delay(5);
write_com(0X06);//0000 01(10),指针加1,整屏不移
delay(5);
}
void choose_flag()
{
uchar i;
for(i=0;i<4;i++)
{
write_com(xy3[ i]);
delay(4);
if(flag==i)write_dat(0x12);
else write_dat(0x20);
delay(5);
}
}
void printf(uchar ovi)
{
uchar ovm,ovp;
init();
for(ovm=0;ovm<4;ovm++)
{
write_com(xy[ovm]);
delay(5);
for(ovp=0;ovp<16;ovp++)
{
write_dat(tab1[ovi][ovm][ovp]);
delay(5);
}
}
if(flag_right==0)choose_flag();
reset();
}
void clean()
{
uchar pp,qq;
init();
for(pp=0;pp<4;pp++)
{
write_com(xy[pp]);
delay(10);
for(qq=0;qq<17;qq++)
{
write_dat(0x20);
delay(6);
}
}
delay(20);
reset();
}
void sends(uchar addxy,uchar *str)
{
uchar temp;
init();
if(addxy<9&&addxy>0)write_com(xy[addxy-1]);
if(addxy>9)write_com(addxy);
temp=*str;
while(temp!=0x00)
{
write_dat(temp);
temp=*(++str);
delay(4);
}
reset();
}
void ten_led(uchar t_f)
{
/* LE;
DDRD&=~BIT(7);
if(t_f>0)if(ten_f>9)ten_f=0;
if(t_f<1)if(ten_f<1)ten_f=10;
if(t_f<1)ten_f--;
if(ten_f<8)PORTA=BIT(ten_f);
DDRC=0XFF;
if(ten_f==8)PORTC|=BIT(0);
if(ten_f==9)PORTC|=BIT(1);
PORTB|=BIT(4);
if(t_f>0)ten_f++;

delay(100);
reset(); */
}
void png_show()
{
uchar i;
const tab[]={0xfe,0xfd,0xfb,0xF7,0xef,0xdf,0xbf,0x7F};
PORTC=0XFF;
for(i=0;i<8;i++)
{
PORTB|=BIT(3);
PORTA=tab[ i];
PORTB&=~BIT(3);
PORTA=png[ ILU][ i];
delay(250);
PORTA=0X00;
}
if(flag_right==0)ILU1++;
if(ILU1==400){ILU1=0;ILU++;}
if(ILU>4)ILU=0;
reset();
}
void key_init()
{
LE;
PORTA=0X00;
LE_;
KEYEN;
PORTD&=~BIT(7);
DDRC=0X00;
PORTC=0XFF;
}
uchar diskey()
{
key_init();
if(PINC==0XFF);
else
{
MAC_;
dat_k=PINC;
while(PINC!=0XFF){{dat_show();png_show();};MAC;DDRC=0X00;key_init();};
}
reset();
return dat_k;
}
void power_down()
{
delay(100);
TCCR0=0x00;
clean();
sends(2," Good_bye!");
sends(3,"Made_from_CuAuAl");
PORTD|=BIT(5);
OCR1A=90000;
OCR1B=50;
delayms(6000);
PORTD&=~BIT(5);
clean();
asm("sleep");
}
void deal_keym()//主菜单处理
{
if(dat_k==247){if(flag<1)flag=3;else flag--;dat_k=0;printf(flag_right);}
if(dat_k==127){if(flag>2)flag=0;else flag++;dat_k=0;printf(flag_right);}
if(dat_k==223){if(flag==3)power_down();{flag_right=flag+1;dat_k=0;printf(flag_right);}}
//if(dat_k==191)if(flag_right==0){flag_right=5;dat_k=0;}
}
void if_back()//是否返回
{
DDRD&=~BIT(6);
PORTD|=BIT(6);
if(!(PIND&0X40))flag_right=0;
}
void tuya()
{
ILU=4;
if(tyb)png[ ILU][tyx]|=BIT(tyy);
if(!tyb)png[ ILU][tyx]&=~BIT(tyy);
if(dat_k==191){if(tyx<7)tyx++;dat_k=0;}
if(dat_k==239){if(tyx>0)tyx--;dat_k=0;}
if(dat_k==127){if(tyy<7)tyy++;dat_k=0;}
if(dat_k==247){if(tyy>0)tyy--;dat_k=0;}
if(dat_k==223){tyb=!tyb;dat_k=0;}
if(tyb)ten_led(1);
if(!tyb)ten_led(0);
}
void yj()
{
if(dat_k==223){yj_f++;dat_k=0;if(yj_f==2){yj_y=0;yj_y1=0;}}
if(yj_f>2)yj_f=0;
if(yj_f==0)dat_yj=0;
if(yj_f==1){dat_yj++;dat_yj++;dat_yj1--;dat_yj1--;dat_yj1--;}
if(dat_yj>98)dat_yj=0;
if(dat_yj1<6)dat_yj1=99;
if(yj_f==2)if(yj_y1<1)
{
yj_y1=yj_y++;
dat_yj++;dat_yj++;
dat_yj1--;dat_yj1--;
}
if(yj_f==2)if(yj_y<16)if(yj_y1>0)yj_y1--;
if(yj_f==2)ten_led(0);
if(yj_f==1)ten_led(1);
}
void rudder()
{
uchar i,temp_left,temp_right,add_l=0x89,add_r=0x91;
if(jb<36){temp_left=0x18;temp_right=0x19;}
if(jb>35){temp_left=0x1a;temp_right=0x1b;}
if(dat_yj%2){add_l=0x91,add_r=0x89;}
if(!(dat_yj%2)){add_l=0x89;add_r=0x91;}
for(i=0;i<6;i++)
{
write_com(add_l+i);
if(i%2)write_dat(temp_left);
else write_dat(0x20);
}
for(i=0;i<6;i++)
{
write_com(add_r+i);
if(!(i%2))write_dat(temp_right);
else write_dat(0x20);
}
}
void jiao()
{
if(fb)
{
dat_yj++;
dat_yj1++;
fb=0;jb++;
if(jb>70)jb=0;
if(jb==30){dat_yj1=0;}
if(jb==35){dat_yj=0;dat_yj1=0;}
if(jb==65){dat_yj=0;}
if(jb==70){dat_yj=0;dat_yj1=0;}
rudder();
}
if(jb>70)jb=0;
if(j_f<3)
{
j_f=200;
clean();
sends(xy3[0],"南");
sends(0x90,"西");
sends(0x97,"东");
sends(xy3[3],"北");
}
if(j_f%2)
{
write_com(0x84);
write_dat(dat[0]+0x30);
write_dat(dat[1]+0x30);
write_com(0x88);
write_dat(dat[2]+0x30);
write_dat(dat[3]+0x30);
write_com(0x8f);
write_dat(dat[2]+0x30);
write_dat(dat[3]+0x30);
write_com(0x9c);
write_dat(dat[0]+0x30);
write_dat(dat[1]+0x30);
}
j_f--;
}
void dis_show()
{
uchar i=20;
if(!tyb&flag_right==1){png[ ILU][tyx]|=BIT(tyy);}
if(flag_right!=3)printf(flag_right);
while(i--)
{
dat_show();
png_show();
if_back();
dat_f=diskey();
if(flag_right==0)deal_keym();
if(flag_right==1)tuya();
if(flag_right==3)jiao();
if(i<10)if(!tyb&flag_right==1){png[ ILU][tyx]|=BIT(tyy);}
if(flag_right==2)yj();
MAC;
}
}
void power_off()
{
clean();
DDRA=0XFF;
DDRB=0XFF;
sends(2," Welcome");
sends(3," Hi_The_Boy!");
PORTD|=BIT(5);
delayms(4000);
MAC_;
delayms(100);
MAC;
//clean();
// PORTD&=~BIT(5);
WDTCR=0X18;
}
void time_base()
{
tb++;
if(tb>27){tb=0;fb=1;}
}
void main()
{
MCUCSR|=BIT(7);
MCUCSR|=BIT(7);
/////////////////禁止jtag
DDRB=0X3F;
DDRD|=BIT(4)|BIT(5)|BIT(7);
DDRD&=~BIT(2);
PORTD|=BIT(2);
//////////////////端口处理
TCCR1A=0X23;
TCCR1B=0X1d;
OCR1A=6000;
OCR1B=100;
/////////////////
EN;ROMCS_;LEDEN_;LE;
/////////////////控制位初始化
TIMSK|=BIT(0);
TCNT0|=0x60;
TCCR0|=0x05;
OCR0=0x8F;
/////////////////计数器初始化
MCUCR&=0X20;
GICR|=BIT(6);
SREG|=BIT(7);
///////////////睡眠初始化
PORTD|=B




IT(5);
//////////////////
DDRD|=BIT(0);
PORTD|=BIT(0);
///////////////蜂鸣器初始化
printf(0);
///////////////屏幕初始化
while(1)
{
MCUCR|=BIT(6);
dis_show();
MAC;
}
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表