锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

合泰单片机内部EEPROM,4*4按键及存储区切换

时间:2024-05-13 12:37:11

;内容:按按键调用内部数据通过显示出来
;数码管段码接法A-PD0,B-PD1....G-PD6,H-PD7
;数码管位码接法OM0-PC0...COM4-PC3
;按键接法行PA.4-PA.7列PA.0-PA.3
;完整源码下载:http://www.51hei.com/f/hteepr.rar
;1.内部EEPROM写与读操作
;2.4*4按键
;3.存储区切换
include HT66F50.inc

ORG0000H
JMPA1
ORG0014H ;多功能中断入口地址
JMPZD1
ORG002DH
Q1:
03; 0
DC006H; 1
DC05BH; 2
DC04FH; 3
DC066H; 4
DC06DH; 5
DC07DH; 6
DC007H; 7
DC07FH; 8
DC06FH; 9
DC077H; A
DC07CH; B
DC039H; C
DC05EH; D
DC079H; E
DC071H; F
A1:
MOVA,0;显示内容
MOV[8AH],A;第一位数码管段码显示内容寄存器
MOVA,0;显示内容
MOV[8BH],A;第二位数码管段码显示内容寄存器
MOVA,0;显示内容
MOV[8CH],A;第三位数码管段码显示内容寄存器
MOVA,0;显示内容
MOV[8DH],A;第四位数码管显示内容寄存器
MOVA,08H;跟CP1C寄存器设置要求选择数据
MOVCP1C,A;设置PC口为I/0口而不是中断口
MOVCP0C,A;设置PA3不为比较器脚
CLRACERL;设置PA口不为AD输入口
CLRPCC;设置pc 口为输出口
CLR;设置PD 口为输出口
MOVA,1;设置初始显示位码显示第一位
MOV[80H],A;位码寄存器
MOVA,8AH;设置对应第一位段码寄存器
MOVMP0,A;间接寄存器指针
MOVA,00000000B;设置TM2 计数时钟位为fSYS/4
MOVTM2C0,A
MOVA,11000001B ;设置TM2中断为定时/计数模式选择比较器A匹配
MOVTM2C1,A
MOVA,LOW 5000;设置中断时间为5000个时钟周期
MOVTM2AL,A;低8位
MOVA,HIGH 5000;设置中断时间为5000个时钟周期
MOVTM2AH,A;高8位
CLRMF0F;清多功能中断0标志
CLRT2AF;清定时器2较器A中断标志
SETMF0E;使能多功能0中断
SETT2AE;使能定时器2较器A中断
SETEMI;使能总中断
SETT2ON;开始计数
MOVA,16;
MOV[83H],A;设置写入数据数量
MOVA,0;EEPROM内部地址0
MOV[81H],A;
MOVA,0;存入EEPROM数据
MOV[82H],A;
A0:
CALLWR1;写数据
INC[81H];地址加1
INC[82H];数据加1
SDZ[83H];判断是否写完
JMPA0
A2:
CALLB0;扫描按键
JMPA2;
;******************************************
;扫描按键子程序
;******************************************
B0:
MOVA,00001111B;设置PA口高4位为输出口低4位为输入口
MOVPAC,A;
MOVPAPU,A;设置低4位上拉
MOVA,11100000B;设置扫描第一行PA.4输出低电平
MOVPA,A;
SZPA.0;判断第一行第一个键是否按下
JMPB1;否则判断第二个键
MOVA,0;EEPROM内部地址0
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B1:
SZPA.1;判断第一行第二个键是否按下
JMPB2;否则判断第3个键
MOVA,1;EEPROM内部地址1
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B2:
SZPA.2;判断第一行第3个键是否按下
JMPB3;否则判断第4个键
MOVA,2;EEPROM内部地址2
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B3:
SZPA.3;判断第一行第4个键是否按下
JMPB4;否则判断第5个键
MOVA,3;EEPROM内部地址3
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B4:
MOVA,11010000B;设置扫描第2行PA.5输出低电平
MOVPA,A;
SZPA.0;判断第2行第一个键是否按下
JMPB5;否则判断第6个键
MOVA,4;EEPROM内部地址4
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B5:
SZPA.1;判断第2行第2个键是否按下
JMPB6;否则判断第7个键
MOVA,5;EEPROM内部地址5
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B6:
SZPA.2;判断第2行第3个键是否按下
JMPB7;否则判断第8个键
MOVA,6;EEPROM内部地址6
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B7:
SZPA.3;判断第2行第4个键是否按下
JMPB8;否则判断第9个键
MOVA,7;EEPROM内部地址7
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B8:
MOVA,10110000B;设置扫描第3行PA.6输出低电平
MOVPA,A;
SZPA.0;判断第3行第一个键是否按下
JMPB9;否则判断第10个键
MOVA,8;EEPROM内部地址8
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B9:
SZPA.1;判断第3行第2个键是否按下
JMPB10;否则判断第11个键
MOVA,9;EEPROM内部地址9
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B10:
SZPA.2;判断第3行第3个键是否按下
JMPB11;否则判断第12个键
MOVA,10;EEPROM内部地址10
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B11:
SZPA.3;判断第3行第4个键是否按下
JMPB12;否则判断第13个键
MOVA,11;EEPROM内部地址11
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B12:
MOVA,01110000B;设置扫描第4行PA.7输出低电平
MOVPA,A;
SZPA.0;判断第4行第一个键是否按下
JMPB13;否则判断第14个键
MOVA,12;EEPROM内部地址12
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B13:
SZPA.1;判断第4行第2个键是否按下
JMPB14;否则判断第15个键
MOVA,13;EEPROM内部地址13
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B14:
SZPA.2;判断第4行第3个键是否按下
JMPB15;否则判断第16个键
MOVA,14;EEPROM内部地址14
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B15:
SZPA.3;判断第4行第4个键是否按下
JMPB16;否则跳出子程序
MOVA,15;EEPROM内部地址15
MOV[81H],A;
CALLRD1;读数据
MOVA,[83H];
MOV[8AH],A;显示数据
B16:
RET
;***************************************
;内部EEPROM写操作
;***************************************
WR1:
MOVA,[81H];设置EEPROM存储地址
MOVEEA,A;EEA为EEPROM地址寄存器
MOVA,[82H];设置存储数据
MOVEED,A;EED为EEPROM数据寄存器
MOVA,40H;EEC(40H)为EEPROM控制寄存器在Bank 1区
MOVMP1,A;不能直接控制只能通过间接寄存器MP1控制
MOVA,01H;Bank 1
MOVBP,A;设置存储器指针为Bank 1
SAR1.2;使能EEPROM写
SETIAR1.3;设置写周期有效
SZIAR1.2;判断是否写完成
JMP$-1;
CLRIAR1;禁止写
CLRBP;设置回Bank 0
RET
;*************************************
;内部EEPROM读操作
;*************************************
RD1:
MOVA,40H;EEC(40H)为EEPROM控制寄存器在Bank 1区
MOVMP1,A;不能直接控制只能通过间接寄存器MP1控制
MOVA,[81H];设置数据地址
MOVEEA,A;EEA为EEPROM地址寄存器
MOVA,01H;Bank 1
MOVBP,A;设置存储器指针为Bank 1
SETIAR1.1;使能EEPROM读
SETIAR1.0;设置读周期有效
SZIAR1.0;判断是否读完成
JMP$-1;
CLRIAR1;
CLRBP;
MOVA,EED;读取数据
MOV[83H],A;
RET;

