单片机菜鸟问个小白问题 求解释 C语言程序的。

2024-12-02 03:07:47
推荐回答(2个)
回答1:

全局变量数组,8个元素,分别表示8个数码管分别显示什么。
主程序部分一个循环,首先检测什么按键被按下,按了就给这个全局数组赋值
检测完了之后是显示的代码。我只操作过2位数码管,8位光靠扫描不确定能不能显示得稳定(不闪烁),这个只能靠你了,反正是显示,显示的代码就是从我刚刚说的全局数组读数据,输出到数码管
完了回到循环开始,检测按键有没有被按下
然后无限循环
任务完成

回答2:

/***数显——火柴天堂作品-20130520***/
/***源程序默认硬件环境:51单片机,12MHz晶振,8位共阴数码管,P2口段选,P1口低电平位选,P10最高位,P17最低位,
P30-33四独立按键(Key1,Key2,Key3,Key4)***/
#include"reg51.h"//包含52头文件
#define TRUE1//定义布尔量'1':真
#define FALSE0//定义布尔量'0':假
#define uchar unsigned char//定义 无符号字符型数据 简称
#define uint unsigned int//定义 无符号整型数据 简称
#define th00xfc
#define tl00x18//1ms at 12MHz(定时器工作模式1 状态)
#define T1sAt50msCount20//定义 1s 在 50ms 计时基准状态下 的计数值 为20
#define SEG_Num8//数码管个数
#define SEG_DataP2//数码管段驱动接口
#define SEG_EnP1//数码管位驱动接口
#define SEG_AllOffSEG_En=0xff//关闭所有数码管(位驱动)
#define DisTimeAt1msCount2//单'位'数码管显示时间,数码管刷新频率f=1/(N*t),其中 N为数码管位数,t 为单'位'数码管显示时间
uchar SEG_A_List[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管代码表"0-9"
uchar code DisplayList[4][8]={{1,9,8,7,0,6,2,4},{0,9,0,2,1,2,2,6},{0,6,2,4,9,0,1,7},{1,2,3,4,5,6,7,8}};
//#define SEG_A_Point0x80//共阴数码管小数点,或操作

#define KeyNum 4
sbit Key1=P3^0;//开始键
sbit Key2=P3^1;//停止键
sbit Key3=P3^2;//继续键
sbit Key4=P3^3;//清零键
#define NotKeyValue0//无按键键值
#define Key1Value1//开始键键值
#define Key2Value2//停止键键值
#define Key3Value3//继续键键值
#define Key4Value4//清零键键值

//#define BirthdayLoca 0
//#define StudentNumberLoca 1
//#define IdentityNumberLoca 2
//#define AnyNumberLoca 3

bit DisplayFlag=1;//显示(刷新)标志位
uchar DisBuf[8];
uchar DisplayStatus=0;

void Timer0() interrupt 1//定时器0中断函数
{
static uchar t1ms;
TL0=tl0;
TH0=th0;
t1ms=++t1ms%DisTimeAt1msCount;//先计数值加1,后对计数范围进行限制0~(DisTimeAt1msCount-1)
if(!t1ms) DisplayFlag=TRUE;//若定时计数值归0,则表示计数值曾到达 单'位'显示时间(DisTimeAt1msCount),显示标志 置位
}

void TimerInit()
{
TMOD=0x01;//开启定时器0、定时器1,并都工作在模式1
TH0=th0;
TL0=tl0;
TR0=1;//启动T0定时器
ET0=1;//允许定时器0中断
EA=1;//开启系统中断功能
}

uchar KeyScan()
{
if(Key1 && Key2 && Key3 && Key4) return NotKeyValue;//无按键按下,返回 无按键键值
if(!Key1) return Key1Value;//开始键按下,返回 开始键键值
if(!Key2) return Key2Value;//停止键按下,返回 停止键键值
if(!Key3) return Key3Value;//继续键按下,返回 继续键键值
if(!Key4) return Key4Value;//清零键按下,返回 清零键键值
return NotKeyValue;//误操作,返回 无按键键值
}

void KeyResp()//按键响应函数
{
static uchar KeyValue;//定义静态变量 存储按键值,设置位
static bit KeyDownFlag,KeyReadyFlag;//定义静态变量 按键按下标志位,按键准备(响应)标志位
uchar key_value=KeyScan();//调用 按键扫描函数,并将扫描结果放在 key_value中
if(key_value!=NotKeyValue)//若扫描结果 有按键
{
KeyValue=key_value;//存储按键值
KeyDownFlag=TRUE;//按键按下标志位 置位
KeyReadyFlag=TRUE;//按键准备(响应)标志位 置位
}
else KeyDownFlag=FALSE;//若扫描结果 无按键,则 清 按键按下标志位
if(KeyReadyFlag && !KeyDownFlag)//若按键准备就绪,且无按键按下,则表示已松手情况
{
if(KeyValue>KeyNum) KeyValue=0;
DisplayStatus=KeyValue;
KeyValue=0;//清 按键值
KeyReadyFlag=FALSE;//清 按键准备(就绪)标志位
}
}

void ContentUpdata()
{
uchar i=0;
for(;i}

void Display()//显示函数,显示内容为 无符号整型数据 dis_num
{
static uchar dis_loca;//定义静态变量 显示位置
if(DisplayFlag)
{
DisplayFlag=FALSE;
dis_loca=++dis_loca%SEG_Num;//先对 显示位置 加1,后对变量范围进行限制 0~(SEG_Num-1)
SEG_AllOff;//关闭所有数码管显示(位驱动)
SEG_Data=SEG_A_List[DisBuf[dis_loca]];//将显示内容(dis_num) 本次需显示的位(dis_loca)上的数值转成代码,并送到数据端口
SEG_En&=~(1<<(SEG_Num-1-dis_loca));//开启本次需要显示的位驱动(低驱动)
}
}

void main()//主函数
{
TimerInit();//调用 定时器初始化函数
while(1)//循环系统
{
KeyResp();//调用 按键响应函数
ContentUpdata();//调用 内容更新函数
Display();//调用 显示函数
}
}