⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 一个关于AVR单片机的例程
💻 C
字号:
//ICC-AVR application builder : 2007-5-23 0:45:25
// Target : M16
// Crystal: 7.3728Mhz

#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 + -