📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** ADEmbed Development Co.,LTD.
** http://www.adembed.com
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2008-12-13
** Last Version: 1.0
** Descriptions: Nixie Light Test.
**
**------------------------------------------------------------------------------------------------------
** Created by: junbolu
** Created date: 2008-12-13
** Version: 1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
**ICC-AVR application builder : 2008-12-13
**Target : M16
**Crystal: 7.3728Mhz
**PA0~PA7口接LED的段码
**PB0~PB3口接LED的位选
**描述:这是一个秒表实验,最大支持99.99秒。由按键K0完成启动计时和停止计时。
**涉及知识点:
** T/C0的CTC工作模式
** INT0的下降沿中断工作模式
*******************************************************************************************************/
#include<iom16v.h>
#include<macros.h>
#define fose 7372800
#define START 0
#define STOP 1
#define CLEAR 3
unsigned char Nixie_State;
unsigned int time_10ms;
unsigned char DISP_NUM; //显示的位数
unsigned char BitTab[]={0xFE,0xFD,0xFB,0xF7}; //三位位选码
unsigned char DispTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //LED字形码
unsigned char DISP_DATA[4]; //显示的数字
void Display(void);
void INT0_Init()
{
GIFR |=0X40; //清楚标志位
//MCUCR|=0X03; //上升沿触发中断
MCUCR|=0X02;MCUCR&=~0X01; //下降沿触发中断
GICR |=0X40; //使能外部中断0
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
if((PIND&0x04)!=0x00) //读取按键状态
{
return;
}
if(Nixie_State ==STOP)
{
time_10ms = 0;
Nixie_State = START;
}
else
{
Nixie_State = STOP;
}
}
//显示函数,DISP_NUM决定显示哪个LED
//采用共阴LED动态显示方法,定时中断函数里面调用
void Display(void)
{
PORTA=0x00; //清除显示再位选
PORTB=BitTab[DISP_NUM]; //PB口接位选
PORTA=DispTab[DISP_DATA[DISP_NUM]]; //PA口接LED的段码
if(DISP_NUM==1)
PORTA|=0x80; //PA口接LED的段码
DISP_NUM++; //先显示低位,再显示高位
if(DISP_NUM==4)
DISP_NUM=0;
}
#pragma interrupt_handler timer0comp:20
void timer0comp (void)
{
if(Nixie_State == START)
{
if(time_10ms<9999)
{
time_10ms++;
}
}
DISP_DATA[0]=time_10ms/1000;
DISP_DATA[1]=(time_10ms/100)-(DISP_DATA[0]*10);
DISP_DATA[3]=time_10ms%10;
DISP_DATA[2]=((time_10ms%100)-DISP_DATA[3])/10;
Display();
}
void main(void)
{
DDRA=0XFF;
PORTA=0X00;
DDRB=0X0F;
PORTB=0X00;
//按键0端口初始化
DDRD &=~0x04; //设置PD2为输入
PORTD|=0x04; //设置PD2为上拉
INT0_Init(); //TART初始化
//t/c0初始化(10ms)
TCCR0=0X0d;
TCNT0=0X00;
OCR0=0X48;
TIMSK=0X02;
time_10ms=0;
//asm("sei");
SEI(); //全局中断使能
Nixie_State = STOP;
for(;;)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -