|
|
這是部分代碼 全部代碼功能量比較大 無(wú)法全部貼上來(lái) 我簡(jiǎn)單的描述一下我遇到的問(wèn)題
1. 在沒(méi)有 “disp_adc_voltage(); //顯示電壓數(shù)據(jù)到顯示屏” 這個(gè)函數(shù)的時(shí)候,我的1602可以隨時(shí)顯示我的 編碼器按鍵數(shù)值我要多少直接轉(zhuǎn)動(dòng)就是了 但不是實(shí)時(shí)數(shù)據(jù) 也就是按鍵在轉(zhuǎn)動(dòng)的時(shí)候才有按鍵值發(fā)生變化
2. 加入了這個(gè)函數(shù)“disp_adc_voltage(); ”后就不行了 在改變按鍵值就無(wú)法進(jìn)入“ keyscan();”這個(gè)函數(shù)了 ,就算進(jìn)了 也是不準(zhǔn)的 轉(zhuǎn)動(dòng)按鍵數(shù)值也不會(huì)變化 要很久才變化 這個(gè)disp_adc_voltage(); “”是顯示電壓的 電壓顯示是實(shí)時(shí)數(shù)據(jù) 是不是因?yàn)?602有實(shí)時(shí)數(shù)據(jù)寫(xiě)入 然后在轉(zhuǎn)動(dòng)按鍵無(wú)法寫(xiě)入按鍵新的數(shù)據(jù)了啊
3.要解決這個(gè)問(wèn)題該怎么弄啊 是讓 ADC 顯示 為間歇性的嗎 請(qǐng)高手指點(diǎn)一下 我百度了 也看論壇了 但是沒(méi)有類似這樣的問(wèn)題
單片機(jī)源程序如下:
#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;
/*-------------------------------
多功能按鍵實(shí)現(xiàn)
--------------------------------*/
void keyscan()
{
//在初始化 第二屏幕類容之前用了清屏指令,故從新寫(xiě)入顯示屏的地址
//第一排為 0x80 第二排為 0xc0 要記住哦
//利用switch 來(lái)切換,這個(gè)條件語(yǔ)句切換的更多 更有優(yōu)勢(shì)一些
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); //光標(biāo)位置 第一位就是0可以不加 你要在第幾位開(kāi)始顯示就是顯示屏格數(shù)-1 例如第3位 就是+2即可
lcd_write_com(0x0f); //光標(biāo)閃爍
if(Data_key_freq(&Sd_Key_Value));
}
break;
case 2 :
{
keyjishu=3; //這里直接賦值是為了在打開(kāi)混頻的時(shí)候減少一次按鍵,就直接調(diào)整旋鈕即可調(diào)整混頻
lcd_write_com(0x80+14); //寫(xiě)入‘O’的地址
write_date_('O');
lcd_write_com(0x80+15); //寫(xiě)入‘N’的地址
write_date_('N');
TR1 = 1;
}
break;
case 3 :
{
lcd_write_com(0x80+6); //寫(xiě)入‘F’光標(biāo)地址
if(Data_key_freq_2(&Sd_Key_Value2));
}
break;
case 4 :
{
// keyjishu=1; // 這里清為1 表示在關(guān)閉混頻的時(shí)候減少一次按鍵直接調(diào)整主頻 如果清0 就要增加幾次按鍵 很麻煩
lcd_write_com(0x80+14);
write_date_('O'); //寫(xiě)入‘O’的地址
lcd_write_com(0x80+15);
write_date_('F'); //寫(xiě)入‘F’的地址
lcd_write_com(0x0c);
TR1 = 0; //關(guān)閉定時(shí)器 關(guān)閉混頻
}
break;
case 5 :
{
CR=1;
lcd_write_com(0x0f); //光標(biāo)閃爍
lcd_write_com(0xc0); //寫(xiě)入光標(biāo)地址
if(Data_key_duty_3(&Sd_Key_Value3));
}
break;
}
if(6 == keyjishu)
{
keyjishu=1;
}
}
/*------------------------
主函數(shù) 主函數(shù)入口
--------------------------*/
void main()
{
//1602初始化
lcd_init();
//開(kāi)機(jī)畫(huà)面1 初始化
Boot_screen_init_0();
//開(kāi)機(jī)密碼檢測(cè),當(dāng)密
//碼輸入成功,進(jìn)入程序
kaijimima_key_init();
//開(kāi)機(jī)畫(huà)面2 初始化
Boot_screen_init_1();
//PWM PCA寄存器初始化
PCAregister_init();
//E2PROM初始化
E2PROM_init();
//定時(shí)器1初始化
Timer1_Init();
//定時(shí)器0 初始化
Timer0_Init();
//ADC配置 初始化
Init_ADC();
//關(guān)閉定時(shí)器T1 防止一進(jìn)來(lái)就啟動(dòng)混頻
TR1 = 0;
/*--------------------------
大循環(huán)
---------------------------*/
while(1)
{
keyscan(); //功能按鍵函數(shù)
disp_adc_voltage(); //顯示電壓數(shù)據(jù)到顯示屏
ZPgengxin(Sd_Key_Value); //把變化的數(shù)據(jù)寫(xiě)入到定時(shí)器PCA時(shí)鐘里面 來(lái)改變主頻數(shù)據(jù)
disp_ZPzankongbi(Sd_Key_Value3); //把占空比變化的值寫(xiě)到顯示屏里面
disp_zhuping(Sd_Key_Value); //從24c02第4扇區(qū)里面把數(shù)據(jù)讀出來(lái),達(dá)到復(fù)位掉電存儲(chǔ)的效果
disp_fuping(Sd_Key_Value2); //把副頻的值顯示屏到屏幕上
// Duty_Cycle(Sd_Key_Value2); //副頻變化寫(xiě)入到函數(shù)里面; 備用 直接賦值到 定時(shí)器里面
CCAP1H =CCAP1L = Sd_Key_Value3; //把占空比變化的值寫(xiě)到PCA寄存器里面
CCAP0H =CCAP0L = Sd_Key_Value3; //把占空比變化的值寫(xiě)到PCA寄存器里面
OVP_ADC_1(); //過(guò)壓保護(hù)
// disp(AT_24c02_read(1)); //從24c02第4扇區(qū)里面把數(shù)據(jù)讀出來(lái),達(dá)到復(fù)位掉電存儲(chǔ)的效果
// disp_fuping(Sd_Key_Value2); //同時(shí)把副頻的變化顯示出來(lái);
// AT_24c02_Write( 2, Sd_Key_Value2); //同時(shí)寫(xiě)到24C02的第4扇區(qū)
// disp(Sd_Key_Value);
// if(Data_key(&Sd_Key_Value));
// Data_key();//不停的掃描開(kāi)關(guān)函數(shù)是否發(fā)生變化
}
}
|
|