找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1146|回复: 1
收起左侧

单片机+1602多重数据显示程序问题 有实时数据 有按键值数据 无法正常工作

[复制链接]
ID:254747 发表于 2019-11-10 16:02 | 显示全部楼层 |阅读模式
这是部分代码  全部代码功能量比较大    无法全部贴上来   我简单的描述一下我遇到的问题   
  1.  在没有 “disp_adc_voltage();             //显示电压数据到显示屏”      这个函数的时候,我的1602可以随时显示我的 编码器按键数值我要多少直接转动就是了 但不是实时数据  也就是按键在转动的时候才有按键值发生变化


  2. 加入了这个函数“disp_adc_voltage();  ”后就不行了  在改变按键值就无法进入“ keyscan();”这个函数了 ,就算进了 也是不准的 转动按键数值也不会变化 要很久才变化     这个disp_adc_voltage();  “”是显示电压的   电压显示是实时数据    是不是因为1602有实时数据写入  然后在转动按键无法写入按键新的数据了啊



  3.要解决这个问题该怎么弄啊   是让  ADC 显示 为间歇性的吗     请高手指点一下     我百度了 也看论坛了  但是没有类似这样的问题  

单片机源程序如下:

#include <STC12C5A60S2.H>

#include "all_function_api.h"

#include "stdint.h"

sbit  LED = P3^7;

sbit  LED_1 = P3^6;

sbit  key  = P3^0;


sbit    Pin_Portry_Sd=P2^2;

/*--------------------------------
功能:该变量用于保存按键值1
--------------------------------*/
extern uint8_t  Sd_Key_Value ;



/*--------------------------------
功能: 该变量用于保存按键值2
---------------------------------*/
extern uint8_t  Sd_Key_Value2 ;


/*---------------------------------
功能:该变量用于保存按键值3
---------------------------------*/
extern uint8_t  Sd_Key_Value3 ;


unsigned char keyjishu=0;




/*-------------------------------
多功能按键实现
--------------------------------*/
void  keyscan()
{
        

        //在初始化 第二屏幕类容之前用了清屏指令,故从新写入显示屏的地址
        //第一排为 0x80  第二排为 0xc0  要记住哦
                //利用switch 来切换,这个条件语句切换的更多 更有优势一些
                   if(Pin_Portry_Sd !=1)
                     {
                           
                           delay_5ms(20);   //消抖
                     
                      if(Pin_Portry_Sd !=1)
                            {

                                while(!Pin_Portry_Sd);
                                keyjishu++;

                            }

                          }

                         switch(keyjishu)
                         {
                            case 1 :
                              {
                                         
                                
                        //        CR=1;                    
                                   lcd_write_com(0x80); //光标位置 第一位就是0可以不加   你要在第几位开始显示就是显示屏格数-1 例如第3位 就是+2即可
                        lcd_write_com(0x0f);  //光标闪烁                                   
                                if(Data_key_freq(&Sd_Key_Value));
                        
                            }
                               break;
                  
                        
                            case 2 :
                              {
                             
                                 keyjishu=3;               //这里直接赋值是为了在打开混频的时候减少一次按键,就直接调整旋钮即可调整混频
                                 lcd_write_com(0x80+14);  //写入‘O’的地址
                                 write_date_('O');
                                 lcd_write_com(0x80+15); //写入‘N’的地址
                                 write_date_('N');
                                 TR1 = 1;                             
                           }

                            break;
                  
                  
                          case 3 :
                              {
                             
                                    lcd_write_com(0x80+6);           //写入‘F’光标地址
                                    if(Data_key_freq_2(&Sd_Key_Value2));
                           
                           }
                             break;
               
                          
                           case 4 :
                              {


                           
                            // keyjishu=1;          //  这里清为1 表示在关闭混频的时候减少一次按键直接调整主频    如果清0 就要增加几次按键 很麻烦                     
                                    lcd_write_com(0x80+14);
                                 write_date_('O');                //写入‘O’的地址
                                 lcd_write_com(0x80+15);
                                 write_date_('F');                //写入‘F’的地址
                                 lcd_write_com(0x0c);
                                    TR1 = 0;                                 //关闭定时器  关闭混频
                           }   
                              break;
                 
                           case 5 :
                              {
                             CR=1;
                                 lcd_write_com(0x0f);  //光标闪烁
                                 lcd_write_com(0xc0);  //写入光标地址
                                 if(Data_key_duty_3(&Sd_Key_Value3));
                           
                           }   
                              break;

                        
                       }

                           if(6 == keyjishu)
                                {
                                   keyjishu=1;
                                
                                }
                        
                  
                  
}

/*------------------------
主函数 主函数入口
--------------------------*/
void main()                                               
{                  
                  //1602初始化
          lcd_init();

                  //开机画面1 初始化
                  Boot_screen_init_0();
               
                  //开机密码检测,当密
                  //码输入成功,进入程序
                  kaijimima_key_init();


                   //开机画面2 初始化
                  Boot_screen_init_1();

                  //PWM PCA寄存器初始化
                  PCAregister_init();

                  //E2PROM初始化
                  E2PROM_init();

                  //定时器1初始化
                  Timer1_Init();

                  //定时器0 初始化
          Timer0_Init();

                  //ADC配置 初始化
                  Init_ADC();

                  //关闭定时器T1  防止一进来就启动混频
                  TR1 = 0;                                          

                 
/*--------------------------
大循环
---------------------------*/                 
while(1)
{
                 
               
                         keyscan();                                                 //功能按键函数
                     disp_adc_voltage();             //显示电压数据到显示屏
                        

                        
               
                         ZPgengxin(Sd_Key_Value);         //把变化的数据写入到定时器PCA时钟里面 来改变主频数据

                         disp_ZPzankongbi(Sd_Key_Value3); //把占空比变化的值写到显示屏里面


                 disp_zhuping(Sd_Key_Value);             //从24c02第4扇区里面把数据读出来,达到复位掉电存储的效果         
                  

                     disp_fuping(Sd_Key_Value2);           //把副频的值显示屏到屏幕上
                        

                           
                //        Duty_Cycle(Sd_Key_Value2);          //副频变化写入到函数里面; 备用 直接赋值到 定时器里面

                        
        

                        
               



                         CCAP1H =CCAP1L = Sd_Key_Value3; //把占空比变化的值写到PCA寄存器里面
                         CCAP0H =CCAP0L = Sd_Key_Value3; //把占空比变化的值写到PCA寄存器里面

                        

                         OVP_ADC_1();                    //过压保护

        //                disp(AT_24c02_read(1));             //从24c02第4扇区里面把数据读出来,达到复位掉电存储的效果


                //        disp_fuping(Sd_Key_Value2);   //同时把副频的变化显示出来;


           //        AT_24c02_Write( 2, Sd_Key_Value2);  //同时写到24C02的第4扇区

                //        disp(Sd_Key_Value);
                                
                          
                 
                   // if(Data_key(&Sd_Key_Value));  
                  //  Data_key();//不停的扫描开关函数是否发生变化
  }
                  
                  
   
}
回复

使用道具 举报

ID:254747 发表于 2019-11-11 10:01 | 显示全部楼层
感谢各位大佬的帮助    这个问题又被我突破了     开始我的软件没法仿真   没有破解   后面破解了   仿真了一下   发现问题在ADC求平均值100次里面耗时太长  导致程序一时半会退不出  ADC      
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表