📄 main.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 + -