⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 17khz150ms.asm

📁 中颖单片机sh6613的一个坐标扫描程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;*****************************************************
;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 + -