keil编程三个按键控制数码管(0到9数码管用keil如何编程)

用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,一次结果

361知讯网

本文链接:http://pdidw.com/keil/34460.html

发表评论

评论列表

还没有评论,快来说点什么吧~