51单片机数码管显示程序设计

合集下载

51单片机中4个数码管的显示实验

51单片机中4个数码管的显示实验

51单片机中4个数码管的显示实验一、实验目的:1、看懂电路原理图,明白4个共阳数码管的编程方式。

2、看懂参考程序,学会使用扫描法来对4个数码管进行扫描显示。

学会使用定时器。

二、实验设备:51通用实验板一个,51仿真器一个,40针仿真头一个,12V电源一个,串口线一条。

三、实验电路原理图:四、实验内容:4个数码管一次显示4个数字,下一次加4进行显示,数字最大为9,到9再从0重新进行显示。

中间有一定的时间延时。

改变数据用定时器进行设置。

五、实验步骤:安实物图的形式把实验设备连接在一起。

六、参考程序:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4个数码管的显示实验;使用70H,71H,72H,73H进行数码管显示数据存储。

75H进行定时器定时时间设置,发光二极管L1进行亮灭显示改变数据标志。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SETTIM EQU 75H;定时时间长短设定ORG 0000HLJMP MAINORG 000BHLJMP TIM0;定时器0中断ORG 0030HMAIN: ;主程序MOV SP,#07HMOV SETTIM ,#00HLCALL INIT;初始化数据MOV TMOD,#01H;设值定时器0MOV TH0,#00H;定时初值MOV TL0,#00HSETB EA;开总中断SETB ET0;开中断SETB TR0;开始定时器STAR:LCALL DISPLJMP STAR;****************************************;显示子程序DISP: MOV R0,#0FEHMOV R1,#70HDISP1:MOV A,R0MOV P2,AMOV A,@R1MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ALCALL DLYSINC R1MOV A,R0RL AMOV R0,AJB ACC.4,DISP1RET;***************************************;定时器0中断程序TIM0:CLR TR0CLR EAMOV A,SETTIMINC ACJNE A,#9,TM1LCALL CHGMOV A,#00HCPL P1.0;定时器运行标志,使L1灯不断闪动TM1: MOV SETTIM,AMOV TH0,#00HMOV TL0,#00HSETB EASETB TR0RETI;****************************改变要显示的值CHG:MOV R0,#70HMOV R3,#04HCH1:MOV A,@R0INC ACJNE A,#0AH,CH2MOV A,#00HCH2:MOV @R0,AINC R0DJNZ R3,CH1RET;********************************************;初始化程序INIT: ;初始化70H---73H中的数据,使用R0,R1,R3MOV R0,#00H;数据初值MOV R3,#04HMOV R1,#70H;4个数码管数据存储地址IN0:MOV A,R0MOV @R1,AINC R0INC R1DJNZ R3,IN0RET;*****************************************;延时程序DLYS: MOV R6,#5DLYS0:MOV R5,#150DJNZ R5,$DJNZ R6,DLYS0RET;*****************************************;数据表TAB:DB 0C0H,0F9H,0A4H,0B0H; 0,1,2,3DB 99H,92H,82H,0F8H;?,5,6,7DB 80H,90H,88H,83H;?,9,A,BDB 0C6H,0A1H,86H,8EH;C,D,E,FDB 8CH,89H,07fh,0bFH;P,H,.,-11001011END七、思考:修改一下程序,使用定时器2进行定时改变数据进显示。

51单片机数码管显示数字原理

51单片机数码管显示数字原理

主题:51单片机数码管显示数字原理内容:1. 介绍51单片机在现代的电子产品中,单片机被广泛应用于各个领域,它是一种集成了微处理器、存储器和输入/输出端口的集成电路芯片。

其中,51单片机即指的是基于Intel 8051架构的单片机,它具有低功耗、高性能和丰富的外设接口,因此被广泛应用于嵌入式系统设计中。

2. 数码管的基本原理数码管是一种能够显示数字和部分字母的显示器件,它由多个发光二极管组成,可以显示0-9的数字。

数码管按照结构可以分为共阳数码管和共阳数码管两种类型。

共阳数码管的显示原理是通过控制各个发光二极管的通断状态来显示不同的数字,而共阴数码管则是通过控制对应的极性来实现数字的显示。

3. 51单片机连接数码管的原理通过51单片机控制数码管显示数字,需要用到引脚的输出功能。

在连接共阳数码管时,需要通过51单片机的输出引脚控制各个发光二极管的状态;而在连接共阴数码管时,则是通过控制对应的极性来实现数字的显示。

4. 51单片机连接数码管的实现步骤由于51单片机有多个通用IO口,因此可以连接多个数码管。

