📄 xf.c
字号:
/*************************************************************
定时器中断是外设级中断,原理就是将事件管理器的中断通过内核级中断int2送到CPU,
发出中断请求,这时如果全局中断INTM为0时将会调入执行中断服务子程序
时间:2008年11月14日
*************************************************************/
/************************文件预处理***************************/
#include "exp3_2407.h"
#include "stdio.h"
ioport short port8001; //输出端口地址定义
unsigned int flag=0,sec=0,min=0,hour=0;
unsigned char dis_buf[8];
void inc_sec();
void inc_min();
void inc_hour();
ioport unsigned port8002; //写lcd指令地址
ioport unsigned port8003; //写lcd数据地址
/*******************函数、子程序声明与定义********************/
void sys_ini() //系统初始化子程序
{
/*关总中断*/
asm(" setc INTM");
/*抑制符号位扩展*/
asm(" clrc SXM");
/*累加器中结果正常溢出*/
asm(" clrc OVM");
/*禁止看门狗*/
* WDCR=0x00E8;
/*CLKIN=10M,CLKOUT=40M*/
* SCSR1=0x0006;
* IFR=0xFFFF; /*初始化标志寄存器*/
}
void timer1_ini() //定时器1初始化子程序
{
/*使能内核级中断int2*/
* IMR=0x0002;
/*使能T1PINT中断*/
* EVAIMRA=0x0080;
/*清EVA中断标志*/
* EVAIFRA=0xFFFF;
/*约200ms产生一次中断*/
* T1PER=0xF424;
/*计数器清零*/
* T1CNT=0x0000;
/*连续增计数模式,预分频为128,定时器计时使能,内部时钟,定时器1比较使能*/
* T1CON=0x170C;
asm(" clrc INTM");
}
void delay_ms() //延时40ms
{
unsigned int k;
for(k=0;k<10000;k++);
}
void delay_us() //延时100us
{
unsigned int k;
for(k=0;k<25;k++);
}
void lcd_ini()
{
delay_ms(); //延时40ms
port8002=0x0030; //8位控制界面,基本指令集
delay_us();
port8002=0x0030; //8位控制界面,基本指令集
delay_us();
port8002=0x000C; //整体显示,显示游标 ,显示游标位置
delay_us();
port8002=0x0001; //清除显示
delay_ms();
port8002=0x0006; //光标右移
delay_us();
}
void lcd_show(unsigned char a[])
{
int x;
unsigned char * string=a;
port8002=0x0001;
for(x=0;x<strlen(a);x++)
{//asm(" setc INTM");
port8003=* string;
string++;
delay_us();
//asm(" CLRC INTM");
}
}
/*****************中断服务子程序声明与定义********************/
interrupt void INT2()
{
/*定时器1周期中断的外部中断向量是0x0027,课本259*/
flag++;
if(flag%5==0)sec++; /*点亮LED1灯,1秒钟*/
inc_sec();
inc_min();
inc_hour();
* EVAIFRA=* EVAIFRA&0x0080; /*清除定时器1周期中断标志,必须手动清除,否则将会忽略下次中断*/
* T1CNT=0x0000; /*定时器1计数器清0*/
}
void inc_sec()
{ if(sec>59)
{ sec=0;
min++;}
dis_buf[0]=sec%10|0x30;
dis_buf[1]=sec/10|0x30;
}
void inc_min()
{ if(min>59)
{ min=0;
hour++;}
dis_buf[3]=min%10|0x30;
dis_buf[4]=min/10|0x30;
}
void inc_hour()
{ if(hour>=23)
{ hour=0;
}
dis_buf[6]=hour%10;
dis_buf[7]=hour/10;
}
void interrupt nothing() //哑中断子程序
{
return;
}
void lcd_dat(unsigned char dat) //显示单个字符
{
port8003=dat;
delay_us();
}
void lcd_showtime(unsigned char dis_buf[8])
{ unsigned char b[]="当前时间";
dis_buf[2]=':';
dis_buf[5]=':';
inc_sec();
inc_min();
inc_hour();
port8002=0x92;
lcd_show(b);
delay_ms();
port8002=0x8A;
delay_ms();
lcd_dat(dis_buf[7]|0x30);
lcd_dat(dis_buf[6]|0x30);
lcd_dat(dis_buf[2]);
lcd_dat(dis_buf[4]|0x30);
lcd_dat(dis_buf[3]|0x30);
lcd_dat(dis_buf[5]);
lcd_dat(dis_buf[1]|0x30);
lcd_dat(dis_buf[0]|0x30);
}
/**************************主程序*****************************/
void main(void)
{
sys_ini();
timer1_ini();
lcd_ini();
asm(" CLRC INTM"); /*开总中断*/
* T1CON=* T1CON|0x0040; /*使能定时器1*/
//port8002=0x92;
//lcd_show(b);
//delay_ms();
while(1)
{
//delay_ms();
lcd_showtime(dis_buf);
//delay_ms();
}
}
/***************************结束******************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -