AVRmega16基本程序
- 格式:doc
- 大小:108.50 KB
- 文档页数:21
枯藤老树昏鸦,小桥流水人家,古道西风瘦马。夕阳西下,断肠人在天涯。/*********************************************************************
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);
} //送選通信號;
/************************************************************