单片机原理与应用第2版源代码10Word格式.docx

上传人:b****6 文档编号:22244559 上传时间:2023-02-03 格式:DOCX 页数:25 大小:25.32KB
下载 相关 举报
单片机原理与应用第2版源代码10Word格式.docx_第1页
第1页 / 共25页
单片机原理与应用第2版源代码10Word格式.docx_第2页
第2页 / 共25页
单片机原理与应用第2版源代码10Word格式.docx_第3页
第3页 / 共25页
单片机原理与应用第2版源代码10Word格式.docx_第4页
第4页 / 共25页
单片机原理与应用第2版源代码10Word格式.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

单片机原理与应用第2版源代码10Word格式.docx

《单片机原理与应用第2版源代码10Word格式.docx》由会员分享,可在线阅读,更多相关《单片机原理与应用第2版源代码10Word格式.docx(25页珍藏版)》请在冰豆网上搜索。

单片机原理与应用第2版源代码10Word格式.docx

MOV60H,#10;

延时10ms子程序,晶振6MHz

LP1:

MOV61H,#250

DJNZ61H,$

DJNZ60H,LP1

RET

END

针对图10-5编程时,要求只处理单一按键,如有两个或多个按键同时按下视为无效,不予以处理,单片机应定时查询数据总线P0端口,按键采用延时去抖。

按键处理程序设计如下:

KEY_IN:

MOVDPTR,#7FFFH

MOVXA,@DPTR;

读按键值

ANLA,#1FH;

屏蔽高3位

CJNEA,#1FH,KEYQD;

判断是否有键按下

LJMPEXIT;

无键按下,退出键盘扫描

KEYQD:

LCALLDEL10MS;

有键按下,延时10ms去抖

再读按键值

ANLA,#1FH

CJNEA,#1FH,KEY1

LJMPEXIT

CJNEA,#1EH,KEY2

CJNEA,#1DH,KEY3

CJNEA,#1BH,KEY4

CJNEA,#17H,KEY5

CJNEA,#0FH,EXIT

RET

延时10ms子程序,晶振为6MHz

在行扫描法中,将所有行线作为输出端口,并逐行输出低电平,将所有列线作为输入端口,得到行、列线值后,也可以不采用查表的方式查找键码。

下面这个行扫描法查键程序,采用了非查表法,比较巧妙地找到按键键码,查键处理程序设计如下:

MOVP1,#0F0H;

P1端口低4位全部输出0电平

MOVA,P1;

从P1端口高4位读入列信号

ORLA,#0FH;

屏蔽低4位

CPLA;

取反

JZKPEXT;

没有按键,即若A=0,Z=1,跳转到KPEXT

MOVR4,#0;

键值初始化

MOVR2,#0FEH;

行扫描码初始化

MOVR7,#4;

扫描次数(行线数)

KP1:

MOVP1,R2;

从P1端口低4位输出扫描码

从P1端口高4位读入列信息

JNZKP2;

本行有按键被按下否?

若有键,跳转到KP2

MOVA,R4;

计算下一行键的起始键值

ADDA,#4

MOVR4,A

MOVA,R2;

计算下一行的扫描码

RLA

MOVR2,A

DJNZR7,KP1;

全部扫描结束否

SJMPKPEXT;

无按键操作

KP2:

JBACC.4,KP3;

是否第一列(若ACC.4=1,即为第一列有键)

RRA;

调整到下一列

INCR4;

调整键码

SJMPKP2;

继续判断

KP3:

MOVA,R4;

取键码,即键值

RET;

返回键码

KPEXT:

MOVA,#0FFH;

没有按键操作,返回0FFH

线反转法查键及键码转换处理程序设计如下:

MOVP1,#0F0H;

行线低4位输出低电平

MOVA,P1;

从高4位读取列线值

ANLA,#0F0H;

屏蔽低4位获得列线值

MOVB,A;

暂存列线值→B

MOVP1,#0FH;

列线高4位输出低电平

从低4位读取行线值

ANLA,#0FH;

屏蔽高4位获得行线值

ORLA,B;

行、列值合并,得到按键特征码

CJNEA,#0FFH,KPIN1;

判断有按键否

AJMPEXIT;

与0FFH相等,无按键,返回

KPIN1:

MOVB,A;

有按键,把特征码暂存→B

MOVDPTR,#TABKP;

DPTR指向键码表首地址

MOVR3,#0;

顺序码初始化

KPIN2:

MOVA,R3;

按顺序码查表

MOVCA,@A+DPTR;

CJNEA,B,KPIN3;

按键特征码与查表特征码比较

MOVA,R3;

相等,顺序码有效,得到键码→A

返回对应的键码(A)

KPIN3:

INCR3;

不相等,调整顺序码,准备查下一个

CJNEA,#0FFH,KPIN2;

是否为表格结束标志

RET;

查到表格末尾仍未找到,以无按键处理

TABKP:

DB0EEH,0DEH,0BEH,7EH;

K0到K3的特征码

DB0EDH,0DDH,0BDH,7DH;

K4到K7的特征码

DB0EBH,0DBH,0BBH,7BH;

K8到KB的特征码

DB0E7H,0D7H,0B7H,77H;

KC到KF的特征码

DB67H,0FFH;

KC+KF的特征码和表格结束标志

下面是静态显示3位50H~52H中的数的子程序:

DISP:

MOVR2,#03

MOVR0,#50H

LP0:

MOVA,@R0

ADDA,#0BH

MOVCA,@A+PC

MOVSBUF,A

LP1:

JNBTI,LP1

CLRTI

INCR0

DJNZR2,LP0

TAB:

DB03H,9FH,25H,0DH,99H,49H;

笔形码表0~9

DB41H,1FH,01H,09H,0FFH,0FFH

动态显示程序设计如下:

DISP:

MOVR3,#00;

显示初值为0

MOVR4,#0E8H;

循环显示次数

MOVDPTR,#TAB;

置笔形码表首地址

LP0:

MOVA,R3

MOVCA,@A+DPTR

MOVP1,A;

送显示段选码

SETBP2.2;

控制输出锁存

CLRP2.2;

保存输出

DELAY:

ACALLDISP1

DJNZR4,DELAY

INCR3

CJNER3,#0AH,LP0;

控制显示一遍0~9数字

AJMPEXQ

DISP1:

MOVR1,#04

MOVR5,#00

DISP2:

MOVA,R5

MOVP2,A;

送位选码

ACALLDEL1;

每位显示1ms

INCR5;

指向下一个LED

DJNZR1,DISP2;

未显示完4位继续

DEL1:

MOVR6,#250;

延时1ms(6MHz晶振)

LP2:

DJNZR6,LP2

EXQ:

RET

TAB:

DB0C0H,0F9H,0A4H,0B0H,99H;

0~9数字共阳笔形码

DB92H,82H,0F8H,80H,90H

按照图10-17电路,编写显示参考程序段如下:

ENEQUP1.2

CLKEQUP1.0

DINEQUP1.1

CLRCLK

CLREN

MOVR7,#60

DEL:

DJNZR7,DEL;

延时

MOVR7,#04;

控制写入4位

MOVA,#4FH;

小数点送A(高4位),即点亮第2位的小数点

ACALLWRD

MOVA,@R0;

读取显示的BCD码→A

MOVR7,#08;

控制写入8位

DECR0

MOVA,@R0

MOVR7,#08

SETBEN

WRD:

SETBCLK;

写入n个二进制位子程序

RLCA

MOVDIN,C

CLRCLK

DJNZR7,WRD

单片机与MAX7219的通信程序设计如下:

DINEQUP1.0;

定义数据线

LOADEQUP1.1;

定义装载线

CLKEQUP1.2;

定义时钟线

ORG0000

LJMPMAIN

ORG0030H

ACALLINIT

MOVR0,#30H;

置显示缓冲区起始地址(存储显示数BCD码)

MOVR1,#01

MOVR3,#08

LOOP3:

MOVA,@R0

MOVR4,A

MOVA,R1

ACALLWRITE;

调用写8位数据子程序

INCR0

INCR1

DJNZR3,LOOP3

LJMPDISP

WRITE:

MOVR2,#08

CLRLOAD;

LOAD引脚置低

SETBLOAD;

LOAD引脚置高

LOOP1:

CLRCLK;

CLK引脚置低

RLCA;

移位传送位控数据

MOVDIN,C

SETBCLK

DJNZR2,LOOP1

MOVA,R4

MOVR2,#08

LOOP2:

CLRCLK

移位传送段码数据

MOVDIN,C

DJNZR2,LOOP2

CLRLOAD

SETBLOAD

以下是MAX7219控制寄存器初始化子程序:

INIT:

MOVA,#09H;

置译码方式

MOVR4,#0FFH

ACALLWRITE

MOVA,#0AH;

置亮度控制

MOVR4,#08

MOVA,#0BH;

置扫描界线

MOVR4,#07

MOVA,#0CH;

置掉电控制

MOVR4,#01

MOVR7,#0;

延时程序

AA:

NOP

DJNZR7,AA

假设需要显示的数据已经分离出并存储在30H~35H单元,则程序段如下:

P1.0bitCLK

P1.1bitSKY1

P1.2bitSKY2

P1.3bitSKY3

SETBCLK;

CLK=1,允许TXD引脚同步移位脉冲输出显示

MOVR7,#06H;

循环次数控制

MOVR0,#30H;

R0作为显示数据指针

DSP1:

MOVA,@R0;

取显示数送A

ADDA,#0DH;

加偏移量

MOVCA,@A+PC;

查表取笔形码

MOVSBUF,A;

将段码送SBUF

JNBTI,$;

输出段码,查询TI状态,1字节的段码输出完否

CLRTI;

1字节的段码输出完,清TI标志

INCR0;

指向下一个显示数据单元

DJNZR7,DSP1;

段码个数计数器R7是否为0,若不为0,转DSP1继续

CLRCLK;

CLK=0,禁止TXD输出同步移位脉冲到显示器

TAB1:

DB03H,9FH,25H,0DH,99H,;

共阳极段码表,对应0,1,2,3,4

DB49H,41H,1FH,01H,09H;

5,6,7,8,9

DB11H,0C1H,63H,85H,61H;

A,B,C,D,E

DB71H,0FDH,31H,0FFH,0FFH;

F,-,P,暗

以下是键盘扫描子程序段:

KEY_IN:

CLRCLK;

清CLK=0,禁止串口移位输出显示

MOVA,#00H;

准备逐列扫描判键

向74LS164(7)输出00H,使所有列线为低电平

JNBTI,$

CLRTI

KNO:

JNBSKY1,KDY;

判第1行是否有按键,如有按键跳转KDY

JNBSKY2,KDY;

判第2行是否有按键,如有按键跳转KDY

JBSKY3,KNO;

判第3行是否有按键,无按键跳转KNO

KDY:

ACALLDELY;

软件去抖,调用延时10ms子程序

JNBSKY1,KIN1;

判断是否抖动引起的

JNBSKY2,KIN1

JBSKY3,KNO

KIN1:

MOVR7,#08H;

逐列扫描次数

MOVR6,#0FEH;

先扫描第1列(列代码FEH),使QA=0

MOVR3,#00H;

R3为列号寄存器

MOVA,R6

KIN3:

MOVSBUF,A;

从串行口输出列代码

JNBSKY1,KIN2;

判第1行是否有按键,如有按键跳转KIN2

JNBSKY2,KIN5;

判第2行是否有按键,如有按键跳转KIN5

JBSKY3,NEXT;

判第3行是否有按键,如无按键跳转NEXT

MOVR4,#10H;

第3行行首键号10H送入R4

AJMPPK3

KIN5:

MOVR4,#08H;

第2行行首键号08H送入R4

KIN2:

