单片机实验 八段数码管显示 c语言 汇编

合集下载

8段数码管显示实验

8段数码管显示实验

八段数码管的显示实验是一个程序语句长,编程设计的结构相对复杂的实验。

但是电类专业目一般在第4个实验就要编制八段数码管程序,因为该实验是其它后续大量实验的基础。

该实验是否能掌握,成为整个单片机实验课程能学习取得效果的转折点。

这样一个复杂的实验指望在2个学时的实验课上掌握是不可能的,采用如下的步骤和方法逐步推进会事半功倍!1.首先将八段数码管的实验箱电路在理论课程中作为例题出现,并且应该成为典型例题!图9-12是某实验箱的键盘和数码显示的部分电路,试回答下列问题:(1.)试写出8255的PA\PB\PC\及控制寄存器的地址;(2.)设置8255的控制寄存器,并初始化8255(88H);(3.)试写出键盘扫描程序一般应具有的功能;(4.)试编写在两位数码管上显示数字20编程思路(2段码为A4;0段选码为C0);(5).试写出用手按下键盘后,在八段数码管上显示对应键值的思路。

2. 实验课程内容必须分解2.1 首先完成能够在数码管上显示一个字符2.2 其次要求在数码管上能显示两个字符,动态显示2.3 最后要求在数码管上轮流显示0~F.3.教师应该提供2.1实验的参考程序作为引导,否则实践证明2个学时后编程程序的不超过10%4.附件 2.1程序cs8255 equ 0ffffh ;8255命令控制口outseg equ 0fffch ;字形控制口outbit equ 0fffdh ;字位/键扫控制口LEDBuf equ 60h ;显示缓冲Num equ 70h ;显示的数据DelayT equ 75h ;延迟参数org 0mov dptr,#CS8255mov a,#88h ;命令字:A,B口输出movx @dptr,a ;8255初始化FillBuf: mov a,#00hanl a,#0fhmov dptr,#LEDMapmovc a,@a+dptr ;数字转换成显示码mov @r0,a ;显示在码填入显示缓冲mov r2,#10000000b;从左边开始显示Loop:mov dptr,#OUTBITclr amovx @dptr,a ;关所有八段管mov a,@r0mov dptr,#OUTSEGmovx @dptr,amov dptr,#OUTBITmov a,r2movx @dptr,a ;显示一位八段管sjmp $LedMap: db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h ;八段管显示码db 080h,090h,088h,083h,0c6h,0a1h,086h,08ehend。

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟程序用数码管(8位)显示的数字时钟,由于是在开发板上写的程序,所以51单片机的一些I/O口设定并不完全一样,以下程序仅供参考#include<reg52.h>sbit dula=P2^6; //段选锁存器sbit wela=P2^7; //位选锁存器sbit key1=P3^2; //INT0 选择键sbit key2=P3^4; //T0 时间增加sbit key3=P3^6; //S4 时间减少char a=0,hour=0,minute=0,seconed=0;char h1,h2,m1,m2,s1,s2;char num=0;char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(char z){char x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display_hour(char h) //显示小时{h1=h/10;h2=h%10;wela=1;P0=0xfe; //1111 1110wela=0;P0=0xff;dula=1;P0=table[h1];dula=0;delay(5);wela=1;P0=0xfd; //1111 1101wela=0;P0=0xff;dula=1;P0=table[h2];delay(5);}void display_minute(char m) //显示分钟{m1=m/10;m2=m%10;wela=1;P0=0xf7; //1111 0111wela=0;P0=0xff;dula=1;P0=table[m1];dula=0;delay(5);wela=1;P0=0xef; //1110 1111wela=0;P0=0xff;dula=1;P0=table[m2];dula=0;delay(5);}void display_seconed(char s) //显示秒{s1=s/10;s2=s%10;wela=1;P0=0xbf; //1011 1111wela=0;P0=0xff;dula=1;P0=table[s1];dula=0;delay(5);wela=1;P0=0x7f; //0111 1111P0=0xff;dula=1;P0=table[s2];dula=0;delay(5);}void init() //初始化函数{TMOD=0x01; //定时器0工作方式1TH0=(65536-45872)/256; //装初值晶振11.0592 50ms为45872 TL0=(65536-45872)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //开启定时器0}void key() //按键函数,功能为对时间进行调整{if(key1==0) //key1键按下进入选择并停止定时器{delay(10);while(!key1); //松手检测TR0=0;num++; //没按一次key1 num自加1}if(num==1) //key1按一次进行“小时”调整{if(key2==0) //key2按下时间增加{delay(10);while(!key2);hour++;if(hour==24)hour=0;}if(key3==0) //key3按下时间减少{delay(10);hour--;if(hour<0)hour=23;}}if(num==2) //按下key1两次进行“分钟调整”{if(key2==0){delay(10);while(!key2);minute++;if(minute==60)minute=0;}if(key3==0){delay(10);while(!key3);minute--;if(minute<0)minute=59;}}if(num==3) //key1按下三次对“秒”进行调节{if(key2==0){delay(10);while(!key2);seconed++;if(seconed==60)seconed=0;}if(key3==0){delay(10);seconed--;if(seconed<0)seconed=59;}}if(num==4) //key1按下四次认为调节完毕开启定时器并将num清0 {num=0;TR0=1;}}void main(){init();while(1){display_seconed(seconed); //显示“秒,分,时”display_minute(minute);display_hour(hour);if(a==20) //判断定时器是否到1s{a=0;seconed++;if(seconed>59){seconed=0;minute++;if(minute>59){minute=0;hour++;if(hour>23){hour=0;}}}}key();}}void time() interrupt 1 {TH0=(65536-45872)/256; TL0=(65536-45872)%256; a++;}。

8位数码管显示电子时钟c51单片机程序

8位数码管显示电子时钟c51单片机程序

