一.题目:
2.解题思路过程:
定义一个计数变量→设计一个累加程序·,当加到题目要求的100时,计时值自动回到原来的初始值
→设计一个累减程序,当减到题目要求的100时,计时值自动回到原来的初始值(计数变量使用的是char所有-1用255代替)→设计一清零和指示灯L1亮2s熄灭的程序→锁定程序(锁定程序用上位机的方式进行设计)。
二.功能代码实现部分:
1.主程序
#include <STC12C5A60S2.H>
#include "intrins.h"
#include "key.h" //按键驱动模块
#include "smg.h" //数码管驱动模块
#include "control.h" //译码器驱动模块
unsigned char key_val,key_down,key_up,key_old; //按键的一些工作方式定义
unsigned char key_sj;
unsigned int smg_sj,count;
unsigned char smg_buf[8]={17,17,17,17,17,17,17,0};
unsigned char smg_point[8]={0,0,0,0,0,0,0,0};
unsigned char sg;
unsigned char num=0;
unsigned char flag=0;
//bit v;
void delay(unsigned char t) //延时函数
{
unsigned int i,j;
for(i=t;i>0;i--)
{
for(j=114;j>0;j--);
}
}
void Init_Timer0() //计数器
{
TMOD=0x01;
TH0=(65535-500)/256;
TL0=(65535-500)%256;
ET0=1;
EA=1;
TR0=1;
}
void key_fz()
{
if(key_sj) return;
key_sj=1;
key_val=key_read();
key_down=key_val&(key_val^key_old);
key_up=~key_val&(key_val^key_old);
key_old=key_val;
switch(key_down)
{
case 5:
if(flag==0)
{
num=0;
smg_buf[7]=num;
smg_buf[6]=0xff;
smg_buf[5]=0xff;
P0=0xfe;
HC318(4);
HC318(0);
delay(2000);
P0=0xff;
HC318(4);
HC318(0);
}
break;
case 9:
if(flag==0)
{
if(--num==255) num=100;
if(num>=0 && num<10)
{
smg_buf[5]=0xff;
smg_buf[6]=0xff;
smg_buf[7]=num%10;
}
if(num>=10 && num<=99)
{
smg_buf[7]=num%10;
smg_buf[6]=num/10%10;
smg_buf[5]=0xff;
}
if(num==100)
{
smg_buf[7]=num%10;
smg_buf[6]=num/10%10;
smg_buf[5]=num/100;
}
}
break;
case 13:
if(flag==0)
{
if(++num==101) num=0;
if(num>=0 && num<10)
{
smg_buf[5]=0xff;
smg_buf[6]=0xff;
smg_buf[7]=num%10;
}
if(num>=10 && num<=99)
{
smg_buf[7]=num%10;
smg_buf[6]=num/10%10;
}
if(num==100)
{
smg_buf[7]=num%10;
smg_buf[6]=num/10%10;
smg_buf[5]=num/100;
}
}
break;
}
}
void smg_fz()
{
if(smg_sj) return;
smg_sj=1;
}
void shutoff()
{
P0=0xff;
HC318(4);
HC318(0);
P0=0x00;
HC318(5);
HC318(0);
}
void serviceTimer0() interrupt 1
{
TH0=(65535-500)/256;
TL0=(65535-500)%256;
if(++key_sj==2) key_sj=0;
if(++smg_sj==100) smg_sj=0;
if(++sg==8) sg=0;
smg_show(sg,smg_buf[sg],smg_point[sg]);
}
void main()
{
Init_Timer0();
shutoff();
while(1)
{
key_fz();
smg_fz();
if(key_down==1)
{
delay(100);
if(key_down==1)
{
if(flag==0)
{
P0=0x7f;
P2=(P2&0x1f)|0x80;
P2&=0x1f;
flag=1;
}
else if(flag==1)
{
P0=0xff;
P2=(P2&0x1f)|0x80;
P2&=0x1f;
flag=0;
}
}
}
}
}
2.按键驱动程序
#include "key.h"
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;
sbit C3=P3^5;
sbit C4=P3^4;
unsigned char key_read()
{
unsigned char temp=0;
R1=0,R2=1,R3=1,R4=1;
if(C1==0) temp=1;
if(C2==0) temp=2;
if(C3==0) temp=3;
if(C4==0) temp=4;
R1=1,R2=0,R3=1,R4=1;
if(C1==0) temp=5;
if(C2==0) temp=6;
if(C3==0) temp=7;
if(C4==0) temp=8;
R1=1,R2=1,R3=0,R4=1;
if(C1==0) temp=9;
if(C2==0) temp=10;
if(C3==0) temp=11;
if(C4==0) temp=12;
R1=1,R2=1,R3=1,R4=0;
if(C1==0) temp=13;
if(C2==0) temp=14;
if(C3==0) temp=15;
if(C4==0) temp=16;
return temp;
}
3.数码管驱动程序
#include "smg.h"
#include "control.h"
unsigned char code duan[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc8,0xff};
unsigned char code wei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void smg_show(unsigned char b,c,d)
{
P0=0xff;
HC318(7);
HC318(0);
P0=wei[b];
HC318(6);
HC318(0);
if(d==1)
{
P0=duan[c]&0x7f;
HC318(7);
HC318(0);
}
else
{
P0=duan[c];
HC318(7);
HC318(0);
}
}
4.译码器驱动程序
#include "control.h"
void HC318(unsigned char a)
{
switch(a)
{
case 4:P2=(P2&0x1f)|0x80; break;
case 5:P2=(P2&0x1f)|0xa0; break;
case 6:P2=(P2&0x1f)|0xc0; break;
case 7:P2=(P2&0x1f)|0xe0; break;
case 0:P2=(P2&0x1f)|0x00; break;
}
}
三.总结
这次设计是我对数码管,按键的应用更加灵活。
目录