风雨战神X 风雨战神X
关注数: 151 粉丝数: 130 发帖数: 8,264 关注贴吧数: 18
求大婶帮忙看看我这个程序有什么问题 想做一个对共阴数码管和独立按键的操控,没想到输出的共阴数码管的信号最后是乱码……也不动,按键按了也不变,这个程序也没做完,我看把基本的加法实现了减法应该也能实现(从0+到99),但是没想到遇到了这样的问题,请大神帮忙看看代码有什么问题,感激不尽! /*对输入信号,独立按键的控制,并使用定时器进行动态扫描。 作者:俞晨昱 时间:2014.4 软件:Keil C */ #include <reg52.h>//加载头文件,一般不需要更改。 #define DataPort P1 sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 sbit KEY_ADD=P3^3; //定义按键输入端口 sbit KEY_DEC=P3^4; void delay(unsigned int t);//提前声明一个函数,用作去抖动的延时 void Display(unsigned char FirstBit,unsigned char Num);//声明一个显示函数,用作给定时器的调用 void Init_Timer0(void);//声明定时器函数 /*------------------------------------------------ 查表表格 ------------------------------------------------*/ unsigned char code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义段码0-10,去掉了不需要的abcdef,节约空间 unsigned char code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义位码,一共是八个位 unsigned char temp[];//变量的储存位置 /*----------------------------- 这下面开始定义延时函数 ------------------------------*/ void delay(unsigned int t) { while(--t); }//让这个函数不停地减,直到产生真循环跳出去,这个函数的延时是12M晶振设定的,1ms是245个指令。 /*------------------------ 主函数 -------------------------*/ void main (void) { unsigned num=0,pressnum=0;//定义用来储存现在数据的量和按键次数 Init_Timer0();//调用到定时器中断 while (1);//主循环,程序就在这里面不停地执行 { if(KEY_ADD=0);//检测到加按键按下 { delay(2450);//延时10ms去抖 if(KEY_ADD=1);//检测到此时按键已经放下 { if (num<99) num++; } pressnum=0; while(!KEY_ADD);//按键不放下 { pressnum++; delay(245);//做1ms的延时 if (pressnum>200);//如果按键2s以上 { if (num<99) num++; temp[0]=duanma[num/10]; temp[1]=duanma[num%10]; delay(12250);//延时50ms } } } //分解显示信息,如要显示68,则68/10=6 68%10=8 temp[0]=duanma[num/10]; temp[1]=duanma[num%10]; // Display(0,8); //显示全部8位 //主循环中添加其他需要一直工作的程序 } } /*------------------------------------------------ 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2 ------------------------------------------------*/ void Display(unsigned char FirstBit,unsigned char Num) { static unsigned char i=0; DataPort=0; //清空数据,防止有交替重影 LATCH1=1; //段锁存 LATCH1=0; DataPort=weima[i+FirstBit]; //取位码 LATCH2=1; //位锁存 LATCH2=0; DataPort=temp[i]; //取显示数据,段码 LATCH1=1; //段锁存 LATCH1=0; i++; if(i==Num) i=0; } /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值 //TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } /*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 { TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%256; Display(0,8); }
1 下一页