用PROTEUS仿真单片机与小键盘接口通信

发布者:Xiangtan最新更新时间:2024-08-09 来源: cnblogs关键字:PROTEUS仿真  单片机 手机看文章 扫描二维码
随时随地手机看文章

(protues高版本不兼容低版本真是不方便啊)

设计要求:

实现Proteus ISIS中的键盘矩阵与8051微控制器的接口。在上一个项目中,实现了LCD与8051微控制器的接口,可以在上面显示数据和不同的值,接下来的项目将从键盘上获取按键值,并在LCD上显示这些值。

#include

void cct_init(void);

void delay(int);

void lcdinit(void);

void writecmd(int);

void writedata(char);

void Return(void);

char READ_SWITCHES(void);

char get_key(void);

sbit RowA = P1^0;

sbit RowB = P1^1;

sbit RowC = P1^2; 

sbit RowD = P1^3;  

sbit C1   = P1^4;     

sbit C2   = P1^5;   

sbit C3   = P1^6;    

sbit C4   = P1^7;    

sbit E    = P3^6;  

sbit RS   = P3^7;    

int main(void)

{

   char key;            

   cct_init();      

   lcdinit();            

   while(1)

   { 

     key = get_key();     

     writedata(key);      

   }

}

void cct_init(void)

{

    P0 = 0x00;  

    P1 = 0xf0;   

    P2 = 0x00; 

    P3 = 0x00; 

}

void delay(int a)

