数码管左移解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数码管左移
名称:数码管左移
日期:2012年05月19日
内容:多位数码管分别显示不同数字,这种扫描显示方式成为动态扫描,并不停变化赋值
------------------------------------------------*/
#include
#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^6;//定义锁存使能端口段锁存(LATCH1(锁存器的段选端)可以用我们习惯的dula代替)
sbit LATCH2=P2^7;// 位锁存(LATCH2(位选端)可以用我们习惯的wela代替)
unsigned char code DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9
unsigned char code WeiMa[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//分别对应相应的数码管点亮,即位码(位码从高到低)
unsigned char TempData[9]; //存储显示值的全局变量(TempData【9】是含有9个元素的数组,全局变量,不明白建议去看看C语言)void Delay(unsigned int t); //函数声明
void Display(unsigned char FirstBit,unsigned char Num);
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
unsigned char i,k,j;(i与Display函数定义中的i不一样,局部变量)
unsigned char s;
while(1)
{
j++;
if(j==20) (有使正在移动的数延时一段时间的作用)
{
j=0;
if(0==k)
{
for(s=0;s<8;s++) //完全循环完成后清零所有缓冲区
TempData[s]=0xff;
}
TempData[i]=DuanMa[k]; //把需要显示的字符依次送缓冲区//(给TempData赋值,每执行一次该语句,只给TempData【9】中的一个元素赋值)
TempData[i-1]=0xff; //不需要显示的区域清零(一定看过实验现象才好理解,这里就那实验现象中0移动来说,0从0x80(位)到0x40位时(此时TempData【i】中只有TempData【0】和TempData【1】被赋值为0,其他的值为0xff(对共阳极而言,即什么都不显)),如果没TempData【i-1】=0xff这句,那么0x80和0x40位上都是0,这条语句作用是使0移动的数码管0x80位上什么都不显示,上面说清零有点不好理解)i++;
if(i==(8-k))(k起限制数字移动的次数的作用,对于k=0,i的最大值7,对于k=1,i为6。。。。对于k=7,i为0){
i=0;
k++;
if(k==8)
k=0;
}
}
Display(0,8);//从第一位显示,共显示8位
}
}
/*------------------------------------------------
延时函数,含有输入参数unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;(局部变量,i和main函数里的i不一样)
f or(i=0;i { DataPort=0xff; //清空数据,防止有交替重影 LATCH1=1; //段锁存 LATCH1=0; DataPort=WeiMa[i+FirstBit]; //取位码 LATCH2=1; //位锁存 LATCH2=0; DataPort=TempData[i]; //取显示数据,段码(TempData【i】里面的i值就是display中的i) LATCH1=1; //段锁存 LATCH1=0; Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影 }