?? keyint.c
字號(hào):
#include <reg51.h>
#include "hardware.h"
#include "LCD1602.h"
extern bit cur_signal;
extern unsigned int data freq;
/* 方波占空比 */
extern unsigned char data time_high, time_low;
/* 與方波頻率相關(guān) */
extern unsigned char data rect_high_TH0;
extern unsigned char data rect_high_TL0;
extern unsigned char data rect_low_TH0;
extern unsigned char data rect_low_TL0;
/* 正弦頻率相關(guān) */
extern unsigned char data sin_TH0;
extern unsigned char data sin_TL0;
/* 與幅度相關(guān) */
extern unsigned char data range_low, range_high;
extern float data proportion; /* 幅度與DAC量程之比 */
extern unsigned char data range_low_data; /* 幅值下界對(duì)應(yīng)的DAC的數(shù)字量 */
extern void mdelay(unsigned int msec);
void enable_timer1()
{
TMOD = 0X10; /* 方式1, 定時(shí)器1 */
ET1 = 1;
PT1 = 1;
EA = 1;
TR1 = 1;
}
void key_scan_ISR() interrupt 3 using 0
{
unsigned int count;
unsigned char dec_bit;
bit update_rect = 0x21;
bit update_sin_freq = 0x22;
KEYPORT = 0Xff;
if (KEYPORT == 0xff) goto out;
mdelay(10);
if (KEYPORT == 0xff) goto out;
if((KEYPORT & 0xf) != 0xf)
update_rect = update_sin_freq = 1;
else
update_rect = update_sin_freq = 0;
if((KEYPORT & 0x8) == 0) { //頻率 千位調(diào)節(jié)
freq += 1000;
if (freq > 4000) freq -= 4000;
dec_bit = (freq / 1000)+0x30;
LCD_write_data(0, 0xa, dec_bit);
} else if ((KEYPORT & 0x4) == 0) { //百位
freq += 100;
if ((freq % 1000) < 100)
freq = freq - 1000;
dec_bit = ((freq / 100) % 10) + 0x30;
LCD_write_data(0, 0xb, dec_bit);
} else if ((KEYPORT & 0x2) == 0) { //十位
freq += 10;
if ((freq % 100 )< 10)
freq = freq - 100;
dec_bit = ((freq / 10) % 10) + 0x30;
LCD_write_data(0, 0xc, dec_bit);
} else if ( (KEYPORT & 0x1) == 0) { //個(gè)位
freq++;
if ((freq % 10) == 0)
freq -= 10;
dec_bit = freq % 10 + 0x30;
LCD_write_data(0, 0xd, dec_bit);
}
else if ( (KEYPORT & 0x20) == 0) { //方波占空比 和正弦幅度設(shè)置
if (cur_signal == SIG_RECT) { //若當(dāng)前為方波,調(diào)節(jié)占空比
time_high++;
if (time_high > 9)
time_high = 1;
LCD_write_data(0, 4, time_high + 0x30);
LCD_write_data(0, 5, 'H');
update_rect = 1;
} else { // 若為正弦, 則調(diào)節(jié)幅度
range_high += 10;
if (range_high <= range_low )
range_high = range_low + 10;
proportion = (float)(range_high - range_low) / 0xff;
///////////////////////////////out put
dec_bit = range_high / 50 + 0x30;//將256個(gè)階分為25份,每份10, 對(duì)于Vref為5V的情況,10近似地代表0.2V
//50近似代表1V, 所以這里的dec_bit表示幅度的整數(shù)部分
LCD_write_data(0, 6, dec_bit);
dec_bit = (range_high / 5) % 10 + 0x30;// range_low /5 表示0。1V的個(gè)數(shù), %10 取個(gè)位數(shù)
LCD_write_data(0, 8, dec_bit);
}
} else if (((KEYPORT & 0x10) == 0)) {
if (cur_signal == SIG_RECT) {
time_low++;
if (time_low > 9)
time_low = 1;
LCD_write_data(0, 6, time_low + 0x30);
LCD_write_data(0, 7, 'L');
update_rect = 1;
} else {
range_low += 10;
if (range_low >= range_high)
range_low = 0;
proportion = (float)(range_high - range_low) / 0xff;
//range_low_data = range_low / ((float)Vref / 256);
dec_bit = range_low / 50 + 0x30;//將256個(gè)階分為25份,每份10, 對(duì)于Vref為5V的情況,10近似地代表0.2V
//50近似代表1V, 所以這里的dec_bit表示幅度的整數(shù)部分
LCD_write_data(0, 2, dec_bit);
dec_bit = (range_low / 5) % 10 + 0x30;// range_low /5 表示0。1V的個(gè)數(shù), %10 取個(gè)位數(shù)
LCD_write_data(0, 4, dec_bit);
}
}
else if ((KEYPORT & 0x40) == 0) {
cur_signal = SIG_RECT;
} else if ((KEYPORT & 0x80) == 0) {
cur_signal = SIG_SIN;
}
if (update_rect) {
count = (HZ * time_high) / (freq * 12 * (time_high + time_low)) * 1000000;
rect_high_TL0 = (unsigned char) count;
rect_high_TH0 = count >> 8;
count = (HZ * time_low) / (freq * 12 * (time_high + time_low)) * 1000000;
rect_low_TL0 = (unsigned char) count;
rect_low_TH0 = count >> 8;
}
if (update_sin_freq) {
count = (HZ / (12 * 256 * freq)) * 1000000;
sin_TL0 = (unsigned char) count;
sin_TH0 = count >> 8;
}
while(KEYPORT != 0xff);//等待按鍵松開
out:
TH1 = 0x3c;
TL1 = 0xb0;
return ;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -