📄 仿进口温控器的按键程序.txt
字号:
程序主要代码如下:(只涉及按键部分,其它略)
#include <iom8535v.h>
#include <macros.h>
#include <eeprom.h>
#define uchar unsigned char
#define uint unsigned int
uchar n=0;
uchar set=0;
uchar left=0; // set、left是为了判断模式设定及左移
uchar disp_flash=0;
uint num_set1=0; // 设置上升测试计数值
uint num_set2=0; // 设置下降测试计数值
uint disp_count=0; // 显示测试计数值
uchar write_flag=0;
uchar INT0_flag=0;
uint delay_k;
uchar delay_i=0,delay_j=0;
uchar *disp;
uchar disp_small1[4]={1,1,1,10}; // 10 显示加号
uchar disp_small2[4]={2,2,2,11}; // 11显示减号
uchar big_buf[4]={0,0,0,0};
uchar small_buf[4]={0,0,0,0};
const uchar disp_table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x1c,0x54};
const uchar calc[3]={1,10,100};
#pragma interrupt_handler timer1_ovf_isr:9
void port_init(void);
void timer1_init(void);
void init_devices(void);
void display(void);
void init_data(void);
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x0F;
DDRB = 0x70;
PORTC = 0xF0;
DDRC = 0x0F;
PORTD = 0x04;
DDRD = 0x00;
}
//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 10mSec
// actual value: 10.000mSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFB; //setup
TCNT1L = 0x1E;
OCR1AH = 0x97;
OCR1AL = 0x5E;
OCR1BH = 0x97;
OCR1BL = 0x5E;
ICR1H = 0x97;
ICR1L = 0x5E;
TCCR1A = 0x00;
TCCR1B = 0x03; //start Timer
}
void timer1_ovf_isr(void)
{
uint temp1;
uchar i,j;
//TIMER1 has overflowed
TCNT1H = 0xFB; //reload counter high value
TCNT1L = 0x1E; //reload counter low value
//...................
//...................
/*****************处理设定按键************************/
n++;
if(n>=20)n=0;
if((PINC&0xF0)!=0xF0) // 如果PB口有键按下
{
if(n==2) // 延迟一个中断周期(10ms),用作键消抖
{ // 进入具体判断按键语句范围
if((PINC|0xEF)==0xEF) // SET键按下
{ set++;left=0;if(set>4)set=1;
if(set==1){for(i=0;i<4;i++)small_buf[i]=disp_small1[i];}
else if(set==2)
{ for(i=0;i<4;i++)small_buf[i]=disp_small2[i];}
else if(set==3){for(i=0;i<4;i++){big_buf[i]=0;small_buf[i]=disp_small1[i];}big_buf[3]=10;write_flag=1;}
else if(set==4){for(i=0;i<4;i++)big_buf[i]=small_buf[i]=disp_small2[i];write_flag=1;}
}
if((PINC|0xDF)==0xDF)left++; // LEFT 键按下
if(left>=3)left=0;
if((PINC|0xBF)==0xBF) // UP键按下
{
if(set==1)
{
num_set1+=calc[left]; if(num_set1>999)num_set1=999;
disp_small1[0]=small_buf[0]=(num_set1%10); // 实时将计数值分解用于LED显示
temp1=num_set1/10;
disp_small1[1]=small_buf[1]=temp1%10;
disp_small1[2]=small_buf[2]=temp1/10;
}
else if(set==2)
{
num_set2+=calc[left]; if(num_set2>999)num_set2=999;
disp_small2[0]=small_buf[0]=(num_set2%10); // 实时将计数值分解用于LED显示
temp1=num_set2/10;
disp_small2[1]=small_buf[1]=temp1%10;
disp_small2[2]=small_buf[2]=temp1/10;
}
}
if((PINC|0x7F)==0x7F) // DOWN键按下
{
if(set==1)
{
num_set1-=calc[left];if(num_set1>999)num_set1=0;
disp_small1[0]=small_buf[0]=(num_set1%10); // 实时将计数值分解用于LED显示
temp1=num_set1/10;
disp_small1[1]=small_buf[1]=temp1%10;
disp_small1[2]=small_buf[2]=temp1/10;
}
else if(set==2)
{
num_set2-=calc[left];if(num_set2>999)num_set2=0;
disp_small2[0]=small_buf[0]=(num_set2%10); // 实时将计数值分解用于LED显示
temp1=num_set2/10;
disp_small2[1]=small_buf[1]=temp1%10;
disp_small2[2]=small_buf[2]=temp1/10;
}
}
/*************设定按键处理完毕***********************************/
if(set==3)
disp_count=0;
else if(set==4)
disp_count=num_set2;
}
}
//...................
//...................
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x40; // 使用外部中断IN0
TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void init_data() // 开机时读出存入EEPROM的数用于显示
{
uchar i;
CLI();
for(i=0;i<4;i++)
disp_small1[i]=EEPROMread(i);
for(i=4;i<8;i++)
disp_small2[i-4]=EEPROMread(i);
SEI();
disp_small1[3]=10;
disp_small2[3]=11;
set=3;
for(i=0;i<4;i++)
small_buf[i]=disp_small1[i];
big_buf[3]=10;
/*转换为数值用于设置过程中的加减计算*/
num_set1=(disp_small1[2]*100)+(disp_small1[1]*10)+disp_small1[0];
num_set2=(disp_small2[2]*100)+(disp_small2[1]*10)+disp_small2[0];
}
void display(void)
{
uchar i,j;
uchar disp_buf[8];
disp_flash++;
if(disp_flash>200)disp_flash=0;
for(i=0;i<8;i++)
{
PORTA=0x00;
PORTC&=0xF8;
PORTC|=i;
if(i<4)
{
disp_buf[i]=big_buf[i];
for(j=0;j<10;j++)
PORTA=disp_table[disp_buf[i]];
}
else
{
disp_buf[i]=small_buf[i-4];
if((set==0)||(set==3)||(set==4))
{ for(j=0;j<10;j++)
PORTA=disp_table[disp_buf[i]];
}
else
{
if(i==left+4)
for(j=0;j<10;j++)
PORTA=disp_table[disp_buf[i]];
else if((disp_flash%5)==0)
for(j=0;j<10;j++)
PORTA=disp_table[disp_buf[i]];
}
}
}
}
/*-----------------主程序--------------------*/
void main(void)
{
uchar i;
init_devices();
init_data();
delay_k=0;
for(;;)
{
display();
if(write_flag==1)
{
if((set==3)||(set==4)) // 进行了设置并且进入工作状态才允许写EEPROM
{ // 这是因为写EEPROM需要很长的时间
CLI(); // 禁止中断,保证写EEPROM不被干扰
for(i=0;i<4;i++)
EEPROMwrite(i,disp_small1[i]);
for(i=4;i<8;i++)
EEPROMwrite(i,disp_small2[i-4]);
}
write_flag=0; // 数据保存后清除“写标志”
SEI(); // 写完后开中断
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -