本节要完成的实验现象:8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。
训练重点:
1、弄清楚数码管的段码与显示数值之间关系。
2、共阳数码管的基本控制方法,特别是弄清楚COM端与显示码的关系。
1、电路分析
2、共阳数码管F3461BH(4位8段)
显示内容的编码思路:
3、代码实现
/**************************************************************实验现象:8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复***************************************************************/#include "reg52.h"#include "intrins.h"//1-9;A-Funsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};void HC138_state(unsigned char n){switch(n){case 4:P2 = (P2 & 0x1f)|0x80;break;case 5:P2 = (P2 & 0x1f)|0xa0;break;case 6:P2 = (P2 & 0x1f)|0xc0;break;case 7:P2 = (P2 & 0x1f)|0xe0;break;}} //延时函数void Delay500ms()//@11.0592MHz{unsigned char i, j, k;_nop_();_nop_();i = 22;j = 3;k = 227;do{do{while (--k);} while (--j);} while (--i);}//初始化关外设void InitSystem(){HC138_state(5);P0=0x00;//蜂鸣器,继电器都关闭}//数码管显示内容与位置的函数void SMG_Show_Bit(unsigned char dat,unsigned pos){HC138_state(6); //数码管的位置 P0 = 0x01 << pos;HC138_state(7); //数码管的内容 P0 = dat;}void SMG_Static(){//数码管分别单独显示0-9unsigned char i,j,k; for(i=0;i<8;i++){for(j=0;j<10;j++){SMG_Show_Bit(SMG_duanma[j],i);Delay500ms();}}//数码管同时显示0-ffor(k=0;k<16;k++){HC138_state(6);//数码管的位置 P0 = 0xff;HC138_state(7); //数码管的内容 P0 = SMG_duanma[k];Delay500ms();}}void main(){InitSystem();while(1){SMG_Static();}}
4、代码分析
1.显示内容
//1-9;A-F;-;.一共18个字符unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
2.控制数码管的显示内容与位置的函数
//数码管显示内容与位置的函数void SMG_Show_Bit(unsigned char dat,unsigned pos){HC138_state(6); //数码管的位置 P0 = 0x01 << pos;HC138_state(7); //数码管的内容 P0 = dat;}
其中显示内容dat=SMG_duanma[i];位置pos=0~7,对应板子第0~7位。