4*4矩阵键盘控制四位数码管显示单片机C语言程序

4*4矩阵键盘控制四位数码管显示单片机C语言程序,第1张

#include <intrins.h>

#define uchar unsigned char

#define ROWP P3

#define LINP P2

void Delay(uchar i) {

uchar j

for(i>0i--)

for(j=0j<112j++)

_nop_()

}

uchar Keyscan(){

uchar i,j,RLP,num

for(i=0i<4i++){

LINP=(LINP|0xf0)&(~(0x10<<i))

Delay(1)

for(j=0j<团纯仿5j++){

RLP=(ROWP|0x1f)&(~(0x10>>j))

if(ROWP==RLP){

Delay(2)

if(ROWP==RLP)

num=i*5+j+1

}

}

}

return num

}

5*4的,稍裤宏微修塌纤改,就是4*4的

#define LCD1602_FLAG

#define LCD1602_PORT P0

#include<reg51.h>

#include<stddef.h>

#define uchar unsigned char

sbit lcd1602_rs=P2^0

sbit lcd1602_e=P2^2

sbit lcd1602_rw=P2^1

sbit lcd1602_busy=P0^7

uchar str[]="This is Key Test"

uchar keyval,keystr[16]

void delay(uchar a)

{

uchar i

while(a--)for(i=0i<120i++)

}

/*

************************************

* 函数名称:lcd1602_CheckBusy()

* 函数功能:状态查询

************************************

*/

void lcd1602_CheckBusy()

{

do

{

lcd1602_busy=1

lcd1602_rs=0

lcd1602_rw=1

lcd1602_e=0

lcd1602_e=1

}

while(lcd1602_busy)

}

/*

***************************************

* 函数名称: lcd1602_WriteCmd()

* 函数功能:写命令

* 入口参数:命令字

* 出口参数:无

***************************************

*/

void lcd1602_WriteCmd(const uchar cmd)

{

lcd1602_CheckBusy()

lcd1602_rs=0

lcd1602_rw=0

lcd1602_e=1

LCD1602_PORT=cmd

lcd1602_e=0

}

/*

*******************************************

* 函数名称:lcd1602_WriteData()

* 函数功能:写数据

* 入口参数:c--待写数据

* 出口参数:无

*********************************************

*/

void lcd1602_WriteData(const uchar c)

{

lcd1602_CheckBusy()

lcd1602_rs=1

lcd1602_rw=0

lcd1602_e=1

LCD1602_PORT=c

lcd1602_e=0

}

/*

***********************************************

* 函数名称:lcd1602_Init()

* 函数侍历功能:初始化LCD

* 入口参数:无

* 出口参数:无

***********************************************

*/

void lcd1602_Init()

{

lcd1602_WriteCmd(0x38) //显示模式为8位2行5*7点阵

lcd1602_WriteCmd(0x0c)//display enable,flag enable,flash enable,

lcd1602_WriteCmd(0x06)//flag move to right,screen don't move

lcd1602_WriteCmd(0x01)//clear screen

}

/*

************************************************

* 函数名称:lcd1602_Display()

* 函数功能: 字符显示

* 入口参数:ptr--字符或字符串指针

* 出口参数:无

* 说    明:用户可通过以下方式来调用:

*           1)lcd1602_Display("Hello,world!")

*           2) INT8U 存储老掘搜类型 txt[]="要显示散猛的字符串"

*              或者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'}

*              INT8U *ptr

*              ptr=&txt

*              lcd1602_Display(ptr)

*              或 lcd1602_Display(txt)

*              或 lcd1602_Display(&txt)

************************************************

*/

void lcd1602_Display(const uchar *ptr,uchar line)

{

uchar data i=0

uchar *data q

q=ptr

switch(line)

{

case 0:

lcd1602_WriteCmd(0x80)

while(q!=NULL &&(*q!='\0') &&i<16)

{

lcd1602_WriteData(*q)

q++

i++

}

break

case 1:

lcd1602_WriteCmd(0xc0)

while(q!=NULL &&(*q!='\0') &&i<16)

{

lcd1602_WriteData(*q)

q++

i++

}

break

}

}

uchar kbscan(void)

{

unsigned char sccode,recode

P3=0x0f  //发0扫描,列线输入

if ((P3 &0x0f) != 0x0f)  //有键按下

{

delay(20)   //延时去抖动

if ((P3&0x0f)!= 0x0f)

{

sccode = 0xef    //逐行扫描初值

while((sccode&0x01)!=0)

{

P3=sccode

if((P3&0x0f)!=0x0f)

{

recode=(P3&0x0f)|0xf0

while((P3&0x0f)!=0x0f)//等待键抬起

return((~sccode)+(~recode))

}

else

sccode=(sccode<<1)|0x01

}

}

}

return 0  //无键按下,返回0

}

uchar getkey(void)

{

uchar key

key=kbscan()

if(key==0){keyval=0xffreturn(0)}

switch(key)

{

case 0x11:keyval=7break

case 0x12:keyval=4break

case 0x14:keyval=1break

case 0x18:keyval=10break

case 0x21:keyval=8break

case 0x22:keyval=5break

case 0x24:keyval=2break

case 0x28:keyval=0break

case 0x41:keyval=9break

case 0x42:keyval=6break

case 0x44:keyval=3break

case 0x48:keyval=11break

case 0x81:keyval=12break

case 0x82:keyval=13break

case 0x84:keyval=14break

case 0x88:keyval=15break

default:keyval=0xffbreak

}

if(keyval!=0xff)return(1)

else return(0)

}

main()

{

uchar num

lcd1602_Init()

lcd1602_Display(str,0)

while(1)

{

if(getkey())

{

keystr[num]=keyval+0x30

lcd1602_Display(keystr,1)

num++

num%=16

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12569159.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存