📄 17khz150ms.asm
字号:
;*****************************************************
;Company :
;File Name : FDJdddadfa.asm
;Author :
;Create Data : 2006-11-01
;Last Modified : 2006-11-01
;Description :
;Version : 1.0
DEBUG EQU 1
IEX EQU 00H
IRQT EQU 01H
TM0 EQU 02H
BTM EQU 03H
T0L EQU 04H
T0H EQU 05H
TBL EQU 06H;
TBH EQU 07H
PORTA EQU 08H
PORTB EQU 09H
PAMODE EQU 0BH
PBMODE EQU 0CH
TBR EQU 0EH ;查表寄存器
INX EQU 0FH ;伪索引寄存器
DPL EQU 10H ;INX 低四位
DPM EQU 11H ;INX 中四位
DPH EQU 12H ;INX 高四位
PORTMODEAB EQU 13H
OSCX EQU 14H ;
LCDCTR EQU 15H ;LCD control
LCDMOD EQU 16H ;Lcd Mode
MaxChnL EQU 20H ;总共要采集的路数
MaxChnH EQU 21H ;总共要采集的路数
CurrentChnL EQU 22H ;当前的路数低
CurrentChnH EQU 23H ;当前的路数高
ACountL0 EQU 24H ;记数器0低四位
ACountM0 EQU 25H ;记数器0中四位
ACountH0 EQU 26H ;记数器0高四位
Tmp7 EQU 27H ;
Tmp8 EQU 28H ;
Tmp9 EQU 29H ;
TmpA EQU 3AH ;
TmpB EQU 3BH ;
TmpC EQU 3CH ;
SampFlg EQU 2DH;一次采集标志,x3 x2 x1 x0四位分别代表x3采集结束、x2当前路数积分已到最大值
RegisterFree EQU 2EH;临时的寄存器
DataSize EQU 2FH;每一个数据占的位数
TMPER EQU 30H;中断保护acc的暂存
TMPERL EQU 31H;暂存,保护dpl
TMPERM EQU 32H;保护dpm
TMPERH EQU 33H;保护dph
PoutH EQU 34H;当前口输出方波的高低电平标志
ADPTimerL EQU 35H;ad输出的计数
ADPTimerH EQU 36H;
Tmp0 EQU 37H;暂存寄存器0
Tmp1 EQU 38H;暂存寄存器1
Tmp2 EQU 39H;暂存寄存器2
Tmp3 EQU 3AH;暂存寄存器3
Tmp4 EQU 3BH;暂存寄存器4
Tmp5 EQU 3CH;暂存寄存器5
Tmp6 EQU 3DH;暂存寄存器6
FinalCodeHexL EQU 3EH;最终的编码低四位十六进制
FinalCodeHexM EQU 3FH;
FinalCodeHexH EQU 40H;
SendDataBufL EQU 41H;即将发送的数据buf
SendDataBufH EQU 42H;发送的数据FinalCode标志
SendDataAcc EQU 43H;发送的位数计数
PageFlg EQU 44H;
TimerFlg EQU 45H;定时器的使用标志,0为判断笔是否落下的时候用的,1为正常采样的时候,2为传输数据的时候用的
CoordXL EQU 4AH;******坐标X的低四位
CoordXH EQU 4BH;******坐标X的高四位
CoordYL EQU 4CH;****** 坐标Y的低四位
CoordYH EQU 4DH;****** 坐标的高四位
PreAvailX0L EQU 4EH;存放上次采集后的扫描线y
PreAvailX0H EQU 4FH;
PreAvailX1L EQU 50H;
PreAvailX1H EQU 51H;
PreAvailY0L EQU 52H;存放上次采集后的扫描线x
PreAvailY0H EQU 53H;
PreAvailY1L EQU 54H;
PreAvailY1H EQU 55H;
CodeDec0 EQU 56H; 十进制的码
CodeDec1 EQU 57H;
CodeDec2 EQU 58H;
CodeDec3 EQU 59H;
ScanCount4L EQU 5AH;
ScanCount4M EQU 5BH;
ScanCount4H EQU 5CH;
ScanCount5L EQU 5DH;
ScanCount5M EQU 5EH;
ScanCount5H EQU 5FH;
PenJmpHigh EQU 60H;
BankJmpFlg EQU 61H;
SysInitFlg EQU 62H;系统初始化的返回值
ACountL1 EQU 63H;
ACountM1 EQU 64H;
ACountH1 EQU 65H;
CmpFlg EQU 66H;
AvailX0L EQU 67H;有用的x0
AvailX0H EQU 68H;
AvailX1L EQU 69H;有用的x1
AvailX1H EQU 6AH;
AvailFLG0 EQU 6BH;flg0,flg1,flg2,flg3
AvailFLG1 EQU 6CH;
AvailFLG2 EQU 6DH;
AvailY0L EQU 6EH;有用的y0
AvailY0H EQU 6FH;
AvailY1L EQU 70H;有用的y1
AvailY1H EQU 71H;
AvailFLG3 EQU 72H;
LINEX0_0L EQU 73H;线x0的第一个数据的低四位地址
LINEX0_0H EQU 74H;线x0的第一个数据的高四位地址
LINEX1_0L EQU 75H;线x1的第一个数据的低四位地址
LINEX1_0H EQU 76H;线x1的第一个数据的高四位地址
LINEY0_0L EQU 77H;线y0的第1个数据的低地址
LINEY0_0H EQU 78H;线y0的第1个数据的高地址
LINEY1_0L EQU 79H;***
LINEY1_0H EQU 7AH;***
LINE_D_MARK EQU 7BH;标记时候有odh的线被记录
DAT_LEN_Y EQU 06H;每路y数据在表格中占的地址数
DAT_LEN_X EQU 04H;每路x数据在表格中占的地址数
DataAdr EQU 90H;数据的起始地址,每三位表示一个完整的数据
TableAdrY EQU 0x100;表格Y基地址
TableAdrX EQU 0x15C;表格X基地址
LcdSegAdr EQU 300H;LCD的ram起始地址
;a.0口输出,b口输入
;*****************************************************
ROMSIZE=4096
ORG 0000H
JMP RESET
NOP
JMP T0INT ;Timer0 service routine
NOP
NOP ;口中断
;;;;******************复位跳转******************************************/
RESET: LDI IEX,00H;
LDI Tmp6,00H;
LdI OSCX,0001B
Call DELAY_5MS ;必須保證有5毫秒以上的時間
LdI OSCX,0011B
LDI PORTMODEAB,1000B ;PA.1,PA.2 as I/O port;LCD signal on;Seg1-4 as LCD output
LDI PBMODE,1111B;
LDI PORTB,1111B ;
LDI PAMODE,1110B;
LDI PORTA,1111B
LDI DPH,01H ;数据地址从40h开始
LDI DPM,01H ;
LDI DPL,00H ;
LDI MaxChnL,01H ;总共采集4路行15根线,列左右个9根共18
LDI MaxChnH,02H ;总共采集4路
LDI CurrentChnL,00H;当前开始路数初始化
LDI CurrentChnH,00H;当前开始路数初始化
LDI DataSize,03H ;每个是数据占的位数
LDI ACountL0,00H ;记数器低四位
LDI ACountM0,00H ;记数器中四位
LDI ACountH0,00H ;记数器高四位
LDI PreAvailX0L,0FH;
LDI PreAvailX0H,08H;
LDI PreAvailX1L,0FH;
LDI PreAvailX1H,08H;
LDI PreAvailY0L,0FH;
LDI PreAvailY0H,08H;
LDI PreAvailY1L,0FH;
LDI PreAvailY1H,08H;
LDI SysInitFlg,00H;
LDI CmpFlg,00H;
LDI LINE_D_MARK,00H ;
LDI RegisterFree,00H ;上次采集是0
LDI PoutH,00H;EQU 31H;当前口输出方波的高低电平标志
LDI SampFlg,00H ;采样标志位
LDI LCDCTR,0011B;
LDI LCDMOD,0100B;
LDI TimerFlg,00H;
LDI PageFlg,00H;
LDI PenJmpHigh,00H;
;********************
;********************
LDI BankJmpFlg,00H;
CALL AA
;CALL LoadXYTable
NOP
LDI BankJmpFlg,01H;
CALL AA
;CALL ClearDataMemory ;清数据存储区的数据--ok
NOP
CALL ClearLcdMemory ;清lcd地址为0
NOP
LDI TM0,1110B ;設定計時器頻率為(OSCX)记数时钟为oscx的二分频
LDI T0L,0BH ;設定計時器計數起始值低4 位,载入初始值6输出频率为20khz
LDI T0H,0EH ;設定計時器計數起始值高4 位
LDI IEX,0100B ;设置口中断中断标志位
LDI IRQT,0000B ;清除TIMER0中斷標誌
;JMP GoMain
;****判断左右页*********
PageJudgeMain:
LDA PORTA,00H; ;读取b.0口数据
BA0 PgLowLookup ;为1时去查询是否变低
JMP PageJudgeMain ;为0时继续去查询
PgLowLookup:
LDI SampFlg,00H;
LDI ACountL0,00H ;记数器低四位
LDI ACountM0,00H ;记数器中四位
LDI ACountH0,00H ;记数器高四位
LDI PORTB,1110B;
CALL Delay70us
LDI PORTB,1111B;
PgACountDeal:
CALL PgACountAdd1;累加器计数ok
LDA SampFlg,00H;
BA2 PgDeal;当超过最大累时的时候扫描下一路
LDA PORTA,00H; ;读取A.0口数据
BA0 PgDeal ;为1时采集结束0->1,
JMP PgACountDeal ;为0时继续去
;*******************************
PgDeal:
;*********************
;*********************
LDA PageFlg,00H;
BNZ ChoseRight ;当前扫页为右页的时候
LDA SampFlg,00H;
BA2 TurnRightPage ;去扫右页
NOP
JMP GoMain
TurnRightPage:
LDI PageFlg,01H;
LDI SampFlg,00H;
LDI ACountL0,00H;
LDI ACountM0,00H;
LDI ACountH0,00H;
JMP PageJudgeMain
ChoseRight:
LDA SampFlg,00H;
BA2 TurnLeftPage ;当磊加器超过最大磊时的时候,去扫左页
NOP
JMP GoMain
TurnLeftPage:
LDI PageFlg,00H; 去扫描左页
LDI SampFlg,00H;
LDI ACountL0,00H;
LDI ACountM0,00H;
LDI ACountH0,00H;
JMP PageJudgeMain
;******累加子程序***************
PgACountAdd1:
LDI Tmp0,00H ;
ADIM ACountL0,01H ;低位加1
LDI Tmp0,00H ;
ADCM ACountM0,00H ;中间4位加1
;LDI Tmp0,00H ;
;ADCM ACountH0,00H ;高四位加1
LDA ACountM0,00H; 设置域值
BA0 PgMaxTimeLimit1
JMP PgENDACount1
PgMaxTimeLimitThen:
LDA ACountL0,00H;
BA2 PgMaxTimeLimit1
JMP PgENDACount1
PgMaxTimeLimit1:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI PenJmpHigh,01H;
LDI SampFlg,0100B;标志最大累时已到,可以跳到下一路去扫描
PgENDACount1:
NOP
RTNI
GoMain: LDA PenJmpHigh,00H;判断笔有没有被抬起
BAZ PageJudgeMain
LDI PenJmpHigh,00H;
LDI IEX,0000B;
LDI TimerFlg,01H;
LDI CmpFlg,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI ADPTimerL,00H;ad的电平输出计数标志
LDI ADPTimerH,00H;
LDI SampFlg,00H;
LDI ACountL0,00H ;记数器低四位
LDI ACountM0,00H ;记数器中四位
LDI ACountH0,00H ;记数器高四位
LDI CurrentChnL,00H;当前开始路数初始化
LDI CurrentChnH,00H;当前开始路数初始化
LDI ADPTimerL,00H;ad的电平输出计数标志
LDI ADPTimerH,00H;
LDI TM0,1110B ;設定計時器頻率為(OSCX)记数时钟为oscx的二分频
LDI T0L,00H ;設定計時器計數起始值低4 位,载入初始值6输出频率为20khz
LDI T0H,0FH ;設定計時器計數起始值高4 位
LDI IEX,0100B ;设置口中断中断标志位
LDI IRQT,0000B ;清除TIMER0中斷標誌
;CALL DelayHalfms
;/**********采集部分主程序******************************
Main:
LDA PORTA,00H; ;读取b.0口数据
BA0 LowLookup ;为1时去查询是否变低
JMP Main ;为0时继续去查询
LowLookup:
LDI SampFlg,00H;
LDI ACountL0,00H ;记数器低四位
LDI ACountM0,00H ;记数器中四位
LDI ACountH0,00H ;记数器高四位
LDI PORTB,1110B;
CALL Delay70us
LDI PORTB,1111B;
ACountDeal:
CALL ACountAdd1;累加器计数ok
LDA SampFlg,00H;
BA2 StoreResult;当超过最大累时的时候扫描下一路
LDA PORTA,00H; ;读取A.0口数据
BA0 StoreResult ;为1时采集结束0->1,
JMP ACountDeal ;为0时继续去
;;**********************采集计数部分*************************************
StoreResult:
NOP
JMP STOREDAT
STOREDAT:
;****加个判断,如果行的有用数**
;****据不超过2个话重新去采集***
;******************************
LDI IEX,0000B ;设置口中断中断标志位
NOP
CALL AccWrite2Memery;将计数结果写如数据区ok
;*******************************************
;如果下一路是地线即0dh,由于该线被悬空,直接跳过
;*******************************************
LDA CurrentChnH,00H;
BNZ TurnChn
SBI CurrentChnL,0CH;
BAZ GroundDeal
JMP TurnChn
GroundDeal:
LDI CurrentChnL,0DH;
LDI ACountL0,0FH;
LDI ACountM0,0FH;
LDI ACountH0,0FH;
JMP STOREDAT
TurnChn:
LDI SampFlg,00H;
CALL Turn2NextChn ;跳到下一路通道,判断总的通道数是否大于当前通道,是则转,否则数据采集结束去处理数据
NOP
LDA SampFlg,00H ;采样标志位
BA3 ToComputeXY ;处理坐标数据
LDI ACountL0,00H ;记数器低四位
LDI ACountM0,00H ;记数器中四位
LDI ACountH0,00H ;记数器高四位
LDI SampFlg,00H;
LDI T0L,00H ;設定計時器計數起始值低4 位,载入初始值6输出频率为20khz
LDI T0H,0FH ;設定計時器計數起始值高4 位
LDI IEX,0100B ;设置口中断中断标志位
LDI IRQT,0000B ;清除TIMER0中斷標誌
NOP
;CALL DelayHalfms
JMP Main
;************清lcd存储空间为0**************
ClearLcdMemory:
LDA MaxChnL,00H; 得到最大路数
STA Tmp0,00H;
LDA MaxChnH,00H; 得到最大路数
STA Tmp1,00H;
Ldi DPH,0110B ;得到300h的基地址
Ldi DPM,0000B
Ldi DPL,0000B
LDI INX,00H;
;*************************
ClearLcdLoop1:
LDI Tmp6,00H;
ADIM Tmp6,00H;
SBIM Tmp0,01H ;总路数高位减1
BC ClearlcdMemory1
LDI Tmp6,00H;
ADIM Tmp6,00H;
SBIM Tmp1,01H;
BNC EndLcdLoop1
LDI Tmp0,0FH;
JMP ClearLcdLoop1
ClearlcdMemory1:
ADIM DPL,01H;
LDI Tmp6,00H;
ADCM DPM,00H;
LDI Tmp6,00H;
ADCM DPH,00H;
LDI INX,00H;
JMP ClearLcdLoop1;
EndLcdLoop1:
NOP
RTNI
;*********把累加器数据写到数据区*********
AccWrite2Memery:
LDI Tmp6,00H;
ADIM Tmp6,00H;
LDI Tmp6,00H;
LDA DataSize,00H; 将每个数据占的字节数放进tmp2
STA Tmp2,00H;
LDI Tmp3,00H; 存放相乘结果寄存器清0
LDI Tmp4,00H;
LDI Tmp5,00H;
LDA CurrentChnL,00H ;将当前路数装至暂存
STA Tmp0,00H;
LDA CurrentChnH,00H;
STA Tmp1,00H;
LDA PageFlg,00H;
BNZ AdjustChanel ;右页做调整
JMP GetAdrOffset1;左页直接往下走
AdjustChanel: ;如果是右页的话,通道保存做调整
LDA Tmp1,00H;
BNZ HighChanelAdjust;高位不为0则为列线
JMP GetAdrOffset1;右页通道的高位为0,则为行,直接去保存就可以了
HighChanelAdjust:;列线做调整,将数据放回和左页的列相同的空间,方便处理数据
LDI Tmp6,00H;
SBIM Tmp0,09H;
LDI Tmp6,00H;
SBCM Tmp1,00H;
LDI Tmp6,00H;
ADIM Tmp6,00H;
;**************************
GetAdrOffset1:
SBIM Tmp2,01H ;Tmp2存放每个数据所占的半字节数
BC ADD_CC1 ;
JMP MUL_OK1 ;
ADD_CC1: LDA Tmp0,00H ;
ADDM Tmp3,00H ;
LDA Tmp1,00H ;
ADCM Tmp4,00H ;
LDI Tmp6,00H ;
ADCM Tmp5,00H ;
JMP GetAdrOffset1
MUL_OK1:
ADIM Tmp3,00H ;
LDI Tmp6,00H;
ADIM Tmp4,09H ; 偏移地址上加上基地址90h得到绝对地址
LDI Tmp6,00H;
ADCM Tmp5,00H ;
NOP
;**************************
; CALL GetAdrOffset
LDI Tmp6,00H;清进位标志位
ADIM Tmp6,00H;清进位标志位
LDI Tmp6,00H;
LDA Tmp3,00H;得到偏移的低四位地址DPL
STA DPL,00H;
LDI Tmp6,00H;
LDA Tmp4,00H;
STA DPM,00H;
ANDIM DPM,0111B;得到偏移的中间三位LPM
LDA Tmp5,00H;
STA DPH,00H;
ANDIM DPH,0011B; 左移一位
ADCM DPH,00H;
ANDIM DPH,0110B; 左移一位
LDI Tmp6,00H;清ac及进位标志位
ADIM Tmp6,00H;清进位标志位
LDA Tmp4,00H;
BA3 DphAdd1
JMP WriteData
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -