不知道是怎样的显示方式,5位数码管扫描显示吗? 对应的原理图是什么,对应那些引脚,以下做参考
#include "reg51h"
#include "intrinsh"
#include <absacch>
#define unit unsigned int
#define char unsigned char
sbit deng1=P0^1;
sbit deng2=P0^2;
sbit kongzhi=P0^0;
char code dis_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00, 0xff };
/共阴LED数码管段码 0 1 2 3 4 5 6 7 8 9 10 A B C D E F 灭 /
char data timedata[6]={0x00,0x00,0x00,0x00,0x00,0x00};//定义计数单元初值0,6个
char code weisao[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位扫描控制字
char data BUFFER[1]={0}; //定时器记数变量
char data wei=-1; //时间设置时选种位
char c=0; //闪烁次数变量
bit flag=0; //标志位
char j1,j; //计数标志
ledxian() //LED显示子程序
{
char k;
for(k=0;k<6;k++)
{
if(wei==-1) //当WEI为-1时正常显示
{
P1=dis_7[timedata[k]];//各位时间显示值转段码
}
else //WEI不为-1时再判断哪一位K闪
{
if(k==wei) //K=WEI时闪等扫过128次时闪
{
if(j==128)
{
//j1++;
//if(j1==1)
flag=~flag; //J到128时标志位取反
}
j++;
if(!flag)
{
P1=dis_7[16]; //灭LED灯
if(j==0)
{
if(c<15) //选种后闪烁次数
{
c++ ;
}
else //20次到了清WEI标志,清闪烁次数标志
{
wei=-1;
c=0;
ET0=1; //定时中断开
}
}
}
else
{
P1=dis_7[timedata[k]]; //FLAG=1时正常显示
}
}
else
{
P1=dis_7[timedata[k]]; //J不到128则正常显示
}
}
P2=~weisao[k]; //位扫描
delayxms(1); //1毫秒延时
P2=~0xff; //屏蔽
}
}
看没有给你出代码,我就花几分钟给你写一个程序。
#include "REG52H"
sbit KEY1_Outak = P1^3;
sbit Temp_Out001 = P1^0;
sbit Temp_Out002 = P1^1;
sbit Temp_Out003 = P1^2;
unsigned char Value_tem;
/
带形参延时1ms子函数
/
void Delay_1ms(unsigned int Temp)
{
unsigned int x, y;
for(x = Temp; x > 0; x--)
for(y = 110; y > 0; y--);
}
/
按键选择不同程序执行
/
void Scank_keyCmd(void)
{
if( KEY1_Outak == 0) //判断按键是否按下
{
Delay_1ms(10); //延时去抖动
if( KEY1_Outak == 0) //按键确实按下
{
Value_tem++; //开始执行变量加加
if(Value_tem == 3) //判断按键变量按下次数等于3
{
Value_tem = 0; //变量清零
}
while(KEY1_Outak == 0); //判断按键松手不等于零退出
}
}
}
/
不同程序按键选择执行
/
void Display_VslutsbekCmd(void)
{
if(Value_tem == 0) //如果没有按键按下变量默认值是0,执行LED1
{
do //进入循环
{
Temp_Out001 = 0; //LED1 = 0;
Delay_1ms(500); //延时500ms
Temp_Out001 = 1; //LED1 = 1;
Delay_1ms(500); //延时500ms
} while(Value_tem == 0); //判断变量等于0一直循环执行否则退出
}
else if(Value_tem == 1) //如果按键按下变量加1, 等于 1 执行LED1
{
do //进入循环
{
Temp_Out002 = 0;
Delay_1ms(500);
Temp_Out002 = 1;
Delay_1ms(500);
} while(Value_tem == 1); //判断变量等于1一直循环执行否则退出
}
else if(Value_tem == 2) //如果按键按下变量加1, 等于2执行LED2
{
do
{
Temp_Out003 = 0;
} while(Value_tem == 2);
}
}
/
主程序
/
int main(void)
{
while(1)
{
Scank_keyCmd(); //循环扫描检测是否有按键按下
Display_VslutsbekCmd(); // 主程序循环扫描显示相应程序
}
}
开一个外部中断,接按键
按键触发后进入中断,循环判断按键,程序暂停,释放按键中断返回,程序继续运行
如果是按一下暂停,再按一下运行的话:
开一个外部中断,接按键
按键触发后进入中断,循环判断按键,释放按键后,等待按键再次触发,程序暂停,再次触发并释放后中断返回,程序继续运行
实现流水灯的方式有很多种(中断,定时器,延时等等),看用哪种方式,最简单的是延时做流水灯,那么在死循环里面增加按键检测,判断出有按键按下来时,再进入死循环,程序不往下走就可以暂停,再按跌出死循环。
#include //51系列单片机定义文件
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
void delay(uint); //声明延时函数
void main(void)
{
uint i;
uchar temp;
uint Flag1=0; 按键标志位bai
uint Flag2=0;
while(1)
{
Flag1 = keyscan();
if(Flag1==1)(Flag2=~Flag2); //如果一旦检测到一次按键扫描就把标志位2 打开;再次就关闭;
if(Flag2==1)// 如果标志位打开就开始流水灯
{
temp=0x01;
for(i=0;i<8;i++) //8个流水灯逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp<<=1;
}
}
扩展资料:
单片机编程就是硬件是单片机,基于单片机进行的程序开发,在有周围外设支持的情况下,用软件来控制的部分通过单片机编程来实现。单片机能识别的语言是硬件语言即汇编,因此编程就是围绕汇编来实现,有直接用汇编程序来编写的,但是较难调试的编写,特别是一上规模就更不易实现,因此常用高级语言来写然后通过编译器转化成汇编。
参考资料来源:百度百科-单片机C语言编程
1、创建项目文件。
2、按键:S1=P3^2,点亮: led=P1^5。
3、创建C语言主函数。
4、创建循环效果,检测效果。while(1) {}。
5、选择输出的效果。
6、当按下一个按键时,关闭灯,整个程序运行,再按一次,程序停止。
结构很规矩,这个程序。
首先单片机上电复位,运行死循环前面的程序(,你这里就是init_timer(); // 应该叫初始化定时器,才合适,让定时器按照你需要的定时长度工作,或叫产生中断 )
接下来单片机主程序就是一直在死循环了。我们的主要任务一般在这里处理。
中断,就是在处理一些特殊任务,比如按键,或定时处理的程序,或外部一个不知道什么时间发生的任务,或通信任务等等。你在主循环的时候,无论在什么时候,中断请求来了(可以理解为需要处理比较紧急任务,优先处理的任务),就会暂停主循环,进入对应中断服务程序。运行完,在回主循环的暂停地方,继续执行死循环的任务。
定时器中断,就是每过一定时间,运行一下中断服务程序。常用来计时和产生脉冲信号。
初始化定时器,就是给定时器的寄存器,设置工作模式,时钟源,溢出的计数值。设置好了,定时器就能根据每个时钟源的频率,进行计数,直至溢出,然后产生一个中断请求。如果不饿能自动加载计数初值的定时器,在中断处理函数(服务函数)必须手动加载初值。
以上就是关于单片机 按键产生中断 控制显示 程序全部的内容,包括:单片机 按键产生中断 控制显示 程序、利用单片机中断写出按键程序实现每按下一个按键一个程序立马停止而去执行另一个程序,写出主程序、怎么让正在运行的单片机程序暂停,其实就是要加个按键,当有键按下就暂停或运行。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)