超经典!PIC单片机原理及应用实验(含代码)
PIC18F452单片机原理及编程实践(第二章)PIC结构体与汇编语言编程

2017/8/29
20
―快速访问RAM区”的映射示意图
0区 (256B)
000H 0FFH
GP RAM GP RAM
000H 07FH F80H FFFH
128B 14区 (256B)
GP RAM FSR
GP RAM
F00H F7FH
F80H FFFH
128B
―快速访问”存 储区的组成 (256B)
9
2017/8/29
PIC18F452的“文件寄存器”结构示意图
4K RAM 000H 0FFH
GP RAM GP RAM
0 255
通用寄存器GPR 文件寄存器 特殊功能寄存器SFR
GP RAM
F00H F7FH F80H FFFH
3840
GP RAM SFR区域 (128B)
3967 3968 4095
2017/8/29
8
PIC文件寄存器(RAM)的空间分配
按照功能逻辑划分,文件寄存器(RAM)被分为: ① 通用寄存器 GPR:存储程序中的变量数据; ② 特殊功能寄存器 SFR:用于设定功能模块的工作 模式、工作状态等特殊信息。
GPR和SFR同在一个RAM存储阵列。 凡是没有分配给SFR的空间都可以作为通用寄存器GPR。 在18F系列中,SFR被“统一集中”在RAM的高地址空间 中(第15区的高128B)。 PIC18系列 RAM的大小随型号而不同,从32B~4KB。
―区选择寄存器”BSF的设定是可以通过指令: MOVLW k MOVWF BSR (k=0~15)
15区 (256B)
GP RAM SFR区域 (128B)
PIC单片机C语言编程实例

PIC单片机C语言编程实例——液晶显示模块编程15.2.2 MG-12232模块的编程下面以图15.1的接口电路为例。
液晶显示区域分成E1边和E2边,下面只含E1边的程序(表15.1中E1=1,E2=0),E2边(表15.1中E1=0,E2=1)类推。
在系统程序的初始化部分,应对程序中用到的寄存器和临时变量作说明,如:unsigned char TRANS;unsigned char PAGEADD;//存放页地址寄存器unsigned char PAGENUM;//存放总页数寄存器unsigned char CLMSUM;//存放总列数寄存器unsigned char CLMADD;//存放列地址寄存器unsigned char WRITE;//存放显示数据寄存器unsigned char row;//存放显示起始行寄存器unsigned char i,k;//通用寄存器//系统各口的输入输出状态初始化子程序void INITIAL(){ADCON1=0X87;//设置PORTA口和PORTE口为数字I/O口TRISA3=0;TRISB0=0;TRISE=0X00;//设置液晶的4个控制脚为输出}//读液晶显示器状态子程序void LCDSTA1(){while(1){TRISD=0XFF;//设置D口为输入RB0=1;//E1=1RA3=0;//E2=0RE0=1;//R/W=1RE1=0;//A0=0if(RD7==0) break;//为忙状态,则继续等待其为空闲}}//对液晶显示器发指令子程序(指令保存在TRANS寄存器中)void TRANS1(){LCDSTA1();//判断液晶是否为忙TRISD=0X00;//置D口为输出RB0=1;//E1=1RA3=0;//E2=0RE0=0;//R/W=0RE1=0;//A0=0PORTD=TRANS;//需要写入的命令字送入数据线RB0=0;//E1=0写入指令RE0=1;//R/W=1}//对液晶显示器写数据子程序(数据保存在WRITE寄存器中) void WRITE1(){TRANS=CLMADD;//设置列地址TRANS1();LCDSTA1();//查询液晶是否为空闲TRISD=0X00;//D口为输出RB0=1;//E1=1RA3=0;//E2=0RE0=0;//R/W=0RE1=1;//A0=1PORTD=WRITE;//需要写入的数据放入D口RB0=0;//E1=0,写入数据CLMADD++;//列地址加1RE0=1;//R/W=1}//开E1显示子程序void DISP1(){while(1){TRANS=0XAF;TRANS1();//送出控制命令LCDSTA1();//判断液晶是否为空闲TRISD=0XFF;//设置D口为输入RB0=1;//E1=1RA3=0;//E2=0RE0=1;//R/W=1RE1=0;//A0=0if(RD5==0) break;//如果液晶没被关闭,则继续关}}//E1边清屏子程序void CLEAR1(){PAGEADD=0xB8;//设置页地址代码for(PAGENUM=0X04;PAGENUM>0;PAGENUM-){ TRANS=PAGEADD;TRANS1();CLMADD=0x00;//设置起始列for(CLMSUM=0X50;CLMSUM>0;CLMSUM-){ LCDSTA1();//判断液晶是否为空闲WRITE=0X00;WRITE1();//写入00H以清屏}PAGEADD++;//页号增1}}//关E1显示子程序void DISOFF1(){while(1){TRANS=0XAE;TRANS1();//发出控制命令LCDSTA1();//判断液晶是否为空闲TRISD=0XFF;//D口设置为输入RB0=1;//E1=1RA3=0;//E2=0RE0=1;//R/W=1RE1=0;//A0=0if(RD5==1) break;//如果液晶没被关闭,则继续关}}有了以上的通用子程序,就可以构造出各种显示程序,如字符。
PIC单片机原理及应用