8位数码管显示电子时钟C51单片机程序时间:2012-09-10 13:52:26 来源:作者:/*8位数码管显示时间格式51 用于小时加1操作52 用于小时减1操作53 用于分钟加1操作54 用于分钟减1操作05 —50—00 标示05点50分00秒*/#inClude<>sbit KEY仁P39 // sbit KEY2=P3A1; 定义端口参数sbitKEY3=P3A2;sbit KEY4=P3A3;sbit LED=P1A2; // 定义指示灯参数Code unsigned Char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 共阴极数码管0—9 unsigned Char StrTab[8]; // 定义缓冲区unsigned Char minute=19,hour=23,seCond; // 定义并初始化为12:30:00void delay(unsigned int Cnt){while(--Cnt);}/****************************************************************/* 显示处理函数*//******************************************************************/void Displaypro(void){StrTab[0]=tab[hour/10]; //显示小时StrTab[1]=tab[hour%10];StrTab[2]=0x40; // 显示"-"StrTab[3]=tab[minute/10]; // 显示分钟StrTab[4]=tab[minute%10];StrTab[5]=0x40; // 显示"-"StrTab[6]=tab[seCond/10]; // 显示秒StrTab[7]=tab[seCond%10];}main()TMOD |=0x01; TH0=0xd8; // TL0=0xf0; // 定时器 0 10ms inM crystal 初值用于计时ET0=1; TR0=1; TMOD |=0x10; TH1=0xF8; TL1=0xf0; // //定时器 1用于动态扫描初值ET1=1; TR1=1; EA =1; Displaypro(); while(1){ //调用显示处理函数if(!KEY1){//按键 1去抖以及动作delay(10000); if(!KEY1){hour++;if(hour==24)hour=0;Displaypro();// 正常时间 小时 加 1if(!KEY2) // 按键 2去抖以及动作delay(10000); if(!KEY2){hour--;if(hour==255)hour=23;//正常时间 小时减1Displaypro();}if(!KEY3){delay(10000); if(!KEY3) {//按键去抖以及动作minute++;if(minute==60)minute=0; Displaypro(); // 分加1} }if(!KEY4) //{delay(10000);if(!KEY4){minute--;if(minute==255)minute=59;Displaypro(); 按键去抖以及动作// 分减1/****************************************************************/* 定时器1中断/**************************************************************** void time1_isr(void) interrupt 3 using 0 //{static unsigned char num;TH1=0xF8; // 重入初值TL1=0xf0;switch (num){case 0:P2=0;P0=StrTab[num];break; //case 1:P2=1;P0=StrTab[num];break;case 2:P2=2;P0=StrTab[num];break;case 3:P2=3;P0=StrTab[num];break;case 4:P2=4;P0=StrTab[num];break;case 5:P2=5;P0=StrTab[num];break;case 6:P2=6;P0=StrTab[num];break;case 7:P2=7;P0=StrTab[num];break;default:break;*/定时器1用来动态扫描分别调用缓冲区的值进行扫描} num++; //if(num==8) 扫描8次,使用8个数码管}num=0;**************************************************************定时器0中断*/ /***************************************************************void tim(void) interrupt 1 using 1{static unsigned char count; //TH0=0xd8; // 重新赋值TL0=0xf0;count++;switch (count){case 0:case 20:case 40:case 60:case 80:Displaypro();break; // case50:P1=~P1;break; // default:break;}if (count==100){count=0;second++; // 秒加 1 if(second==60){second=0;minute++; // if(minute==60) {minute=0;hour++; // if(hour==24) hour=0;}定义内部局部变量隔一定时间调用显示处理半秒LED 闪烁分加1时加1基于单片机的LCD1602空制总线模式时间:2012-09-10 13:50:39 来源:作者:第一行显示"Welcome"; 第二行显示="Happy day"; 若要显示其他字符,请直接往数组LCMLineOne[16] 和LCMLineTwo[16] 填充相应的代码。

单片机八段数码管显示实验原理及分析报告

单片机八段数码管显示实验原理及分析报告

八段数码管显示实验原理及分析报告学 院 计算机工程学院 专 业 计算机科学与技术 年级班别 09计算机科学与技术1班 学 号 2009404010123 学生姓名 郑伟伟 指导教师 李 永2011年 1月18 日JINGCHU UNIVERSITY OF TECHNOLOGY目录一、实验项目的目标 (3)二、八段数码管显示实验原理及分析 (3)1、实验线路 (3)2、实验器材 (3)3、实验工作原理 (4)4、实验步骤 (5)5、实验现象的分析说明 (5)6、程序框架图 (6)7、实验所用芯片的使用介绍 (7)(1)、8155IO/RAM扩展芯片说明 (7)(2)、74ls164芯片说明 (8)8、实验代码分析 (8)三、调试 (16)四、心得体会 (17)一、实验项目的目标:1、了解数码管动态显示的原理。

2、了解74LS164扩展端口的方法。

3、利用实验仪提供的显示电路,动态显示一行数据。

二、实验项目的原理1实验线路:这里只是显示草图,详细原理参见第一章的1.1.15 “8155键显模块”。

2、实验器材:1、超想-3000TC综合实验仪 1 台2、KEIL仿真器 1 台3、计算机 1 台3、实验工作原理:(1)、本实验仪提供了8段码数码管LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。

显示共有6位,采用动态方式显示。

8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。

6位位码由8155的PA0口输出,经uA2003反向驱动后,选择相应显示位。

74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。

写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74LS164中,向显示位选通地址输出高电平就可以点亮相应的显示位。

本实验仪中数据位输出地址为0e102H ,时钟位输出地址为0e102H ,位选通输出地址为 0e101H 。

c51单片机驱动三位8段数码管显示0.00-9.99,c语言程序

