- 程序#include<reg51.h> //51系列单片机头文件
- #defineuchar unsigned char //宏定义
- #defineuint unsigned int //宏定义
- /******************************************************
- 基础定义
- *******************************************************/
- ucharm=0,n=0;
- ucharo,p,d;
- uchartime=0;
- ucharcode table[]={0x01,0x04,0x08,0x02,0x40,0x10,0x80,0x20};
- /******************************************************
- 数码显示数据定义
- *******************************************************/
- ucharcode taba[]={
- 0xff,0xef,0xef,0xef,0xab,0xc7,0xef,0xff}; //编码定义↓
- ucharcode tab1[]={
- 0xff,0xef,0xcf,0xef,0xef,0xef,0xef,0xc7}; //编码定义1
- ucharcode tab2[]={
- 0xff,0xc7,0xbb,0xfb,0xf7,0xcf,0xbf,0x83}; //编码定义2
- ucharcode tab3[]={
- 0xff,0xc7,0xbb,0xfb,0xe7,0xfb,0xbb,0xc7}; //编码定义3
- ucharcode tab4[]={
- 0xff,0xf7,0xe7,0xd7,0xb7,0xb7,0x83,0xf7}; //编码定义4
- ucharcode tab5[]={
- 0xff,0x83,0xbf,0x87,0xfb,0xfb,0xbb,0xc7}; //编码定义5
- ucharcode tab6[]={
- 0xff,0xe7,0xdf,0xbf,0x87,0xbb,0xbb,0xc7}; //编码定义6
- /******************************************************
- 延时
- *******************************************************/
- voiddelay(uchar n) //延时子函数
- {
- uchar i,j;
- for(i=n;i>0;i--)
- {
- for(j=255;j>0;j--);
- }
- }
- /********************************************************************
- * 名称 : ucharChangeFor(uchar dat)
- * 功能 : 交换一个字节位的位置,用于数码管显示
- * 输入 : 需要改变的数
- * 输出 : 改变后的数
- ***********************************************************************/
- #defineLED_a 4 //数码管段选的a段接在段选IO口的第0位
- #defineLED_b 3
- #defineLED_c 1
- #defineLED_d 5
- #defineLED_e 0
- #defineLED_f 6
- #defineLED_g 7
- #defineLED_dp 2
- ucharChangeFor(uchar dat)
- {
- uchar temp=0;
- if(dat&0x01) //判断数据的第一位是否为1
- temp|=0x01<<LED_a;//如果为1,放到控制数码管a段的位置
- if(dat&0x02)
- temp|=0x01<<LED_b;
- if(dat&0x04)
- temp|=0x01<<LED_c;
- if(dat&0x08)
- temp|=0x01<<LED_d;
- if(dat&0x10)
- temp|=0x01<<LED_e;
- if(dat&0x20)
- temp|=0x01<<LED_f;
- if(dat&0x40)
- temp|=0x01<<LED_g;
- if(dat&0x80)
- temp|=0x01<<LED_dp;
- return temp;
- }
- /******************************************************
- T/C0中断服务程序入口
- *******************************************************/
- timer0()interrupt 1 using 1 //定时器0工作方式1
- {
- TH0 = (65536-50000)/256; //赋初值
- TL0 = (65536-50000)%256; //赋初值
-
- if(o>p)//if语句一般处理两个分支,处理多个分支用if-else-if结构
- {
- d=1;
- }
- else if(o<p)
- {
- d=2;
- }
- else
- {
- d=0;
- }
- time++;
- if(time==1)
- {
- n=~(1<<(p+1));
- }
- else if(time==5)
- {
- if(d==0)
- {
- n=~(1<<(p+1));
- }
- else if(d==1)
- {
- p++;
- n=0xfe;
- }
- else if(d==2)
- {
- p--;
- n=0xfd;
- }
- }
- else if(time==20)
- {
- time = 0;
- }
- }
- /******************************************************
- 定时器T/C0初始化
- *******************************************************/
- voidcom_initialize(void) //定时器初始化
- {
- TMOD = 0x01;//设定定时器0为工作方式1
- TH0 = (65536-50000)/256; //装初值
- TL0 = (65536-50000)%256; //装初值
- EA = 1; //开总中断
- ET0 = 1; //开定时器0中断
- TR0 = 1; //启动定时器0
- }
- /******************************************************
- 主函数
- *******************************************************/
- voidmain() //主函数
- {
- uchar i=0,j=0,k=0;
- uchar tmp=0;
- uchar om=0;
- d=0;
- m=0;
- o=1;
- p=1;
- n=0xff;
- com_initialize();
- while(1) //主循环
- {
- for(i=0;i<8;i++)
- {
- P1=0xff;
- P0=table[ i]; //[ i]刷新
- if(++k==50) //延时
- {
- k=0;
- }
- m=P1; //记录按键
- if(m != 0xff && d==0&& m!=om)
- {
- om=m;
- switch(m) //开关语句
- {
- case 0xfb:
- tmp=1;break;
- case 0xf7:
- tmp=2;break;
- case 0xef:
- tmp=3;break;
- case0xdf:
- tmp=4;break;
- case 0xbf:
- tmp=5;break;
- case 0x7f:
- tmp=6;break;
- default:
- tmp=o;break;
- }
-
- if(o!=tmp)
- {
- p=o;
- o=tmp;
- time=0;
- }
- n=m;
- }
- if(n==0xfe) //识别按键值
- {
- if(k==0)
- j=++j%8;
- P2=ChangeFor(taba[7-(i+j)%8]);
- }
- else if(n==0xfd)
- {
- if(k==0)
- {
- if(j>0)
- j--;
- else
- j=7;
- }
- P2=ChangeFor(taba[(i+j)%8]);
- }
- else if(n==0xfb)
- {
- P2=ChangeFor(tab1[ i]);
- }
- elseif(n==0xf7)
- {
- P2=ChangeFor(tab2[ i]);
- }
- else if(n==0xef)
- {
- P2=ChangeFor(tab3[ i]);
- }
- else if(n==0xdf)
- {
- P2=ChangeFor(tab4[ i]);
- }
- else if(n==0xbf)
- {
- P2=ChangeFor(tab5[ i]);
- }
- else if(n==0x7f)
- {
- P2=ChangeFor(tab6[ i]);
- }
- delay(5);
- }
- }
- }
复制代码
|