32位摇摇棒程序原理图:
32位摇摇棒程序:
- #include <STC11F60XE.h>
- /*********外部接口定义**********/
- #define uchar unsigned char
- #define uint unsigned int //宏定义
- #define out P1 //数据输出端口
- sbit led1=P3^0; //第1组LED
- sbit led2=P3^1; //第2组LED
- sbit led3=P3^3; //第3组LED
- sbit led4=P3^4; //第4组LED
- sbit key1=P3^5; //按键输入
- sbit p3_2=P3^2;
- uchar KY,num; //KY作用在后面说明
- uchar BUFF; //缓存
- /*********全局变量定义**********/
- unsigned long int TimeCount=0;
- unsigned int DelayN=80, //延时临时计数
- DelayTime=80; //每次延时的周期个数
- unsigned char key,keyy;
- /**********************************************/
- void delay(unsigned char n);
- void DelayMs(void);
- /*******************************************/
- unsigned char code text0[]={
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0xB7,0xBB,0xB7,0xBB,0xB3,0xBB,0xB4,0xBB,0xB5,0xBB,0xB7,0xBB,0xB7,0xBB,0xB7,0xBB,0x07,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"自",1*/
- 0xBF,0xBF,0xBE,0xDF,0x39,0xE0,0xFF,0xDF,0xEF,0xBF,0xEF,0xBF,0x6D,0xB0,0x6D,0xB7,0x6D,0xB7,0x01,0xB7,0x6E,0xB7,0x6E,0xB7,0x6E,0xB0,0xEF,0xBF,0xEF,0xBF,0xFF,0xFF,/*"适",2*/
- 0xFF,0xBF,0xFF,0xC7,0x03,0xF8,0xBB,0xDF,0x7B,0xDF,0xFB,0xD0,0xEB,0xDB,0xDA,0xDF,0x39,0xDC,0x7B,0xCF,0xFB,0xD3,0xFB,0xDC,0x1B,0xDF,0xBB,0xDF,0xFF,0xDF,0xFF,0xFF,/*"应",3*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",4*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",5*/
- 0xEF,0xFB,0xEF,0xBB,0xEF,0x7D,0x00,0x80,0x6F,0xFF,0xAF,0xFD,0x75,0x05,0x8D,0xBD,0xB9,0xBD,0xA5,0xBD,0x3D,0x80,0x9E,0xBD,0xAE,0xBD,0xB6,0xBD,0xFF,0x05,0xFF,0xFF,/*"摇",6*/
- 0xEF,0xFB,0xEF,0xBB,0xEF,0x7D,0x00,0x80,0x6F,0xFF,0xAF,0xFD,0x75,0x05,0x8D,0xBD,0xB9,0xBD,0xA5,0xBD,0x3D,0x80,0x9E,0xBD,0xAE,0xBD,0xB6,0xBD,0xFF,0x05,0xFF,0xFF,/*"摇",7*/
- 0xEF,0xFC,0x2F,0xFF,0x00,0x00,0xAF,0xFF,0x6F,0xFD,0xBB,0xF5,0xAB,0xF6,0x2B,0xF5,0x8B,0xF5,0xA0,0x00,0x2B,0xF5,0xAB,0xF4,0xAB,0xF6,0xBB,0xF5,0xBF,0xFD,0xFF,0xFF,/*"棒",8*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",9*/
- };
- unsigned char code text1[]={
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",0*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",1*/
- 0xF7,0xFD,0xF7,0xFE,0x76,0xFF,0x31,0x00,0x57,0xFF,0xE7,0x7C,0xFF,0xBF,0x01,0xCF,0x7D,0xF0,0x7D,0xFF,0x7D,0xFF,0x7D,0x80,0x01,0x7F,0xFF,0x7F,0xFF,0x0F,0xFF,0xFF,/*"祝",2*/
- 0x7F,0xFF,0xBF,0xFF,0x0F,0x80,0xD3,0xFF,0xBC,0xEF,0xDF,0xF3,0x67,0xFC,0xF0,0xDE,0xF5,0xBF,0x17,0xC0,0xF7,0xFF,0x77,0xFF,0xD7,0xFC,0xE3,0xE3,0xF7,0xF7,0xFF,0xFF,/*"你",3*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",4*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",5*/
- 0xFF,0xFF,0xBF,0x7F,0xBD,0xBF,0xBD,0xDF,0xBD,0xEF,0xBD,0xF7,0xBD,0xF9,0x01,0xFE,0xBD,0xFD,0xBD,0xFB,0xBD,0xF7,0xBD,0xEF,0xBD,0xCF,0xBD,0x9F,0xBF,0xDF,0xFF,0xFF,/*"天",6*/
- 0xFF,0xFF,0xBF,0x7F,0xBD,0xBF,0xBD,0xDF,0xBD,0xEF,0xBD,0xF7,0xBD,0xF9,0x01,0xFE,0xBD,0xFD,0xBD,0xFB,0xBD,0xF7,0xBD,0xEF,0xBD,0xCF,0xBD,0x9F,0xBF,0xDF,0xFF,0xFF,/*"天",7*/
- 0xBF,0xFF,0xBD,0xBF,0xBD,0xDF,0xBD,0xEF,0xBD,0xF3,0x01,0xFC,0xBD,0xFF,0xBD,0xFF,0xBD,0xFF,0xBD,0xFF,0x01,0x80,0xBD,0xFF,0xBD,0xFF,0xBD,0xFF,0xBD,0xFF,0xFF,0xFF,/*"开",8*/
- 0xFF,0xFB,0x7F,0xFC,0xFF,0xFF,0xFF,0xFF,0x0F,0xC0,0xFF,0xBF,0xFE,0xBF,0xFD,0xBF,0xE3,0xBF,0xF7,0xBF,0xFF,0xBF,0xBF,0x87,0x7F,0xFF,0xFF,0xF8,0xFF,0xFD,0xFF,0xFF,/*"心",9*/
- };
- unsigned char code text2[]={
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF,0xFF,0x9F,0xF9,0xFF,0xFF,0x9F,0xF9,0xFF,0xFF,0x9F,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xF9,0xFF,0xFF,0x9F,
- 0xF9,0xFF,0xFF,0x9F,0xF9,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0x01,0xFE,0xFF,
- 0x7F,0x00,0xF8,0xFF,0x3F,0x00,0xF0,0xFF,0x1F,0x00,0xE0,0xFF,0x0F,0x00,0xC0,0xFF,0x07,0x00,0x80,0xFF,0x03,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x03,0x00,0x00,0xFE,
- 0x03,0x00,0x00,0xFC,0x03,0x00,0x00,0xF8,0x07,0x00,0x00,0xF0,0x0F,0x00,0x00,0xE0,0x1F,0x00,0x00,0xE0,0x3F,0x00,0x00,0xC0,0x3F,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,
- 0x0F,0x00,0x00,0xE0,0x07,0x00,0x00,0xF0,0x03,0x00,0x00,0xF8,0x03,0x00,0x00,0xFC,0x03,0x00,0x00,0xFE,0x03,0x00,0x00,0xFF,0x07,0x00,0x80,0xFF,0x0F,0x00,0xC0,0xFF,
- 0x1F,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0xFF,0x00,0xF8,0xFF,0xFF,0x01,0xFC,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0x07,0x00,0x00,0xE0,0x07,0x00,0x00,0xC0,0x07,0x00,0x00,0xC0,0xFF,0xFF,0xFF,0xC7,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xCF,
- 0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xC7,0x07,0x00,0x00,0xC0,0x07,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,/*"未命名文件",0*/
- };
- /***********n(us)延时子程序***************/
- void DelayUs(uint N)
- {
- uint x;
- for(x=0; x<=N;x++);
- }
- /******************************************/
- void main()
- {
- AUXR=0x80;
- CLK_DIV=1;
- EX0=1; //开放外部中断0
- IT0=1; //中断0为边沿触发方式
- IP=0x02; //设置中断优先级
- TMOD=0x02; //定时器0方式2,8位重装载
- TH0=0x80; //设定定时器初值
- TL0=0x80;
- KY=0;
- EA=1; //开放中断
- ET0=1; //开放定时器0中断
- TR0=1; //启动定时器0,开始计时*/
- key=0; //初始化显示第一组文字
- keyy=0;
- P1M0=0x55; //0101 0101 /P1.0 P1 .2 P1.4 P1.6推挽输出
- P1M1=0xAA;
- while(1){//等待中断
-
- if(key1==0){ //有键按下
- DelayUs(50);
- if(key1==0){
- key++; //更换下一幅图片
- if(key>2) key=0; //图片循环显示 根据显示的组数来定义 这里有9组 所以就要keyy>9
- while(key1==0); //等待按键释放
- }
- }
- if(num>10) //每中断10次切换
- {
- keyy++;
- num=0;
- }
- if(keyy>2)keyy=0; //图片循环显示 根据显示的组数来定义 这里有9组 所以就要keyy>9
- }
- }
-
- /*********文字显示子程序**********/
- void display_word(unsigned char code *text)
- {
- unsigned char i,j=2; //j为图片起始位置 3 为第3个开始是图片 如果要显示高时32的大字 也属于图片格式
- DelayUs(6400);
-
- for(i=0;i<64;i++)
- {
-
- P3M0=0x00; //0000 0000 //P3.0推挽输出 P3 .1 P3.3 P3.4输入高阻
- P3M1=0x1B;
- if((key>=j)||(keyy>=j))
- BUFF=(*(text+i*4+3));
- else
- BUFF=(*(text+128+i*2+1));
- led4=0;
- P1=~BUFF>>1;
- P3M0=0x10; //0001 0000 //P3.4推挽输出 P3 .0 P3.3 P3.1输入高阻
- P3M1=0x0B; //0000 1011
- delay(1);
- P3M0=0x00; //0000 0000 //P3.0推挽输出 P3 .1 P3.3 P3.4输入高阻
- P3M1=0x1B; //0001 1011
- led4=1;
- P1=BUFF; //01010101 1357
- P3M0=0x10; //0001 0000 //P3.4推挽输出 P3 .0 P3.3 P3.1输入高阻
- P3M1=0x0B; //0000 1011
- delay(1);
- P3M0=0x00; //0000 0000 //P3.0推挽输出 P3 .1 P3.3 P3.4输入高阻
- P3M1=0x1B; //0001 1011
- if((key>=j)||(keyy>=j))
- BUFF=(*(text+i*4+2));
- else
- BUFF=(*(text+128+i*2));
- led3=0;
- P1=~BUFF>>1;
- P3M0=0x08; //0000 1000 //P3.3推挽输出 P3 .0 P3.1 P3.4输入高阻
- P3M1=0x13; //0001 0011
- delay(1);
- P3M0=0x00; //0000 0000 //P3.0推挽输出 P3 .1 P3.3 P3.4输入高阻
- P3M1=0x1B; //0001 1011
- led3=1;
- P1=BUFF; //01010101 1357
- P3M0=0x08; //0000 1000 //P3.3推挽输出 P3 .0 P3.1 P3.4输入高阻
- P3M1=0x13; //0001 0011
- delay(1);
- P3M0=0x00; //0000 0000 //P3.0推挽输出 P3 .1 P3.3 P3.4输入高阻
- P3M1=0x1B;
- if((key>=j)||(keyy>=j))
- BUFF=(*(text+i*4+1));
- else
- BUFF=(*(text+i*2+1));
- led2=0;
- P1=~BUFF>>1;
- P3M0=0x02; //0000 0010 //P3.1推挽输出 P3 .0 P3.3 P3.4输入高阻
- P3M1=0x19; //0001 1001
- delay(1);
- P3M0=0x00; //0000 0000 //P3.0推挽输出 P3 .1 P3.3 P3.4输入高阻
- P3M1=0x1B; //0001 1011
- led2=1;
- P1=BUFF; //01010101 1357
- P3M0=0x02; //0000 0010 //P3.1推挽输出 P3 .0 P3.3 P3.4输入高阻
- P3M1=0x19; //0001 1001
- delay(1);
- P3M0=0x00; //0000 0000 //P3.0推挽输出 P3 .1 P3.3 P3.4输入高阻
- P3M1=0x1B; //0001
- if((key>=j)||(keyy>=j))
- BUFF=(*(text+i*4));
- else
- BUFF=(*(text+i*2));
- led1=0;
- P1=~BUFF>>1;
- P3M0=0x01; //0000 0001 //P3.0推挽输出 P3 .1 P3.3 P3.4输入高阻
- P3M1=0x1A; //0001 1010
- delay(1);
- P3M0=0x00; //0000 0000 //P3.0推挽输出 P3 .1 P3.3 P3.4输入高阻
- P3M1=0x1B; //0001 1011
- led1=1;
- P1=BUFF; //01010101 1357
- P3M0=0x01; //0000 0001 //P3.0推挽输出 P3 .1 P3.3 P3.4输入高阻
- P3M1=0x1A; //0001 1010
- delay(1);
- } }
- /*********显示内容选择子程序**********/
- void display(unsigned char t)
- { keyy=0;
- switch (t){ //通过按键选择显示内容
- case 0: {display_word(text0);}break;
- case 1: {display_word(text1);}break;
- case 2: {display_word(text2);}break;
- // case 3: {display_word(text3);}break;
- // case 4: {display_word(text4);}break;
- // case 5: {display_word(text5);}break;
- // case 6: {display_word(text6);}break;
- // case 7: {display_word(text7);}break;
- // case 8: {display_word(text8);}break;
- // case 9: {display_word(text9);}break;
- // case 10:{display_word(text10);}break;
- //default:{display_word(text1);}
-
-
- }}
- /*****************************************/
- void display1(unsigned char y)
- {
- switch (y){ //通过按键选择显示内容
- case 0: {display_word(text0);}break;
- case 1: {display_word(text1);}break;
- case 2: {display_word(text2);}break;
- // case 3: {display_word(text3);}break;
- // case 4: {display_word(text4);}break;
- // case 5: {display_word(text5);}break;
- // case 6: {display_word(text6);}break;
- // case 7: {display_word(text7);}break;
- // case 8: {display_word(text8);}break;
- // case 9: {display_word(text9);}break;
- // case 10:{display_word(text10);}break;
- }
- }
- /***************************************/
- /*********延时子程序**********/
- void delay(unsigned char n)
- {
- for(;n>0;n--){
- DelayN=DelayTime;
- while (DelayN);
- }
- }
- /*********中断子程序**********/
- void int0() interrupt 0 //使用外部中断0
- {
- KY=~KY;
- if(KY==0)
- {
- DelayTime=TimeCount/1580;
- TimeCount=0; //延时周期计数清零
- if(key==0)
- {
- num++;
- display1(keyy); //根据按键选择循环显示文字
- }
- else
- {
- display(key); //根据按键选择循环显示文字
- }
- }
- }
- void timer0() interrupt 1 //定时器0中断子程序
- {
- TimeCount++;
- if (DelayN!=0)
- DelayN--;
- }
复制代码
|