c51单片机驱动三位8段数码管显示0.00-9.99,c语言程序
#include <reg51.h>
unsigned char temp[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
unsigned char table[3];
unsigned iபைடு நூலகம்t num;
void display(unsigned int num)
TH0 = 0xfc;
TL0 = 0x18;
j++;
if(i < 3)
{
P2 = 0xf8;
P1 = 0x00;
P2 = ~(1 << i);
P1 = table1[i];
i++;
}
else
i = 0;
if(j >= 1000)
{
num++;
if(num > 999)
num = 0;
j = 0;
}
用的是共阴极数码管,定时器延时,不会出现数码管抖动现象
定时器自动加,会从0.00-9.99自动显示,9.99以后又清0.00
追问
我是从ADC0908中传出的8位数字量到单片机上,用单片来动态显示到数码管上的,不知道是不是要标定一下?(传感器输出1-5v,量程是0-10米经AD转换后给单片机用数码管显示0-10米,且在1米和8米处要求报警)
是不是该用单片机不断地循环查询?
回答
不知道这个有没的AD转换中断,如果有可以在每次转换成功以后查下,没有的话,估计要不断查询
TL0 = 0x18;
ET0 = 1;

实验报告_八段数码管实验

实验报告_八段数码管实验
将数码管各笔划发光元件的负极连在一起称为共阴数码管,且该共电极连接电路电源的负极,而各笔划元件的正极连接驱动电路。它适用于高电平有效的驱动电路,当某一笔划的驱动电平为高电平时,该笔划发光。
1.1解释和推导0,1,2的共阳的段码,并列举出0~9的段码。
由高到低位 dpgfedcba。因为共阳,低电平有效
4次循环,每次循环改变P0的值和改变位选并延时。
改变P0的指通过timeCtrl中4个数字,代表codeValue所对应的段码的下标,选出对应的段码赋给P0
P2位选是有4个数码管,对应p2.0,p2.1,p2.2,p2.3。循环4次就通过codeCtrl数组访问了这4个数码管,由于蜂鸣器也是P2.4控制,所以数码管位选&flag就能通过改变flag的值来控制蜂鸣器的响。
0就是abcdef为0,其余为1.所以段码11000000为C0H
1就是bc为0,其余为1,所以段码11111001为F9H
2就是abged为0,其余为1,所以段码10100100为A4H
3B0H499H592H682H7F8H880H990H
1.2 详细解释实验板上,P0口是如何进行分时复用,并和位选信号配合,实现多个数码管同时显示的。
(1)数码管高两位显示分钟数,低两位显示秒数。
(2)定时器T0工在16位定时器状态,溢出产生中断进行响应。
(3)每满一分钟,蜂鸣器响一次,进行提醒。
(4)INT0工作在边沿触发模式,每按下一次进行“开始计时”与“停止计时”之间的来回切换。每次停止之后,重新从0开始计时。
1 数码管工作原理分析
1.0什么是数码管?什么是共阴和共阳?
重 庆 理 工 大 学
实验报告
课程汇编语言程序设计
题目八段数码管实验

八段数码管显示实验

八段数码管显示实验

实验一 八段数码管显示实验一、实验目的:1、了解数码管动态显示的原理。

2、了解74LS164扩展端口的方法。

二、实验要求:利用实验仪提供的显示电路,动态显示一行数据。

三、实验电路:这里只是显示草图,详细原理参见第一章的1.1.15 “8155键显模块”。

四、实验说明:1、本实验仪提供了8段码数码管LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。

显示共有6位,采用动态方式显示。

8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。

6位位码由8155的PA0口输出,经uA2003反向驱动后,选择相应显示位。

74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。

写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74LS164中,向显示位选通地址输出高电平就可以点亮相应的显示位。

本实验仪中数据位输出地址为0e102H ,时钟位输出地址为0e102H ,位选通输出地址为 0e101H 。

本实验涉及到了8155 I0/RAM 扩展芯片的工作原理以及74LS164器件的工作原理。

2六、实验步骤:1、将KEIL仿真器上40芯排线一端和实验箱上51CPU板上的40芯排针连接起来,将仿真器连接的USB或串口线与PC机对应的USB或串口连接起来,打开实验箱电源。

2、进入KEIL软件界面,点击项目/打开项目在C:\KEIL\UV2\次1配套实验例程中选择实验一,内有ASM和C51两种程序,进入ASM 文件夹打开LED项目文件进入如图所示界面点击“调试/启动/停止调试”,进入调试界面,点击“调试/运行”可看到8段数码管交替显示0—F七、实验程序:OUTBIT equ 0e101h ; 位控制口CLK164 equ 0e102h ; 段控制口(接164时钟位)DAT164 equ 0e102h ; 段控制口(接164数据位)IN equ 0e103h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;org 0000hljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #00hmovx @dptr, a ; 关所有八段管mov a, @r0mov B, #8 ; 送164DLP:rlc amov r3, amov acc.0, cANL A, #0FDHmov dptr, #DAT164movx @dptr, amov dptr, #CLK164orl a,#02hmovx @dptr, aanl a,#0fDhmovx @dptr, amov a, r3djnz B, DLPmov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管retStart: mov dptr,#0e100hmov a,#03hmovx @dptr,amov sp, #40hmov Num, #0MLoop:inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ; 数字转换成显示码mov @r0,a ; 显示在码填入显示缓冲 inc r0inc bcjne r0, #LEDBuf+6, FillBuf mov DelayT,#30 DispAgain:call DisplayLED ; 显示djnz DelayT,DispAgainljmp MLoopEND。

单片机实验八段数码管显示

单片机实验八段数码管显示

“验证式"? 实验十一八段数码管显示;文件名(A11.ASM)OUTBIT equ 0e101h ; 位控制口CLK164 equ 0e102h ; 段控制口(接164时钟位) DA T164 equ 0e102h ; 段控制口(接164数据位) IN equ 0e103h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #00hmovx @dptr, a ; 关所有八段管mov a, @r0mov B, #8 ; 送164DLP:rlc amov r3, amov acc.0, cANL A, #0FDHmov dptr, #DA T164movx @dptr, amov dptr, #CLK164orl a,#02hmovx @dptr, aanl a,#0fDhmovx @dptr, amov a, r3djnz B, DLPmov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管retStart: mov dptr,#0e100hmov a,#03hmovx @dptr,amov sp, #40hmov Num, #0MLoop:inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ; 数字转换成显示码mov @r0,a ; 显示在码填入显示缓冲inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#30DispAgain:call DisplayLED ; 显示djnz DelayT,DispAgainljmp MLoopend。

单片机LED点亮一个灯及数码管显示1至8c练习程序

单片机LED点亮一个灯及数码管显示1至8c练习程序
单片机led点亮一个灯及数码管显示1至8c练习程序点亮练习一个单片机led灯和数码管led程序一个源程序数码管
#include<reg52.h>//调52系列单片机的头文件
#include<intrins.h>//包含_crol_函数所在的头文件
#define uchar unsigned char/*宏定义*/
wela=1;//原来段选数据通过位选锁存器造成混乱
P0=0xfb;//送位选数据
wela=0;
delayms(600);//延时
dula=1;
P0=table[4];
dula=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时
wela=1;//原来段选数据通过位选锁存器造成混乱
P0=0xf7;//送位选数据
P0=table[6];
dula=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时
wela=1;//原来段选数据通过位选锁存器造成混乱
P0=0xdf;//送位选数据
wela=0;
delayms(600);//延时
}
}
void delayms(uint xms)
{
uint i,j;
dula=1;
P0=table[2];
dula=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时
wela=1;//原来段选数据通过位选锁存器造成混乱
P0=0xfd;//送位选数据
wela=0;
delayms(600);//延时
dula=1;
P0=table[3];
dula=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时

基于汇编语言(含C)的单片机Led点阵显示.doc

基于汇编语言(含C)的单片机Led点阵显示.doc

基于汇编语言(含C)的单片机Led点阵显示8×8发光二极管点阵显示技术在8×8发光二极管点阵上显示一个柱状,允许它从左到右平滑移动三次,然后从右到左移动三次,然后从上到下移动三次,最后从下到上移动三次,如此循环。

电路原理图图4.24.1硬件电路连接(1)。

将“单片机系统”区域的P1端口连接到“点阵模块”区域的“DR1-DR8”端口,带8个内核。

(2)将“微控制器系统”区域中的P3端口连接到具有8个内核的“点阵模块”区域中的“DC1-DC8”端口。

程序设计内容(1)。

8×8点阵发光二极管的工作原理如下图所示,说明了8×8点阵发光二极管的结构。

从图4.24.2可以看出,8×8点阵总共需要64个发光二极管,每个发光二极管位于行线和列线的交点处。

当相应的列设置为1电平,相应的行设置为0电平时,相应的二极管将点亮。

因此,为了实现柱状照明方法,如图49所示,相应的列是垂直列,或者相应的列是水平列。

因此,实现柱照明的方法如下: 垂直列:扫描行时,相应的列设置为1。

水平栏:扫描列时,相应的行被设置为0。

汇编源程序org 00H start : no MOV 3,# 3lop23360movr4,# 8movr2,# 0lop1:movp1,# 0fffhmovdptr,# tabamova,r2 movca,@ adpmovp3,A INC R2 LCALL DELAY DJNZ R4,LOP1 DJNZ R3,LOP2 MOV R3,#3 LOP4: MOV R4,#8 MOV R2,# 7 LOP : MOV P1,#0FFH MOV R2 MOVC公司,@A DPTR MOV P1公司R2 LCALL DELAY DJNZ R4,LOP5 DJNZ R3,LOP6 MOV R3,#3 LOP8: MOV R4,#8 MOV R2,#7 LOP7: MOV P3,#00H MOV DPTR,#TABB MOV A,R2 MOVC A,@A DPTR MOV P1,A DEC R2 LCALL DELAY DJNZ R4,LOP7 DJNZ R3,LOP8 LJMP启动延迟3360 MOV R5 无符号字符代码tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x 80 };void delay(void) {无符号字符I,j;对于(i=10i0;(j=248j0;j-);} void delay1(void) {无符号字符I,j,k;对于(k=10k0;(i=20i0;(j=248j0;j-);} void main(void) {未签名char i,j;而(1) {对于(j=0;J3;j)//从左到右3次{对于(I=0;i8;㈠P3=塔巴·[一世;P1=0x ff;delay 1();} }对于(j=0;J3;j)//从右向左3次{对于(I=0;i8;I){ P3=塔巴·[7-I];P1=0x ff;delay 1();} }对于(j=0;J3;j)//从上到下3次{对于(I=0;i8;I){ P3=0x 00;P1=塔布·[7-I];delay 1();} }对于(j=0;J3;j)//从底部到顶部3次{对于(I=0;i8;I){ P3=0x 00;P1=塔布·[一世];delay 1();单词模型。

8位数码管显示电子时钟c51单片机程序

8位数码管显示电子时钟c51单片机程序

8位数码管显示电子时钟c51单片机法式之阿布丰王创作时间:2012-09-10 13:52:26 来源:作者:/*8位数码管显示时间格式 05—50—00 标示05点50分00秒S1 用于小时加1把持S2 用于小时减1把持S3 用于分钟加1把持S4 用于分钟减1把持*/#include<reg52.h>sbit KEY1=P3^0; //界说端口参数sbit KEY2=P3^1;sbit KEY3=P3^2;sbit KEY4=P3^3;sbitLED=P1^2; //界说指示灯参数code unsigned chartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管0—9unsigned char StrTab[8]; //界说缓冲区unsigned char minute=19,hour=23,second; //界说并初始化为 12:30:00void delay(unsigned int cnt){ while(--cnt);}/******************************************************************//* 显示处置函数*//******************************************************************/void Displaypro(void){StrTab[0]=tab[hour/10]; //显示小时StrTab[1]=tab[hour%10]; StrTab[2]=0x40; //显示"-" StrTab[3]=tab[minute/10]; //显示分钟StrTab[4]=tab[minute%10];StrTab[5]=0x40; //显示"-"StrTab[6]=tab[second/10]; //显示秒StrTab[7]=tab[second%10];}main(){ TMOD |=0x01; //按时器0 10msinM crystal 用于计时 TH0=0xd8; //初值TL0=0xf0; ET0=1; TR0=1;TMOD |=0x10; //按时器1用于静态扫描TH1=0xF8; //初值 TL1=0xf0; ET1=1; TR1=1; EA =1; Displaypro(); //调用显示处置函数while(1) { if(!KEY1) //按键1去抖以及举措{ delay(10000); if(!KEY1){ hour++;if(hour==24)hour=0;//正常时间小时加1Displaypro(); } }if(!KEY2) //按键2去抖以及举措{ delay(10000);if(!KEY2){ hour--;if(hour==255)hour=23;//正常时间小时减1Displaypro(); } } if(!KEY3) //按键去抖以及举措{ delay(10000);if(!KEY3){ minute++;if(minute==60)minute=0;//分加1Displaypro(); } } if(!KEY4) //按键去抖以及举措{ delay(10000);if(!KEY4){ minute--;if(minute==255)minute=59;//分减1Displaypro(); } }}}/******************************************************************//* 按时器1中断*//******************************************************************/void time1_isr(void) interrupt 3 using 0//按时器1用来静态扫描{ static unsigned char num;TH1=0xF8; //重入初值 TL1=0xf0;switch (num){ case0:P2=0;P0=StrTab[num];break; //分别调用缓冲区的值进行扫描 case 1:P2=1;P0=StrTab[num];break; case 2:P2=2;P0=StrTab[num];break; case3:P2=3;P0=StrTab[num];break; case4:P2=4;P0=StrTab[num];break; case5:P2=5;P0=StrTab[num];break; case6:P2=6;P0=StrTab[num];break; case7:P2=7;P0=StrTab[num];break;default:break; } num++; //扫描8次,使用8个数码管 if(num==8) num=0;}/******************************************************************//* 按时器0中断*//******************************************************************/void tim(void) interrupt 1 using1{ static unsigned char count; //界说内部局部变量TH0=0xd8; //重新赋值 TL0=0xf0;count++; switch (count){ case 0: case 20:case 40: case 60: case80:Displaypro();break; //隔一按时间调用显示处置case 50:P1=~P1;break; //半秒 LED 闪烁default:break; }if (count==100){ count=0; second++;//秒加1 if(second==60){ second=0;minute++; //分加1if(minute==60){ minute=0; hour++; //时加1if(hour==24)hour=0; } } } }基于单片机的LCD1602控制总线模式时间:2012-09-10 13:50:39 来源:作者:第一行显示"Welcome";第二行显示="Happy day";若要显示其他字符,请直接往数组 LCMLineOne[16]和LCMLineTwo[16]填充相应的代码.直接上图,仿真图如下:源法式如下,可以比较时序方式,理解总线的把持方法.#include<reg51.h>//#include<absacc.h>#define uchar unsigned char#define uint unsigned int #define busy0x80uchar xdata LCMWriteCOM _at_ 0x80ff; //写指令寄存器uchar xdata LCMReadCOM _at_ 0xa0ff ; //读指令寄存器uchar xdata LCMWriteData _at_ 0xc0ff ; //写数据寄存器uchar xdata LCMReadData _at_ 0xe0ff ; //读数据寄存器uchar data LCMLineOne[16]="Welcome"; //第一行显示的数据uchar data LCMLineTwo[16]="Happy day";//第二行显示的数据void Delayms(uchar ms){ uchar i,j; for(i=0;i<ms;i++) for(j=0;j<57;j++) ;}//写指令寄存器void LCMWriteC(uchar COMData){ uchar LCMStatus; do{ LCMStatus=(LCMReadCOM&busy); } while(LCMStatus!=0); LCMWriteCOM=COMData;}//读指令寄存器ucharLCMReadC(){uchar LCMStatus; do{ LCMStatus=(LCMReadCOM&busy); } while(LCMStatus!=0); LCMStatus=LCMReadCOM; return(LCMStatus);}//读数据寄存器uchar LCMReadD(uchar addr){uchar LCMStatus; do{ LCMStatus=(LCMReadCOM&busy); } while(LCMStatus!=0); LCMWriteC(0x80+addr); LCMStatus=LCMReadData;return(LCMStatus);}//写数据寄存器带地址void LCMWriteDAdd(uchar addr,uchar LCMData){uchar LCMStatus; do { LCMStatus=(LCMReadCOM&busy); }while(LCMStatus!=0); LCMWriteC(0x80+addr); LCMWriteData=LCMData;}//写数据寄存器无地址void LCMWriteD(ucharLCMData){uchar LCMStatus; do{ LCMStatus=(LCMReadCOM&busy); } while(LCMStatus!=0); LCMWriteData=LCMData;}//初始化voidLCMInit(void){ Delayms(15); LCMWriteCOM=0x38; Delayms(5); LCMWriteCOM=0x38; Delayms(5); LCMWriteCOM=0x38;Delayms(5); LCMWriteC(0x38); LCMWriteC(0x08);LCMWriteC(0x01); LCMWriteC(0x06); LCMWriteC(0x0c);} main(){ uchar i; LCMInit(); while(1){ LCMWriteC(0x80); //第一行开始地址for(i=0;i<16;i++) LCMWriteD(LCMLineOne[i]);LCMWriteC(0x80+0x40); //第二行开始地址for(i=0;i<16;i++) LCMWriteD(LCMLineTwo[i]); }}。

单片机实验 八段数码管显示 c语言 汇编

单片机实验 八段数码管显示 c语言 汇编

八段数码管显示汇编OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ;mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ;mov r2, #00100000b ;Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ;mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ;mov r6, #01call Delaymov a, r2 ;rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ;retStart:mov sp, #40hmov Num, #0MLoop:mov Num, #0inc Nummov a, Nummov b, amov r0, #LEDBuf FillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ;mov @r0,a ;inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#0 DispAgain:call DisplayLED ;djnz DelayT,DispAgainljmp MLoopendc语言#include<reg51.h>#define LEDLen 6xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口unsigned char LEDBuf[LEDLen]; // 显示缓冲code unsigned char LEDMAP[] = { // 八段管显示码0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d};void Delay(unsigned char CNT){ unsigned char i;while (CNT-- !=0)for (i=100; i !=0; i--);}void DisplayLED(){ unsigned char i;unsigned char Pos;unsigned char LED;Pos = 0x20; // 从左边开始显示for (i = 0; i < LEDLen; i++){ OUTBIT = 0; // 关所有八段管LED = LEDBuf[i];OUTSEG = LED;OUTBIT = Pos; // 显示一位八段管Delay(1);Pos >>= 1; // 显示下一位}OUTBIT = 0; // 关所有八段管}void main(){ unsigned char i = 0;unsigned char j;while(1){ LEDBuf[0] = LEDMAP[i%6];LEDBuf[1] = LEDMAP[(i+1)%6];LEDBuf[2] = LEDMAP[(i+2)%6];LEDBuf[3] = LEDMAP[(i+3)%6];LEDBuf[4] = LEDMAP[(i+4)%6];LEDBuf[5] = LEDMAP[(i+5)%6];i++;for(j=0; j<100; j++)DisplayLED(); // 显示}}。

8段数码管动态显示详解

8段数码管动态显示详解

原理图:8个数码管它的数据线并联接到JP5, 位控制由8个PNP型三级管驱动后由JP8引出。

相关原理:数码管是怎样来显示1,2,3,4呢?数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。

我们分别把他命名为A,B,C,D,E,F,G,H。

搞懂了这个原理, 我们如果要显示一个数字2, 那么 A,B,G,E,D这5个段的发光管亮就可以了。

也就是把B,E,H(小数点)不亮,其余全亮。

根据硬件的接法我们编出以下程序。

当然在此之前,还必须指定哪一个数码管亮,这里我们就指定最后一个P2.7。

LOOP:CLR P2.7 ;选中最后的数码管SETB P0.7 ;B段不亮SETB P0.5 ;小数点不亮SETB P0.1 ;C段不亮CLR P0.2 ;其他都亮CLR P0.3CLR P0.4CLR P0.6CLR P0.0JMP LOOP ;跳转到开始重新进行END把这个程序编译后写入单片机,可以看到数码管的最后一位显示了一个数字2。

也许你会说:显示1个2字就要10多行程序,太麻烦了。

显示数字2则是C,F,H(小数点)不亮,同时由于接法为共阳接法,那么为0(低电平)是亮为1(高电平)是灭。

从高往低排列,(p0.7_p0.0)写成二进制为01111110, 把他转化为16进制则为A2H。

我们可以根据硬件的接线把数码管显示数字编制成一个表格, 以后直接调用就行了。

有了这个表格上面显示一个2的程序则可简化为:LOOP:CLR P2.7 ;选中左边的数码管MOV P0,#0A2H ;送数字2的代码到P0口JMP LOOP ;跳转到开始重新进行END原理图中把所有数码管的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。

CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,由8个PNP的三极管,来控制这8位哪一位工作,例如上面的例子中我们选中的是P2.7.就是最后的一位亮了. 同样的如果要第一位亮, 只需要把程序CLR P2.7改为CLR P2.0即可。

8位数码管秒表C程序

8位数码管秒表C程序

8位数码管秒表C程序/***********************************************************实验名称:8位数码管秒表达例程序程序阐明:烧好程序,短接J1的左端,按下S6即可看到秒表运行,再按下S6秒表暂停计时,按第三下秒表归零。

作者:RF-X1开发板团体日期:-08-01***********************************************************/#include <reg51.h>#include <intrins.h>unsigned char data dis_digit;unsigned char key_s, key_v;unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, offunsigned char dis_buf[8]; // 显示缓冲区unsigned char sec_bcd[8]; // 秒计数值, BCD码unsigned char dis_index; //unsigned char key_times; // K1 按下次数 //void clr_time();void update_disbuf();bit scan_key();void proc_key();void delayms(unsigned char ms);sbit K1 = P3^2;/******************************************/ /* 主函数 */ /******************************************/ void main(void) {P0 = 0xff;P2 = 0xff;TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式TH1 = 0xdc;TL1 = 0;TH0 = 0xFC;TL0 = 0x17;clr_time(); //dis_digit = 0x7f; // 初始显示P30口数码管dis_index = 0; //key_times = 0;key_v = 0x01;IE = 0x8a; // 使能timer0, timer1中断TR0 = 1;TR1 = 0;while(1){if(scan_key()){delayms(10);if(scan_key()){key_v = key_s;proc_key();}}}}/******************************************/ /* 清零 *//******************************************/ void clr_time(){sec_bcd[0] = 0x0;sec_bcd[1] = 0x0;sec_bcd[2] = 0x0;sec_bcd[3] = 0x0;sec_bcd[4] = 0x0;sec_bcd[5] = 0x0;sec_bcd[6] = 0x0;sec_bcd[7] = 0x0;update_disbuf();}/******************************************//* 键盘扫描子程序 */ /******************************************/ bit scan_key(){key_s = 0x00;key_s |= K1;return(key_s ^ key_v);}/******************************************//* 键盘解决子程序 */ /******************************************/ void proc_key(){if((key_v & 0x01) == 0){key_times++;if(key_times == 1){TR1 = 1;}else if(key_times == 2){TR1 = 0;}else{clr_time();key_times = 0;}}}/*******************************************//*定时器0中断服务程序, 用于数码管的动态扫描*//*dis_index --- 显示索引, 用于标记目前显示的数码管和缓冲区的偏移量 */ /*dis_digit --- 位选通值,传送到P2口用于选通目前数码管的数值, 如等于0xfe时,选通P2.0口数码管*/ /*dis_buf ---显于缓冲区基地址 *//******************************************/ void timer0() interrupt 1{TH0 = 0xFC;TL0 = 0x17;P2 = 0xff; // 先关闭全部数码管P0 = dis_buf[dis_index]; // 显示代码传送到P0口P2 = dis_digit; //dis_digit = _cror_(dis_digit,1); // 位选通值右移(P20<-P27),下次中断时选通下一位数码管dis_index++; //dis_index &= 0x07; //8个数码管全部扫描完一遍之后,再回到第一种开始下一次扫描}/******************************************/ /* 定时中断1 *//******************************************/ void timer1() interrupt 3 {unsigned char i;TH1 |= 0xdc;for(i = 0; i < 8; i++){sec_bcd[i]++; // 低位加1if(sec_bcd[i] < 10) // 如果低位满10则向高位进1break; // 低位未满10sec_bcd[i] = 0; // 低位满10清0}update_disbuf(); // 更新显示缓冲区}/******************************************/ /* 更新显示缓冲区 */ /******************************************/ void update_disbuf() {dis_buf[0] = dis_code[sec_bcd[7]];dis_buf[1] = dis_code[sec_bcd[6]];dis_buf[2] = dis_code[sec_bcd[5]];dis_buf[3] = dis_code[sec_bcd[4]];dis_buf[4] = dis_code[sec_bcd[3]];dis_buf[5] = dis_code[sec_bcd[2]]& 0x7f; // 加上小数点dis_buf[6] = dis_code[sec_bcd[1]];dis_buf[7] = dis_code[sec_bcd[0]]; }/******************************************//* 延时子程序 */ /******************************************/ void delayms(unsigned char ms) {unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}。

用PIC单片机驱动按键控制8个数码管的显示的C程序

用PIC单片机驱动按键控制8个数码管的显示的C程序

用PIC16F877A单片机驱动按键控制8个数码管的显示的C程序经典按键控制数码管C程序#include <htc.h>#define HC595_SER RB7#define HC595_SCK RB6#define HC595_RCK RB5#define key_164_data RB3#define key_164_clk RB2#define key_com1 RB1#define key_com0 RB0#define TURE 1bit key_finish; //定义的位变量,这是PICmate仿真软件环境的特有的地方unsigned int sample_key;unsigned int sample_keyBuf[2];unsigned int key_value;unsigned char key_row_sel;unsigned char key_number;//键号unsigned int T100ms;unsigned char disbuf[8];const unsigned char seven_seg[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5 e,0x79,0x71};//----------------------------------------------void disbuf_update(void){if(key_number>=16){disbuf[0]=0xff;disbuf[1]=0xff;disbuf[2]=0xff;disbuf[3]=0xff;disbuf[4]=0xff;disbuf[5]=0xff;disbuf[6]=0xff;disbuf[7]=0xff;return;}disbuf[0]=seven_seg[key_number];disbuf[1]=seven_seg[key_number];disbuf[2]=seven_seg[key_number];disbuf[3]=seven_seg[key_number];disbuf[4]=seven_seg[key_number];disbuf[5]=seven_seg[key_number];disbuf[6]=seven_seg[key_number];disbuf[7]=seven_seg[key_number];}//----------------------------------------------void inite_time0(void) //对timer0中断进行初始化{PSA=0;T0CS=0;T0IF=0;GIE=1;T0IE=1;TMR0=0xf0;PS0=1;PS1=1;PS2=1;}//----------------------------------------------//发送一个字节void s_pData(unsigned char key) //形参key对应着实参disbuf[i]{unsigned char i;for(i=0;i<8;i++){if(0x80&(key<<i))HC595_SER=1;else HC595_SER=0;HC595_SCK=0;HC595_SCK=1;}}//----------------------------------------------//发送一个字节void Key_s_pData(unsigned char key){unsigned char i;for(i=0;i<8;i++){if(0x80&(key<<i))key_164_data=1;elsekey_164_data=0;key_164_clk=0;key_164_clk=1;}}//---------------------------------------------- void display (void){unsigned char i;for(i=0;i<8;i++)s_pData(disbuf[i]);HC595_RCK=0;HC595_RCK=1;}//---------------------------------------------- void key_process(void){unsigned char i;for(i=0;i<16;i++){if( (key_value&(0x0001<<i)) ){key_number=i;return;}}}//---------------------------------------------- //主程序int main(void){PORTB=0;TRISB=0x03;inite_time0();key_number=0xff;while(1){if(key_finish==TURE){//按键扫描成功key_process();key_finish=0;}if(T100ms<10)continue;T100ms=0;disbuf_update();display();}}//---------------------------------------------- void scan_key(void){sample_key =sample_key<<1;if(key_com1)sample_key |=0x0001;sample_key =sample_key<<1;if(key_com0)sample_key |=0x0001;key_row_sel++;if(key_row_sel<8){Key_s_pData(1<<key_row_sel);return;}key_row_sel=0;Key_s_pData(1<<key_row_sel);sample_keyBuf[0]=sample_key;if(sample_keyBuf[1]!=sample_keyBuf[0]){sample_keyBuf[1]=sample_keyBuf[0];return;}key_value=sample_keyBuf[0];if(key_value!=0)key_finish=TURE;}//-------------------------------------------- //2ms中断interruptvoid time_int(void){if(T0IF==1){T0IF=0;TMR0=0xf0;T100ms++;scan_key();}}它的电路图可以参考用PIC16F877A单片机驱动按键控制8个数码管的显示电路图.。

8位动态LED数码管显示实验——【全国大学生电子设计大赛】

8位动态LED数码管显示实验——【全国大学生电子设计大赛】

8位动态LED数码管显示实验2008-03-18 18:048.1 实物图与原理图本实验仪配置带8位动态扫描显示模块一个。

实物图如下:为减少IO的使用,我们采用串入并出芯片CD4094来扩展了IO 口,即采用3个IO来实现数据的传输。

原理图如下:所以,我们占用3个IO来传输数据,8个IO来进行8个LED数码管的位选。

在本实验仪中链接管教分布如下:STK-----P2.5DAT-----P2.6CLK-----P2.7B0、B1、B2、B3、B4、B5、B6、B7接P0口(P0.0 P0.1 P0.2 P0.3 P0.4 P0.5P0.6 P0.7)由于上一节已经讲述了CD4094驱动一位LED数码管的问题,这里我们讲如何来扫描8位数码管。

8.2 LED动态显示原理根据原理图管脚连接,我们知道P0口控制了8个LED数码管的位选中,所以如果想让8个数码管都亮起来,我们可以逐位扫描8位数码管。

1动态显示原理:原理上同一时刻只有一位LED是点亮的,但只要扫描的频率足够高(一般大于25Hz),由于人眼的视觉暂留特性,直观上感觉却是连续点亮的,这就是常说的动态扫描显示。

动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。

如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,所以一般均取几个ms左右为宜。

8.3 DG3000 动态显示头文件display_s.h----------------------------------------------------------程序作用:显示头文件display_s.h----------------------------------------------------------#ifndef _display_#define _display_#include <intrins.h>sbit SDA=P2^6; 定义显示管脚sbit CLK=P2^7;unsigned char data display_bit;unsigned char codeled[20]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x89,0x8C};2旗开得胜定义段码延时程序void delay(unsigned int k){ unsigned int i,j;for(i=0;i<k;i++)for(j=0;j<100;j++);}数据传输void send(unsigned char a){unsigned char i;for(i=0;i<8;i++){if(_crol_(a,i)&0x80)SDA=1;elseSDA=0;CLK=0;CLK=1;}}3显示程序8位LED数码管扫描void display(unsigned char display_buffer[8]){unsigned char i,k;display_bit=0xfe;for(i=0;i<8;i++){k=led[display_buffer[i]];send(k);P0=display_bit;delay(0x01);P0=0xff;display_bit=_crol_(display_bit,1);}display_bit=0xfe;8.4 8位数码管动态显示01234567(C51程序)----------------------------------------------------------程序作用:动态扫描显示01234567----------------------------------------------------------#include<REG52.h>#include<display_s.h> 调用显示头文件4main(){unsigned chara[8]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7};显示01234567 while(1){display(a); 显示数据}}8.5 8位数码管动态显示01234567(汇编);----------------------------------------------------------;程序作用:8位数码管动态显示01234567(汇编);----------------------------------------------------------;定义变量DBUF DATA 40H ;显示缓冲区首址SP_BT DATA 60H ;堆栈指针初值; LED 位选LED_CS1 BIT P0.0LED_CS2 BIT P0.1LED_CS3 BIT P0.2LED_CS4 BIT P0.35旗开得胜LED_CS5 BIT P0.4LED_CS6 BIT P0.5LED_CS7 BIT P0.6LED_CS8 BIT P0.7;4094接口SDA_4094 BIT P2^6CLK_4094 BIT P2^7ORG 0000HAJMP MAIN;-------------------------------ORG 0030HMAIN: MOV SP,#60HMOV R0,#0FFH;单元清零RES1: MOV R0,#0DJNZ R0,RES1MOV DBUF,#00H;显示数据MOV DBUF+1,#01HMOV DBUF+2,#02HMOV DBUF+3,#03HMOV DBUF+4,#04H6旗开得胜MOV DBUF+5,#05HMOV DBUF+6,#06HMOV DBUF+7,#07HSAMP1:LCALL DIR ;调用显示SJMP SAMP1;------------------------------------------------------;显示数据;-------------------------------------------------------DIR:;显示程序MOV DPTR,#TABLEMOV A,DBUFMOVC A,A+DPTRACALL DISP_da ;送段码输出CLR LED_CS1 ;选通第1位数码管LCALL DELAY_4094SETB LED_CS1 ;关闭显示MOV A,DBUF+1MOVC A,A+DPTRANL A,#7FH;加小数点7ACALL DISP_da ;送段码输出CLR LED_CS2;选通第1位数码管LCALL DELAY_4094SETB LED_CS2;关闭显示MOV A,DBUF+2MOVC A,A+DPTRACALL DISP_da ;送段码输出CLR LED_CS3 ;选通第1位数码管LCALL DELAY_4094SETB LED_CS3 ;关闭显示MOV A,DBUF+3MOVC A,A+DPTRACALL DISP_da ;送段码输出CLR LED_CS4;选通第1位数码管LCALL DELAY_4094SETB LED_CS4;关闭显示MOV A,DBUF+4MOVC A,A+DPTRACALL DISP_da ;送段码输出CLR LED_CS5 ;选通第1位数码管LCALL DELAY_40948SETB LED_CS5 ;关闭显示MOV A,DBUF+5MOVC A,A+DPTRANL A,#7FH;加小数点ACALL DISP_da ;送段码输出CLR LED_CS6;选通第1位数码管LCALL DELAY_4094SETB LED_CS6;关闭显示MOV A,DBUF+6MOVC A,A+DPTRACALL DISP_da ;送段码输出CLR LED_CS7 ;选通第1位数码管LCALL DELAY_4094SETB LED_CS7 ;关闭显示MOV A,DBUF+7MOVC A,A+DPTRACALL DISP_da ;送段码输出CLR LED_CS8;选通第1位数码管LCALL DELAY_4094SETB LED_CS8;关闭显示;-------------------------------------9RETTABLE: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0~9DB 88H,83H,0C6H,0A1H,86H,8EH ;A~F;-------------------------延时子程序---------------------------------DELAY_4094: MOV R4,#2 ;延时程序3,精确延时1000微秒D_4094:MOV R5,#248DJNZ R5,$DJNZ R4,D_4094RETDISP_DA:MOV R3,#08HDUP: RLC AMOV SDA_4094,CCLR CLK_4094SETB CLK_4094DJNZ R3,DUPRETEND10。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

八段数码管显示汇编
OUTBIT equ 08002h ; 位控制口
OUTSEG equ 08004h ; 段控制口
LEDBuf equ 60h ; 显示缓冲
Num equ 70h ; 显示的数据
DelayT equ 75h ;
ljmp Start
LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
Delay: ;
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ;
mov r2, #00100000b ;
Loop:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ;
mov a, @r0
mov dptr, #OUTSEG
movx @dptr,a
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ;
mov r6, #01
call Delay
mov a, r2 ;
rr a
mov r2, a
inc r0
djnz r1, Loop
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ;
ret
Start:
mov sp, #40h
mov Num, #0
MLoop:
mov Num, #0
inc Num
mov a, Num
mov b, a
mov r0, #LEDBuf FillBuf:
mov a, b
anl a, #0fh
mov dptr, #LEDMap
movc a, @a+dptr ;
mov @r0,a ;
inc r0
inc b
cjne r0, #LEDBuf+6, FillBuf
mov DelayT,#0 DispAgain:
call DisplayLED ;
djnz DelayT,DispAgain
ljmp MLoop
end
c语言
#include<reg51.h>
#define LEDLen 6
xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口
unsigned char LEDBuf[LEDLen]; // 显示缓冲code unsigned char LEDMAP[] = { // 八段管显示码0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d
};
void Delay(unsigned char CNT)
{ unsigned char i;
while (CNT-- !=0)
for (i=100; i !=0; i--);
}
void DisplayLED()
{ unsigned char i;
unsigned char Pos;
unsigned char LED;
Pos = 0x20; // 从左边开始显示
for (i = 0; i < LEDLen; i++)
{ OUTBIT = 0; // 关所有八段管LED = LEDBuf[i];
OUTSEG = LED;
OUTBIT = Pos; // 显示一位八段管
Delay(1);
Pos >>= 1; // 显示下一位}
OUTBIT = 0; // 关所有八段管
}
void main()
{ unsigned char i = 0;
unsigned char j;
while(1)
{ LEDBuf[0] = LEDMAP[i%6];
LEDBuf[1] = LEDMAP[(i+1)%6];
LEDBuf[2] = LEDMAP[(i+2)%6];
LEDBuf[3] = LEDMAP[(i+3)%6];
LEDBuf[4] = LEDMAP[(i+4)%6];
LEDBuf[5] = LEDMAP[(i+5)%6];
i++;
for(j=0; j<100; j++)
DisplayLED(); // 显示}
}。

相关文档
最新文档