TA的每日心情 | 开心 2024-4-2 06:00 |
---|
签到天数: 5 天 [LV.2]偶尔看看I
中级会员
- 积分
- 218
|
本帖最后由 yhf3721 于 2023-6-4 15:30 编辑
/*********************************************************************************************
程序名: 简易时钟增强版
编写人: yhf37211
编写时间: 2023 年5 月 31日
硬件支持:
接口说明:
修改日志: v0.1
/*********************************************************************************************
说明:在冲哥视频作业的基础上,增加了按键用于调整时间。编写程序的目的,熟悉按键,数码管和定时器的使用。后续有时间可能会继续增加功能。
/*********************************************************************************************/
#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"
#define key1 P34 //定义一个按键 引脚选择P34
#define key2 P33 //定义一个按键 引脚选择P33
#define key3 P32 //定义一个按键 引脚选择P32
#define MAIN_Fosc 24000000UL //定义主时钟
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
u8 SEG_Tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9数字及横杠
u8 COM_Tab[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //0-7的位码数组
u8 Show_Tab[8] = {0,0,10,0,0,10,0,0};
u16 temp,num;
u16 hour,min,sec; //时间时分秒计数
void Show_Time();//时间显示函数
void Keyscan();//键盘扫描函数
void Sys_Init(); //端口初始化
void Delay_ms(u16 ms); //unsigned int
void Timer0_Init(void);
void Timer0_Init(void) //1毫秒@24.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main() //程序开始运行的入口
{
Sys_Init(); //USB功能+IO口初始化
usb_init(); //usb库初始化
Timer0_Init();
EA = 1; //CPU开放中断,打开总中断。
while(1) //死循环
{
if( DeviceState != DEVSTATE_CONFIGURED ) //
continue;
if( bUsbOutReady )
{
usb_OUT_done();
}
Keyscan();
}
}
void Keyscan()
{
if(key1==0)//调秒键按下
{
Delay_ms(20);
if(key1==0)//再次判断键是否按下
{
sec++;//秒加1
if(sec>=60)//判断秒是否到60S
sec=0;
}//到60S清零
while(key1==0);//释放键
}
if(key2==0)//调分,原理同上
{
Delay_ms(20);
if(key2==0)
{
min++;
if(min>=60)
min=0;
}
while(key2==0);
}
if(key3==0)//调时,原理同上
{
Delay_ms(20);
if(key3==0)
{
hour++;
if(hour>=24)
hour=0;
}
while(key3==0);
}
}
void Show_Time()
{
Show_Tab[0]=hour/10;
Show_Tab[1]=hour%10;
Show_Tab[2]=10;
Show_Tab[3]=min/10;
Show_Tab[4]=min%10;
Show_Tab[5]=10;
Show_Tab[6]=sec/10;
Show_Tab[7]=sec%10;
P7=COM_Tab[num];
P6=SEG_Tab[Show_Tab[num]];
num++;
if(num>7)
num=0;
}
void Timer0_Isr(void) interrupt 1
{
temp++;
if(temp>=1000)
{
temp=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)
hour=0;
}
}
}
Show_Time();
}
void Sys_Init() //函数定义
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
P3M0 = 0x00;
P3M1 = 0x00;
P3M0 &= ~0x03;
P3M1 |= 0x03;
//设置USB使用的时钟源
IRC48MCR = 0x80; //使能内部48M高速IRC
while (!(IRC48MCR & 0x01)); //等待时钟稳定
USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。
USBCON = 0x90;
}
void Delay_ms(u16 ms) //unsigned int
{
u16 i;
do
{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
|
|