#include "STC15F2K60S2.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit CS=P1^0;
sbit SID=P1^1;
sbit SCLK=P1^2;
uchar num2;
uchar jj=0;
uchar flag=0;
//uchar code table[]={'0','1','2','3','4','5','6,'7','8','9','*','#'}; //显示字符表
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2a,0x23}; //显示字符表
//uchar code table[]={0xa3b0,0xa3b1,0xa3b2,0xa3b3,0xa3b4,0xa3b5,0xa3b6,0xa3b7,0xa3b8,0xa3b9,0xa3aa,0xa3a3}; //显示字符表
//=====================延时函数==========================
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms,即延时约xms毫秒
for(j=110;j>0;j--);
}
void send_command(uchar command_data)
{
uchar i;
uchar i_data;
i_data=0xf8;
CS=1;
SCLK=1;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
delayms(1);
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
delayms(1);
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data<<=4;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
delayms(1);
SCLK=1;
i_data=i_data<<1;
}
CS=0;
delayms(10);
}
void send_data(uchar command_data)
{
uchar i;
uchar i_data;
i_data=0xfa;
CS=1;
SCLK=1;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
delayms(1);
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
delayms(1);
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data<<=4;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
delayms(1);
SCLK=1;
i_data=i_data<<1;
}
CS=0;
delayms(10);
}
//=====================按键扫描==========================
uchar matrixkeyscan()
{
uchar temp,key;
P1=0xfe; //P1口赋值为 1111,1110即将P1.0置低
temp=P1; //将P1口赋给temp,等待按键按下
temp=temp&0xf0; //判断temp的高四位是否为0,即判断是否有键按下
if(temp!=0xf0) //当有键按下时
{
delayms(10); //延时去抖
temp=P1; //重新读一次P1口的数据
temp=temp&0xf0; //判断temp的高四位是否为0,即判断是否有键按下
if(temp!=0xf0) //确实有键按下时
{
temp=P1;
if(temp==0xee)
key=3;
if(temp==0xde)
key=2;
if(temp==0xbe)
key=1;
flag=1;
while(temp!=0xf0) //等待按键被释放
{
temp=P1; //不断读取P1口的值。然后赋给temp
temp=temp&0xf0; //判断高四位,只要结果不等于0xf0,说明按键没有释放,等待按键释放
delayms(30);
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
if(temp==0xed)
key=6;
if(temp==0xdd)
key=5;
if(temp==0xbd)
key=4;
flag=1;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
delayms(30);
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
if(temp==0xeb)
key=9;
if(temp==0xdb)
key=8;
if(temp==0xbb)
key=7;
flag=1;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
delayms(30);
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
if(temp==0xe7)
key=11;
if(temp==0xd7)
key=0;
if(temp==0xb7)
key=10;
flag=1;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
delayms(30);
}
}
}
return key;
}
//=====================串口初始化==========================
void uart_init()
{
AUXR=0x40; //定时器1速度是传统8051的12倍
TMOD&=0x0f; //设置T1定时器为工作模式0 16位自动装载
TL1=0xe0; //设置波特率为9600
TH1=0xfe;
SM0=0; //设置SCON 串口模式1 8位UART
SM1=1;
TR1=1; //开启T1定时器
REN=1; //允许串行接收
ET1=0; //关闭T1定时器
}
//=====================12232初始化==========================
void lcd_init()
{
delayms(100);
send_command(0x30); //设置8位数据口,基本指令模式
send_command(0x02);
send_command(0x06); //整体显示开,游标关,反白关
send_command(0x0c); //游标及显示右移一位
send_command(0x01); //写入空格清屏指令
send_command(0x80); //设定首次显示位置
}
void main()
{
lcd_init(); //lcd初始化
uart_init(); //串口初始化
while(1)
{
num2=matrixkeyscan();
if(flag==1)
{
flag=0;
SBUF=num2;
while(!
ti);
TI=0;
send_data(table[num2]);
}
}
}
现在矩阵按键肯定没问题了,问题是有时候显示不出来数,或者显示位置不对,比如说我按1 ,有时候在第一个显示,有时候在第二个显示,或者不一定在哪显示了。请大家看看问题出哪了
问题解决了,每次给地址前要把DDRAM清0.谢谢你这么关注我,亲,你要程序,加我好友发给你。
一周热门 更多>