世纪电源网社区logo
社区
Datasheet
标题
返回顶部
未解决

单片机编程问题(C语言)

[复制链接]
查看: 318 |回复: 3
1
姜sir
  • 姜sir
  • 离线
  • LV6
  • 高级工程师
  • 积分:458
  • |
  • 主题:14
  • |
  • 帖子:81
积分:458
LV6
高级工程师
  • 2023-3-31 15:00:07
10问答币
两个数码管显示0-60秒秒表。一矩阵键盘,从0-F。当A键按下后,此时分别按下0-9中的任意两个数,数码管时间更改,如按下09,数码管此时显示09,再按下A键,数码管从09继续跑。(51单片机)写出c语言程序,端口随便接。问题关键是如何实现A按下后,数码管秒数的改变。
收藏收藏
z443233785
  • 积分:5343
  • |
  • 主题:117
  • |
  • 帖子:1003
积分:5343
LV8
副总工程师
  • 2023-4-2 19:54:11
  • 倒数3
 
#include"AT89X52.h"

sbit BUTTON = P1^1;
sbite LED = P1^0;
unsigned int reg;
void main(void)
{
while(1)
{
if (!BUTTON)
{
reg= 5000;
while(--reg);
if (!BUTTON)
{
LED = ~LED;
while(!BUTTON)
Merssi
  • Merssi
  • 离线
  • LV4
  • 初级工程师
  • 积分:350
  • |
  • 主题:11
  • |
  • 帖子:55
积分:350
LV4
初级工程师
  • 2023-4-4 15:24:44
  • 倒数2
 


调试了好几遍~ 没接口芯片 光单片机好麻烦啊 在我的开发板上调试成功了 12M晶振~~ 既然多少分都可以 那就使劲给吧~

#include <reg52.h>
code unsigned char tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳数码管 0-9

unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
unsigned char second; //秒
char flag;
unsigned char shi;
void delay(unsigned int cnt)
{
while(--cnt);
}

unsigned char keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值并返回
}
}
return(0xff); //否则返回固定值0xff
}

void main()
{
unsigned char key,temp;
TMOD |=0x01;//定时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //打开中断
TR0=1;
flag=0;
Dis_Shiwei=tab[0];//十位显示值处理
Dis_Gewei=tab[0]; //个位显示处理
while(1)
{
P0=Dis_Shiwei;//显示十位
P2=0xFD;
delay(150);//短暂延时
P0=Dis_Gewei; //显示个位
P2=0xFE;
delay(150);
key=keyscan();//调用键盘扫描,
temp=-1;
if(key!=0xff){
switch(key)
{
case 0x7e:temp=0;break;//0 按下相应的键显示相对应的码值
case 0x7d:temp=1;break;//1
case 0x7b:temp=2;break;//2
case 0x77:temp=3;break;//3
case 0xbe:temp=4;break;//4
case 0xbd:temp=5;break;//5
case 0xbb:temp=6;break;//6
case 0xb7:temp=7;break;//7
case 0xde:temp=8;break;//8
case 0xdd:temp=9;break;//9
case 0xdb:temp=10;break;//a
case 0xd7:temp=11;break;//b
case 0xee:temp=12;break;//c
case 0xed:temp=13;break;//d
case 0xeb:temp=14;break;//e
case 0xe7:temp=15;break;//f
}
if(temp==10)//按下了A键
{
TR0=!TR0;
flag=!flag;
}else
if(flag==1)//按下有效键
{
second=shi*10+temp;
Dis_Shiwei=Dis_Gewei;
Dis_Gewei=tab[temp];
delay(0x7fff); //这个延时太长会在设置时显示不流畅 太短会出现连键
shi=temp;
}
}
}
}

//定时中断
void tim(void) interrupt 1 using 1
{
static unsigned char count;
TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second++;//秒减1
if(second>=60)
{
second=0; //减到0是重新赋值
}
Dis_Shiwei=tab[second/10];//十位显示值处理
Dis_Gewei=tab[second%10]; //个位显示处理

}
}




DeadEnd
  • 积分:450
  • |
  • 主题:13
  • |
  • 帖子:77
积分:450
LV6
高级工程师
最新回复
  • 2023-4-7 14:07:32
  • 倒数1
 
可以用定时判断A的状态的,一旦按键触发,就停止读秒或数码管清零,等待按键输入,当然,因为你只用到0-9显示,你也可以把A键作为一个特殊键处理的。
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号