连接数码管的步骤如下:1)确定数码管的类型,共阴还是共阳2)连接数码管的正极和负极到单片机的对应IO口3)编写程序控制51单片机的IO口输出状态,以显示所需的数字5. 51单片机连接数码管的程序设计下面是一个简单的示例程序,演示了如何使用51单片机连接数码管,并控制其显示数字的过程:```C#include <reg51.h>sbit DIG1 = P0^0; // 数码管第一位sbit DIG2 = P0^1; // 数码管第二位sbit DIG3 = P0^2; // 数码管第三位sbit DIG4 = P0^3; // 数码管第四位void m本人n(){unsigned char DisplayData[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9的显示码unsigned char i;while(1){for(i=0; i<10; i++){DIG1=0; // 打开第一位数码管P2=DisplayData[i]; // 发送段码delay(100); // 延时DIG1=1; // 关闭第一位数码管// 同样的方法依次打开其他位数码管并发送段码// 这里省略其他三个数码管的控制}}}通过以上程序设计,我们可以实现用51单片机控制数码管显示0-9的数字。

51单片机数码管显示程序设计

51单片机数码管显示程序设计

练习3主程序参考:
ORG 0000H LJMP START ORG 000BH LJMP T0SERV ;T0中断入口 ORG 0030H START: MOV SP,#50H ;初始化堆栈 LCALL INIT ;初始化 MOV DISBUF,#0 MOV DISBUF+1,#1 MOV DISBUF+2,#2 MOV DISBUF+3,#3 MOV DISBUF+4,#4 MOV DISBUF+5,#0 MOV FLASH,#11000000B MOV R0,#0 LOOP: MOV DISBUF+5,R0 LCALL DELAY INC R0 CJNE R0,#10,LOOP MOV R0,#0 AJMP LOOP
恢复现场
返回
动态显示参考程序1:定义变量
;--------------------------------------------------------;动态显示程序 ;--------------------------------------------------------;全局变量定义 FLAG EQU 20H ;标志位 DISSEG EQU P0 ;显示段驱动 DISBIT EQU P2 ;显示位驱动P2.7-P2.2 DISBUF EQU 21H ;显示缓冲区首地址21H-26H DISBITBUF EQU 27H ;当前显示位计数器0-5 FLASH EQU 28H ;闪烁控制xxxxxx00,将x=1闪烁,=0不闪 ;小数点的处理: ;若显示‘3’,缓冲区放‘3’,若显示‘3.’,缓冲区放‘3+80H’, 最高位为1 S_PULSE EQU FLAG.0 ;秒脉冲 CNT_2D5MS EQU 2FH ;2.5MS计数器 CNT_10MS1 EQU 30H ;10MS计数器 CN_0D5S EQU 31H ;0.5秒计数器 ;----------------------------------------------------------

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

51单片机实现数码管0-7显示

51单片机实现数码管0-7显示

原理图程序#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar code SEG[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(){uint i;for(i=0;i<520;i++); }main(){while(1){uchar i;P3=0x7f;for(i=0;i<8;i++){P3=_crol_(P3,1);P0=SEG[i];DELAY();}}}教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。

文件――页面设置――版式――页眉和页脚――首页不同。

2. 问:请问word 中怎样让每一章用不同的页眉?怎么我现在只能用一个页眉,一改就全部改了?答:在插入分隔符里,选插入分节符,可以选连续的那个,然后下一页改页眉前,按一下“同前”钮,再做的改动就不影响前面的了。

简言之,分节符使得它们独立了。

这个工具栏上的“同前”按钮就显示在工具栏上,不过是图标的形式,把光标移到上面就显示出”同前“两个字来。

3. 问:如何合并两个WORD 文档,不同的页眉需要先写两个文件,然后合并,如何做?答:页眉设置中,选择奇偶页不同与前不同等选项。

4. 问:WORD 编辑页眉设置,如何实现奇偶页不同比如:单页浙江大学学位论文,这一个容易设;双页:(每章标题),这一个有什么技巧啊?答:插入节分隔符,与前节设置相同去掉,再设置奇偶页不同。

5. 问:怎样使WORD 文档只有第一页没有页眉,页脚?答:页面设置-页眉和页脚,选首页不同,然后选中首页页眉中的小箭头,格式-边框和底纹,选择无,这个只要在“视图”――“页眉页脚”,其中的页面设置里,不要整个文档,就可以看到一个“同前”的标志,不选,前后的设置情况就不同了。

max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)

max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)
SPI1_InitStructure.SPI_Mode=SPI_Mode_Master;//设置SPI工作模式;设置为主SPI
SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位MSB在先
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态,时钟悬空高
*功能:STM32_SPI1硬件配置初始化
*入口参数:无
*出口参数:无
*说明:STM32_SPI1硬件配置初始化,使用3V3
****************************************************************************/
void SPI1_Init(void)
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
SPI1_InitStructure.SPI_NSS = SPI_NSS_Soft;CPolynomial = 7;//CRC值计算的多项式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//SPI1相关引脚

51单片机-数码管显示

51单片机-数码管显示
P2=0x00; P0=0x03; delay(400); P0=0x9f; delay(400); P0=0x25; delay(400);
} void delay(int x) {
int i,j; for(i=0;i<x;i++)
for(j=1;j<120;j++); }
LED字型显示代码表
段符号
十六进制代码
显示 dp
g
f
e
d
c
b
a 共阴极 共阳极
0
0
1
0
2
0
3
0
4
0
5
0
6
0
7
0
8
0
9
0
A0
b
0
C0
d
0
E0
F
0
H0
P0
0
1
1
1
1
1
1
3FH
C0H
0
0
0
0
1
1
0
06H
F9H
1
0
1
1
0
1
1
5BH
A4H
1
0
0
1
1
1
1
4FH
B0H
1
1
0
0
1
Hale Waihona Puke 1066H
99H
1
1
0
1
1
0
1
6DH 92H
1
1
1
1
1
0
1
7DH
1. 静态显示的特点
静态显示就是单片机将所要显示的数据送出去后,数码管始终显示 该数据(不变),到下一次显示时,再传送一次新的显示数据。

以51单片机为核心的DS18B20的数码管显示温度程序+Proteus仿真

以51单片机为核心的DS18B20的数码管显示温度程序+Proteus仿真

//DS18B20的读写程序,数据脚P3.3 ////温度传感器18B20汇编程序,采用器件默认的12位转化////最大转化时间750微秒,显示温度-55到+125度,显示精度////为0.1度,显示采用4位LED共阳显示测温值////P0口为段码输入,P24~P27为位选///***************************************************/#include "reg51.h"#include "intrins.h" //_nop_();延时函数用#define Disdata P0 //段码输出口#define discan P2 //扫描口#define uchar unsigned char#define uint unsigned intsbit DQ=P3^3; //温度输入口sbit DIN=P0^7; //LED小数点控制uint h;uchar flag;//**************温度小数部分用查表法***********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//共阳LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" uchar code scan_con[4]={0x7f,0xbf,0xdf,0xef}; //列扫描控制字uchar data temp_data[2]={0x00,0x00}; //读出温度暂放uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用///////***********11微秒延时函数**********///void delay(uint t){for(;t>0;t--);}///***********显示扫描函数**********/scan(){char k;for(k=0;k<4;k++) //四位LED扫描控制{Disdata=0xff;Disdata=dis_7[display[k]];if(k==1){DIN=0;}discan=scan_con[k];delay(90);discan=0xff;}}/////***********18B20复位函数**********/ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();DQ=0; //delay(50); // 550usDQ=1; //delay(6); // 66uspresence=DQ; // presence=0继续下一步}delay(45); //延时500uspresence = ~DQ;}DQ=1;}/////**********18B20写命令函数*********///向1-WIRE 总线上写一个字节void write_byte(uchar val){uchar i;for (i=8; i>0; i--) //{DQ=1;_nop_();_nop_();DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; //最低位移出delay(6); //66usval=val/2; //右移一位}DQ = 1;delay(1);}///*********18B20读1个字节函数********///从总线上读取一个字节uchar read_byte(void){uchar i;uchar value = 0;for (i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ = 0; //_nop_();_nop_();_nop_();_nop_(); //4usDQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us if(DQ)value|=0x80;delay(6); //66us}DQ=1;return(value);}///***********读出温度函数**********///read_temp(){ow_reset(); //总线复位write_byte(0xCC); // 发Skip ROM命令write_byte(0xBE); // 发读命令temp_data[0]=read_byte(); //温度低8位temp_data[1]=read_byte(); //温度高8位ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令}///***********温度数据处理函数**********/ void work_temp(){uchar n=0;uchar doth,dotl;uchar flag3=1,flag2=1; //数字显示修正标记if((temp_data[1]&0xf8)!=0x00){temp_data[1]=~(temp_data[1]);temp_data[0]=~(temp_data[0])+1;n=1;flag=1;}//负温度求补码if(temp_data[0]>255){temp_data[1]++;}display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];doth=display[0]/10;dotl=display[0]%10;display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4); display[3]=display[4]/100;display[2]=display[4]/10%10;display[1]=display[4]%10;if(!display[3]){display[3]=0x0a;flag3=0;if(!display[2]){display[2]=0x0a;flag2=0;}}//最高位为0时都不显示if(n){display[3]=0x0b;//负温度时最高位显示"-"flag3=0;}}/////**************主函数****************/main(){Disdata=0xff; //初始化端口discan=0xff;for(h=0;h<4;h++){display[h]=8;}//开机显示8888ow_reset(); // 开机先转换一次write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令for(h=0;h<500;h++){scan();} //开机显示"8888"2秒while(1){read_temp(); //读出18B20温度数据work_temp(); //处理温度数据scan(); //显示温度值2秒}}////*********************结束**************************//。

51单片机用k1到k3控制数码管移位显示

51单片机用k1到k3控制数码管移位显示
51单片机用K1-K3控制数码管移位显示设计
功能:1.按下K1时加1计数并增加显示位,
2.按下K2时减1计数并减少显示位,
3.按下K3时清零。
#include<reg51.h> //头文件
#define uchar unsigned char //把uchar定义为usigned char为后面定义的时候方便
buffer[keycount-1]=keycount;//按下K1时加1计数并增加显示位
break;
case 0xfd: if(keycount>0) buffer[--keycount]=10;//当P1=0xfd时即P1.1=0,即k2按下
break;按下K2时减1计数并减少显示位
case 0xfb: buffer[0]=0;
#define uint unsigned int
uchar code acode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//其阳极数码管0到9的数字,即为段码
uchar code index[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//位码
{
uchar i;
for(i=0;i<8;i++)
{
P0=0xff;//消除对P0口的影响
P0=acode[buffer[i]];//P0口为连接数码管的端口
P2=index[i];//位选
delay(2) main()//主程序
{
uchar i,key1,keycount=0;//定义变量i,key1,keycount

51单片机 电机控制 输入速度 七段数码管显示 汇编程序

51单片机 电机控制 输入速度 七段数码管显示 汇编程序

51单片机电机控制输入速度七段数码管
显示汇编程序
简介
本文档介绍了使用51单片机控制电机的方法,以及如何通过输入设置速度,并使用七段数码管显示相关信息的汇编程序。

电机控制
在使用51单片机控制电机之前,需要连接合适的电机驱动模块,并将其与单片机进行连接。

通过控制电机驱动模块的引脚,可以实现电机的正转、反转、停止等功能。

输入速度
可以通过外部的输入设备(如按键、旋钮等)来设置电机的速度。

通过读取输入设备的状态,可以在程序中动态地调整电机的速度。

七段数码管显示
可以通过七段数码管来显示相关信息,如电机的速度、转速等。

通过控制七段数码管的引脚,可以实现在数码管上显示相应的数字
或字符。

汇编程序
使用51汇编语言编写程序,通过设置相应的控制寄存器和引
脚状态,可以实现电机的控制和数码管的显示。

汇编程序需要包括
以下几个方面的功能:
- 初始化相关引脚和寄存器
- 读取输入设备的状态
- 根据输入设备的状态设置电机的速度
- 控制电机的正转、反转、停止等操作
- 更新七段数码管显示的内容
总结
本文档介绍了51单片机控制电机的方法,以及通过输入设备
设置速度和使用七段数码管显示信息的汇编程序。

通过合理地编写
汇编程序,可以实现电机的精确控制和相关信息的显示。

以上是本文档的大致内容,希望对您有所帮助。

51单片机数码管的程序代码

51单片机数码管的程序代码
for (x=s;x>0;x--) for (y=100;y>0;y--);
}
3.依次流水作业
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit line= P1^3; //点阵
sbit led= P1^2;
duan=1; P0=table[shi]; _nop_();
//显示十位
_nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xFb; wei=0; delay(3);
duan=1; P0=table[ge]; _nop_(); _nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xF7; wei=0; delay(3);
unsigned char code weisn[]=
{
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint y,s,a,b;
void delay ( uint);
void main ()
{
P0=0X00;
line=0;//关闭点阵
P0=0xff; led=0;//关闭 led
5,DS18B20 温度计程序代码
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^4; //18B20 信号端口 sbit duan=P1^0; //数码管段码控制端

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

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

恢复现场
返回
动态显示参考程序1:定义变量
;--------------------------------------------------------;动态显示程序 ;--------------------------------------------------------;全局变量定义 FLAG EQU 20H ;标志位 DISSEG EQU P0 ;显示段驱动 DISBIT EQU P2 ;显示位驱动P2.7-P2.2 DISBUF EQU 21H ;显示缓冲区首地址21H-26H DISBITBUF EQU 27H ;当前显示位计数器0-5 FLASH EQU 28H ;闪烁控制xxxxxx00,将x=1闪烁,=0不闪 ;小数点的处理: ;若显示‘3’,缓冲区放‘3’,若显示‘3.’,缓冲区放‘3+80H’, 最高位为1 S_PULSE EQU FLAG.0 ;秒脉冲 CNT_2D5MS EQU 2FH ;2.5MS计数器 CNT_10MS1 EQU 30H ;10MS计数器 CN_0D5S EQU 31H ;0.5秒计数器 ;----------------------------------------------------------
动态显示参考程序3:中断服务程序
;----------2.5MS中断服务程序=动态显示------T0SERV: MOV TL0,#05H MOV TH0,#0F7H PUSH PSW ;保护现场 PUSH ACC PUSH DPH PUSH DPL SETB RS0 ;中断服务使用工作寄存器组1 CLR RS1 ;-----------计算时间---------------------------INC CNT_2D5MS ;2.5MS 计数器 MOV A,CNT_2D5MS CJNE A,#4,T0SERV3 ;4x2.5ms=10ms MOV CNT_2D5MS,#0 INC CNT_10MS1 ;10MS计数+1 MOV A,CNT_10MS1 CJNE A,#50,T0SERV3 MOV CNT_10MS1,#0 INC CN_0D5S ;0.5秒计数 CPL S_PULSE ;秒脉冲,每0.5秒变化
0 0 0 0 1 1 0 1
;共阳极7段数码管驱动段码表 ; pgfedcba TAB: DB 11000000B DB 11111001B DB 10100100B DB 10110000B DB 10011001B DB 10010010B DB 10000010B DB 11111000B DB 10000000B DB 10010000B
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7
a
b
c
d
e
f
g
dp
编程练习1-驱动一位数码管
开始
要求:在第一位显示连续变 化的0-9,间隔时间自定。 参考课本P196页例1,在 keil中编程,生产HEX文件。 在proteus中观察运行结果。 (参考“ c6定时器应用程 序调试” 介绍的方法)
(R0)=0 (A)=(R0) 查段码表, 取得段驱动码
段驱动码送P0口
P2.7=0 延时
(R0)+1
(R0)=10? Y (R0)=0 N
编程练习2-动态显示程序
T0中断
要求:显示123.456。
提示: (1)使用内部RAM21H-26H单元做显示缓冲区。
重装初值 保护现场 选工作寄存器组 熄灭显示 计算显示位 根据当前显示位 查得段驱动码 处理小数点 段驱动码送P0口 根据当前显示位 查得位驱动码 位驱动码送P2口-----------显示处理--------------------------T0SERV3:ORL DISBIT,#11111100B ;熄灭显示 MOV A,DISBITBUF ;取当前显示位 INC A ;指向下一位,若(A)+1=6,使(A)=0 CJNE A,#6,T0SERV1 CLR A T0SERV1:MOV DISBITBUF,A MOV R0,#DISBUF ;取显示内容 ADD A,R0 MOV R0,A MOV A,@R0 ;A中为显示内容 MOV C,ACC.7 ;判断是否显示小数点 CLR ACC.7 MOV DPTR,#LEDTAB MOVC A,@A+DPTR ;取段码 JNC T0SERV2 CLR ACC.7 ;设置显示小数点 T0SERV2:MOV DISSEG,A ;送段码 ;闪烁控制 MOV A,FLASH ;取闪烁控制码 MOV R0,DISBITBUF ;将当前显示位的闪烁控制位移入c中 INC R0 T0SERV4:RLC A DJNZ R0,T0SERV4 JNC T0SERV5 ;C=1,闪烁 JNB S_PULSE,T0SERV5 ;S_PULSE=1时不显示 MOV DISSEG,#0FFH T0SERV5:MOV DPTR,#DISBITTAB ;取位驱动码 MOV A,DISBITBUF MOVC A,@A+DPTR ANL DISBIT,A ;送位驱动码 T0SERV0:POP DPL ;恢复现场 POP DPH POP ACC POP PSW RETI
练习3主程序参考:
ORG 0000H LJMP START ORG 000BH LJMP T0SERV ;T0中断入口 ORG 0030H START: MOV SP,#50H ;初始化堆栈 LCALL INIT ;初始化 MOV DISBUF,#0 MOV DISBUF+1,#1 MOV DISBUF+2,#2 MOV DISBUF+3,#3 MOV DISBUF+4,#4 MOV DISBUF+5,#0 MOV FLASH,#11000000B MOV R0,#0 LOOP: MOV DISBUF+5,R0 LCALL DELAY INC R0 CJNE R0,#10,LOOP MOV R0,#0 AJMP LOOP
动 态 显 示 参 考 程 序 5: 位 段 驱 动 码 表
;-------------------------------------;数码管位驱动代码表 DISBITTAB: DB 01111111B ;位1 DB 10111111B ;位2 DB 11011111B ;位3 DB 11101111B ;位4 DB 11110111B ;位5 DB 11111011B ;位6 ;-------------------------------------;共阳极数码管段驱动代码表 LEDTAB: DB 0C0H ;0 00 DB 0F9H ;1 01 DB 0A4H ;2 02 DB 0B0H ;3 03 DB 99H ;4 04 DB 92H ;5 05 DB 82H ;6 06 DB 0F8H ;7 07 DB 80H ;8 08 DB 90H ;9 09 DB 0FFH ;空 10 ;--------------------------------------
编程练习3


动态显示:前5位显示 01234,使前两位闪烁, 最后一位循环显示0- 9,变化速度自定。 提示:只需要在练习2 的基础上,改动主程 序。(利用双重循环 编一个延时程序)
主程序流程图
开始 初始化 显示012340
(FLASH)=11000000B
(R0)=0
(DISBUF+5)=(R0) 延时 (R0)+1 (R0)=10? Y (R0)=0 N
六位共阳极数码管模块 相同的段驱动端都并联在 一起。
在第一位上显示5
+5V
P2.7
0
P2.6 com1
1
P2.5 com2
1
P2.4 com3
1
P2.3 com4
1
P2.2 com5 com6
1
位驱动P2.7输出0 段驱动P0口输出“5”的段 码“10010010B” 0 1 0 0 1 0 0 1
编程练习4


秒表:前4位不显示, 后两位循环显示00- 59秒。 提示:只需要在练习2 的基础上,定义29H单 元存储秒的值,利用 T0中断服务程序中的 0.5秒信号产生1秒信 号。主程序负责将秒 的个位和十位分离并 放入显示缓冲区。
主程序流程图
开始 初始化 显示 00
(A)=(29H)
(B)=10
C7数码管显示程序设计
山东职业学院
主要内容

发光二极管的工作参数 数码管的结构和工作原理 多位数码管动态显示电路原理图 编程练习:驱动一位数码管
发光二极管的工作参数
+5V
发光二极管正常发光时, 电流约为5~10mA,压 降1V左右。
500
P1.0
限流电阻 R=(5V-1V)/8mA=500 Ω
A÷B (DISBUF+4)=(A) (DISBUF+5)=(B)
练习4主程序参考:
SEC EQU 29H ;定义秒单元 ORG 0000H LJMP START ORG 000BH LJMP T0SERV ;T0中断入口 ORG 0030H START: MOV SP,#50H ;初始化堆栈 LCALL INIT ;初始化 MOV DISBUF,#10 MOV DISBUF+1,#10 MOV DISBUF+2,#10 MOV DISBUF+3,#10 MOV DISBUF+4,#0 MOV DISBUF+5,#0 MOV FLASH,#0 MOV SEC,#0 LOOP: MOV A,SEC MOV B,#10 DIV AB MOV DISBUF+4,A MOV DISBUF+5,B AJMP LOOP
练习4中断T0服务程序中的1秒计数参考:
;-----------计算时间---------------------------INC CNT_2D5MS ;2.5MS 计数器 MOV A,CNT_2D5MS CJNE A,#4,T0SERV3 ;4x2.5ms=10ms MOV CNT_2D5MS,#0 INC CNT_10MS1 ;10MS计数+1 MOV A,CNT_10MS1 CJNE A,#50,T0SERV3 MOV CNT_10MS1,#0 INC CN_0D5S ;0.5秒计数 CPL S_PULSE ;秒脉冲,每0.5秒变化 JNB S_PULSE,T0SERV3 INC SEC MOV A,SEC CJNE A,#60,T0SERV3 MOV SEC,#0 ;1秒计数
相关文档
最新文档