📄 main.c
字号:
/*
中断方式测试键盘程序
文件名:main.c
硬件:CA-M8
时钟:4MHz
芯艺 2004-12-17
*/
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.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};
uchar g_bCounter=0;
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);
}
//外部中断0
SIGNAL(SIG_INTERRUPT0)
{
DelayMs(100);
display_number(++g_bCounter,0);
GIFR|=_BV(INTF0);//写1清除中断标志,消抖
}
int main(void)
{
DDRD=_BV(SER_DAT)|_BV(SER_SCK)|_BV(SER_RCK);
PORTD=_BV(KEY0)|_BV(KEY1);//键盘引脚上拉电阻开
MCUCR=_BV(ISC00)|_BV(ISC01);//上升沿触发
GICR=_BV(INT0);//外部中断0允许
sei(); //总中断允许
display_number(g_bCounter,0);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -