单片机学习小组
直播中

蔡晨史

7年用户 160经验值
私信 关注

矩阵按键输入任意两位数显示在LCD12864

昨天,12单片机12M换24M导致时序错误,今天12864键值显示异常。看来短时间内完成工程。必须经验丰富来着。
/********************************************************** 用矩阵按键输入任意两位数并显示在12684上。如先输入2,再输入5

液晶上显示25。用矩阵按键0-9共10个按键。LCD12864用串行方式操作, 如果用并行,请自行修改。

***********************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define NOP _nop_();



***it LCD_CS=P1^0; //片选,高电平有效(RS)
***it LCD_SID=P1^1; //串行数据输入端(R/W)
***it LCD_SCLK=P1^2; //串行同步时钟,上升沿读取SID数据(E) ***it LCD_PSB=P1^3; //并/串选择 H并行 L串行
***it LCD_RST=P1^4; //复位,低电平有效



uchar keynum;
uchar code dis1[]={"请输入任意两位数"};
uchar code dis2[16]={"0123456789ABCDEF"};
uchar dis_buf[]={0,0};



uchar getkey();
void display();
void delay(uint x)
         {
         uchar i;
         while(x--)
                 {
                 for(i=0;i<110;i++);
                 }
         }
/*写指令程序,指令由3个字节组成,第一个为写指令*/
/*第二个为指令高4位,第三个为指令低4位*/
void send_cmd(uchar cmd_dat)
         {
         uchar i;
         uchar i_dat;
         i_dat=0xf8;
         LCD_CS=1;
         LCD_SCLK=0;
         for(i=0;i<8;i++)
                 {
                 LCD_SID=(bit)(i_dat&0x80);
                 LCD_SCLK=0;
                 LCD_SCLK=1;
                 i_dat=i_dat<<1;
                 }
         i_dat=cmd_dat;
         i_dat&=0xf0;
         for(i=0;i<8;i++)
                 {
                 LCD_SID=(bit)(i_dat&0x80);
                 LCD_SCLK=0;
                 LCD_SCLK=1;
                 i_dat=i_dat<<1;
                 }
         i_dat=cmd_dat;
         i_dat<<=4;
         for(i=0;i<8;i++)
                 {
                 LCD_SID=(bit)(i_dat&0x80);
                 LCD_SCLK=0;
                 LCD_SCLK=1;
                 i_dat=i_dat<<1;
                 }
         LCD_CS=0;
         delay(10);
         }

/*写数据程序,指令由3个字节组成,第一个为写数据*/ /*第二个为数据高4位,第三个为数据低4位*/

void send_dat(uchar cmd_dat)
         {
         uchar i;
         uchar i_dat;
         i_dat=0xfa;
         LCD_CS=1;
         for(i=0;i<8;i++)
                 {
                 LCD_SID=(bit)(i_dat&0x80);
                 LCD_SCLK=0;
                 LCD_SCLK=1;
                 i_dat=i_dat<<1;
                 }
         i_dat=cmd_dat;
         i_dat&=0xf0;
         for(i=0;i<8;i++)
                 {
                 LCD_SID=(bit)(i_dat&0x80);
                 LCD_SCLK=0;
                 LCD_SCLK=1;
                 i_dat=i_dat<<1;
                 }
         i_dat=cmd_dat;
         i_dat<<=4;
         for(i=0;i<8;i++)
                 {
                 LCD_SID=(bit)(i_dat&0x80);
                 LCD_SCLK=0;
                 LCD_SCLK=1;
                 i_dat=i_dat<<1;
                 }
         LCD_CS=0;
         delay(10);
         }
         
         
void LCD_INIT()
         {
         LCD_PSB=0; //串行方式操作
         send_cmd(0x30); //基本指令操作
         delay(5);
         send_cmd(0x0c); //显示开,关游标,游标位置反白禁止 delay(5);
         send_cmd(0x06); //光标右移,整体显示不移动 delay(5);
         send_cmd(0x01); //清除LCD显示内容
         delay(5);
         }

         
uchar getkey()
         {
         unsigned char row,col,k;
         for(row=0;row<4;row++) //行值依次为0xfe, 0xfd, 0xfb, 0xf7
                 {
                 P2=~(1<                  k=0x10;
                 for(col=0;col<4;col++) //列值扫描
                         {
                         if(!(P2&k)) //如果有键按下
                         return (row*4+col); //返回按键位置
                         k<<=1;
                         }
                 }
         return 99; //无键按下返回99
         }

void key_dispos() //按键处理并显示程序
         {
         display(); //显示第一行和初始键值 keynum=getkey(); //获取键值
         if(keynum<10) //
                 {
                 dis_buf[1]=dis_buf[0]; //第一个键值移位显示 dis_buf[0]=keynum; //获得第二个键值 display(); //显示改变后的键值 while(keynum<10) //松手检测
                         {
                         keynum=getkey();
                         }
                 }
         }

void main()
         {
         P1=0xff;
         LCD_INIT();
         while(1)
                 {
                 key_dispos();
                 }
         }
         void display()
                 {
                 uint i;
                 send_cmd(0x80); //第一行显示
                 i=0;
                         while(dis1!='\0')
                         {
                         send_dat(dis1);
                         i++;
                         }
                 send_cmd(0x90); //第二行显示数据 send_dat(dis2[dis_buf[1]]);
                 send_dat(dis2[dis_buf[0]]);
         }



更多回帖

发帖
×
20
完善资料,
赚取积分