关于用单片机设计一个时钟计时器,补全代码

matsukawahikari 2018-11-05 09:31:35
单片机课程接近尾声,老师要求我们自己做一个课题,从学姐那里拿到了时钟计时器的部分代码,但是缺少头文件的内容,我想请教各路大佬,能不能根据我的主程序,帮我把头文件里的内容补出来?
这个课题用到的是STC12C5A60S2单片机、矩阵键盘、8位7段共阳极数码管
P.S 因为刚注册的号,只有20可用分,我也无可奈何QAQ真的希望有好心人帮帮我!下周就要答辩,现在只知道头文件里应该定义了P1和P2口什么的,但还是一头雾水...

已知代码如下:

#include "CONFIGURE.H"
#define uint unsigned int
#define uchar unsigned char

uchar t,m,f,s;
uchar num;

uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x7F};
uchar code tablewe[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //控制位选

void delayms(uint z) //延时z ms
{
uint x,y;
for(x=z;x>0;x--) for(y=110;y>0;y--);
}
void display(uchar n,uchar c,uchar d) //分离变量
{
uchar a,b;
a=n/10; //十位
b=n%10; //个位

P0=table[a]; P2=tablewe[c]; delayms(2); //十位显示
P0=table[b]; P2=tablewe[d]; delayms(2); //个位显示
}
void init()
{ t=0; m=0; f=0; s=0;

TMOD=0X01; //定时器T0工作于方式1
TH0=(65536-50000)/256; //晶振为12MHZ
TL0=(65536-50000)%256; //定时时间为50ms
EA=1; //开中断
ET0=1; //开T0中断
TR0=1; //启动T0
}

void Key(int k) //按键扫描
{
if(k==1) //功能键
{
num++; //功能键按下次数加1
if(num==1)TR0=0; //关闭T0,进入调时模式
if(num==4)
{
num=0; TR0=1; //启动T0
}
}
if(k==2) //加1键
{
if(num==1){ m++; if(m==60)m=0; display(m,6,7); } //秒加1,显示秒
if(num==2){ f++; if(f==60)f=0; display(f,4,5); } //分加1,显示分
if(num==3){ s++; if(s==24)s=0; display(s,2,3); } //时加1,显示时
}
if(k==3) //加1键
{
if(num==1){ m--;if(m==-1)m=59;display(m,6,7);} //秒减1,显示秒
if(num==2){ f--;if(f==-1)f=59;display(f,4,5);} //分减1,显示分
if(num==3){ s--;if(s==-1)s=23;display(s,2,3);} //时减1,显示时
}
}

unsigned int keyscan(){//键盘特征编号法
unsigned int k;//用于接受最后返回结果
unsigned char temp;
unsigned char temp1=0;
M_Key = 0xf0;//先将P2高四位输入高电平,低四位输入低电平
temp = M_Key;//将按了按键后的结果用temp保留高四位
if(temp!=0xf0){//如果高四位不全为1有按键按下
delayms(100);//消去抖动
temp = M_Key;//再次接收保留高四位
if(temp!=0xf0){//再次判断是否有按键按下
M_Key = 0xf0;//重复操作
temp = M_Key;//重复操作(保留高四位)
M_Key = 0x0f;//再将P2高四位输入低电平,低四位输入高电平
temp1 = M_Key;//用templ来保留第四位
temp = temp|temp1;//将保留的用或运算可以的到特征的按键位置
switch(temp){//判断键盘的位置
case 0xee: k=1 ;break;//若是键盘s1则让k=1表示按了一键
case 0xed: k=2 ;break;//若是键盘s2则让k=2表示按了二键
case 0xeb: k=3 ;break;//若是键盘s3则让k=3表示按了三键
}
M_Key = 0xf0;//初始化
temp = M_Key;//初始化
while(temp!=0xf0){temp=M_Key;}//判断是否有按键按下
return k;//返回键盘相关的键号
}
}
}

void main()
{
init();//初始化
while(1)
{
int key = keyscan(); //调键扫描
Key(key);
P0=0x40; //显示-
P2=0xdb;

delayms(2); //延时
display(s,2,3); //秒显示
display(f,4,5); //分显示
display(m,6,7); //时显示
}
}

void T0_time() interrupt 1
{
TH0=(65536-50000)/256; //重赋初值
TL0=(65536-50000)%256;
t++; //中断次数加1
if(t==20) //到1秒
{
t=0; //计数清0
m++; //秒加1
if(m==60) //到1分
{
m=0; //秒清0
f++; //分加1
if(f==60) //到1小时
{
f=0; //分清0
s++; //小时加1
if(s==24)s=0;//小时采用24小时制,进行显示
}
}
}
}

...全文
89 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
matsukawahikari 2018-11-12
  • 打赏
  • 举报
回复
能提一些更有建设性的意见吗
matsukawahikari 2018-11-06
  • 打赏
  • 举报
回复
加了#include<stcreg.h>头文件
现在只有M_Key未定义了
matsukawahikari 2018-11-06
  • 打赏
  • 举报
回复
Build target 'Target 1'
compiling 时钟.c...
时钟.C(20): error C202: 'P0': undefined identifier
时钟.C(20): error C202: 'P2': undefined identifier
时钟.C(21): error C202: 'P0': undefined identifier
时钟.C(21): error C202: 'P2': undefined identifier
时钟.C(27): error C202: 'TMOD': undefined identifier
时钟.C(28): error C202: 'TH0': undefined identifier
时钟.C(29): error C202: 'TL0': undefined identifier
时钟.C(30): error C202: 'EA': undefined identifier
时钟.C(31): error C202: 'ET0': undefined identifier
时钟.C(32): error C202: 'TR0': undefined identifier
时钟.C(40): error C202: 'TR0': undefined identifier
时钟.C(43): error C202: 'TR0': undefined identifier
时钟.C(65): error C202: 'M_Key': undefined identifier
时钟.C(66): error C202: 'M_Key': undefined identifier
时钟.C(69): error C202: 'M_Key': undefined identifier
时钟.C(71): error C202: 'M_Key': undefined identifier
时钟.C(72): error C202: 'M_Key': undefined identifier
时钟.C(73): error C202: 'M_Key': undefined identifier
时钟.C(74): error C202: 'M_Key': undefined identifier
时钟.C(81): error C202: 'M_Key': undefined identifier
时钟.C(82): error C202: 'M_Key': undefined identifier
时钟.C(83): error C202: 'M_Key': undefined identifier
时钟.C(91): error C202: 'TH0': undefined identifier
时钟.C(92): error C202: 'TL0': undefined identifier
时钟.C(121): error C202: 'P0': undefined identifier
时钟.C(122): error C202: 'P2': undefined identifier
Target not created
有很多没有定义
云山大侠 2018-11-06
  • 打赏
  • 举报
回复
C 文件 忘记包含头文件了,加上。
#include "CONFIGURE.H"
云山大侠 2018-11-06
  • 打赏
  • 举报
回复
头文件
#ifndef _CONFIGURE_H_
#define _CONFIGURE_H_

#define uint unsigned int
#define uchar unsigned char

extern uchar t;
extern uchar m;
extern uchar f;
extern uchar s;

extern uchar code table[];
extern uchar code tablewe[];

extern void delayms(uint z);
extern void display(uchar n, uchar c, uchar d);
extern void init(void);
extern void Key(int k);
extern unsigned int keyscan(void);
extern void T0_time(void);

#endif


C文件:


/*这里建议你初始化 :写成 uchar t = 0;uchar m = 0;.......... */
uchar t, m, f, s;
uchar num;

uchar code table[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x7F };
uchar code tablewe[] = { 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe }; //控制位选void delayms(uint z) //延时z ms
{
uint x, y;
for (x = z; x > 0; x--) for (y = 110; y > 0; y--);
}
void display(uchar n, uchar c, uchar d) //分离变量
{
uchar a, b;
a = n / 10; //十位
b = n % 10; //个位

P0 = table[a]; P2 = tablewe[c]; delayms(2); //十位显示
P0 = table[b]; P2 = tablewe[d]; delayms(2); //个位显示
}
void init()
{
t = 0; m = 0; f = 0; s = 0;

TMOD = 0X01; //定时器T0工作于方式1
TH0 = (65536 - 50000) / 256; //晶振为12MHZ
TL0 = (65536 - 50000) % 256; //定时时间为50ms
EA = 1; //开中断
ET0 = 1; //开T0中断
TR0 = 1; //启动T0
}

void Key(int k) //按键扫描
{
if (k == 1) //功能键
{
num++; //功能键按下次数加1
if (num == 1)TR0 = 0; //关闭T0,进入调时模式
if (num == 4)
{
num = 0; TR0 = 1; //启动T0
}
}
if (k == 2) //加1键
{
if (num == 1){ m++; if (m == 60)m = 0; display(m, 6, 7); } //秒加1,显示秒
if (num == 2){ f++; if (f == 60)f = 0; display(f, 4, 5); } //分加1,显示分
if (num == 3){ s++; if (s == 24)s = 0; display(s, 2, 3); } //时加1,显示时
}
if (k == 3) //加1键
{
if (num == 1){ m--; if (m == -1)m = 59; display(m, 6, 7); } //秒减1,显示秒
if (num == 2){ f--; if (f == -1)f = 59; display(f, 4, 5); } //分减1,显示分
if (num == 3){ s--; if (s == -1)s = 23; display(s, 2, 3); } //时减1,显示时
}
}

unsigned int keyscan()
{//键盘特征编号法
unsigned int k;//用于接受最后返回结果
unsigned char temp;
unsigned char temp1 = 0;
M_Key = 0xf0;//先将P2高四位输入高电平,低四位输入低电平
temp = M_Key;//将按了按键后的结果用temp保留高四位
if (temp != 0xf0){//如果高四位不全为1有按键按下
delayms(100);//消去抖动
temp = M_Key;//再次接收保留高四位
if (temp != 0xf0){//再次判断是否有按键按下
M_Key = 0xf0;//重复操作
temp = M_Key;//重复操作(保留高四位)
M_Key = 0x0f;//再将P2高四位输入低电平,低四位输入高电平
temp1 = M_Key;//用templ来保留第四位
temp = temp | temp1;//将保留的用或运算可以的到特征的按键位置
switch (temp){//判断键盘的位置
case 0xee: k = 1; break;//若是键盘s1则让k=1表示按了一键
case 0xed: k = 2; break;//若是键盘s2则让k=2表示按了二键
case 0xeb: k = 3; break;//若是键盘s3则让k=3表示按了三键
}
M_Key = 0xf0;//初始化
temp = M_Key;//初始化
while (temp != 0xf0){ temp = M_Key; }//判断是否有按键按下
return k;//返回键盘相关的键号
}
}
}

void T0_time() interrupt 1
{
TH0 = (65536 - 50000) / 256; //重赋初值
TL0 = (65536 - 50000) % 256;
t++; //中断次数加1
if (t == 20) //到1秒
{
t = 0; //计数清0
m++; //秒加1
if (m == 60) //到1分
{
m = 0; //秒清0
f++; //分加1
if (f == 60) //到1小时
{
f = 0; //分清0
s++; //小时加1
if (s == 24)s = 0;//小时采用24小时制,进行显示
}
}
}
}



main.c:
#include "CONFIGURE.H"

void main()
{
init();//初始化
while (1)
{
int key = keyscan(); //调键扫描
Key(key);
P0 = 0x40; //显示-
P2 = 0xdb;

delayms(2); //延时
display(s, 2, 3); //秒显示
display(f, 4, 5); //分显示
display(m, 6, 7); //时显示
}
}
matsukawahikari 2018-11-06
  • 打赏
  • 举报
回复
@死国之神 CONFIGURE.H文件里按你给的代码编辑了
然后在keilμVision4里运行我这个项目,出现以下报错:
Build target 'Target 1'
compiling 时钟设计.c...
CONFIGURE.H(1): error C141: syntax error near 'z', expected ')'
CONFIGURE.H(2): error C141: syntax error near 'n', expected ')'
CONFIGURE.H(8): error C129: missing ';' before 't'
Target not created
编译失败了
云山大侠 2018-11-06
  • 打赏
  • 举报
回复
extern uchar t;
extern uchar m;
extern uchar f;
extern uchar s;

extern uchar code table[];
extern uchar code tablewe[];
云山大侠 2018-11-06
  • 打赏
  • 举报
回复
extern void delayms(uint z);
extern void display(uchar n, uchar c, uchar d);
extern void init(void);
extern void Key(int k);
extern unsigned int keyscan(void);
extern void T0_time(void);

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