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

📄 atmega8.c

📁 这个程序的对象是mega8单片机
💻 C
字号:
/*********************************************/
/*          Design target: ATMEGA8           */
/*              Author: joanhn               */
/*       Mail: joanhn789@vip.sina.com        */
/*     Mail2: joanhn@163.com QQ: 19321364    */
/*  Phone: 0379-68282215 Mobile:13526945688  */
/*********************************************/
#include <iom8v.h>
#include <macros.h>
#include <general.h>
#define byte unsigned char
#define word unsigned int
//define the macro of the bit operation//
#define set_bit(byteadd,bitadd) (byteadd|=(1<<bitadd))
#define clr_bit(byteadd,bitadd) (byteadd&=~(1<<bitadd))
#define get_bit(byteadd,bitadd) (byteadd&(1<<bitadd))
//modify the list parameter while exchanging device//
#define key_l0 2
#define key_l1 3
#define key_read_row(dat) (dat=PINC&(0x0f))
#define key_line_output() (DDRD=(1<<key_l0)|(1<<key_l1))
#define key_row_input() {DDRC&=0xf0;PORTC=(1<<0)|(1<<1)|(1<<2)|(1<<3);}
#define key_l0_clr() (PORTD&=~(1<<key_l0))
#define key_l0_set() (PORTD|=(1<<key_l0))
#define key_l1_clr() (PORTD&=~(1<<key_l1))
#define key_l1_set() (PORTD|=(1<<key_l1))
#define key_4x4_line_output() {DDRD|=0xf0;PORTD&=0x0f;}
#define key_4x4_line_input() {DDRD&=0x0f;PORTD|=0xf0;}
#define key_4x4_row_output() {DDRB|=0x0f;PORTB&=0xf0;}
#define key_4x4_row_input() {DDRB&=0xf0;PORTB|=0x0f;}
#define key_4x4_get_line(dat) (dat=PIND&(0xf0))
#define key_4x4_get_row(dat) (dat=PINB&(0x0f))

const byte keytab[]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7};

/*********Delay 10us FOSC=12M*********/
void delay_us(byte time)
{
 	byte i;
	while(time--) for(i=28;i;i--) ;
}
void DelayMs(byte number)
{
	byte temp;
	for(;number;number--)
	{
		for(temp=250;temp;temp--) ;
	}
}

void delay_ms(byte number)
{
	byte temp,cnt8;
	for(;number;number--)
		for(temp=250;temp;temp--)
			for(cnt8=8;cnt8;cnt8--) ;
}

void key_init_2x4(void)
{
 	key_line_output();
	key_row_input();
	key_l0_clr();
	key_l1_clr();
}

void key_init_4x4(void)
{
 	key_4x4_row_output();
	key_4x4_line_input();
}

byte key_scan_2x4(void)
{
  	byte ktmp,key;
	key=0;
	key_l0_clr();
	key_l1_clr();
	delay_ms(10);
	key_read_row(ktmp);
	while(ktmp==0x0f) key_read_row(ktmp);
	key_read_row(ktmp);
	if(ktmp!=0x0f)
	{
	 	delay_ms(100);
		key_read_row(ktmp);
		if(ktmp!=0x0f)
		{
		 	key_l0_clr();
			key_l1_set();
			delay_ms(15);
			key_read_row(ktmp);
			key=ktmp;
			key_l0_set();
			key_l1_clr();
			delay_ms(15);
			key_read_row(ktmp);
			key|=(ktmp<<4);
			key_l0_clr();
			key_l1_clr();
			delay_ms(15);
			key_read_row(ktmp);
		}
	}
	return(key);
}

byte key_scan_4x4(void)
{
 	byte ktmp,key;
	key=0;
	key_4x4_line_output();
	key_4x4_row_input();
	key_4x4_get_row(ktmp);
	while((ktmp&0x0f)==0x0f) key_4x4_get_row(ktmp);
 	delay_ms(10);
	key_4x4_get_row(ktmp);
	if((ktmp&0x0f)!=0x0f)
	{
		key=(ktmp&0x0f);
		key_4x4_row_output();
		key_4x4_line_input();
		delay_ms(10);
		key_4x4_get_line(ktmp);
		if((ktmp&0xf0)!=0xf0)
		{
			key+=(ktmp&0xf0);
			while((ktmp&0xf0)==0xf0) key_4x4_get_line(ktmp);
			key_4x4_line_output();
			key_4x4_row_input();
			for(ktmp=0;ktmp<16;ktmp++)
			{
				if(key==keytab[ktmp]) return(ktmp);
			} 
			return(0xff);
		}
		else return(0xff);
	}
	else return(0xff);
}

void hex2compressbcd(word dat,byte * decimal_dat)
{
  	*decimal_dat=dat/10000+0x30;
	*(decimal_dat+1)=(dat%10000/1000)+0x30;
	*(decimal_dat+2)=(dat%1000/100)+0x30;
	*(decimal_dat+3)=(dat%100/10)+0x30;
	*(decimal_dat+4)=(dat%10)+0x30;
}
/*
void hex2compressbcd(word dat,byte *dh,byte *dm,byte *dl)
{
  	*dh=dat/10000;
	*dm=dat%10000/1000;
	*dm=*dm<<4;
	*dm|=(dat%1000/100);
	*dl=dat%100/10;
	*dl=*dl<<4;
	*dl|=dat%10;
}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -