/********************************************************************************************
利用数码管在最高位显示数字8,再利用外部中断系统来控制数字的左右移动
写的时候遇到了几个问题,本来是在main函数中只有一个大循环,循环中先扫描数码管然后用按键来执行中断,在显示的时候会有一个数字8正常左右移动,但总会在最高位显示一个数字8,于是就用到了两个大循环,在第一个大循环中只用来在按键按下之前扫描数码管和挑战到第二个大循环,呃呃呃,我的思维可能比较古怪
以下代码为我利用手头上的开发板(QX-MCS51)写下的小程序
********************************************************************************************/
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
sbit WE = P2^7;
sbit DU = P2^6;
sbit zy = P3^6;
sbit yy = P3^7;
sbit S2 = P3^0;
sbit S3 = P3^1;
u8 code wei[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8 j;
void Delay_ms(u16 n) //毫秒级别延时函数
{
u8 j;
while(n--)
for(j=0;j<113;j++);
}
void Init() //中断初始化函数
{
EA = 1;
EX0 = 1;
EX1 = 1;
IT0 = 1;
IT1 = 1;
}
void SMGHS() //数码管显示函数
{
DU = 1;
P0 = 0x7f;
DU = 0;
WE = 1;
P0 = wei[j];
WE = 0;
}
void main()
{
while(1) //第一个大循环
{
SMGHS(); //扫描数码管
if(S2 == 0)
{
Delay_ms(10);
if(S2 == 0)
{
goto AA; //跳转到第二个大循环中的左移中断
while(S2 == 0);
}
}
if(S3 == 0)
{
Delay_ms(10);
if(S3 == 0)
{
goto BB; //跳转到第二个大循环中的右移中断
while(S3 == 0);
}
}
}
while(1)
{
Init();
if(S2 == 0)
{
Delay_ms(10);
if(S2 == 0)
{
AA: zy = 1;
zy = 0; //产生下降沿,进入中断0
while(S2 == 0);
}
}
if(S3 == 0)
{
Delay_ms(10);
if(S3 == 0)
{
BB: yy = 1;
yy = 0; //产生下降沿,进入中断1
while(S3 == 0);
}
}
}
}
void int0() interrupt 0
{
j++; //数码管数字左移
if(j == 8)
j=0;
SMGHS();
}
void int1() interrupt 2
{
j--; //数码管数字右移
if(j == -1)
j=7;
SMGHS();
}共4条
1/1 1 跳转至页
关于蓝桥杯训练小程序 中断控制数码管显示数字的左右移动
关键词: 蓝桥训练 程序 外部中断 数码管数字左移
共4条
1/1 1 跳转至页
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |
我要赚赏金