;*******************************************************
;中断服务子程序
;*******************************************************
ZD1:
MOV[0F0H],A;压栈ACC到0F0H
MOVA,;
MOV[0F1H],A;压栈status标志寄存器到0F1H
MOVA,BP;压栈储存区指针寄存器BP到0F2H
MOV[0F2H],A;
CLRBP
CLRPC;清PC(清屏幕)
MOVA,Q1;数据表地址
CLRTBHP;清数据表地址高位否则出错
ADDA,IAR0;利用间接寄存器找到要显示段码所在数据表的地址
MOVTBLP,A;表格指针寄存器TBLP
TABRD;查表并将数据存到PD口寄存器
MOVA,[80H];位码寄存器
MOVPC,A;将位码寄存器的数存到PC口寄存器
;段码和位码的数都有了所以数码管被点亮
INCMP0;间接寄存器指针加1指向下一个段码寄存器
RL[80H];左移位码寄存器控制下一个数码管
SNZ[80H].5;判断是否控制完4个数码管
JMPZD2;退出中断继续
MOVA,1;是则从新初始化寄存器数据
MOV[80H],A;
MOVA,8AH;千位数码管对应寄存器
MOVMP0,A;存到间接寄存器0
ZD2:
MOVA,[0F2H];弹栈后进先出先进后出
MOVBP,A;弹栈0F2H的数到储存区寄存器BP
MOVA,[0F1H];
MOVSTATUS,A;弹栈0F1H的数到标志寄存器
MOVA,[0F0H];弹栈0F0H的数到acc
CLRMF0F;清多功能标志
CLRT2AF;清定时器2比较器A标志
RETI;中断返回
;*******************************************************
;延时子程序
;*******************************************************
M001:
MOVA,1
MOV[85H],A
M002:
MOVA,20
MOV[86H],A
M003:
MOVA,250
MOV[87H],A
M004:
SDZ[87H]
J004
SDZ[86H]
JMPM003
SDZ[85H]
JMPM002
RET
END


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。锐单自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章