微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Atmega16单片机实用程序

Atmega16单片机实用程序

时间:12-01 来源:互联网 点击:
/*********************************************************************

MCU: ATmega16

外部晶振: 8MHz

程序功能: 4*4鍵盤識別,LED七段數碼管顯示,密碼功能模塊,直流電機正反轉控制

AD轉換模塊, 模擬比較器,外部中斷應用,12864液晶,C/T0

硬件設計: 參考PROTUES硬件仿真電路

調試: 所有程序主要功能都軟硬件仿真通過,實際使用時要根據需要加入可靠性。

編譯環境: ICC AVR

Design by: wdw

********************************************************************/

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define SET_1(a,b) a|=bit(b) //將寄存器a的第b位置1

#define CLR_0(a,b) a&=~bit(b) //將寄存器a的第b位清0

#program date code:

const date[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,//共陽數據;

0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

#program duan code:

const duan[]={0x20,0x10,0x08,0x04,0x02,0x01}; //段選;

char adchannel;

int dispbuf[]={0,0,0,0,0,0,}; //顯示緩存;

uchar securbuf[]={0,0,0,0,0,}; //5位密碼緩存;

/********************************************************************

名稱:ms延時子函數

功能:延時指定的ms

*********************************************************************/

void delayms(int ms)

{

int i,j;

for(i=ms;i>0;i--)

{

for(j=1722;j>0;j--); //8M时改为1141;

} //12M时为1722;

}

/*******************************************************************

名稱:us延時子程序

功能:延時指定的us

********************************************************************/

void delayus(uchar us)

{

for(us;us<0;us--);

{

} //12M时单位T为1.45US

}

/********************************************************************

单参数LED 显示

硬件连接:数据PORTC-----D7~D0

段选PORTD-----D7~D4

*********************************************************************/

void LEDShow(long int shownum)

{

uchar i,tmp,curnum;

long int tmpnum;

tmp = 0xfb;

tmpnum = shownum;

for(i=0;i<6;i++) //显示的位数为5

{

curnum = tmpnum % 10;

tmpnum = tmpnum / 10;

PORTD = tmp;

PORTC = date[curnum];

delayus(1);

tmp = (tmp < 1) + 0x01; //补上移位造成的最右位为0;

}

}

/*******************************************************

名稱:七段LED共陽數碼管,在指定数位上显示指定的数,双参数

功能:在指定的位置上顯示制定的數;

硬件連接:PC口複用控制段選和位選,有2片573進行數據鎖存;

*******************************************************/

void show(uchar dat,uchar num) //六位七段數碼管顯示程序OK;

{

PORTC=date[dat];

PORTD|=BIT(0);

PORTD&=~BIT(0); //送數據;

delayus(2);

PORTC=0X00;

delayus(1);

PORTC=duan[num];

PORTD|=BIT(1);

delayus(2);

PORTD&=~BIT(1);

delayus(2);

} //送選通信號;

/************************************************************

名稱:MCU端口初始化

功能:設置MCU端口初始方向為輸出初始狀態為低

*************************************************************/

void Gpioinit0()

{

DDRA=0XFF;

PORTA=0X00;

DDRB=0XFF;

PORTB=0X00;

DDRC=0XFF;

PORTC=0X00;

DDRD=0XFF;

PORTD=0X00;

}

/***********************************************************

名稱:MCU端口初始化

功能:設置MCU端口初始為輸出初始狀態為高

************************************************************/

void Gpioinit1()

{

DDRA=0Xff;

PORTA=0XFF;

DDRB=0xff;

PORTB=0XFF;

DDRC=0xff;

PORTC=0XFF;

DDRD=0xff;

PORTD=0XFF;

}

/**************************************************

名稱:單端口測試

輸入:測試PC的任意端口號0~7

功能:週期改變一個端口的電平

**************************************************/

void IOtest(uchar num)

{

DDRC|=BIT(num);

// while(1)

// {

PORTC|=BIT(num);

delayms(50);

PORTC&=~BIT(num);

delayms(50);

// }

}

/*************************************************

名稱:按鍵動作檢測子程序。

功能:檢測4*4鍵盤是否有鍵按下;

硬件

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top