PIC单片机原理及应用PIC单片机的原理是基于微处理器的原理,它包含了CPU、存储器、输入输出(I/O)端口、定时/计数器等功能单元。
其中,CPU负责执行指令,通过存储器存储数据和程序,通过输入输出端口与外部设备进行数据交互,通过定时/计数器实现计时和计数功能。
PIC单片机的应用非常广泛。
首先,它可以用于各种嵌入式系统中,如智能家居系统、工业自动化系统等。
在智能家居系统中,PIC单片机可以控制家电设备的开关和状态,实现智能化的控制;在工业自动化系统中,PIC单片机可以根据不同的传感器信号,控制设备的运行状态和生产流程。
其次,PIC单片机还可以用于电子产品设计中,如手机、数码相机等。
在手机中,PIC单片机可以实现电池电量显示、充电管理、触摸屏控制等功能;在数码相机中,PIC单片机可以控制图像处理、曝光控制、对焦等功能。
此外,PIC单片机还可以应用于通信设备、医疗设备、汽车电子等领域。
在PIC单片机的开发过程中,需要使用相应的开发工具和软件。
Microchip公司提供了一系列的开发工具和编程软件,如PICkit系列的编程器、MPLAB X IDE集成开发环境等,方便开发者进行开发和调试。
同时,PIC单片机采用C语言进行编程,可以通过编写代码实现相应的功能和控制。
总之,PIC单片机作为一种强大的单片微控制器,具有体积小、功耗低、性能稳定等特点,广泛应用于各种电子设备中。
它的原理基于微处理器的原理,具有CPU、存储器、输入输出端口、定时/计数器等功能单元。
通过合理使用PIC单片机的开发工具和软件,可以实现各种应用需求,为电子行业的发展提供了有力的支持。
pic实验程序

void _delay_ms(char a) //毫秒级延时子函数 { unsigned char i,j; for(i=0;i<a;i++) for(j=0;j<40;j++);
}
void enable(void) //控制命令的子函数 {
rs=0;//1111 1101 a1 置 0 rw=0; //1111 1011 a2 置 0
while(delaytime)delaytime--; } //向 LCD 写入命令的子程序 void write_lcd_command(unsigned char write_command) {
lcd_delay(40); RSCLR;//Rs=0 RWCLR;//RW=0 temp=(write_command&0xf0)>>4; LCDPORT=(LCDPORT&0xf0)|temp;//写命令字 ((write_command>>4)&0x0f); ENSET;//EN=1; ENCLR;//EN=0
unsigned char i; ENCLR;//开使能 for(i=20;i>0;i--)lcd_delay(248);//延时 45ms for(i=4;i>0;i--)write_lcd_command(0x2f);//设为四线输出 lcd_delay(248); write_lcd_command(0x2f);//设为四线输出 lcd_delay(248);//延时 45ms write_lcd_command(0x2f);//设为四线输出 for(i=4;i>0;i--)lcd_delay(248);//延时 45ms
#define up
PIC单片机原理及应用(第三版)(下)

