/*
SMC1602A(16*2)模拟口线接线方式
连接线图:
---------------------------------------------------
|LCM-----51 | LCM-----51 | LCM------51 |
--------------------------------------------------|
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.5 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.6 |
|DB2-----P0.2 | DB6-----P0.6 | E--------P2.7 |
|DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND|
---------------------------------------------------
Keyboard接线
PS/2--------51
1 DATA------P3.4
3 GND
4 VCC
5 CLK-------P3.3 接在51的外部中断,触发方式为低电平
本程序源码只供学习参考,不得应用于商业用途,如有需要请联系作者。
[注:AT89x51使用12M或11.0592M晶振,实测使用11.0592M]
*/
#include <AT89X51.h>
#include "scancodes.h"
#include <string.h>
#include <intrins.h>
#include <stdio.h>
#define LCM_RS P2_5 //定义引脚
#define LCM_RW P2_6
#define LCM_E P2_7
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
#define Key_Data P3_4 //定义Keyboard引脚
#define Key_CLK P3_3
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void Decode(unsigned char ScanCode);
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
unsigned char code www[] = {" WWW.QLMCU.COM "};
unsigned char code email[] = {" 0595-28011587 "};
unsigned char code input[] = {" Keyboard Test "};
unsigned char code Cls[] = {" "};
static unsigned char IntNum = 0; //中断次数计数
static unsigned char KeyV; //键值
static unsigned char DisNum = 0; //显示用指针
static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
static unsigned char BF = 0; //标识是否有字符被收到
void main(void)
{
unsigned char TempCyc;
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
DisplayListChar(0, 0, www); //第一行显示 WWW.QLMCU.COM
DisplayListChar(0, 1, email); //第一行显示 0595-28011587
for (TempCyc=0; TempCyc<10; TempCyc++)
Delay400Ms(); //延时
DisplayListChar(0, 0, input); //第一行显示 Keyboard Test
DisplayListChar(0, 1, Cls); //第二行清屏
IT1 = 0; //设外部中断1为低电平触发
EA = 1;
EX1 = 1; //开中断
do
{
if (BF)
Decode(KeyV);
else
EA = 1; //开中断
}
while(1);
}
/*****************************************
********* LCM1602驱动程序 **************
******************************************/
//----------写数据-----------------------------!!!问题一直出在这里!!!2006.03.18
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
// LCM_E 必须是由 高 到 低 的电平变化!!!
LCM_E = 1; //-----!!!问题一直出在这里!!!
_nop_(); //-----------------!!!!!加上这四句即可!
_nop_();
LCM_E = 0;
}
//----------写指令----------------------------!!!问题一直出在这里!!!2006.03.18
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
// LCM_E 必须是由 高 到 低 的电平变化!!!
LCM_E = 1; //-----!!!问题一直出在这里!!!
_nop_(); //-----------------!!!!!加上这四句即可!
_nop_();
LCM_E = 0;
}
//读状态
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
_nop_();
LCM_E = 1;
_nop_();
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}
void LCMInit(void) //LCM初始化
{
LCM_Data = 0x00;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}
//按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength,j;
ListLength = strlen(DData);
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (X <= 0xF) //X坐标应小于0xF
{
for(j=0;j<ListLength;j++)
{
DisplayOneChar(X, Y, DData[j]); //显示单个字符
X++;
}
}
}
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
//************************************************************************
///////////外部中断 1 子程序,自动产生入口地址,使用第 0 组寄存器
void Keyboard_out(void) interrupt 2
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
}
IntNum++;
while (!Key_CLK); //等待PS/2CLK拉高
if (IntNum > 10)
{
IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
BF = 1; //标识有字符输入完了
EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)
}
}
void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{
unsigned char TempCyc;
if (!Key_UP) //当键盘松开时
{
switch (ScanCode)
{
case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
Key_UP = 1;
break;
case 0x12 : // 左 SHIFT
Shift = 1;
break;
case 0x59 : // 右 SHIFT
Shift = 1;
break;
default:
if (DisNum > 15)
{
DisplayListChar(0, 1, Cls);//清LCD第二行
DisNum = 0;
}
if(!Shift) //如果SHIFT没按下
{
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
if (UnShifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]);
DisNum++;
}
else //按下SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
if (Shifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, Shifted[TempCyc][1]);
DisNum++;
}
break;
}
}
else
{
Key_UP = 0;
switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
{
case 0x12 : // 左 SHIFT
Shift = 0;
break;
case 0x59 : // 右 SHIFT
Shift = 0;
break;
}
}
BF = 0; //标识字符处理完了
}
没有合适的资源?快使用搜索试试~ 我知道了~
C51实验程序 单片机基础实验程序
共168个文件
bak:39个
opt:14个
hex:14个
需积分: 11 8 下载量 14 浏览量
2011-04-07
10:29:49
上传
评论
收藏 211KB RAR 举报
温馨提示
C51实验程序 单片机基础实验程序C51实验程序 单片机基础实验程序C51实验程序 单片机基础实验程序C51实验程序 单片机基础实验程序C51实验程序 单片机基础实验程序C51实验程序 单片机基础实验程序
资源推荐
资源详情
资源评论
收起资源包目录
C51实验程序 单片机基础实验程序 (168个子文件)
24C02 15KB
4x4key 6KB
93C46 16KB
PS2Key.c.bak 7KB
24C02.C.bak 5KB
4x4key.c.bak 4KB
LCD.c.bak 4KB
keys_leds.c.bak 2KB
door_ring.c.bak 2KB
didi.c.bak 2KB
led_dis.c.bak 2KB
led_table_Uv2.Bak 2KB
led_dis_Uv2.Bak 2KB
count.c.bak 2KB
keys_leds_Uv2.Bak 2KB
key_led_Uv2.Bak 2KB
run_led_Uv2.Bak 2KB
baojing_Uv2.Bak 2KB
24C02_Uv2.Bak 2KB
LCD1602_Uv2.Bak 2KB
PS2Key_Uv2.Bak 2KB
led_table.c.bak 2KB
run_led.c.bak 2KB
key_led.c.bak 2KB
led_table_Opt.Bak 1KB
run_led_Opt.Bak 1KB
led_dis_Opt.Bak 1KB
93C46_Opt.Bak 1KB
key_led_Opt.Bak 1KB
PS2Key_Opt.Bak 1KB
keys_leds_Opt.Bak 1KB
4x4key_Opt.Bak 1020B
baojing_Opt.Bak 1020B
24C02_Opt.Bak 1018B
count_Opt.Bak 1016B
LCD1602_Opt.Bak 1014B
didi_Opt.Bak 1013B
door_ring_Uv2.Bak 0B
didi_Uv2.Bak 0B
4x4key_Uv2.Bak 0B
93C46_Uv2.Bak 0B
count_Uv2.Bak 0B
PS2Key.c 7KB
93C46.C 6KB
24C02.C 5KB
4x4key.c 4KB
LCD.c 4KB
keys_leds.c 2KB
led_dis.c 2KB
door_ring.c 2KB
didi.c 2KB
led_table.c 2KB
count.c 2KB
run_led.c 2KB
key_led.c 2KB
baojing.c 2KB
count 3KB
Thumbs.db 11KB
didi 3KB
door_ring 4KB
scancodes.h 1KB
PS2Key.hex 3KB
93C46.hex 3KB
24C02.hex 2KB
4x4key.hex 1KB
LCD1602.hex 1KB
run_led.hex 455B
door_ring.hex 428B
count.hex 408B
led_table.hex 318B
didi.hex 275B
led_dis.hex 238B
baojing.hex 230B
keys_leds.hex 192B
key_led.hex 112B
key_led 2KB
keys_leds 3KB
LCD1602 10KB
led_dis 3KB
led_table 3KB
baojing.lnp 31B
didi.lnp 25B
PS2Key.LST 15KB
4x4key.LST 13KB
93C46.LST 11KB
24C02.LST 10KB
LCD.LST 7KB
keys_leds.LST 5KB
count.LST 5KB
door_ring.LST 4KB
led_dis.LST 4KB
run_led.LST 4KB
led_table.LST 4KB
didi.LST 4KB
baojing.LST 3KB
key_led.LST 3KB
24C02.M51 14KB
PS2Key.M51 14KB
93C46.M51 13KB
LCD1602.M51 9KB
共 168 条
- 1
- 2
资源评论
gongxingandwu
- 粉丝: 0
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python大作业:音乐播放软件(爬虫+可视化+数据分析+数据库)
- 课程设计-python爬虫-爬取日报,爬取日报文章后存储到本地,附带源代码+课程设计报告
- 软件和信息技术服务行业投资与前景预测.pptx
- 课程设计-基于SpringBoot + Mybatis+python爬虫NBA球员数据爬取可视化+源代码+文档+sql+效果图
- 软件品质管理系列二项目策划规范.doc
- 基于TensorFlow+PyQt+GUI的酒店评论情感分析,支持分析本地数据文件和网络爬取数据分析+源代码+文档说明+安装教程
- 软件定义无线电中的模拟电路测试技术.pptx
- 软件开发协议(作为技术开发合同附件).doc
- 软件开发和咨询行业技术趋势分析.pptx
- 软件测试题详解及答案.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功