学习笔记
学习科目: |
用按键和数码管制作一个简易特别简易的秒表 |
学习安排: |
昨天下午写完,但是找不出来毛病,想了一晚上了,还是发现不了,所以,求助一下 |
开始时间: |
2019-01-25 |
结束时间: |
2019-01-26 |
本帖最后由 林雨 于 2019-1-26 11:23 编辑
我编写了一个按键和数码管同时使用的一个小的秒表,按键用的是k4按键,只用这一个按键控制秒表的启动和暂停。但是一打开发现秒表数值只往上加,按键无法发挥作用,我反复看了代码还是没有发现有什么问题啊,哪位有空的同学帮我看一下吧,非常感谢。这是前边声明以及定义变量的部分:
[mw_shl_code=applescript,true]#include <
>
sbit A0=P2^0;
sbit A1=P2^1;
sbit A2=P2^2;
sbit ENLED=P1^1;
sbit Key = P2^3;//我们使用k4按键作为秒表的暂停和启动按键
sbit KeyOut = P2^7;//我们使用k4按键作为秒表的暂停和启动按键
unsigned char code LedChar[]={
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
};//这是数码管的真值表
unsigned char LedBuff []={
0xff,0xff,0xff,0xff,0xff,0xff
};//数码管显示缓冲区
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned int Dis_Value = 0;//这一个值就是要显示在数码管上的值每10毫秒加一,也就是说这个秒表的分辨率是10毫秒
bit Running_Flag = 1;//这是秒表的运行标志,如果这个值为一那么表示秒表要正常运行,如果这个值是0秒暂停
bit Key_BackUp = 1;//这是按键状态的备份值。
bit Key_Back =1;//这是按键扫描传回来的值,如果船回来以表示按键式弹起,如果传回来为零,表示按键按下,这个值与之前备份的那个值进行比较,如果不相等则可以判定有动作[/mw_shl_code]
这是主函数部分主函数主要用来控制秒表的启停,通过控制一个秒表运行标志位来实现:
[mw_shl_code=applescript,true]void main ()
{
ENLED = 0;//首先要使能数码管。
KeyOut = 0;//让这个引脚输出低电平。
EA = 1;//打开总中断。
TMOD = 0x01;//配置计时模式。
TH0 = 0xea;//配置定时器零的高位初始值。
TL0 = 0x6a;//配置定时器零的低位初始值。
ET0 = 1;//打开定时器中断。
TR0 = 1;//打开定时器零。
// Configure_Timer_0 (1);
while (1)
{
if (Key_BackUp != Key_Back)//时刻检测按键状态,判断传回来的按键状态是否与备份的状态相同,如果不相同则进行下一步判断。
{
if (Key_BackUp == 0)//如果备份值为0,说明是弹起。
{
if (Running_Flag)//判断运行标志是否为真,如果在运行状态则让运行状态变为零,停止往上加数。
Running_Flag = 0;
else
Running_Flag = 1;//否则运行标志为假,则让运行状态标志变为真,继续往上加数
}
Key_BackUp = Key_Back;//更新备份的按键状态。
}
}
}[/mw_shl_code]
接下来是数码管显示函数:
[mw_shl_code=applescript,true]void Solo_Led_Display (unsigned int shu)//这是数码管显示相关的函数,每两毫秒调用一次,每调用一次,刷新一次。
{
static unsigned char i = 0;
LedBuff[5] = LedChar[shu%10];
LedBuff[4] = LedChar[shu/10%10];
LedBuff[3] = LedChar[shu/100%10];
LedBuff[2] = LedChar[shu/1000%10];
LedBuff[1] = LedChar[shu/10000%10];
LedBuff[0] = LedChar[shu/100000%10];
P0 = 0xff;
P2 = (P2 & 0xf8) | i;//这一个语句虽然简单,但是可以实现位选操作,显示函数是没有问题的。
P0 = LedBuff;
//这主要是金沙滩上那个数码管扫描改进程序。
if (i<5)
i++;
else
i = 0;
}[/mw_shl_code]
下面是按键检测函数:
[mw_shl_code=applescript,true]void Key_Check ()//这是判断案件状态相关的函数,每两毫秒调用一次。
{
static unsigned char KeyBuff = 0xff;//定义判断按键状态所需用的缓冲值。
KeyBuff = (KeyBuff<<1) |Key;//每一次调用都将缓冲值左移一位,然后与见进行按位或操作
if (KeyBuff == 0x00)//操作8次之后自动来判断这个缓冲值的各种情况,比如这种情况,说明按键按下。
{Key_Back = 0;}//这种情况下传回去的按键值为零,说明按键按下。
else if (KeyBuff == 0xff)//这是另外一种情况,说明按键弹起。
{Key_Back = 1;}//这种情况传回去的案件之为1,说明按键弹起。
else {}//别的状态说明按键处于不稳定状态,不进行任何操作。
[/mw_shl_code]
下面是中断函数:
[mw_shl_code=applescript,true]void Interrupt_Timer_0 () interrupt 1
{
static unsigned char cent = 0;//这是为了计时十毫秒用的值,每次进入中断也就是说每两毫秒他会加一加到5之后就是10毫秒。
TH0 = 0xea;//这是为了定时两毫秒给定时器零的高位赋的值。
TL0 = 0x6a;//这是为了定时两毫秒给定时器零的低位赋的值。
Key_Check ();//每次进入中段都检测按键状态。检测8次一共耗费16毫秒。
Solo_Led_Display (Dis_Value);//这是数码管显示的函数,每一次进入中断,也就是说每两毫秒调用一次进行数码管刷新。
cent++;//每次进入中断,这个值都自加一次,自加5次之后变成10毫秒。
if(cent >= 5)//如果达到十毫秒
{
if(Running_Flag)//进行运行状态标志判断,那个值为真的话就进行加1操作,否则不进行任何操作。
{Dis_Value = Dis_Value++;}
cent = 0;//清零
}
}[/mw_shl_code]
|
|