这是自己最近研究的单片机和8255扩展的连接方法
组成了一个16个按键的矩形键盘
用LCD来显示按键的数字和一些小小的功能
新手初来乍到,不足之处还请各位多多指点。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <REGX52.H>
- #include<intrins.h>
- #include<absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- //ABC口,控制定义
- #define PA XBYTE[0X7CFF]
- #define PB XBYTE[0X7DFF]
- #define PC XBYTE[0X7EFF]
- #define COM XBYTE[0X7FFF]
- //定义键盘
- uchar code JP[]={
- 0xe7,0xeb,0xed,0xee,
- 0xd7,0xdb,0xdd,0xde,
- 0xb7,0xbb,0xbd,0xbe,
- 0x77,0x7b,0x7d,0x7e,
- };
- uchar code lcd[]={ '0','1','2','3',
- '4','5','6','7',
- '8','9', '+','-',
- '*','/', '=',
-
- };
- //定义控制引脚
- sbit RS=P3^0;
- sbit RW=P3^1;
- sbit EN=P3^2;
- sbit WR1=P3^6;
- sbit RD1=P3^7;
- //延时
- void DelayMS(uint ms)
- {
- uchar i;
- while(ms--)
- {
- for(i=0;i<120;i++);
- }
- }
- //1602写指令
- void Write_LCD_Command(uchar cmd)
- {
- RS=0;RW=0;EN=0;
- P1=cmd;
- DelayMS(5);
- EN=1;
- DelayMS(5);
- EN=0;
- }
- //1602写数据
- void Write_LCD_data(uchar dat)
- {
- RS=1;RW=0;EN=0;
- P1=dat;
- DelayMS(5);
- EN=1;
- DelayMS(5);
- EN=0;
- }
- //1602读数据
- void read(uchar rea)
- {
- RS=1;RW=1;EN=1;
- P1=rea;
- DelayMS(5);
- EN=0;
- DelayMS(5);
- EN=1;
- }
- //1602初始化
- void Ini_LCD()
- {
- Write_LCD_Command(0x0F);DelayMS(5);//设置功能
- Write_LCD_Command(0x38);DelayMS(5);
- Write_LCD_Command(0x06);DelayMS(5);//AC+1
- Write_LCD_Command(0x01);DelayMS(5);//清屏
- Write_LCD_Command(0x0c);DelayMS(5);//显示功能
- }
- //1602显示位置
- void WAdd( uchar x,uchar y)
- {
- Write_LCD_Command(0x80+x);
- Write_LCD_data(y);
- }
- //主函数
- void main()
- {
- COM=0X90;
- Ini_LCD();
- while(1)
- {
- uchar key,temp,num,a;
- PC=0X0F;
- if(PC!=0X0F)
- {
- DelayMS(10);
- if(PC!=0X0F)
- {
- temp=PC;
- PC=0xf0;
- key=temp|PC;
- if(key==0x7e)
- {
- Write_LCD_Command(0x01);DelayMS(5);//清屏
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
8255 16按键.rar
(61.55 KB, 下载次数: 279)
|