?? mega8_0.c
字號:
//mega8_0.c : source file for the mega8設計 project
//
#include "mega8_0.h"
#include "inttypes.h"
#include "io.h"
#include "avr/signal.h"
#include "avr/interrupt.h"
#include <delay.h>
/////////////////////////////////////////////////////////////////////////////
//mega8_0
static unsigned char dis[16]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x09,0x0a,0x38,0x9c,0x68,0x1c,0x1e};
unsigned char key_get=0;
static void io_init(void)
{
//{{WIZARD_MAP(General)
//}}WIZARD_MAP(General)
//{{WIZARD_MAP(I/O Ports)
// PortB
PORTB = 0x0;
DDRB = 0x07;
// PortC
PORTC = 0x3f;
DDRC = 0x30;
// PortD
PORTD = 0xc4;
DDRD = 0xc0;
//}}WIZARD_MAP(I/O Ports)
//{{WIZARD_MAP(Watchdog)
// Watchdog Enabled, Prescaler: OSC/16k
wdt_disable();
//}}WIZARD_MAP(Watchdog)
//{{WIZARD_MAP(Analog Comparator)
// Analog Comparator Disabled
ACSR = 0x80;
//}}WIZARD_MAP(Analog Comparator)
}
int main(void)
{
//{{WIZARD_MAP(Initialization)
io_init();
//}}WIZARD_MAP(Initialization)
// TODO: Add extra initialization here
GICR=1<<INT0;
MCUCR=((1<<ISC01)|(0<<ISC00));
sei(); //中斷使能
//{{WIZARD_MAP(Global interrupt)
//}}WIZARD_MAP(Global interrupt)
while(1)
{
// TODO: Add your code here
/*
led();
led_red();
*/
get_k();
shuma();
}
}
/**********************************************
7.1 中斷實驗
說明:INT0中斷,下降沿觸發中斷
*********************************************/
SIGNAL(SIG_INTERRUPT0)
{int i;
for (i=0;i<2;i++)
{
cbi(PORTC,5);
delay(500,8000);
sbi(PORTC,5);
cbi(PORTC,4);
delay(500,8000);
sbi(PORTC,4);
cbi(PORTD,6);
delay(500,8000);
sbi(PORTD,6);
cbi(PORTD,7);
delay(500,8000);
sbi(PORTD,7);
}
}
/*****************************************************************
6.1 4個LED燈顯示
硬件連接:PC5->D0 PC4->D1 PD6->D2 PD7->D3
*****************************************************************/
/*
void led(void)
{
if (bit_is_clear(PINC,0))
cbi(PORTC,5);
else
sbi(PORTC,5);
if (bit_is_clear(PINC,1))
cbi(PORTC,4);
else
sbi(PORTC,4);
if (bit_is_clear(PINC,2))
cbi(PORTD,6);
else
sbi(PORTD,6);
if (bit_is_clear(PINC,3))
cbi(PORTD,7);
else
sbi(PORTD,7);
}
*/
/***********************************************
6.2 紅綠燈控制
硬件:PC5->D0(紅燈) PC4->D1(綠燈)
說明:紅燈與綠燈交替閃爍,間隔1秒
************************************************/
/*
void led_red(void)
{ int i;
for(i=0;i<5;i++)
if((bit_is_clear(PINC,0))&&(bit_is_clear(PINC,1)))
{
cbi(PORTC,5);
delay(1000,8000);
sbi(PORTC,5);
cbi(PORTC,4);
delay(1000,8000);
sbi(PORTC,4);
}
}
*/
/*******************************************************
6.3 單個8段LED數碼管顯示
說明:推上開關S0,數碼管顯示1;推上S1,顯示2;依次類推。
*********************************************************/
void shuma(void)
{
if (key_get==1)
{cbi(PORTC,5);
led_out(dis[1]);}
else
{sbi(PORTC,5);
led_out(dis[0]);}
if (key_get==2)
{cbi(PORTC,4);
led_out(dis[2]);}
else
{sbi(PORTC,4);
led_out(dis[0]);}
if (key_get==3)
{cbi(PORTD,6);
led_out(dis[3]);}
else
{sbi(PORTD,6);
led_out(dis[0]);}
if (key_get==4)
{cbi(PORTD,7);
led_out(dis[4]);}
else
{sbi(PORTD,7);
led_out(dis[0]);}
}
/*******************************************************************************
595驅動LED數碼管輸出子程序
硬件連接:PB0->SER PB1->RCLK PB2->SRCLK
輸 入:8Bits字符a
輸 出:無
********************************************************************************/
void led_out(unsigned char a)
{
char i,d;
cbi(PORTB,1);//RCLK是鎖存時鐘信號,應獨立控制,等8位數據全部移出后再送出一個上升沿,
//以防移位時LED閃爍;
for(i=0;i<8;i++)
{
cbi(PORTB,2);
d=a&0x80;//判斷7位是否為1
if(d)
sbi(PORTB,0);//SER置1
else
cbi(PORTB,0);
a<<=1;
sbi(PORTB,2);//SRCLR接高電平,不進行清零輸出
}
sbi(PORTB,1);
}
/*****************************************
6.7 鍵盤掃描
作用:掃描鍵盤
輸出:按鍵編碼
******************************************/
unsigned char get_k(void)
{
unsigned char a;
a = PINC & 0x0f;
//delay(3,8000);
switch (a)
{
case 0x0e: key_get=1; break;
case 0x0d: key_get=2; break;
case 0x0b: key_get=3; break;
case 0x07: key_get=4; break;
default : key_get=0; break;
}
return key_get;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -