📄 xf.c
字号:
/*************************************************************
定时器中断是外设级中断,原理就是将事件管理器的中断通过内核级中断int2送到CPU,
发出中断请求,这时如果全局中断INTM为0时将会调入执行中断服务子程序
时间:2009年3月8日
注意:关键是有些中断需定义成全局的
*************************************************************/
/************************文件预处理***************************/
#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();
void SheZhi();
unsigned char xianshi;
char send_buff=0x00;//发送指令
char rece_buff=0x00;//接收指令
unsigned char m[]="设置时间:";
unsigned int data_buff=0x0000;
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,使能evb外围模块*/
* SCSR1=0x0008;
/*将iope1,2,3配置为输出脚 ,且iope3初始值为0,iope1,iope2初始值为1*/
* PEDATDIR=0x0E06;
/*将iopf6配置为输出脚,且iopf6初始值为1|这四个端口分别连接7279的四个控制端口*/
* PFDATDIR=0x4040;
/*清除所有中断标志,"写1清0"*/
* IFR=0xFFFF;
}
void timer1_ini() //定时器1初始化子程序
{
/*使能内核级中断int2*/
* IMR=0x0002;
/*使能T1PINT中断*/
* EVAIMRA=0x0080;
/*清EVA中断标志*/
//* EVAIFRA=0xFFFF;
/*约200ms产生一次中断*/
* T1PER=0xF424;
/*计数器清零*/
* T1CNT=0x0000;
/*连续增计数模式,预分频为128,定时器计时使能,内部时钟,定时器1比较使能*/
* T1CON=0x174C;
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");
}
}
void lcd_show1(char a)
{
port8003=a;
delay_us(1000000);
}
/*****************中断服务子程序声明与定义********************/
interrupt void INT2()
{
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 pdpintb_ini() //int1中断初始化子程序
{
/*清除所有中断标志*/
* IFR=0xFFFF;
/*使能中断1*/
* IMR=0x0001;
/*清除pdpintb中断标志*/
* EVBIFRA=0xFFFF;
/*使能pdpintb中断,功率驱动保护中断使能*/
* EVBIMRA=0x0001;
/*开总中断*/
asm(" clrc INTM");
}
void delay_8us() //延时8us子程序
{
unsigned int i;
for(i=0;i<2;i++);
}
void delay_50us() //延时50us子程序
{
unsigned int j;
for(j=0;j<25;j++);
}
void delay_25ms() //延时25ms子程序
{
unsigned int k;
for(k=0;k<12500;k++);
}
void delay_long()
{
unsigned int n;
for(n=0;n<60000;n++);
for(n=0;n<60000;n++);
}
void cs_high()
{
* PFDATDIR|=0x0040; //7279cs高
}
void cs_low()
{
* PFDATDIR&=0xFFBF; //7279cs低
}
void send()
{
unsigned int m;
cs_low();
delay_50us(); //延时50us,等待CLK时钟脉冲;
for(m=0;m<8;m++)
{
switch(send_buff&0x80)
{
case 0x00:* PEDATDIR&=0xFFFB;break; //7279data低
case 0x80:* PEDATDIR|=0x0004; //7279data高
}
* PEDATDIR|=0x0008; //7279clk高 ,产生同步时钟上升沿以使数据有效
delay_8us();
* PEDATDIR&=0xFFF7; //7279clk低 // 完成一个时钟脉冲
delay_8us();
send_buff<<=1; //左移接受下一位数据
}
}
/*7279作为接收方接收数据*/
void receive()
{
unsigned int s;
unsigned char num;
* PEDATDIR&=0xFBFD; //将iope2配置为输入脚
delay_50us();
for(s=0;s<8;s++)
{//接收数据是在高电平状态下完成的
* PEDATDIR|=0x0008; //7279clk高
delay_8us();
//前八位是指令,后八位是接收的数据
data_buff=data_buff|((* PEDATDIR&0x0004)<<(13-s));//读iope2引脚数据; * PEDATDIR高八位没用
* PEDATDIR&=0xFFF7; //7279clk低
delay_8us();
}
rece_buff=data_buff>>8;
/*for(s=0;s<8;s++)
{
* PEDATDIR|=0x0008; //7279clk高
delay_50us();
num=* PEDATDIR&0xFBFD;
if(num)
{
rece_buff= * PEDATDIR&0x0004;
rece_buff<<=1;
rece_buff= rece_buff|0x0004;
}
* PEDATDIR&=0xFFF7; //7279clk低
delay_8us();
}
rece_buff>>=3;*/
// return(rece_buff);
data_buff=0x0000; //清除data_buff
* PEDATDIR|=0x0402; //将iope2配置为输出脚,7279收数据
}
interrupt void pdpintb()
{
send_buff=0x15; //读键值指令
send();
receive();
send_buff=0xA0; //数据右移指令
send();
send_buff=0xC8;
send();
send_buff=rece_buff;//将接收到的键值送显示
send();
// SheZhi();
//xinshi=rece_buff;
/*if(xianshi<0xA){
lcd_show1(xianshi+48);}
else lcd_show1(xianshi+55);*/
* EVBIFRA=0xFFFF; //清除PDPINTB中断标志
return;
}
/*unsigned char read7279(unsigned char command)
{send_buff=command;
send(command);
return(receive());
}*/
////////////////////////识别按键改写时间程序(未写完)//////////////////////////
void SheZhi()
{ unsigned char key_number;
unsigned int i=0,status=0; //状态值
unsigned char m[]="设置时间:";
unsigned char shezhi[8];
// * T1CON=* T1CON|0x0040; /*使能定时器1*/
if(* PEDATDIR&0xFBFD)
{
if (rece_buff==0x0c) //如果设置键按下
{ status=1;
port8002=0x0001;
port8002=0x92;
lcd_show(m);
delay_ms();
}
else {if(status==0)lcd_showtime(dis_buf);
else
{
port8002=0x8A;
//delay_ms();
lcd_dat(shezhi[6]);
lcd_dat(shezhi[7]);
// for(i=0;i<6;i++)
// { {if(* PEDATDIR&0xFBFD)
// shezhi[i]=rece_buff&0x0F;
//lcd_dat(shezhi[i]|0x30);}
// }
}
}
}
else lcd_showtime(dis_buf);
}
/**************************主程序*****************************/
void main(void)
{
sys_ini();
timer1_ini();
pdpintb_ini();
lcd_ini();
//asm(" CLRC INTM"); /*开总中断*/
// * T1CON=* T1CON|0x0040; /*使能定时器1*/
while(1)
{
delay_ms();
SheZhi();
delay_ms();
/*if (rece_buff==0x0c) //如果功能键按下
{
//port8002=0x0001;
while(1)
{
port8002=0x92;
delay_ms();
lcd_show(m);}
//if (status<3) //如果状态值小于最大状态值,则状态值加1
// status++;
// else status=0; //否则,状态值置最小状态值
//rece_buff=0; //清键值
if(rece_buff==0x0a)lcd_showtime(dis_buf);
}
else lcd_showtime(dis_buf);*/
}
}
/***************************结束******************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -