📄 main._c
字号:
/*****************************************
* 基于T/C0的定时器设计 *
* 功 能:定时器 *
* 时钟频率:外部7.3728M *
* 设 计:莫锦攀 *
* 修改日期:2007年07月30日 *
* 编译环境:ICC-AVR6.31 *
* 实验环境:M16学习板 *
* 使用端口:PC6,PC7,PA4~PA7 *
*使用1M频率时不够精确所以用8M的了,注意要 *
*使用T/C0定时功能前的初始化工作 *
*****************************************/
#include <iom16v.h>
#include "1602.h"
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
uchar data[5]={0,0,0,0,0};//显示的初始值:0,0,0,0
uint cnt=0; //初始计数值:0
uchar timer[2]={0,0};//初始时间00:00
//********计数值处理函数******************//
void process(uchar *i,uchar *p)
{p[0]=i[0]/10+48;//分的高位
p[1]=i[0]%10+48;//分的低位
p[2]=i[1]/10+48;//秒的高位
p[3]=i[1]%10+48;//秒的低位
//注意这里加48是因为ASCII码中数字都要加48的原因
}
//************液晶显示函数******************//
void lcd(void)
{
LCD_write_string(2,0,"Timer by MJP");
LCD_write_char(6,1,data[0]);
LCD_write_char(7,1,data[1]);
LCD_write_char(8,1,':');
LCD_write_char(9,1,data[2]);
LCD_write_char(10,1,data[3]);
}
//************T/C0中断服务函数******************//
#pragma interrupt_handler Timer0:10
void Timer0(void)
{cnt++;
if(cnt==450)//450*64*256=7372800
{cnt=0;
timer[1]++;//秒加1
if(timer[1]==60){timer[1]=0;timer[0]++;}//分加1
if(timer[0]==60){timer[0]=0;}//计数达到最高,重新开始
}
}
//************初始化函数******************//
void init(void)
{
LCD_init();//液晶初始化
SEI();//开全局中断
TCCR0=0x03;//系统时钟64分频
TCNT0=0x00;//tcnt清零
TIMSK=0x01;//打开T/C中断屏蔽寄存器
}
void main(void)
{init();//初始化
while(1)
{
process(timer,data);//计数值处理
lcd();//显示
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -