找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2208|回复: 1
收起左侧

求助一下,如何用4x4矩阵键盘控制lcd1602的移屏速度

[复制链接]
ID:111317 发表于 2016-3-29 17:13 来自手机 | 显示全部楼层 |阅读模式
键号越大,移屏速度越快。刚开始学,希望大神详细点说。
回复

使用道具 举报

ID:111317 发表于 2016-3-29 17:38 | 显示全部楼层
这是程序,完全不行。。。


#include"lcd.h"

/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能                   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
           
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能                   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
#ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com)          //写入命令
{
        LCD1602_E = 0;     //使能
        LCD1602_RS = 0;           //选择发送命令
        LCD1602_RW = 0;           //选择写入
       
        LCD1602_DATAPINS = com;     //放入命令
        Lcd1602_Delay1ms(1);                //等待数据稳定

        LCD1602_E = 1;                  //写入时序
        Lcd1602_Delay1ms(5);          //保持时间
        LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)          //写入命令
{
        LCD1602_E = 0;         //使能清零
        LCD1602_RS = 0;         //选择写入命令
        LCD1602_RW = 0;         //选择写入

        LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

//        Lcd1602_Delay1ms(1);
        LCD1602_DATAPINS = com << 4; //发送低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能                   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/                  
#ifndef         LCD1602_4PINS                  
void LcdWriteData(uchar dat)                        //写入数据
{
        LCD1602_E = 0;        //使能清零
        LCD1602_RS = 1;        //选择输入数据
        LCD1602_RW = 0;        //选择写入

        LCD1602_DATAPINS = dat; //写入数据
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;   //写入时序
        Lcd1602_Delay1ms(5);   //保持时间
        LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)                        //写入数据
{
        LCD1602_E = 0;          //使能清零
        LCD1602_RS = 1;          //选择写入数据
        LCD1602_RW = 0;          //选择写入

        LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

        LCD1602_DATAPINS = dat << 4; //写入低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能                 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/                  
#ifndef                LCD1602_4PINS
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x38);  //开显示
        LcdWriteCom(0x0c);  //开显示不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //设置数据指针起点
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x32);         //将8位总线转为4位总线
        LcdWriteCom(0x28);         //在四位线下的初始化
        LcdWriteCom(0x0c);  //开显示不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //设置数据指针起点
}
#endif
/*******************************************************************************
*                 
*                                        普中科技
--------------------------------------------------------------------------------
* 实 验 名                 : LCD1602显示试验
* 实验说明       : LCD1602第一行Pechin Science,第二行显示Welcome to the world
*                * of MCU。并一直移动。
* 连接方式       : 见连接图
* 注    意                 :
*******************************************************************************/
#include<reg51.h>       
#include"lcd.h"
#include<intrins.h>
#define GPIO_KEY P1

//--定义全局变量--//
unsigned char PuZh[16] = " Pechin Science ";
unsigned char CnCh[27] = "Welcome to the world of MCU";

unsigned char KeyValue;
//用来存放读取到的键值

//--声明全局变量--//
void Delay10ms(unsigned int c);   //误差 0us

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
        unsigned char i;
        int KeyValue;
    char c=KeyValue;
        LcdInit();
       
        //--写第一行--//
        for(i=0; i<16; i++)
        {
                LcdWriteData(PuZh[i]);       
        }

        //--写第二行
        LcdWriteCom(0xC0); //设置坐标在第二行
        for(i=0; i<27; i++)
        {
                LcdWriteData(CnCh[i]);
        }

        LcdWriteCom(0x07); //设置每写一次整屏右移
        while(1)
        {                       
                LcdWriteCom(0xC0); //设置坐标在第二行
                for(i=0; i<27; i++)
                {
                        LcdWriteData(CnCh[i]);
                        Delay10ms(c+10);
                }
               
        }                               
}

/*******************************************************************************
* 函 数 名         : KeyScan
* 函数功能                   : 检测有按键按下并读取键值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

kscan(void)//键盘扫描子程序
{
        uchar i,GPIO_KEY,KeyValue=160;
        for(i=0;i<4;i++)
        {
            P1=_crol_(0xfe,i);  //逐行扫描
                GPIO_KEY=P1; //读取键值
                GPIO_KEY=GPIO_KEY & 0xf0;//屏蔽低4位行值
                if(GPIO_KEY!=0xf0)//高四位列值不全为1,说明有键按下,延时去抖动
                {
                        Delay10ms(1);
                        GPIO_KEY=P1;
                        GPIO_KEY=GPIO_KEY & 0xf0;            
                        if(GPIO_KEY!=0xf0)
                        {
                                GPIO_KEY=P1;                       
                                switch(GPIO_KEY)//根据按键所在的行与列位置确定键号
                                {
                                        case 0xee:KeyValue=160;break;
                                        case 0xde:KeyValue=150;break;                               
                                        case 0xbe:KeyValue=140;break;                               
                                        case 0x7e:KeyValue=130;break;

                                        case 0xed:KeyValue=120;break;
                                        case 0xdd:KeyValue=110;break;                               
                                        case 0xbd:KeyValue=100;break;                               
                                        case 0x7d:KeyValue=90;break;

                                        case 0xeb:KeyValue=80;break;
                                        case 0xdb:KeyValue=70;break;                               
                                        case 0xbb:KeyValue=60;break;                               
                                        case 0x7b:KeyValue=50;break;

                                        case 0xe7:KeyValue=40;break;
                                        case 0xd7:KeyValue=30;break;                               
                                        case 0xb7:KeyValue=20;break;                               
                                        case 0x77:KeyValue=10;break;                       
                                        default:break;
                                }                                                       
                                while((GPIO_KEY & 0xf0)!=0xf0) // 等待按键释放
                                {       
                                        GPIO_KEY=P1;GPIO_KEY=GPIO_KEY & 0xf0;222
                                       
                                }                                       
                        }                       
                }       
        }
        return KeyValue;       
        }
/*******************************************************************************
* 函 数 名         : Delay10ms
* 函数功能                   : 延时函数,延时10ms
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Delay10ms(unsigned int KeyValue)   //误差 0us
{
    char c=KeyValue;
    unsigned char  b, a;

        //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (c=KeyValue;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表