{

   int i;

   for(i=0;i}

void writedata(char t)

{

   RS = 1;           

   P2 = t;          

   E  = 1;      

   delay(150);

   E  = 0;        

   delay(150);

}

void writecmd(int z)

{

   RS = 0;         

   P2 = z;    

   E  = 1;        

   delay(150);

   E  = 0;       

   delay(150);

}

void lcdinit(void)

{

     delay(15000);

   writecmd(0x30);

     delay(4500);

   writecmd(0x30);

     delay(300);

   writecmd(0x30);

     delay(650);

   writecmd(0x38); 

   writecmd(0x0c); 

   writecmd(0x01);   

   writecmd(0x06);  

}

void Return(void)

{

  writecmd(0x02);

    delay(1500);

}

char READ_SWITCHES(void)    

{    

    RowA = 0; RowB = 1; RowC = 1; RowD = 1;

    if (C1 == 0) { delay(10000); while (C1==0); return '7'; }

    if (C2 == 0) { delay(10000); while (C2==0); return '8'; }

    if (C3 == 0) { delay(10000); while (C3==0); return '9'; }

    if (C4 == 0) { delay(10000); while (C4==0); return '/'; }

    RowA = 1; RowB = 0; RowC = 1; RowD = 1;

    if (C1 == 0) { delay(10000); while (C1==0); return '4'; }

    if (C2 == 0) { delay(10000); while (C2==0); return '5'; }

    if (C3 == 0) { delay(10000); while (C3==0); return '6'; }

    if (C4 == 0) { delay(10000); while (C4==0); return 'x'; }

    RowA = 1; RowB = 1; RowC = 0; RowD = 1; 

    if (C1 == 0) { delay(10000); while (C1==0); return '1'; }

    if (C2 == 0) { delay(10000); while (C2==0); return '2'; }

    if (C3 == 0) { delay(10000); while (C3==0); return '3'; }

    if (C4 == 0) { delay(10000); while (C4==0); return '-'; }

    RowA = 1; RowB = 1; RowC = 1; RowD = 0;

    if (C1 == 0) { delay(10000); while (C1==0); return 'C'; }

    if (C2 == 0) { delay(10000); while (C2==0); return '0'; }

    if (C3 == 0) { delay(10000); while (C3==0); return '='; }

    if (C4 == 0) { delay(10000); while (C4==0); return '+'; }

    return 'n';   

}

char get_key(void)

{

    char key = 'n';

    while(key=='n')

        key = READ_SWITCHES();

    return key;             

}


别的就没啥了,没太大问题的情况下是都可以正常运行的。

关键字:PROTEUS仿真  单片机 引用地址:用PROTEUS仿真单片机与小键盘接口通信

上一篇:用PROTEUS仿真单片机与七段数码管
下一篇:keil应用的中的问题

推荐阅读最新更新时间:2026-03-18 13:07

《逗比小憨憨51单片机Proteus仿真系列》第18期单片机矩阵键盘+数码管显示
源代码: KEYBUF EQU 40H ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV KEYBUF,#0 MOV R0,#30H MOV R2,#0CH CLR A QING: MOV @R0,A INC R0 DJNZ R2,QING MOV P0,#8FH MOV R1,#30H DIS1: MOV R0,#30H MOV R2,#04H MOV R3,#05H DIS2: MOV A,@R0 AN
[单片机]
《逗比小憨憨51单片机Proteus仿真系列》第27期单片机步进电机正反转加减速(汇编)
源代码: ;逗比小憨憨 ZHENG EQU 30H FAN EQU 31H NO EQU 32H AS EQU 33H SS EQU 34H ORG 00H AJMP MAIN ORG 03H AJMP SUB_INT0 ORG 30H MAIN: MOV 10H,#01H MOV 11H,#03H MOV 12H,#02H MOV 13H,#06H MOV 14H,#04H MOV 15H,#0CH MOV 16H,#08H MOV 17H,#09H MOV 20H,#50 MOV 21H,#2
[单片机]
《逗比小憨憨51单片机Proteus仿真系列》第14期基于单片机的LCD12864显示汉字实验
源代码: #include reg52.h #include intrins.h #define LcdDataPort P2 typedef unsigned char u8; typedef unsigned int u16; sbit Busy = P2^7; sbit Reset = P3^0; sbit RS = P3^1; sbit E = P3^2; sbit RW = P3^3; sbit CS1 = P3^4; sbit CS2 = P3^5; const u8 code table1 =
[单片机]
《逗比小憨憨51单片机Proteus仿真系列》第19期单片机的5位数码管显示(汇编代码)
源代码: ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV 30H,#01H MOV 31H,#02H MOV 32H,#03H MOV 33H,#04H MOV 34H,#05H MOV P0,#8FH DIS1: MOV R0,#30H MOV R1,#00H MOV R2,#05H DIS2: MOV A,@R0 ANL A,#0FH MOV B,A MOV A,R1 ANL A,#0FH
[单片机]
《逗比小憨憨51单片机Proteus仿真系列》第31期电子琴与倒计时音乐播放器(汇编)
源代码: ORG 0000H SL EQU 30H SH EQU 31H ML EQU 32H MH EQU 33H HL EQU 34H HH EQU 35H L0 EQU 36H L1 EQU 37H L2 EQU 38H L3 EQU 39H DSPLYP EQU 3AH PLYTS EQU 3BH LPLMOD BIT 39H HPLMOD BIT 3AH BRIGHT BIT 3BH TCOUNT EQU 3CH
[单片机]
《逗比小憨憨51单片机Proteus仿真系列》第34期基于单片机的数码管计数器
源代码: #include reg51.h #define LEDCHAR P1 #define LEDSELECT P0 #define TIME0H 0xFC #define TIME0L 0x18 #define TIME1H 0x40 #define TIME1L 0x98 unsigned char uc_DisCount=1; unsigned char uc_TimeCount=0; unsigned long ul_Number=0; unsigned char code uca_LEDCode ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x
[单片机]
《逗比小憨憨51单片机Proteus仿真系列》第1期51单片机的流水灯仿真
源代码: #include reg51.h #include "intrins.h" /* 文件描述:第1期基于单片机的花式流水灯设计与仿真 作者:逗比小憨憨 备注:收录至(逗比小憨憨51单片机Proteus仿真系列视频) */ void main(void) { unsigned char i,rol; void delay_ms(unsigned int nms); rol = 0xfe; while(1) { for(i=0;i 8;i++) { P1 = rol; delay_ms(200); rol = _crol_(rol
[单片机]
《逗比小憨憨51单片机Proteus仿真系列》第25期单片机LCD12864显示汉字
源代码: #include reg51.h #include absacc.h typedef unsigned char uchar; typedef unsigned int uint; #define LLCD_CMD_WR PBYTE #define LLCD_CMD_RD PBYTE #define LLCD_DATA_WR PBYTE #define LLCD_DATA_RD PBYTE #define RLCD_CMD_WR PBYTE #define RLCD_CMD_RD PBYTE #define RLCD_DATA_WR PBYTE #define RLCD_DATA_RD PBYTE
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved