|
大伙们我下面实现的功能是:按下第一个按键,从0加到80
按下第二个按键,从80减到10
按下第三个按键,显示10
我下面的代码当按下第一个按键时,会一直加到80,但是数码管不能同时显示这两位,只能显示一位,按下第二个按键也是一样,第三个按键也是一样
请大伙给个代码例程或者给我讲讲哪些错误的地方需要改,按键是由ADC来判断的
- //段
- sbit pin_seg1 = P0^2;
- sbit pin_seg2 = P0^1;
- sbit pin_seg3 = P0^5;
- sbit pin_seg4 = P2^1;
- sbit pin_seg5 = P2^4;
- sbit pin_seg6 = P0^3;
- sbit pin_seg7 = P0^4;
- sbit pin_seg8 = P2^0;
- //位
- sbit pin_com1 = P1^7; //第一个数码管
- sbit pin_com2 = P2^7; //第二个数码管
- sbit pin_com3 = P2^5; //第三个数码管
- sbit pin_com4 = P0^0; //第四个数码管
- sbit pin_com5 = P1^6; //两个点
- unsigned int ADCValue = 0x0000;
- bit AdcFlag = 0;
- //------------------------0,---1;-----2;----3;----4;----5;----6;----7;----8;----9;----10---11;--12;--13;---14;---15
- unsigned char code bcd[]={0x3f,0x30,0x5b,0x79,0x74,0x6d,0x6f,0x38,0x7f,0x7d,0x77,0x79,0x39,0x5e,0x4f,0x71};
- /*****************************************************
- *函数名称:void Delay_50us(unsigned int n)
- *函数功能:延时函数
- *入口参数:n
- *出口参数:void
- *****************************************************/
- void Delay_50us(unsigned int n)
- {
- unsigned char i;
- while(n--)
- {
- for(i=0;i<15;i++);
- }
- }
- /**************************************ADC采样口选择*****************************************/
- #if (IC_MODEL == SC92F7323)
- enum Channel {AIN0=0,AIN1,AIN2,AIN3,AIN4,AIN5,AIN6,AIN7,AIN8,AIN9,VDD4=15};
- #endif
- #if (IC_MODEL == SC92F7322)
- enum Channel {AIN0=0,AIN1,AIN4=4,AIN5,AIN6,AIN7,AIN8,AIN9,VDD4=15};
- #endif
-
- #if (IC_MODEL == SC92F7321)
- enum Channel {AIN0=0,AIN1,AIN2,AIN3,AIN8=8,AIN9,VDD4=15};
- #endif
-
- #if (IC_MODEL == SC92F7320)
- enum Channel {AIN0=0,AIN1,AIN6=6,AIN7,VDD4=15};
- #endif
-
- /*****************************************************
- *函数名称:void ADC_Init(unsigned int Channel)
- *函数功能:ADC初始化
- *入口参数:Channel
- *出口参数:void
- *****************************************************/
- void ADC_Init(unsigned int Channel)
- {
- ADCCON = 0X80|Channel; //开启ADC,ADC采样频率为2M ,选择Channel位ADC采样口
- if(Channel<8)
- {
- ADCCFG0 = 1<<Channel; //设置Channel作为采样口
- }
- else
- {
- ADCCFG1 = 1<<(Channel-8); //设置Channel作为采样口
- }
- IE |= 0X40; //开启ADC中断
- }
- /*****************************************************
- *函数名称:void GetAdcValue(void)
- *函数功能:ADC测试
- *入口参数:void
- *出口参数:void
- *函数作用:获取ADC的值
- *****************************************************/
- unsigned int GetAdcValue(void)
- {
- ADC_Init(AIN6); //设置通道6为ADC输入
- ADCCON |= 0X40; //开始ADC转换
- while(!AdcFlag); //等待 ADC转换完成;
- AdcFlag = 0;
- ADCValue = (ADCVH<<4)+(ADCVL>>4);
- return ADCValue;
- }
- void ADC_Interrupt(void) interrupt 6
- {
- static unsigned char TIME1 = 0;
- ADCCON &= ~(0X10); //清中断标志位
- AdcFlag = 1;
- }
- /*****************************************************
- *函数名称:void Seg_selection2(void)
- *函数功能:将传进来的num值,分别赋值给各个引脚
- *入口参数:void
- *出口参数:void
- *****************************************************/
- void Seg_selection(unsigned char num) //num是a~h
- {
- pin_seg1 = num & 0x01;num=num>>1; //num^0是a段
- pin_seg2 = num & 0x01;num=num>>1; //num^1是b段
- pin_seg3 = num & 0x01;num=num>>1; //num^2是c段
- pin_seg4 = num & 0x01;num=num>>1; //num^3是d段
- pin_seg5 = num & 0x01;num=num>>1; //num^4是e段
- pin_seg6 = num & 0x01;num=num>>1; //num^5是f段
- pin_seg7 = num & 0x01;num=num>>1; //num^6是g段
- pin_seg8 = num & 0x01;num=num>>1; //num^7是h段
- }
- /*****************************************************
- *函数名称:void Pos_selection(void)
- *函数功能:点亮某一位数码管
- *入口参数:void
- *出口参数:void
- *****************************************************/
- void Pos_selection(unsigned char num) //num的1~5位分别对应数码管的1~5位
- {
- pin_com1 = num & 0x01;num=num>>1; //num^0是第一个数码管
- pin_com2 = num & 0x01;num=num>>1; //num^1是第二个数码管
- pin_com3 = num & 0x01;num=num>>1; //num^2是第三个数码管
- pin_com4 = num & 0x01;num=num>>1; //num^3是第四个数码管
- pin_com5 = num & 0x01;num=num>>1; //num^4是第两个点
- }
- //***********************************************************
- //数码管处理显示
- void Display(void)
- {
- unsigned int Key_value;
- static unsigned char Current_num = 0;
- Key_value = GetAdcValue(); //获取ADC的值
- if(Key_value > 2000 && Key_value < 2200) //第一个按键
- {
- Current_num++;
- if(Current_num > 0 && Current_num < 80)
- {
- Pos_selection(0x00); //消影
- Seg_selection(bcd[Current_num%10]); //显示Current_num的个位
- Pos_selection(0x02); //第二位数码管
- Delay_50us(2000);
-
- Pos_selection(0x00); //消影
- Seg_selection(bcd[Current_num/10]); //显示Current_num的十位
- Pos_selection(0x01); //第一位数码管
- Delay_50us(2000);
- }
- else
- {
- Current_num = 0;
- }
- }
- if(Key_value > 2600 && Key_value < 3000) //第二个按键
- {
- Current_num--;
- if(Current_num > 10 && Current_num < 80)
- {
- Pos_selection(0x00); //消影
- Seg_selection(bcd[Current_num%10]);
- Pos_selection(0x02); //第二位数码管
- Delay_50us(2000);
-
- Pos_selection(0x00); //消影
- Seg_selection(bcd[Current_num/10]);
- Pos_selection(0x01); //第一位数码管
- Delay_50us(2000);
- }
- else
- {
- Current_num = 0;
- }
- }
- if(Key_value > 3000 && Key_value < 3500) //第三个按键
- {
- Pos_selection(0x00); //消影
- Seg_selection(0x30); //显示1
- Pos_selection(0x01); //第一位数码管
- Delay_50us(2000); //延时
-
- Pos_selection(0x00); //消影
- Seg_selection(0x3F); //显示1
- Pos_selection(0x02); //第一位数码管
- Delay_50us(2000); //延时
-
- }
- }
- void main(void)
- {
- IO_Init();
- EA = 1;
- while(1)
- {
- Display();
- }
- }
复制代码
|
|