📄 pelikon.c
字号:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#include <avr/delay.h>
#include <pelikon.h>
/*---------------------------------------------------------------------------------
just as the test screens.
------------------------------------------------------------------------------------*/
static const PROGMEM unsigned char rcBuffer[7][16] = {
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
},//clear the display screen.
{
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
},//full
{
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
},//1
{
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
},//2
{
0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
},//3
{
0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
},//4
{
0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
}//5
};
//key scan variable which in interrupt
volatile unsigned char timer_ov_num1 = 0,timer_ov_num2 = 0,first_keyscan = 0,key_value = 0,
key_valueold = 0,key = 0;
//variable which in timer1 interrupt
volatile unsigned char T1_flag = 0,timer_flag = 0;
volatile unsigned char T1_num = 0,T1_num2 = 0;
volatile unsigned char num = 0;
//variable which in main function flag
volatile unsigned char screen_flag = 1;
#define VKEY1 1
#define VKEY2 2
unsigned char keyscan(void)
{
unsigned char temp;
temp = PINB;
if ((temp & 0x01) == 0)
{
return VKEY1;
}
else if ((temp & 0x02) == 0)
{
return VKEY2;
}
return 0;
}
void disbouncing(void)
{
while(key_value != 0)
{
if(key < 10)
{
key = 0;
}
else
{
key = 0;
}
}
}
void write_segments(unsigned char index)
{
unsigned char i;
for (i = 0;i < 16;i++)
{
if (pgm_read_byte(&rcBuffer[index][i]))
{
set_DATA_IN();
}
else
{
reset_DATA_IN();
}
reset_CLK();
_delay_loop_1(4);
set_CLK();
}
reset_DATA_IN();
reset_CLK();
_delay_loop_1(4);
reset_LE();
_delay_loop_2(4100);
set_LE();
}
void init_pelikon (void)
{
DDRA = 0xff;
PORTA = 0x01;
write_segments(0);//17,there is no gray level segment.
TCCR0=0x01;
TCNT0=0x00;
TIMSK=TIMSK|0x01;
sei();
}
int main(void)
{
unsigned char i;
init_pelikon();
for(;;)
{
write_segments(screen_flag);
while (key_value == 0);
if (key_value == 1)
{
disbouncing ();
screen_flag ++;
if (screen_flag == 7)
{
screen_flag = 1;
}
}
else if (key_value == 2)
{
disbouncing ();
screen_flag --;
if (screen_flag == 0)
{
screen_flag = 6;
}
}
}
}
SIGNAL(SIG_OVERFLOW0)
{
timer_ov_num1++;
if(timer_ov_num1 == 20)
{
timer_ov_num1 = 0;
timer_ov_num2++;
if(timer_ov_num2 == 157)//157
{
timer_ov_num2 = 0;
if(first_keyscan == 0)
{
first_keyscan = 1;
key_valueold = 0;
}
if(key_value != 0)
{
key_valueold = key_value;
}
key_value = keyscan();
if((key_value == key_valueold) && (key_value != 0))
{
key++;
}
if((key_valueold != key_value) && (key < 10))
{
key = 0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -