打印

矩正键盘 C程序

[复制链接]
2165|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dream2010|  楼主 | 2008-10-27 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//键盘扫描子程序
void    keyscan( )
{
    if((RB4==0)||(RB5==0))    FLAG1=1    ; 
    else    FLAG1=0    ;                   
}

//键服务子程序
void        keyserve( )
{
    PORTB=0XFD    ;
    if(RB5==0)    data=0X01;
    if(RB4==0)    data=0X03;
    PORTB=0XFB;
    if(RB5==0)    data=0X02;
    if(RB4==0)    data=0X04;        
    PORTB=0X00;                
    if(data==0x01)    
         {
        COUNTER=COUNTER+1;    //若按下S9键,则COUNTER加1
        if(COUNTER>4)    COUNTER=0x01;//若COUNTER超过4,则又从1计起
    }
    if(data==0x02)    
        {
        COUNTER=COUNTER-1;    //若按下S11键,则COUNTER减1
    if(COUNTER<1)    COUNTER=0x04;//若COUNTER小于1,则又循环从4计起
    }
    if(data==0x03)    FLAG2=1    ;        //若按下S10键,则建立标志FLAG2
    if(data==0x04)    FLAG2=0    ;        //若按下S12键,则清除标志FLAG2
}


void KEYinitial()
{
TRISB1=0;
TRISB2=0;
TRISB4=1;
TRISB5=1;
RB1=0;
RB2=0;   //四个IO口构成四个矩形键盘,实现加1减1功能.

}
沙发
兰天白云| | 2008-10-28 08:24 | 只看该作者

你是贴程序共享吗?

如果是这样,还希望你把具体情况也说说,好让网友学起来轻松点,他们平时很累的

使用特权

评论回复
板凳
Ivy19860210| | 2009-5-27 09:25 | 只看该作者

急!!!单片机高手看看我的键盘程序哪错了,帮忙改一下

ORG 0100H
START:  MOV    TMOD,#20H        ;定时器T1为方式2
        MOV    TH1,#0F3H
        MOV    TL1,#0F3H        ;12m,波特率为2400
        MOV    PCON,#00H        ;置SMOD=1
        SETB   TR1              ;启动T1计数开始
        MOV    SCON,#50H        ;串口方式1
        CLR    RI               ;清接收标志
        CLR    TI               ;清发送标志

KSCAN:  LCALL KEYS1 ;调用判键闭合子程序
  JNZ KEY1;(A)<>0有键闭合则转至去抖动
  AJMP RETURN;无键闭合则返回
KEY1: ACALL  D10MS   ;调用10ms延时程序
  ACALL KEYS1;再次调用判键闭合子程序
  JNZ KEY2;确认有键闭合,开始扫描
  LJMP RETURN;无键闭合则返回
KEY2: MOV R2,#0FEH      ;送首列扫描字
  MOV R4,#00H ;送首列号
KEY0: MOV A,R2
  MOV P1,A
  MOV P0,#0FFH
  MOV A,P0;扫描字从P1口送出
  JB ACC.0,LINE1 ;第1行无键闭合,转第2行
  MOV A,#00H;第1行首键号送A
  AJMP KPV ;转键值计算程序
LINE1: JB ACC.1,LINE2 ;第2行无键闭合,转第3行
  MOV A,#04H;第2行首键号送A
  AJMP KPV;转键值计算程序
LINE2: JB ACC.2,LINE3;第3行无键闭合,转第4行
  MOV A,#08H;第3行首键号送A
  AJMP KPV ;转键值计算程序
LINE3: JB ACC.3,LINE4  ;第4行无键闭合,转下1列
  MOV A,#0CH;第4行首键号送A
  AJMP KPV
LINE4: JB ACC.4,NEXT
  MOV A,#10H
KPV: ADD A,R4;计算键值
   MOV 50H,A ;键值存放在40H单元
   ACALL SEDATA
  PUSH ACC
KEY3: ACALL KEYS1;等待键释放
  JNZ KEYS1
  POP ACC
  SETB FLAG;置有键按下标志
  SJMP KEY4
RETURN:CLR FLAG;清有键按下标志
KEY4: RET
NEXT: INC R4;列号加1
  MOV A,R2
  CJNE A,#0F7H,RETURN;判断4行是否都已扫描完,;完则返回
  RL A ;为扫描下1行做准备
  MOV R2,A
  AJMP KEY0;开始扫描下1列

KEYS1:          MOV P1,#0F0H;判键闭合子程序
  MOV P0,#0FFH
  MOV A,P0
  CPL A
  ANL A,#0E0H
  RET

D10MS:MOV R7,#14H;10ms延时子程序
DLY: MOV R6,#0F8H
DLY1: DJNZ R6,DLY1
  DJNZ R7,DLY
  RET

SEDATA:MOV  R0,#50H
WAIT:  JNB  TI,$ ;等待发送完一个字符
       MOVX A,@R0;取一个字符
       MOV  SBUF,A;送串口
       CLR  TI
       RET
       END 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

26

帖子

0

粉丝