這是部分代碼 全部代碼功能量比較大 無法全部貼上來 我簡單的描述一下我遇到的問題
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();//不停的掃描開關函數是否發生變化
}
}
|