1
第0章 键盘和显示
键盘和显示是单片机控制系统非常重要的人 机交互界面。
2
0.1 八段数码显示
1、八段数码显示器的编码
数值
1 2 3 4 5
编码
06H 5BH 4FH 66H 6DH
数值
6 7 8 9 0
编码
7DH 07H 7FH 6FH 3FH
2、编码查表程序
3
3、多位数字动态显示 多位数字动态显示涉及数据的传送和显示 位的控制。
18
Bit6/SSPOV:接收溢出标志位,被动参数。 0:未发生接收溢出; 1:发生接收溢出。 注意:所指的接收溢出是缓冲器SSPBUF中 数据还未取出时,移位寄存器SSPSR中又收到 新的数据,原SSPSR中的数据丢失。
19
Bit7/WCOL:写操作冲突检测位,被动参数。 在SPI从动方式下: 0:未发生冲突; 1:发生冲突。 注意:当WCOL=1, 正在发送前一个数据时, 又有新数据写入SSPBUF,必须用软件予以清零。
RK0 RK0 RK1 RK2 RK3 CK0 CK1 CK2 CK3 RK0 RK1 RK2 RK3 CK0 CK1 CK2 CK3 TO PIC1 6F877 RSW1 4K7 RSW2 4K7 RSW3 4K7 RSW4 4K7 RK3 C SW-PB D SW-PB E SW-PB F SW-PB RK2 8 SW-PB 9 SW-PB A SW-PB B SW-PB RK1 4 SW-PB 5 SW-PB 6 SW-PB 7 SW-PB 0 SW-PB 1 SW-PB 2 SW-PB 3 SW-PB
37
Bit2/T1SYNC:TMR1外部输入时钟与系统时钟同步控制位,主 动参数。 当TMR1工作于计数器方式(TMR1CS=1时): 0: TMR1外部输入时钟与系统时钟保持同步; 1: TMR1外部输入时钟与系统时钟不保持同步; 当TMR1工作于定时器方式(TMR1CS=0时):该位不起作用。 Bit3/T1OSCEN:TMR1自带振荡器使能位,主动参数。 0: 禁上TMR1振荡器起振,使非门的输出端呈高阻态; 1: 允许TMR1振荡器起振。
PIC18F452单片机原理及编程实践(第五章)算数、逻辑指令和程序示例

00111100 11100111
+ 00111011 10001101 01111000 01110100
=7874H
作为计算机,是按照字节运算的,所以应采用“先做低8 位” 、 “后做高8位”字节运算的规律。但是这种8位的 字节两次加法是否能与真正的16位加法运算相一致呢?
8
2017/8/29
9
2017/8/29
5.1.4 BCD(二进制编码的十进制数)系统
十进制数 BCD码
用二进制数来表示十进制数的 方法称之为“BCD”码; 在计算机系统中,存储BCD码 的方式有两种: 非压缩的BCD码; 压缩的BCD码。
1. 2.
0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
2017/8/29
13
1. 2.
举例说明: 两个BCD码17H+28H。 人工计算=45H; 计算机计算=3FH。 问题出在计算机是按照二进制加法法则运算的。
1. 2.
修正原理。执行任何一条指令后: 如果低4位大于9或DC=1,那么低4位加6H; 如果高4位大于9或C=1,那么高4位加6H。
2017/8/29
14
57H+77H。
57H + 77H CEH + 6 6H 3 4H
DC=1、C=0 C=1
实际调整后应当为134,注意百位的BCD码是存在C中。
2017/8/29
15
PIC的DAW指令的特殊性
与其它的微处理器(如INTE公司的MCS-例如:
PIC实验报告

} void interrupt AD_SER() { if(T0IF) { T0IF=0; GO=1; while(GO); LED=!LED; } } 2.protues原理图
实验四:PWM 2.实验程序: #include "pic.h" __CONFIG(0x20f1); __CONFIG(0x3fff); void main() { TRISC1=0; //RC1定义为输出 CCP2CON=0b00001100; //占空比低两字节为0;PWM模式CCPR2L=0b01100100; //占空比高8位 PR2=249; T2CON=0b00000101; //timer2使能;预分频比1:4 while(1); } 3.protu实验报告实验一:定时器 2.实验程序: #include "pic.h" __CONFIG(0x20f1); __CONFIG(0x3fff); #define LED1 RD1 void interrupt T1_SER(void); void main() { TRISD=0; LED1=1; T1CON=0b00000001; TMR1H=15536>>8; TMR1L=15536; GIE=1;TMR1IE=1;PEIE=1; while(1); } void interrupt T1_SER() { if(TMR1IF) { TMR1IF=0; LED1=!LED1; TMR1H=15536>>8; TMR1L=15536; } } 3.protues原理图
实验二:按键中断2.实验程序: #include "pic.h" __CONFIG(0x20F1); __CONFIG(0x3FFF); #define uint unsigned int #define LED RD0 void DELAY(uint); void interrupt INT_SER(void); void main(void) { TRISD=0b11111110; TRISB=0b11111111; ANSEL=0; ANSELH=0; nRBPU=0; WPUB0=1; LED=1; GIE=1;INTE=1; while(1); } void interrupt INT_SER(void)
PIC18F452单片机原理及编程实践(第四章)PIC的端口编程

MOVF
PORTA,W
却使用了两个不同的地址。这是防止与PORTA得真正输 入(通过Input Latch的外信号输入)相区别。
LAT
的地址=F80H;
PORTA的地址=F92H。
端口结构图
2017/8/29 17
端口结构小结
1.
每一个端口都对应三个地址: 数据端口PORT x : 输入输出Latch地址。 注意:在端口内部输出与输入对应着两个锁存器: Out Data Latch ----- 输出数据的锁存器; Input Data Latch ----- 输入数据的锁存器。 但他们都具有相同的地址:如 MOVWF PORTA 利用输出锁存器输出数据; MOVF PORTA,W 通过输入锁存器读取引脚信号。 两者是靠指令的性质(输入/输出)来自动选择的。
端口结构图
2017/8/29
16
5 检查端口的输出数据。(RD LAT)
端口做输出时的“回馈 ”操作,可以称之为“准输 入 ”。与真正的输入的区别是:回送前次输出数据的状 态,而不是端口的引脚电平信号。
注意:尽管在物理结构上 RD LAT 的操作与端口输出时 WR PORT 是同一个锁存器,但是两种操作: MOVF LATA,W
端口A: 7位并行端口(引脚:RA0~RA6); 端口地址(SFR): PORTA:F80H; I/O引脚 第二功能 TRISA: F92H; RA0 AN0 / CAREF LATA: F89H。 RA1 AN1 / 端口的第二功能: RA2 AN2 / VREFADC电路的模拟 RA3 AN3 / VREF+ 输入引脚等。
如: MOVF MOVF LATA,W PORTA,W ;回读Out Data Latch 数据 ;输入PORTA的引脚信号
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《单片机原理及应用》实验指导书适用年级:08 物电信编制人:彭晓珊编制时间:2010.3实验室:嵌入式工程师实训室1《单片机原理及应用》第一次实验实验名:开发环境认识实验主要内容:认识MPLAB 开发软件,熟悉QL200B 实验箱目的要求:熟练掌握MPLAB 开发软件的开发流程,熟悉QL200B 实验箱的组成。
主要仪器:QL200B 实验箱+PC+万用表《单片机原理及应用》第二次实验实验名:跑马灯实验主要内容:进一步认识MPLAB 开发软件,熟悉QL200B 实验箱硬件,熟悉软件延时的设计。
目的要求:实现一个简单的流水灯程序,即轮流点亮 C 口的8 个灯(先点亮RC0,再熄灭RCO 点亮RC1……)。
硬件要求:拨码开关S11 全部置ON,其余全部为OFF。
主要仪器:QL200B 实验箱+PC参考程序如下:#include<p16f877A.inc> ;调用头文件__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_ WDT_OFF&_HS_OSC;**********************用户寄存器定义********************count equ 20h ;移位次数寄存器2del_va1 equ 0ffh ;外层延时参数del_va2 equ 0afh ;内层延时参数org 00h ;程序人口地址;**********************主程序开始***********************mainnop ;ICD 所需要的一条空指令clrf PORTC ;先清楚C 口所有显示banksel TRISC ;选择I/O 口方向寄存器所在的体clrf TRISC ;设置C 口全为输出clrf STATUS ;返回体0movlw .8movwf count ;装载循环次数8(C 口共8 位)bsf STATUS,C ;置进位标志位为1,因循环移位是带进位循环的looprlf PORTC,1 ;C 口左移1 位call delay3call delayCALL delay ;调用三次延时程序(保证亮度,以及流水灯闪烁速度)bcf STATUS,C ;清0 进位标志位(永远只有一只LED 亮)DECFSZ count,1 ;判断是否一轮循环结束goto loop ;否,继续循环移位GOTO main ;是,程序重头开始;***********************延时程序*************************delaymovlw del_va1 ;延时程序外层参数movwf 30hmovlw del_va2 ;延时程序内层参数movwf 31hdecfsz 31h,1goto $-1decfsz 30h,1goto $-4return;********************程序结束****************************end4《单片机原理及应用》第三次实验实验名:LED 显示控制实验主要内容:进一步认识MPLAB 开发软件,熟悉QL200B 实验箱硬件,熟悉静态和动态显示LED 的设计。
目的要求:1、用静态方式控制LED 显示实验目的:熟悉数码管的静态显示,数码管显示单个数字“0”硬件要求:拨码开关S6 全置ON,S5 第 6 位置ON,其它位和拨码开关置OFF参考程序:#INCLUDE<P16F877A.INC> ;包含头文件__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_ WDT_OFF&_HS_OSCORG 00H ;程序入口地址NOP ;放置ICD 所需要的空指令MOVLW 0FFHMOVWF PORTAMOVWF PORTD ;清除所有显示BSF STATUS,RP0 ;选择体1MOVLW 1FH ;RA5 为输出,其余各位为输入MOVWF TRISA5CLRF TRISD ;RD 口全部输出MOVLW 06HMOVWF ADCON1 ;A 口设置为普通I/OBCF STATUS,RP0 ;回体0MOVLW 0C0H ;0 的共阳极显示编码MOVWF PORTD ;送数码管显示BCF PORTA,5 ;使能数码管显示LOOPGOTO LOOP ;停机指令END ;源程序结束2、用动态方式控制LED 显示实验目的:熟悉多位数码管动态扫描显示的方法。
六位数码管从左到右显示012345 六位数字。
硬件要求:拨码开关S5、S6 全部置ON。
其他拨码开关全置OFF。
#include<p16f877A.inc> ;包含头文件__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_ WDT_OFF&_HS_OSCORG 00H ;程序入口地址6NOP ;放置一条ICD 所需要的空指令MOVLW 0FFHMOVWF PORTAMOVWF PORTD ;清除所有显示BSF STATUS,RP0 ;选择体1CLRF TRISA ;设置A 口为输出CLRF TRISD ;设置D 口为输出MOVLW 06HMOVWF ADCON1 ;设置A 口为普通I/O 口BCF STATUS,RP0 ;回体0LOOPMOVLW 0 ;显示0CALL TABLEMOVWF PORTDBCF PORTA,0CALL DELAYBSF PORTA,0MOVLW 1 ;显示1CALL TABLE7MOVWF PORTDBCF PORTA,1CALL DELAYBSF PORTA,1MOVLW 2 ;显示2CALL TABLEMOVWF PORTDBCF PORTA,2CALL DELAYBSF PORTA,2MOVLW 3 ;显示3CALL TABLEMOVWF PORTDBCF PORTA,3CALL DELAYBSF PORTA,3MOVLW 4 ;显示48CALL TABLEMOVWF PORTDBCF PORTA,4CALL DELAYBSF PORTA,4MOVLW 5 ;显示5CALL TABLEMOVWF PORTDBCF PORTA,5CALL DELAYBSF PORTA,5GOTO LOOP ;循环显示;***************查表程序*****************************TABLEADDWF PCL,1 ;加上偏移地址1RETLW 0C0H ;0 的编码(公阳极数码管)RETLW 0F9H ;1 的编码9RETLW 0A4H ;2 的编码RETLW 0B0H ;3 的编码RETLW 99H ;4 的编码RETLW 92H ;5 的编码;**************延时程序*****************************DELAYMOVLW 0FFHMOVWF 20HDECFSZ 20H,1GOTO $-1RETURNEND ;程序结束10实验四:按键判别实验内容:判断有无按键按下硬件要求:拨码开关S1 全部置ON《单片机原理及应用》第四次实验要求:拨码开关S6 全部置ON,S5 第5-6 位置ON,其他位置OFF 其他拨码开关置OFF数码管无按键按下时显示“FF”,有按键时显示编码;1、使用实验箱上的模块是独立按键模块:2、六位数码管模块使用过3、参考程序:#include<p16f877A.inc> ;包含头文件__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_ WDT_OFF&_HS_OSC;*******************用户寄存器定义*********************DISPLAYVAL1 EQU 20H ;显示高位寄存器DISPLAYVAL2 EQU 21H ;显示低位寄存器;******************程序入口地址************************11ORG 00HNOP ;ICD 所需要的空指令GOTO MAIN ;转主程序;*****************查表程序*****************************TABLEADDWF PCL,1 ;加上偏移地址RETLW 0C0H ;0 的编码RETLW 0F9H ;1 的编码RETLW 0A4H ;2 的编码RETLW 0B0H ;3 的编码RETLW 83H ;b 的编码RETLW 88H ;A 的编码RETLW 8EH ;F 的编码;****************主程序*******************************MAINMOVLW 0FFHMOVWF PORTD ;关闭所有显示BANKSEL TRISA ;选择I/O 口方向寄存器所在的体12MOVLW 0FHMOVWF TRISA ;A 口高2 位输出,低4 位输入MOVWF TRISB ;B 口高4 位输出,低4 位输入CLRF TRISD ;D 口输出BANKSEL ADCON1MOVLW 06HMOVWF ADCON1 ;A 口为普通I/O 口CLRF STATUS ;回体0LOOPMOVLW 6MOVWF DISPLAYVAL1MOVWF DISPLAYVAL2 ;F 的偏移地址BTFSC PORTB,0 ;BO 是否按下?GOTO PB_1 ;否,转判B1CALL DELAY ;延时,清除干扰信号BTFSC PORTB,0 ;再次判断BO 口是否按下?GOTO PB_1 ;否MOVLW 4 ;是,b 的偏移地址MOVWF DISPLAYVAL113MOVLW 0 ;0 的偏移地址MOVWF DISPLAYVAL2GOTO LOOP_END ;转显示部分PB_1BTFSC PORTB,1 ;B1 是否按下?GOTO PB_2 ;否,转判B2CALL DELAY ;延时,清除干扰信号BTFSC PORTB,1 ;再次判断B1 是否按下?GOTO PB_2 ;否MOVLW 4MOVWF DISPLAYVAL1 ;是,b 的偏移地址MOVLW 1MOVWF DISPLAYVAL2 ;1 的偏移地址GOTO LOOP_END ;转显示部分PB_2BTFSC PORTB,2 ;B2 是否按下?GOTO PB_3 ;否,转判B3CALL DELAY ;延时,清除干扰信号BTFSC PORTB,2 ;再次判断B2 是否按下?GOTO PB_3 ;否14MOVLW 4MOVWF DISPLAYVAL1 ;是,b 的偏移地址MOVLW 2MOVWF DISPLAYVAL2 ;2 的偏移地址GOTO LOOP_END ;转显示部分PB_3BTFSC PORTB,3 ;B3 是否按下GOTO PA_0 ;否,转判A0CALL DELAY ;延时,清除干扰信号BTFSC PORTB,3 ;再次判断B3 是否按下?GOTO PA_0 ;否MOVLW 4MOVWF DISPLAYVAL1 ;是,b 的偏移地址MOVLW 3MOVWF DISPLAYVAL2 ;3 的偏移地址GOTO LOOP_END ;转显示部分PA_0BTFSC PORTA,0 ;A0 是否按下GOTO PA_1 ;否,转判A1CALL DELAY ;延时,清除干扰信号15BTFSC PORTA,0 ;再次判断A0 是否按下?GOTO PA_1 ;否MOVLW 5 ;是,A 的偏移地址MOVWF DISPLAYVAL1MOVLW 0MOVWF DISPLAYVAL2 ;0 的偏移地址GOTO LOOP_END ;转显示部分PA_1BTFSC PORTA,1 ;A1 是否按下GOTO PA_2 ;否,转判A2CALL DELAY ;延时,清除干扰信号BTFSC PORTA,1 ;再次判断A1 是否按下?GOTO PA_2 ;否MOVLW 5MOVWF DISPLAYVAL1 ;是,A 的偏移地址MOVLW 1MOVWF DISPLAYVAL2 ;1 的偏移地址GOTO LOOP_END ;转显示部分PA_2BTFSC PORTA,2 ;A2 是否按下16GOTO PA_3 ;否,转判A3CALL DELAY ;延时,清除干扰信号BTFSC PORTA,2 ;再次判断A2 是否按下?GOTO PA_3 ;否MOVLW 5MOVWF DISPLAYVAL1 ;是,A 的偏移地址MOVLW 2MOVWF DISPLAYVAL2 ;1 的偏移地址GOTO LOOP_END ;转显示部分PA_3BTFSC PORTA,3 ;A3 是否按下GOTO LOOP_END ;否,转显示部分CALL DELAY ;延时,清除干扰信号BTFSC PORTA,3 ;再次判断A3 是否按下?GOTO LOOP_END ;否,转显示部分MOVLW 5MOVWF DISPLAYVAL1 ;是,A 的偏移地址MOVLW 3MOVWF DISPLAYVAL2 ;3 的偏移地址GOTO LOOP_END17LOOP_ENDMOVF DISPLAYVAL1,0 ;显示低位CALL TABLE ;查表获取相应的编码MOVWF PORTD ;送数码管显示BCF PORTA,4 ;使能相应数码管显示CALL DELAY ;延时一段时间,以保证足够的亮度BSF PORTA,4 ;关闭显示MOVF DISPLAYVAL2,0 ;显示高位CALL TABLE ;查表获取相应的编码MOVWF PORTD ;送数码管显示BCF PORTA,5 ;使能相应数码管显示CALL DELAY ;延时一段时间BSF PORTA,5 ;关闭显示GOTO LOOP ;循环判断是否有按键按下,并显示;*******************延时程序*************************DELAYMOVLW 0FFHMOVWF 30HDECFSZ 30H,118GOTO $-1RETURN;******************程序结束**************************END《单片机原理及应用》第五次实验:4*4 键盘控制实验实验目的:熟悉键盘矩阵的扫描方法程序中先不考虑做按键去抖,也先不考虑多个键同时按下的情况。