📄 firstbb1.c
字号:
/*********************头文件预定义***********************/
#include<iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
//数码管引脚顺序0-7:edhcgafb
/*****管脚定义******/
/* 1 a f 2 3 b */
/* e d h c g 4 */
/*********************/
uchar const SEG[10]={0x14,0x77,0x4c,0x45,0x27,
0x85,0x84,0x57,0x04,0x05}; //共阴数码管0-9段选
uchar const DIG[4]={0x40,0x20,0x10,0x08}; //4位位选
static uint c,cont=0,second=0,minute=0;
/**********************延时子程序************************/
/*void delay_ms(uint k) //毫秒级延时子函数
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<570;j++);
}
}
/********************键盘读取子程序**********************/
uchar key_read(void)
{
uchar lie;
uchar i;
DDRC=0xff; //PC口设为输出
DDRD=0x00; //PD口设为输入
PORTC=0x00; //PC口初始化输出0
PORTD=0xff; //PD口初始化为弱上拉输入
for(i=0;i<10;i++);//延时等待
lie=PIND;
PORTD=0xff; //端口状态切换过渡
switch (lie) {/*将按键码转换成键值*/
case 0xff: return 0;
default : return 1;
}
}
uchar get_key(void)
{
unsigned char i;
static unsigned char j;//按键记录
i = key_read();
if (i == 0)//无有效按键按下
{
j = 0;//清除按键记录
return 0;//程序退出
}
j = i;//保存本次采样结果
//去按键颤抖
return i;
}
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xF3; //setup
TCNT1L = 0xCB;
OCR1AH = 0x0C;
OCR1AL = 0x35;
OCR1BH = 0x0C;
OCR1BL = 0x35;
ICR1H = 0x0C;
ICR1L = 0x35;
TCCR1A = 0x00;
TCCR1B = 0x04; //start Timer
}
/************************主程序**************************/
int main(void)
{
CLI();
DDRB=0xff; //PB口设为输出
DDRA=0xff; //PA口设为输出
PORTB=0xff; //PB口初始化输出1
PORTA=0x00; //PA口初始化输出0 数码管关闭
TCNT0=0xe3;//<1ms的定时初值
TCCR0=0x03;//定时器0的计数预分频取64
timer1_init();
TIMSK=0x05;//使能T/C0-1中断
SREG=0x80;//使能中断
SEI();
while(1);
}
/**************T/C0中断服务子程序********************/
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
SREG=0x80;//使能中断
TCNT0=0xe3;//重装1ms定时初值
if(++c>3) c=0;
switch(c)
{
case 0: PORTB=SEG[cont];PORTA=DIG[0];break;
case 1: PORTB=SEG[second%10];PORTA=DIG[1];break;
case 2: PORTB=SEG[second/10];PORTA=DIG[2];break;
case 3: PORTB=SEG[minute];PORTA=DIG[3];break;
default: break;
}
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
SREG=0x80;//使能中断
timer1_init();
if(get_key()==0)
{
cont++;
if(cont==10)
{
cont=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==10) minute=0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -