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

📄 main.c

📁 《AVR单片机GCC程序设计》
💻 C
字号:
/*
	查询方式测试键盘程序
	main.c
	硬件:CA-M8
	时钟:4MHz
	
	芯艺 2004-12-17
*/

#include <avr/io.h>
#include <avr/delay.h>

#define uchar unsigned char
#define uint  unsigned int

#define FREQ   4

#define SER_PORT	PORTD
#define SER_DAT	PD4
#define SER_RCK	PD5
#define SER_SCK	PD6

#define KEY0	PD2
#define KEY1	PD3

//显示码
uchar g_aDisplayBuf[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void DelayMs(uint t)
{
	uint i;
	for(i=0;i<t;i++)
		_delay_loop_2(250 * FREQ);
}

//向595 写一字节
void ser_out(uchar dat)
{
	uchar i;

	for(i=0;i<8;i++)
	{
		if(dat&0x80)
			SER_PORT|=_BV(SER_DAT);
		else
			SER_PORT&=~_BV(SER_DAT);
		
		SER_PORT|=_BV(SER_SCK);
		SER_PORT&=~_BV(SER_SCK);
		dat<<=1;
	}
}
//数码管显示数(0~255)
//num :显示的数   hex:是否用十六进制显示
void display_number(uchar num,uchar hex)
{
	uchar buf[2];//发送显示码缓冲区
	uchar temp;
	
	if(hex) //十六进制
	{
		buf[0]=g_aDisplayBuf[num>>4];//高位
		buf[1]=g_aDisplayBuf[num&0x0f];//低位
	}
	else//十进制
	{
		buf[1]=g_aDisplayBuf[num%10];
		temp=num%100;
		buf[0]=g_aDisplayBuf[temp/10];
		temp=num/100;
		
		if(temp>0)
			buf[1]|=0x80; //第一个数码管小数点表示百位1
		if(temp>1)
			buf[0]|=0x80;//两个数码管小数点表示百位2
	}
	
	//串行发送数据
	ser_out(buf[0]);
	ser_out(buf[1]);

	//显示
	SER_PORT|=_BV(SER_RCK);
	SER_PORT&=~_BV(SER_RCK);
}

//扫描键盘
uchar GetKey(void)
{
	uchar ret=0;
	while(1)
	{
		if(!(PIND&_BV(KEY0)))
		{
			//延时消抖
			DelayMs(5);
			if(!(PIND&_BV(KEY0)))
			{
				ret=0;
				break;
			}
		}	
		if(!(PIND&_BV(KEY1)))
		{
			//延时消抖
			DelayMs(5);
			if(!(PIND&_BV(KEY1)))
			{
				ret=1;
				break;
			}
		}
		DelayMs(5);
	}
	//等待弹起
	while((PIND & (_BV(KEY0)|_BV(KEY1)))!=(_BV(KEY0)|_BV(KEY1)))
		DelayMs(1);
	return ret;
}

int main(void)
{
	uchar i=0,flag=0,key;
	DDRD=_BV(SER_DAT)|_BV(SER_SCK)|_BV(SER_RCK);
	PORTD=_BV(KEY0)|_BV(KEY1);//键盘引脚上拉电阻开
//	DDRB=_BV(PB0)|_BV(PB1);
	
	display_number(i,flag);
	while(1)
	{
		key=GetKey();
		switch(key)
		{
		case 0:		//显示数据加一
			display_number(++i,flag);
			break;
		case 1:		//十进制和十六进制间切换
			flag=!flag;
			display_number(i,flag);
			break;	
		default:
			break;
		}
	}
}

⌨️ 快捷键说明

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