这是部分代码 全部代码功能量比较大 无法全部贴上来 我简单的描述一下我遇到的问题
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();//不停的扫描开关函数是否发生变化
}
}
|