用KEIL编写C语言程序实现:单片机是AT89C51,实现一个计时器,数码管为6为的,有三个按键接在P0上。
你可以参考下面这个程序,这个是加计时器.把对应端口改下,计时改减就可以了.
数码管的显示网上大把,移植一下就可以了.
//--------LCD 1601 clock----------------------------------------
//---modified from a LCD1602 program,2012/11/21-----------------
#includereg52.h
#define uchar unsigned char
#define uint unsigned int
//----P3: key input for modify timer ---------------------------
#define KEY_IO P3
#define LCD_IO P0
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
//----P1.2: timer speaker output-------------------------------
sbit SPK = P1^2;
//----P2.4: timer LED indicator output------------------------
sbit LED = P2^4;
bit new_s, modify = 0;
char t0, sec = 50, min = 59, hour = 23;
//char code LCD_line1[] = "Designed by ZELD";
char code LCD_line2[] = "Timer: 00:00:00 ";
char Timer_buf[] = "23:59:50";
//---------------------------------------------------
void delay(uint z)
{
uint x, y;
for(x = z; x 0; x--) for(y = 100; y 0; y--);
}
//---------------------------------------------------
void W_LCD_Com(uchar com) //写指令
{
LCD_RS = 0; LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令
LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲
}
//---------------------------------------------------
void W_LCD_Dat(uchar dat) //写数据
{
LCD_RS = 1; LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据
LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲
}
//---------------------------------------------------
void W_LCD_STR(uchar *s) //写字符串
{
while(*s) W_LCD_Dat(*s++);
}
//---------------------------------------------------
void W_BUFF(void) //填写显示缓冲区
{
Timer_buf[7] = sec % 10 + 48; Timer_buf[6] = sec / 10 + 48;
Timer_buf[4] = min % 10 + 48; Timer_buf[3] = min / 10 + 48;
Timer_buf[1] = hour % 10 + 48;Timer_buf[0] = hour / 10 + 48;
// W_LCD_Com(0xc0 + 7); W_LCD_STR(Timer_buf);
//1602 start from address C0H(second row),1601 start from 40H-------
W_LCD_Com(0x80 + 7); W_LCD_STR(Timer_buf);
}
//---------------------------------------------------
uchar read_key(void)
{
uchar x1, x2;
KEY_IO = 255;
x1 = KEY_IO;
if (x1 != 255) {
delay(100);
x2 = KEY_IO;
if (x1 != x2) return 255;
while(x2 != 255) x2 = KEY_IO;
if (x1 == 0x7f) return 0;
else if (x1 == 0xbf) return 1;
else if (x1 == 0xdf) return 2;
else if (x1 == 0xef) return 3;
else if (x1 == 0xf7) return 4;
}
return 255;
}
//---------------------------------------------------
void Init()
{
LCD_RW = 0;
W_LCD_Com(0x38); delay(50);
W_LCD_Com(0x0c);
W_LCD_Com(0x06);
W_LCD_Com(0x01);
// W_LCD_Com(0x80); W_LCD_STR(LCD_line1);
// W_LCD_Com(0xC0); W_LCD_STR(LCD_line2);
W_LCD_Com(0x80); W_LCD_STR(LCD_line2);
TMOD = 0x01; //T0定时方式1
TH0 = 0x4c;
TR0 = 1; //启动T0
PT0 = 1; //高优先级, 以保证定时精度
ET0 = 1;
EA = 1;
}
//---------------------------------------------------
void main()
{
uint i, j;
uchar Key;
Init();
while(1) {
//-------------------------------
if (new_s) { //如果出现了新的一秒, 修改时间
new_s = 0; sec++; sec %= 60;
if(!sec) { min++; min %= 60;
if(!min) { hour++; hour %= 24;}
}
W_BUFF(); //写显示
//-------------------------------
if (!sec !min) { //整点报时
for (i = 0; i 200; i++) {
SPK = 0; for (j = 0; j 100; j++);
SPK = 1; for (j = 0; j 100; j++);
} }
}
//-------------------------------
Key = read_key(); //读出按键
switch(Key) { //分别处理四个按键
case 0: modify = 1; break;
case 1: if(modify) {min++; min %= 60; W_BUFF(); break;}
case 2: if(modify) {hour++; hour %= 24; W_BUFF(); break;}
case 3: modify = 0; break;
} }
}
//---------------------------------------------------
void timer0(void) interrupt 1 //T0中断函数, 50ms执行一次
{
TH0 = 0x4c;
t0++; t0 %= 20; //20, 一秒钟
if(t0 == 0) {new_s = 1; LED = ~LED;}
if(modify) LED = 0;
}
//===================================================
keil2 调试c语言出现语法错误
#includereg52.h
#includestdio.h
#includemath.h
//#define unsigned int uint
int n;
static int number=0;
int Ctrl=1;
sbit led=P1^7;
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit s1=P2^0;
sbit s2=P2^1;
sbit s3=P2^2;
sbit s4=P2^3;
int ge,shi;
int code table[]=
{
0xff,0xff,0xff,0xff,0xff, //这儿还没有编号码
0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff
}; //少分号
void delayms(int x)
{
int i,j;
for(i=x;i0;i--)
for(j=110;j0;j--);
//return 0;
}
void display(int num)
{
shi=num/10;
ge=num%10;
P0=table[shi];
s2=0;
s2=1;
delayms(50);//WARING L16 是因为函数定义后没有使用
P0=table[ge];
s1=0;
s1=1;
}
void Init()
{
TMOD=0x01;
TH0=(65536-45873)%256;
TL0=(65536-45873)%256;
EA=1;
ET0=1;
}
void T0_time() interrupt 1
{
TH0=(65536-45873)%256;
TL0=(65536-45873)%256;
n++;
}
//本来留着的 注释符号 */
void keyscan()
{
int temp,flag=0;
if(key1==0)
{
delayms(10);
if(key1 == 0)
{
if(Ctrl % 2 == 1)
{
shi=(shi+1)%10;
number=shi*10+ge;
}
else if(Ctrl%2==0)
{
ge=(ge+1)%10;
number=shi*10+ge;
}
number=(number+1)%100;
while(!key1)
{
n=0;
TR0=1;
if(n==40)
{
while(1)
{
n=0;
if(n==1)
{
number=(number+1)%100;
display(number);
}
if(!key1)
break;
}
}
TR0=~TR0;
}
}
}
/**/
if(key2==0)
{
delayms(10);
if(key2==0)
{
if(Ctrl%2==1)
{shi=(shi-1)%10;
number=shi*10+ge;
}
else if(Ctrl%2==0)
{ge=(ge-1)%10;
number=shi*10+ge;
}
number=(number-1)%100;
led=~led;
while(!key2)
{
n=0;
TR0=1;
if(n==40)
{
while(1)
{
n=0;
if(n==1)
{
number=(number-1)%100;
led=~led;
display(number);
}
if(!key1)
break;
}
}
TR0=~TR0;
}
}
}
if(key3==0)
{
delayms(20);
if(key3==0)
{
temp=number;
number--;
while(temp!=number)
{
n=0;TR0=1;
if(n==40)
{
if(flag==0)
{
display(number);
led=~led;
number--;
}
if(number==0)
flag=1;
if(flag==1)
{
display(number);
led=~led;
number++;
}
}
}
TR0=~TR0;
}
}
if(key0==0)
{
delayms(10);
if(key0==0)
Ctrl++;
}
}
void main()
{
Init();//WARING L16 是因为函数定义后没有使用
do{
keyscan();//原来为Keyscan();
display(number);
}
while(1);//使程序一直跑
}
//功能没帮你调 但是编译肯定可以通过
如何用3个按键控制流水灯方向和流速同时使用数码管显示当前时间间隔?
有这么好的动手机会,就自己做吧。对以后非常有用(过来人的建议。)。
分享下我思路:
1、将你控制用的单片机datasheet下载下来,不用全看,挑需要的看,其他的以后研究。
2、这个项目只是控制单片机的流水灯而已,由于你未提供原理图,我就假设一个IO口控制一盏灯,程序设计流程如下:
初始化单片机(设置定时器的定时时间为0.1s,控制灯,数码管的IO口设置为输出模式,检测按键的IO口设置为输入模式)
----- 写三个函数模块(按键检测函数模块keyscan(char times);,流水灯控制模块LED_Ctrl(char times,char direction)(times为间隔时间,dir为流水灯方向);间隔时间显示函数Display(););
----- 在定时中断函数里分别设置0.1s,0.5s,1s,1.5s,2s的中断标志(即在里面计数,进中断1次,5次,10次,15次,20次。);
----- 主循环重复跑这几个函数模块
以下为伪代码:
int main(void)
{
Initialize();
while(1)
{
keyscan();
Display(times);
LED_Ctrl(times, dir);//times在keyscan()函数里更改.
}
}
三个按键如何分别控制三个数码管C语言编程
enum keys {S1,S2,S3};
int L1=0,L2=0,L3=0;
int main(int argc, char* argv[])
{
int flag;
while(1)
{
printf("请输入按键1 2 3: ");
scanf("%d",flag);
switch (flag)
{
case 1:
{
L1++;
if (L1==10)
{
L1=0;
}
}
printf("%d,%d,%d \n",L1,L2,L3);
break;
case 2:
{
L2++;
if (L2==10)
{
L2=0;
}
}
printf("%d,%d,%d \n",L1,L2,L3);
break;
case 3:
{
L3++;
if (L3==10)
{
L3=0;
}
}
printf("%d,%d,%d \n",L1,L2,L3);
break;
default:
printf("ERR ");
break;
}
}
return 0;
}
//1,2,3是按键,L1,L2,L3打印结果,没输入一次1,或者2,或者3,一次结果