第2讲 单片机控制两个数码管
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while(b<10) { P3_6=~P3_6; P3_7=~P3_7; P1=dispcode [a]; delay40ms(); tcount++; if(tcount==10) { tcount=0; a++; } P3_6=~P3_6; P3_7=~P3_7; P1= dispcode[b]; delay40ms(); if(a==10) { a=0; b++; } } }
10
实训与作业
完成数码管显示00-99的项目(静态 显示方式、动态显示方式) 写出实验报告
11
讨论:数组与指针( 讨论:数组与指针(C51)vs 内容与地址(ASM) ) 内容与地址( )
另一种查表方法: #include <reg52.h> unsigned char code dispcode[] ={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; 定义基于程序存储器( unsigned char code *finger; //定义基于程序存储器(code区)的指针 定义基于程序存储器 区 unsigned int a,b; void main(void) { while(1) { finger = &dispcode[0]; //指针:finger为数组 指针: 为数组dispcode的第一个单元的地 指针 为数组 的第一个单元的地 显示数码表的第一个值所在的地址) 址(即:显示数码表的第一个值所在的地址) for(b=0;b<32;b++) { delay20ms(); P1= *finger; //从指针指向的地址取数据 内容) P1口 //从指针指向的地址取数据(内容)到P1口 从指针指向的地址取数据( finger++; //指针加一 指针加一 } } } !!说明 C51的指针 说明: 的指针finger=ASM的地址 C51的 finger=ASM的 的地址, !!说明:C51的指针finger=ASM的地址, C51的*finger=ASM的@R0 C51的&x=ASM的取得内容为 C51的&x=ASM的取得内容为(x)的单元地址 的取得内容为( 12
比较: unsigned char data *x; x=0x30; *x=0x34; 与: MOV A,#34H MOV 30H,A
13
6
观察: 观察:
从汇编语言到C51的算术运算
7
任务2-2 单片机控制两个数码管动态显示 单片机控制两个数码管动态显示00-99 任务
1、两个共阳极数码管,码位由P1控制; 2、P3.7控制十位, P3.6控制个位 3、延时方式:延迟时间1秒。
8
SCOUNT EQU 30H ORG 0000H SETB P3.7 CLR P3.6 START:MOV P1,#0FFH MOV SCOUNT,#00H ST1: MOV 20H,#0 MOV 21H,#0 ST2: CPL P3.6 CPL P3.7 MOV R0,20H MOV A,R0 ACALL SEG7 MOV P1,A ACALL DELAY INC SCOUNT MOV R2,SCOUNT CJNE R2,#10,STH MOV SCOUNT,#00H INC R0 MOV 20H,R0
void main(void) { Second=0; P2=dispcode[Second/10]; P1=dispcode[Second%10]; while(1) { delay1s(); Second++; if(Second==100) { Second=0; } P2=dispcode [Second/10]; P1=dispcode [Second%10]; } }
STH:
CPL P3.6 CPL P3.7 ST3: MOV R1,21H ST4: MOV A,R1 ACALL SEG7 MOV P1,A ACALL DELAY CJNE R0,#10,ST2 INC R1 MOV 21H,R1 MOV 20H,#0 CJNE R1,#10,ST2 DJNZ R7,D1 RET SJMP ST1 SEG7: INC A DELAY: MOV R7,#4 MOVC A,@A+PC D1: MOV R6,#20 RET D2: MOV R5,#248 DB ...... DJNZ R5,$ 9 END DJNZ R6,D2
EQU 20H ORG 0000H START: MOV second,#00H LOOP: ACALL SHOW ACALL DELAY1S INC second MOV R0,second CJNE R0,#64H,LOOP SJMP START SHOW: MOV A,20H MOV B,#10 DIV AB SHOW1: MOV DPTR,#TAB MOVC A,@A+DPTR ;十位 MOV P2,A MOV A,B ;个位 MOVC A,@A+DPTR MOV P1,A RET DELY1S: MOV R6,#100 D2: MOV R5,#20 D1: MOV R4,#248 DJNZ R4,$ DJNZ R5,D1 DJNZ R6,D2 RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H
汇编
C51
#include <reg52.h> unsigned char code dispcode[] ={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; unsigned char tcount; unsigned int a,b,c; sbit P3_6=P3^6; sbit P3_7=P3^7; void delay40ms(void) { unsigned char i,j,k; for(k=4;k>0;k--) for(i=20;i>0;i--) for(j=248;j>0;j--); } void main(void) { tcount=0; P3_6=0; P3_7=1; P1=0xff; while(1) { a=0; b=0; }
共阳极代码 6FH 77 H 7CH 39H 5EH 79H 71H 00H
4 5 6 7 8
99H 92H 82H F 8H 80H
66H 6DH 7 DH 07 H 7FH
思考:y、J、L、H的编码?
2
任务2-1 单片机控制两个数码管静态显示 单片机控制两个数码管静态显示00-99 任务
1、两个共阳 极数码管; 2、P2控制十 位,P1控制个 位 3、延时方式: 延迟时间1秒。
3
程序框图
Байду номын сангаас
4
second
汇编程序设计
分析: 1, 两个数码管显示:十 位值放在(A),个位值放 在(B),方法:采用 DIV,(20H)/10,商A,余数B 2,将second从00到99循 环附值 3,每个second显示一次, 只要将前面的程序作为子 程序调用。 4,显示间隔:采用延迟 子程序(延迟时间为1秒)
讨论:数组与指针( 讨论:数组与指针(C51)vs 内容与地址(ASM) ) 内容与地址( )
比较: unsigned char xdata *x,*y; x=0x0456; *x=0x34; 与: MOV DPTR,#0456H MOV A,#34H MOVX @DPTR,A 比较: unsigned char pdata *x; x=0x45; *x=0x34; 与: MOV R0,#45H MOV A,#34H MOVX @R0,A
第2讲 单片机控制两个数码管 讲
本讲内容: 1、单片机控制两个数码管静态显示00-99 2、单片机控制两个数码管静态显示按钮 次数
1
十六进制数字型代码表
字型 0 1 2 3
共阳极代码 共阴极代码 C0H F 9H A4H B0H 3FH 06H 5BH 4FH
字型 9 A B C D E F 灭
共阳极代码 90H 88H 83H C6H A1H 86H 84H FFH
5
C51程序设计 程序设计
#include < reg52.h > unsigned char code dispcode[]={0xc0,0xf9,0xa4, 0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; unsigned char Second; void delay1s(void) { unsigned char i,j,k; for(k=100;k>0;k--) for(i=20;i>0;i--) for(j=248;j>0;j--); }