标题:
HT66F50单片机4*4矩阵键盘源码
[打印本页]
作者:
xinglong123456
时间:
2016-3-19 12:58
标题:
HT66F50单片机4*4矩阵键盘源码
只是一个键盘源码 和泰的单片机
44矩阵键盘.rar
(17.34 KB, 下载次数: 8)
2016-3-19 12:56 上传
点击文件名下载附件
键盘源码
下载积分: 黑币 -5
//**************此程序的功能是用PA口接一个4*4的键盘,并通过按键的键值不同,在LCD1602上显示不同的信息*
//跳线接法:将4*4的矩阵键盘依次接到PA口,其显示的值分别为0123456789*#ABCD,其中液晶的接法同做1602的实验一样
//做这个实验的时候,我们采用的是模块化编程
//注意,在液晶初始化之前,需先将引脚的其他功能去掉,设设置好相应的输入输出模式
//此程序的键盘扫描函数我感觉太繁琐,希望能找到更好的办法解决,再就是程序有点问题,就是当液晶显示已满之后,当你再次按下按键时
//液晶为何没有显示。这是个问题。希望大家能够找到答案。我们一起相互交流QQ:846754315
#include"HT66F50.h"
#include"yejingdc.h"
#define rs _23_0//pd.0
#define rw _23_1//pd.1
#define e _23_2//pd.2
#define data _pc//数据传送通道
#define rsc _24_0//控制pd.0
#define rwc _24_1//控制pd.1
#define ec _24_2//控制pd.2
#define datac _pcc//数据pc0~7
#define k _pa//键盘接口
#define kc _pac//键盘接口控制输入输出端寄存器
#define ks _papu//键盘接口上拉电阻控制寄存器
#define k1 _1a_0
#define k2 _1a_1
#define k3 _1a_2
#define k4 _1a_3
#define k5 _1a_4
#define k6 _1a_5
#define k7 _1a_6
#define k8 _1a_7
const uchar table0[]="0123456789*#ABCD";
void main(void)
{
uchar i=0;//记录按键的次数
quchu();//去除液晶接口其它功能子函数
quchu2();//去除键盘接口其他功能子函数
shezhi();//设置液晶键盘的输入输出模式
lcd_init();//液晶初始化子程序
lcd_pos(0x00);//送初始显示地址
while(1)//开始键盘扫描
{
k8=0;k7=1;k6=1;k5=1;//将键盘接口的最高位拉低,以检测低四位的电平变化
if((k3==0)||(k2==0)||(k1==0)||(k4==0))//只要有一个成立就成立
{
_delay(45000);//12m,延时大约15ms
if(k1==0)
{
while(!k1);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[0]);//液晶显示零
}
else if(k2==0)
{
while(!k2);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[1]);//液晶显示一
}
else if(k3==0)
{
while(!k3);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[2]);//液晶显示二
}
else if(k4==0)
{
while(!k4);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[3]);//液晶显示三
}
}
k8=1;k7=0;k6=1;k5=1;//将高七位拉低
if((k3==0)||(k2==0)||(k1==0)||(k4==0))//只要有一个成立就成立
{
_delay(45000);//12m,延时大约15ms
if(k1==0)
{
while(!k1);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[4]);//液晶显示四
}
else if(k2==0)
{
while(!k2);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[5]);//液晶显示五
}
else if(k3==0)
{
while(!k3);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[6]);//液晶显示六
}
else if(k4==0)
{
while(!k4);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[7]);//液晶显示七
}
}
k8=1;k7=1;k6=0;k5=1;//将高六位拉低
if((k3==0)||(k2==0)||(k1==0)||(k4==0))//只要有一个成立就成立
{
_delay(45000);//12m,延时大约15ms
if(k1==0)
{
while(!k1);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[8]);//液晶显示八
}
else if(k2==0)
{
while(!k2);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[9]);//液晶显示九
}
else if(k3==0)
{
while(!k3);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[10]);//液晶显示*
}
else if(k4==0)
{
while(!k4);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[11]);//液晶显示#
}
}
k8=1;k7=1;k6=1;k5=0;//将高五位拉低
if((k3==0)||(k2==0)||(k1==0)||(k4==0))//只要有一个成立就成立
{
_delay(45000);//12m,延时大约15ms
if(k1==0)
{
while(!k1);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[12]);//液晶显示A
}
else if(k2==0)
{
while(!k2);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[13]);//液晶显示B
}
else if(k3==0)
{
while(!k3);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[14]);//液晶显示C
}
else if(k4==0)
{
while(!k4);//松手检测
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行显示已满,就将地址从新赋值,并清除显示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[15]);//液晶显示D
}
}
}
}
复制代码
作者:
admin
时间:
2016-3-20 01:42
//****************此c文件是一个液晶显示的底层文件
#include"HT66F50.h"
#define uint unsigned int
#define uchar unsigned char
#define rs _23_0//pd.0
#define rw _23_1//pd.1
#define e _23_2//pd.2
#define data _pc//数据传送通道
#define rsc _24_0//控制pd.0
#define rwc _24_1//控制pd.1
#define ec _24_2//控制pd.2
#define datac _pcc//数据pc0~7
//const uchar table0[]="0123456789*#ABCD";
//******************写指令子函数******************************/
void lcd_wcmd(uchar cmd)
{
_delay(100);
rs = 0;
rw = 0;
e = 0;
_nop();
_nop();
data = cmd;
_nop();
_nop();
_nop();
_nop();
_nop();
e = 1;
_nop();
_nop();
_nop();
_nop();
_nop();
e = 0;
}
//****************写数据到LCD子函数******************************/
void lcd_wdat(uchar dat)
{
_delay(100);
rs = 1;
rw = 0;
e = 0;
data = dat;
_nop();
_nop();
_nop();
_nop();
_nop();
_nop();
e = 1;
_nop();
_nop();
_nop();
_nop();
e = 0;
}
//*****************设定显示地址子函数***********************//
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80); //数据指针=80+地址变量
}
//***********************LCD初始化子函数*****************************/
void lcd_init()
{
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
_delay(30000);
lcd_wcmd(0x38);
_delay(30000);
lcd_wcmd(0x38);
_delay(30000);
lcd_wcmd(0x0c); //显示开,关光标
_delay(30000);
lcd_wcmd(0x06); //移动光标
_delay(30000);
lcd_wcmd(0x01); //清除LCD的显示内容
_delay(30000);
}
void quchu(void)//液晶接口其他功能去除子函数
{
_scomen=0;//关闭SCOM功能
_tmpc0=0x00;//关闭TM比较输出功能
_cp1c=0x00;//关比较器1输入功能
_tmpc1=0x00;//关TP2_0功能
}
void quchu2(void)//键盘接口其它功能去除子函数
{
_acerl=0x00;//去除PA口的ADC功能
_tmpc0=0x00;//去除PA0引脚的TM输出
_cp0c=0x00;//去除PA0引脚的比较器0功能
_cp1c=0x00;//去除pa口的比较器1功能
}
void shezhi(void)//键盘及液晶的引脚输出输入设置子函数
{
_pac=0x0f;//设置键盘接口输入有效(高四位为输出,低四位为输入)
_papu=0xff;//键盘接口上拉电阻设置有效
datac=0;//设置液晶数据通道输出有效
rsc=0;//设置rs端输出有效
rwc=0;//设置rw端输出有效
ec=0;//设置使能端输出有效
}
复制代码
作者:
17720837065
时间:
2017-3-18 08:34
666,请问有光照传感器的代码吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1