MOVR4,#00H;

第1行行首键号00H送入R4

PK3:

MOVSBUF,#00H;

等待松键,发送00H使所有列线为低电平

KIN4:

JNBSKY1,KIN4;

判行线状态

JNBSKY2,KIN4

JNBSKY3,KIN4

两行线均为高电平,表示键已松开

ADDA,R3;

行号+列号可得到键码→A

找到键码,返回

NEXT:

MOVA,R6;

列扫描码左移一位,判断下列键

MOVR6,A;

记列扫描码于R6中

INCR3;

列号加1

DJNZR7,KIN3;

判断是否扫描完8列

8列已扫描完毕返回

DELY:

MOVR7,#0AH;

延时10ms子程序(晶振6MHz)

DL1:

MOVR6,#250

DJNZR6,$

DJNZR7,DL1

按照图10-22电路连接编程,将扫描得到的按键值送出显示。

程序设计如下:

SDABITP1.0;

I2C总线定义

SCLBITP1.1

ACKBIT00H;

应答信号标志位

MTDDATA30H;

发送缓冲区(30H~37H)

MRDDATA38H;

接收缓冲区(38H~3FH)

SLADATA40H;

器件从地址

SUBADATA41H;

器件子地址

NUMBYTEDATA42H;

数据传输字节数

DISP_BUFDATA43H;

存储显示数据的缓冲区首地址(43H~4AH)

DISP_NUMDATA4BH;

数码显示个数

CMD0DATA4CH;

命令1

CMD1DATA4DH;

命令2

ADDRDATA4EH;

ZLG7290内部寄存器地址

DATA0DATA4FH;

写入ZLG7290内部寄存器的数据存储单元

BUFDATA50H;

显示缓冲区的指针

ZLG7290EQU70H;

ZLG7290的器件地址

SUBCMDEQU07H;

ZLG7290的命令缓冲区地址

SUBKEYEQU01H;

ZLG7290的键值寄存器地址

ORG0000H;

主程序

MOVSP,#60H

MOVDISP_BUF,#01

MOVDISP_BUF+1,#02

MOVDISP_BUF+2,#03

MOVDISP_BUF+3,#04

MOVDISP_NUM,#04

LCALLDISPLY

LOOP:

LCALLGET_KEY

MOVA,MRD

JZLOOP

MOVB,#10H

DIVAB

MOVDISP_BUF,A

MOVDISP_BUF+1,B

MOVDISP_NUM,#02

LCALLDISPLY

LJMPLOOP

DISPLY:

MOVBUF,#DISP_BUF;

ZLG7290送显示命令子程序

MOVR7,DISP_NUM

MOVCMD0,#60H;

显示命令字(从0位置开始显示)

MOVR0,BUF

MOVCMD1,@R0;

读取显示数据

LCALLSEND_CMD

INCBUF

INCCMD0

DJNZR7,DISP1

RET

WR_RGE:

MOVSLA,#ZLG7290;

ZLG7290写寄存器子程序

MOVSUBA,ADDR

MOVMTD,DATA0

MOVNUMBYTE,#01

LCALLIWRNBYTE;

调用数据写入子程序

LCALLDEL10MS

SEND_CMD:

MOVSLA,#ZLG7290;

ZLG7290发送控制命令子程序

MOVSUBA,#SUBCMD

MOVMTD,CMD0

MOVMTD+1,CMD1

MOVNUMBYTE,#02

GET_KEY:

ZLG7290读键值子程序

MOVSUBA,#SUBKEY

LCALLIRDNBYTE;

调用数据读出子程序

MOV51H,#4

DEL_B:

MOV52H,#123

DJNZ52H,$

DJNZ51H,DEL_B

IWRNBYTE:

MOVA,NUMBYTE;

向器件指定子地址写入N字节子程序

MOVR3,A

LCALLSTART;

启动总线,见9.5.4节的I2C总线常用子程序

MOVA,SLA

LCALLWRBYTE;

发送器件从地址(参考I2C

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1