摇摇棒
用AT89S52做
以下资料供参考
- #include <AT89X52.h>
- #define uchar unsigned char
- #define uint unsigned int //宏定义
- #define KEY P3_7 //定义画面切换按键
- uchar KY; //KY作用在后面说明
- uchar disp; //显示汉字指针
- uchar pic=0,num=0; //pic为按键次数;num为中断次数
- uchar code love[] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x20,0xC0,0x20,0x00,0x13,
- 0x00,0x0C,0x00,0x03,0xC0,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x08,0x0C,0x08,0x0A,0x08,0x09,0x88,0x08,0x48,0x08,0x28,0x08,
- 0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,
- 0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0xF0,0x0F,0x10,0x00,0x08,0x00,0x08,0x00,
- 0x08,0x00,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"E:\摇摇棒资料\yzm.BMP",0*/
- /* (64 X 16 ) */
- };
- uchar code loveyou[] = {
- 0x00,0x00,0x00,0x00,0xF0,0x0F,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0xFF,0xFF,
- 0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0xF0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,/*"中",0*/
- /* (16 X 16 , 宋体 ) */
- 0x20,0x10,0x20,0x08,0x24,0x04,0x24,0x02,0x24,0x01,0x24,0x0D,0xBF,0x0B,0x64,0x09,
- 0x24,0x49,0x34,0x89,0x28,0x49,0x24,0x39,0x22,0x01,0x20,0x00,0x20,0x00,0x00,0x00,/*"考",1*/
- /* (16 X 16 , 宋体 ) */
- 0x10,0x80,0x10,0x40,0x10,0x30,0xFF,0x0F,0x10,0x40,0x10,0x80,0xF0,0x7F,0x00,0x00,
- 0x00,0x00,0xF8,0x7F,0x08,0x20,0x08,0x20,0x08,0x20,0xF8,0x7F,0x00,0x00,0x00,0x00,/*"加",2*/
- /* (16 X 16 , 宋体 ) */
- 0x10,0x04,0x60,0x04,0x02,0x7E,0x8C,0x01,0x00,0x00,0xF0,0xFF,0x10,0x42,0x10,0x42,
- 0x10,0x42,0xFF,0x7F,0x10,0x42,0x10,0x42,0x10,0x42,0xF0,0xFF,0x00,0x00,0x00,0x00,/*"油",3*/
- /* (16 X 16 , 宋体 ) */
- };
- uchar code hehe[] = {
- 0x80,0x40,0x40,0x40,0x30,0x42,0x1E,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0xFF,0x7F,
- 0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x40,0x00,0x40,0x00,0x00,/*"生",0*/
- /* (16 X 16 , 宋体 ) */
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,
- 0x82,0x40,0x82,0x40,0x82,0x40,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"日",1*/
- /* (16 X 16 , 宋体 ) */
- 0x00,0x01,0xE0,0x00,0x00,0x00,0xFF,0xFF,0x10,0x00,0x20,0x81,0x08,0x41,0x08,0x31,
- 0x08,0x0D,0xFF,0x03,0x08,0x0D,0x08,0x31,0xF8,0x41,0x00,0x81,0x00,0x81,0x00,0x00,/*"快",2*/
- /* (16 X 16 , 宋体 ) */
- 0x00,0x00,0x00,0x20,0xE0,0x10,0x9C,0x08,0x84,0x06,0x84,0x40,0x84,0x80,0xF4,0x7F,
- 0x82,0x00,0x82,0x00,0x83,0x02,0x82,0x04,0x80,0x08,0x80,0x30,0x00,0x00,0x00,0x00,/*"乐",3*/
- /* (16 X 16 , 宋体 ) */
- };
- unsigned char code hanzi[] = {
- 0x00,0x08,0x00,0x08,0xE0,0x08,0x9F,0x08,
- 0x88,0x08,0x88,0x08,0x88,0x08,0x88,0x08,
- 0x88,0x08,0x88,0x48,0x88,0x80,0x88,0x40,
- 0x88,0x3F,0x08,0x00,0x00,0x00,0x00,0x00,/*"与",0*/
- /* (16 X 16 , 宋体 ) */
- 0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF,
- 0x07,0x00,0x40,0x10,0x20,0x0C,0x18,0x03,
- 0x0F,0x40,0x08,0x80,0xC8,0x7F,0x08,0x00,
- 0x08,0x01,0x28,0x06,0x18,0x18,0x00,0x00,/*"你",1*/
- /* (16 X 16 , 宋体 ) */
- 0x10,0x08,0x10,0x04,0x10,0x03,0xD0,0x00,
- 0xFF,0xFF,0x90,0x00,0x10,0x03,0x00,0x00,
- 0xFE,0xFF,0x22,0x42,0x22,0x42,0x22,0x42,
- 0x22,0x42,0xFE,0xFF,0x00,0x00,0x00,0x00,/*"相",2*/
- /* (16 X 16 , 宋体 ) */
- 0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF,
- 0x07,0x02,0x20,0x02,0x22,0x02,0x2C,0x02,
- 0x20,0x02,0xFF,0xFF,0x20,0x02,0x28,0x02,
- 0x24,0x02,0x22,0x02,0x00,0x02,0x00,0x00,/*"伴",3*/
- /* (16 X 16 , 宋体 ) */
- 0x00,0x10,0x02,0x08,0x02,0x04,0x02,0x02,
- 0x02,0x01,0x82,0x00,0x42,0x00,0xF2,0xFF,
- 0x0E,0x00,0x42,0x00,0x82,0x00,0x02,0x01,
- 0x02,0x02,0x02,0x0C,0x00,0x00,0x00,0x00,/*"不",4*/
- /* (16 X 16 , 宋体 ) */
- 0x04,0x40,0x04,0x38,0x04,0x00,0xFC,0x00,
- 0x84,0x3C,0x84,0x40,0x85,0x40,0x86,0x42,
- 0x84,0x4C,0x84,0x40,0x84,0x40,0x84,0x70,
- 0x84,0x04,0x04,0x08,0x04,0x30,0x00,0x00,/*"忘",5*/
- /* (16 X 16 , 宋体 ) */
- 0x08,0x02,0x08,0x01,0x89,0x00,0xEA,0xFF,
- 0x18,0x01,0x88,0x86,0x00,0x40,0x04,0x20,
- 0x04,0x18,0xFC,0x07,0x04,0x40,0x04,0x80,
- 0x04,0x40,0xFC,0x3F,0x00,0x00,0x00,0x00,/*"初",6*/
- /* (16 X 16 , 宋体 ) */
- 0x04,0x20,0x04,0x20,0xF4,0x10,0x94,0x10,
- 0x94,0x08,0x94,0xFC,0x95,0x42,0xFE,0x21,
- 0x94,0x02,0x94,0x04,0x94,0x08,0x94,0x10,
- 0xF4,0x28,0x04,0x44,0x04,0x40,0x00,0x00,/*"衷",7*/
- /* (16 X 16 , 宋体 ) */
- 0x00,0x80,0xFE,0x47,0x02,0x30,0xFA,0x0F,
- 0x02,0x10,0xFE,0x67,0x00,0x00,0x00,0xFF,
- 0x00,0x41,0x00,0x41,0xFF,0x41,0x10,0x41,
- 0x10,0x41,0x10,0xFF,0x10,0x00,0x00,0x00,/*"贴",8*/
- /* (16 X 16 , 宋体 ) */
- 0x00,0x10,0x00,0x0C,0x80,0x03,0x00,0x00,
- 0x00,0x00,0xE0,0x3F,0x02,0x40,0x04,0x40,
- 0x18,0x40,0x00,0x40,0x00,0x40,0x00,0x78,
- 0x40,0x00,0x80,0x01,0x00,0x0E,0x00,0x00,/*"心",9*/
- /* (16 X 16 , 宋体 ) */
- 0x10,0x08,0x10,0x04,0x10,0x03,0xD0,0x00,
- 0xFF,0xFF,0x90,0x00,0x10,0x03,0x00,0x00,
- 0xFE,0xFF,0x22,0x42,0x22,0x42,0x22,0x42,
- 0x22,0x42,0xFE,0xFF,0x00,0x00,0x00,0x00,/*"相",10*/
- /* (16 X 16 , 宋体 ) */
- 0x00,0x00,0xFE,0xFF,0x22,0x04,0x5A,0x08,
- 0x86,0x87,0x08,0x41,0x10,0x3F,0x44,0x40,
- 0x24,0x80,0xF4,0xBF,0x2C,0x85,0x27,0x95,
- 0x24,0xA5,0xE4,0x9F,0x04,0x80,0x00,0x00,/*"随",11*/
- /* (16 X 16 , 宋体 ) */
- };
- /*****函数声明*****/
- void display1_ltor(void);
- void display2_ltor(void);
- void display2_rtol(void);
- void display3(void);
- void display4(void);
- /*****n(us)延时子程序*****/
- void DelayUs(uint N)
- {
- uint x;
- for(x=0; x<=N;x++);
- }
- /*****中断服务程序*****/
- void intersvr0(void) interrupt 0
- {
- ;
- KY=~KY; //每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)
- if(KY==0)
- {
- num++; //计算中断次数
- switch(pic) //选择画面
- {
- case 0:{display1_ltor();}break;
- case 1:{display2_ltor();}break;
- case 2:{display3();}break;
- case 3:{display4();}break;
- default:{display1_ltor();}
- }
- }
- }
- /*****显示子程序1*****/
- void display1_ltor(void)
- {
- uchar i;
- if(num>5){disp++;num=0;} //每中断7次切换
- if(disp>2)disp=0;
- DelayUs(5200); //此处延时时间依各硬件差别而各不相同,试着调整使得显示内容居中即可
- for(i=0;i<64;i++)
- {
- P0=~hanzi[disp*128+i*2];
- P2=~hanzi[disp*128+i*2+1];
- DelayUs(100);
- }
- }
- /*****显示子程序2*****/
- void display2_ltor(void)
- {
- uchar i;
- DelayUs(4000);
- for(i=0;i<64;i++)
- {
- P0=~love[i*2];
- P2=~love[i*2+1];
- DelayUs(140);
- }
- }
- /*****显示子程序3*****/
- void display3(void)
- {
- uchar i;
- DelayUs(4000);
- for(i=0;i<64;i++)
- {
- P0=~loveyou[i*2];
- P2=~loveyou[i*2+1];
- DelayUs(120);
- }
- }
- /*****显示子程序4*****/
- void display4(void)
- {
- uchar i;
- DelayUs(4000);
- for(i=0;i<64;i++)
- {
- P0=~hehe[i*2];
- P2=~hehe[i*2+1];
- DelayUs(120);
- }
- }
- /*****主函数*****/
- void main(void)
- {
- IT0=1;
- EX0=1;
- EA=1; //开中断,下降沿中断
- KY=0;
- while(1) //主程序中只检测按键
- {
- if(KEY==0) //画面切换键按下
- {
- DelayUs(10000); //按键去抖
- if(KEY==0);
- pic++;}
- if(pic>3)pic=0;
- }
- }
- /*****END*****/
复制代码
|