📄 main._c
字号:
//ICC-AVR application builder : 2007-5-23 0:45:25
// Target : M16
// Crystal: 1.0000Mhz
#include <iom16v.h>
#include <macros.h>
typedef unsigned char uint8;//可移植的8位无符号变量
typedef unsigned int uint16;//可移植的16位无符号变量
#pragma data:code
const uint8 seg7_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0~F and "shut"
#pragma data:data
volatile uint8 seg7_led_buff[4];//禁止编译器优化,保护数组内容
#define seg7_bitselect_port PORTD
#define seg7_bitselect_ddr DDRD
#define seg7_bit0 4
#define seg7_bit1 5
#define seg7_bit2 6
#define seg7_bit3 7
#define seg7_bit0_en() {seg7_bitselect_ddr|=(1<<seg7_bit0);seg7_bitselect_port|=(1<<seg7_bit0);}
#define seg7_bit0_dis() {seg7_bitselect_ddr|=(1<<seg7_bit0);seg7_bitselect_port&=~(1<<seg7_bit0);}
#define seg7_bit1_en() {seg7_bitselect_ddr|=(1<<seg7_bit1);seg7_bitselect_port|=(1<<seg7_bit1);}
#define seg7_bit1_dis() {seg7_bitselect_ddr|=(1<<seg7_bit1);seg7_bitselect_port&=~(1<<seg7_bit1);}
#define seg7_bit2_en() {seg7_bitselect_ddr|=(1<<seg7_bit2);seg7_bitselect_port|=(1<<seg7_bit2);}
#define seg7_bit2_dis() {seg7_bitselect_ddr|=(1<<seg7_bit2);seg7_bitselect_port&=~(1<<seg7_bit2);}
#define seg7_bit3_en() {seg7_bitselect_ddr|=(1<<seg7_bit3);seg7_bitselect_port|=(1<<seg7_bit3);}
#define seg7_bit3_dis() {seg7_bitselect_ddr|=(1<<seg7_bit3);seg7_bitselect_port&=~(1<<seg7_bit3);}
#define seg7_data_port PORTA
#define seg7_data_ddr DDRA
void delay100us(uint8 n)
{
uint8 i;
for(i=100*n;i!=0;i--)
NOP();
}
void seg7_led_update(void)//数码管扫描
{
seg7_data_port=seg7_data[seg7_led_buff[0]];
seg7_bit0_en();
delay100us(1);
seg7_bit0_dis();
seg7_data_port=seg7_data[seg7_led_buff[1]];
seg7_bit1_en();
delay100us(1);
seg7_bit1_dis();
seg7_data_port=seg7_data[seg7_led_buff[2]];
seg7_bit2_en();
delay100us(1);
seg7_bit2_dis();
seg7_data_port=seg7_data[seg7_led_buff[3]];
seg7_bit3_en();
delay100us(1);
seg7_bit3_dis();
}
void seg7_led_init(void)//7段数码管显示初始化
{
seg7_data_ddr=0xff;
seg7_data_port=0x00;
seg7_bitselect_ddr|=0xf0;
seg7_bitselect_port|=0xf0;
}
#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{
uint8 key_buf=0,i=0,tmpi=0;
GICR=0x00;//关闭中断使能
DDRB=0x0f;
PORTB&=0xf0;
_NOP();
if((PINB&0x0F)!=0x0F)
{ //#1
delay100us(10);
if((PINB&0x0F)!=0x0F)
{ //#2
if((~PINB)&0x10)
key_buf=0;
else if((~PINB)&0x20)
key_buf=1;
else if((~PINB)&0x40)
key_buf=2;
else if((~PINB)&0x80)
key_buf=3;
DDRB=0xf0;
PORTB=0x0f;
delay100us(10);
if((~PINB)&0x01)
key_buf+=0;
else if((~PINB)&0x02)
key_buf+=4;
else if((~PINB)&0x04)
key_buf+=8;
else
key_buf=16;
tmpi=PINB;
if((key_buf!=16)&&(key_buf!=10)&&(key_buf!=11))
{
for(i=3;i!=0;i--)
{
seg7_led_buff[i]=seg7_led_buff[i-1];//移位显示
}
seg7_led_buff[0]=key_buf;
tmpi=PINB;
while((~PINB)&0x07)//按键释放检测,如不释放就一直循环
;
}
else if(key_buf==10)
;
else if(key_buf==11)
;
DDRB=0x0f;
PORTB=0xf0;
} //end of #2
} //end of #1
GICR=0x40;//中断复位
}
void main(void)
{
DDRB=0x0f;//PB3 out
PORTB&=0xF8;
PORTB|=0xF0;//PORTB置1111x000
DDRD&=0xfb;
PORTD|=(~0xfb);
MCUCR&=(~0x03);
GICR=0x40;//使能中断INT0
SEI();
seg7_led_init();
while(1)
{
seg7_led_update();//数码管扫描
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -