这是程序,完全不行。。。
#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--);
}
}
}
|