標(biāo)題:
HT66F50單片機(jī)4*4矩陣鍵盤源碼
[打印本頁(yè)]
作者:
xinglong123456
時(shí)間:
2016-3-19 12:58
標(biāo)題:
HT66F50單片機(jī)4*4矩陣鍵盤源碼
只是一個(gè)鍵盤源碼 和泰的單片機(jī)
44矩陣鍵盤.rar
(17.34 KB, 下載次數(shù): 8)
2016-3-19 12:56 上傳
點(diǎn)擊文件名下載附件
鍵盤源碼
下載積分: 黑幣 -5
//**************此程序的功能是用PA口接一個(gè)4*4的鍵盤,并通過(guò)按鍵的鍵值不同,在LCD1602上顯示不同的信息*
//跳線接法:將4*4的矩陣鍵盤依次接到PA口,其顯示的值分別為0123456789*#ABCD,其中液晶的接法同做1602的實(shí)驗(yàn)一樣
//做這個(gè)實(shí)驗(yàn)的時(shí)候,我們采用的是模塊化編程
//注意,在液晶初始化之前,需先將引腳的其他功能去掉,設(shè)設(shè)置好相應(yīng)的輸入輸出模式
//此程序的鍵盤掃描函數(shù)我感覺(jué)太繁瑣,希望能找到更好的辦法解決,再就是程序有點(diǎn)問(wèn)題,就是當(dāng)液晶顯示已滿之后,當(dāng)你再次按下按鍵時(shí)
//液晶為何沒(méi)有顯示。這是個(gè)問(wèn)題。希望大家能夠找到答案。我們一起相互交流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//數(shù)據(jù)傳送通道
#define rsc _24_0//控制pd.0
#define rwc _24_1//控制pd.1
#define ec _24_2//控制pd.2
#define datac _pcc//數(shù)據(jù)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;//記錄按鍵的次數(shù)
quchu();//去除液晶接口其它功能子函數(shù)
quchu2();//去除鍵盤接口其他功能子函數(shù)
shezhi();//設(shè)置液晶鍵盤的輸入輸出模式
lcd_init();//液晶初始化子程序
lcd_pos(0x00);//送初始顯示地址
while(1)//開(kāi)始鍵盤掃描
{
k8=0;k7=1;k6=1;k5=1;//將鍵盤接口的最高位拉低,以檢測(cè)低四位的電平變化
if((k3==0)||(k2==0)||(k1==0)||(k4==0))//只要有一個(gè)成立就成立
{
_delay(45000);//12m,延時(shí)大約15ms
if(k1==0)
{
while(!k1);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[0]);//液晶顯示零
}
else if(k2==0)
{
while(!k2);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[1]);//液晶顯示一
}
else if(k3==0)
{
while(!k3);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[2]);//液晶顯示二
}
else if(k4==0)
{
while(!k4);//松手檢測(cè)
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))//只要有一個(gè)成立就成立
{
_delay(45000);//12m,延時(shí)大約15ms
if(k1==0)
{
while(!k1);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[4]);//液晶顯示四
}
else if(k2==0)
{
while(!k2);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[5]);//液晶顯示五
}
else if(k3==0)
{
while(!k3);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[6]);//液晶顯示六
}
else if(k4==0)
{
while(!k4);//松手檢測(cè)
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))//只要有一個(gè)成立就成立
{
_delay(45000);//12m,延時(shí)大約15ms
if(k1==0)
{
while(!k1);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[8]);//液晶顯示八
}
else if(k2==0)
{
while(!k2);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[9]);//液晶顯示九
}
else if(k3==0)
{
while(!k3);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[10]);//液晶顯示*
}
else if(k4==0)
{
while(!k4);//松手檢測(cè)
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))//只要有一個(gè)成立就成立
{
_delay(45000);//12m,延時(shí)大約15ms
if(k1==0)
{
while(!k1);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[12]);//液晶顯示A
}
else if(k2==0)
{
while(!k2);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[13]);//液晶顯示B
}
else if(k3==0)
{
while(!k3);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[14]);//液晶顯示C
}
else if(k4==0)
{
while(!k4);//松手檢測(cè)
if(i==16)
{
i=0;
lcd_pos(0x00);//假如第一行顯示已滿,就將地址從新賦值,并清除顯示
lcd_wcmd(0x01);
}
else
i++;
lcd_wdat(table0[15]);//液晶顯示D
}
}
}
}
復(fù)制代碼
作者:
admin
時(shí)間:
2016-3-20 01:42
//****************此c文件是一個(gè)液晶顯示的底層文件
#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//數(shù)據(jù)傳送通道
#define rsc _24_0//控制pd.0
#define rwc _24_1//控制pd.1
#define ec _24_2//控制pd.2
#define datac _pcc//數(shù)據(jù)pc0~7
//const uchar table0[]="0123456789*#ABCD";
//******************寫(xiě)指令子函數(shù)******************************/
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;
}
//****************寫(xiě)數(shù)據(jù)到LCD子函數(shù)******************************/
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;
}
//*****************設(shè)定顯示地址子函數(shù)***********************//
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80); //數(shù)據(jù)指針=80+地址變量
}
//***********************LCD初始化子函數(shù)*****************************/
void lcd_init()
{
lcd_wcmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
_delay(30000);
lcd_wcmd(0x38);
_delay(30000);
lcd_wcmd(0x38);
_delay(30000);
lcd_wcmd(0x0c); //顯示開(kāi),關(guān)光標(biāo)
_delay(30000);
lcd_wcmd(0x06); //移動(dòng)光標(biāo)
_delay(30000);
lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
_delay(30000);
}
void quchu(void)//液晶接口其他功能去除子函數(shù)
{
_scomen=0;//關(guān)閉SCOM功能
_tmpc0=0x00;//關(guān)閉TM比較輸出功能
_cp1c=0x00;//關(guān)比較器1輸入功能
_tmpc1=0x00;//關(guān)TP2_0功能
}
void quchu2(void)//鍵盤接口其它功能去除子函數(shù)
{
_acerl=0x00;//去除PA口的ADC功能
_tmpc0=0x00;//去除PA0引腳的TM輸出
_cp0c=0x00;//去除PA0引腳的比較器0功能
_cp1c=0x00;//去除pa口的比較器1功能
}
void shezhi(void)//鍵盤及液晶的引腳輸出輸入設(shè)置子函數(shù)
{
_pac=0x0f;//設(shè)置鍵盤接口輸入有效(高四位為輸出,低四位為輸入)
_papu=0xff;//鍵盤接口上拉電阻設(shè)置有效
datac=0;//設(shè)置液晶數(shù)據(jù)通道輸出有效
rsc=0;//設(shè)置rs端輸出有效
rwc=0;//設(shè)置rw端輸出有效
ec=0;//設(shè)置使能端輸出有效
}
復(fù)制代碼
作者:
17720837065
時(shí)間:
2017-3-18 08:34
666,請(qǐng)問(wèn)有光照傳感器的代碼嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1