微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第66节:单片机外部中断的基础

第66节:单片机外部中断的基础

时间:11-22 来源:互联网 点击:

isplay_service(); //显示的窗口菜单服务程序

}

}

void display_service() //显示的窗口菜单服务程序

{

switch(ucWd) //本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。

{

case 1: //显示第一个窗口的数据 本系统中只有一个显示窗口

if(ucWd1Update==1) //窗口1要全部更新显示

{

ucWd1Update=0; //及时清零标志,避免一直进来扫描

ucDigShow8=10; //第8位数码管显示无

ucDigShow7=10; //第7位数码管显示无

ucDigShow6=10; //第6位数码管显示无

ucDigShow5=10; //第5位数码管显示无

//先分解数据

ucTemp4=uiPluseCnt/1000;

ucTemp3=uiPluseCnt%1000/100;

ucTemp2=uiPluseCnt%100/10;

ucTemp1=uiPluseCnt%10;

//再过渡需要显示的数据到缓冲变量里,让过渡的时间越短越好

//以下增加的if判断就是略作修改,把整个4位数据中高位为0的去掉不显示。

if(uiPluseCnt<1000)

{

ucDigShow4=10; //如果小于1000,千位显示无

}

else

{

ucDigShow4=ucTemp4; //第4位数码管要显示的内容

}

if(uiPluseCnt<100)

{

ucDigShow3=10; //如果小于100,百位显示无

}

else

{

ucDigShow3=ucTemp3; //第3位数码管要显示的内容

}

if(uiPluseCnt<10)

{

ucDigShow2=10; //如果小于10,十位显示无

}

else

{

ucDigShow2=ucTemp2; //第2位数码管要显示的内容

}

ucDigShow1=ucTemp1; //第1位数码管要显示的内容

}

break;

}

}

void display_drive()

{

//以下程序,如果加一些数组和移位的元素,还可以压缩容量。但是鸿哥追求的不是容量,而是清晰的讲解思路

switch(ucDisplayDriveStep)

{

case 1: //显示第1位

ucDigShowTemp=dig_table[ucDigShow1];

if(ucDigDot1==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xfe);

break;

case 2: //显示第2位

ucDigShowTemp=dig_table[ucDigShow2];

if(ucDigDot2==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xfd);

break;

case 3: //显示第3位

ucDigShowTemp=dig_table[ucDigShow3];

if(ucDigDot3==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xfb);

break;

case 4: //显示第4位

ucDigShowTemp=dig_table[ucDigShow4];

if(ucDigDot4==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xf7);

break;

case 5: //显示第5位

ucDigShowTemp=dig_table[ucDigShow5];

if(ucDigDot5==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xef);

break;

case 6: //显示第6位

ucDigShowTemp=dig_table[ucDigShow6];

if(ucDigDot6==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xdf);

break;

case 7: //显示第7位

ucDigShowTemp=dig_table[ucDigShow7];

if(ucDigDot7==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xbf);

break;

case 8: //显示第8位

ucDigShowTemp=dig_table[ucDigShow8];

if(ucDigDot8==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0x7f);

break;

}

ucDisplayDriveStep++;

if(ucDisplayDriveStep>8) //扫描完8个数码管后,重新从第一个开始扫描

{

ucDisplayDriveStep=1;

}

}

//数码管的74HC595驱动函数

void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)

{

unsigned char i;

unsigned char ucTempData;

dig_hc595_sh_dr=0;

dig_hc595_st_dr=0;

ucTempData=ucDigStatusTemp16_09; //先送高8位

for(i=0;i<8;i++)

{

if(ucTempData>=0x80)dig_hc595_ds_dr=1;

else dig_hc595_ds_dr=0;

dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器

delay_short(1);

dig_hc595_sh_dr=1;

delay_short(1);

ucTempData=ucTempData<1;

}

ucTempData=ucDigStatusTemp08_01; //再先送低8位

for(i=0;i<8;i++)

{

if(ucTempData>=0x80)dig_hc595_ds_dr=1;

else dig_hc595_ds_dr=0;

dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器

delay_short(1);

dig_hc595_sh_dr=1;

delay_short(1);

ucTempData=ucTempData<1;

}

dig_hc595_st_dr=0; //ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来

delay_short(1);

dig_hc595_st_dr=1;

delay_short(1);

dig_hc595_sh_dr=0; //拉低,抗干扰就增强

dig_hc595_st_dr=0;

dig_hc595_ds_dr=0;

}

void T0_time() interrupt 1 //定时器中断函数

{

TF0=0; //清除中断标志

TR0=0; //关中断

display_drive(); //数码管

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top