关键词:数码管的段选和位选;138译码器
一、知识点
1、Y6控制段码,Y7控制公共端
二、实验
实验目的:数码管显示值
实验步骤:
S1:数码管0-9段选码排成数组NixieTable[]
S2:138译码器选中Yn端,InitHC138()函数,switch语句分支
S3:数码管在固定位置显示固定值函数,void ShowSMG(void)
void ShowSMG(void) { InitHC138(6);//573锁存器位选使能端打开 P0=0x01;//com1是阳极,要接1,所以连接它的P0口是0x01 InitHC138(7);//573锁存器段选使能端打开 P0=0x82;//段选6. }
S4:对ShowSMG()优化,使得通过改变参数使得可在不同位显示不同值(疑问)
void ShowSMG_bit(unsigned char dat,unsigned pos) { InitHC138(6);//数码管的位置 P0=0x01<<pos;//0x01左移1、2...位的含义? InitHC138(7);//数码管的内容 P0=dat; }
S5:编写数码管静态显示数字(设置循环变量i,j,循环在不同位显示不同值)
void SMG_Static() { unsigned char i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) { ShowSMG_bit(NixieTable[j],i); Delay(60000); } } }
S6:进一步完善码管静态显示数字函数,满足题意
整体代码:
#include <REGX52.H>
unsigned char code NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0-9+全空
void Delay(unsigned char t)
{
while(t--);
while(t--);
}
void InitHC138(unsigned char n)
{
switch(n)
{
case 4:P2=(P2&0x1F)|0x80;break;//1001 1111 //100->8
case 5:P2=(P2&0x1F)|0xA0;break;//1011 1111 //101->A
case 6:P2=(P2&0x1F)|0xC0;break;//1101 1111 //110->C
case 7:P2=(P2&0x1F)|0xE0;break;//1111 1111 //高三位清零&,|将高三位置值
}
}
void ShowSMG_bit(unsigned char dat,unsigned pos)
{
InitHC138(6);//数码管的位置
P0=0x01<<pos;//0x01左移1、2...位的含义?
InitHC138(7);//数码管的内容
P0=dat;
}
void SMG_Static()
{
unsigned char i,j;
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
{
ShowSMG_bit(NixieTable[j],i);
Delay(60000);//每个都显示6,依次循环
}
}
for(j=0;j<10;j++)
{
InitHC138(6);
P0=0xFF;
InitHC138(7);
P0=NixieTable[j];
Delay(60000);//延迟一会儿看的更清楚
Delay(60000);
}
}
void main()
{
while(1)
{
SMG_Static();
}
}
感谢B站小蜜蜂老师的教程,本笔记资料及代码均来自教程,仅作为个人复习、整理和学习交流用。