赞
踩
1.模式化编程框图
2.模式化编程注意事项:
#include <REGX52.H> //主函数中要包括接下来引用的各函数头文件 #include "Delay.h"//延时函数 #include "light_position_number.h"//动态数码管显示函数 void main() { while(1) { light_position_number(1,2); // Delay(1); light_position_number(2,3); // Delay(1); light_position_number(3,4); // Delay(1); // light_position_number(2,3); // light_position_number(4,4); // light_position_number(5,5); // light_position_number(6,6); // light_position_number(7,7); } }
5.Delay.c函数(可用端口调试助手直接生成后修改,数值大小为xms,单位毫秒)
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
6.Delay.h文件
//对应的函数名不管原来大小写,这里统一大写
#ifndef _DELAY_H//如果没有定义delay.h函数
#define _DELAY_H//则定义delay.h函数
void Delay(unsigned int xms);//函数名,返回类型,参数名及类型
//注意要加分号,否则会显示在主函数初始处报错
#endif
7.显示函数(light_position_number)
#include <REGX52.H> //由于在新建的函数中使用到了52的端口,所以需要再次添加REGX52.H头文件 unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; void light_position_number(unsigned char position,number) { switch(position)//位码选择 { case 1:P2_4=0;P2_3=0;P2_2=0;break; case 2:P2_4=0;P2_3=0;P2_2=1;break; case 3:P2_4=0;P2_3=1;P2_2=0;break; case 4:P2_4=0;P2_3=1;P2_2=1;break; case 5:P2_4=1;P2_3=0;P2_2=0;break; case 6:P2_4=1;P2_3=0;P2_2=1;break; case 7:P2_4=1;P2_3=1;P2_2=0;break; case 8:P2_4=1;P2_3=1;P2_2=1;break; } P0=table[number];//段码选择 P0=0x00;//消隐 }
case语句后面一定要加空格,再加一个要比较的值
8.显示函数头文件定义
#ifndef _LIGHT_POSITION_NUMBER_H
#define _LIGHT_POSITION_NUMBER_H
void light_position_number(unsigned char position,number);
#endif
9、LCD1602的函数库使用:
(1)主函数
#include <REGX52.H> #include "LCD1602.h" void main() { LCD_Init(); LCD_ShowChar(1,1,'B'); LCD_ShowString(1,2,"Hello"); //在LCD1602指定位置开始显示所给数字 //若系统默认显示数字长度大于需要显示的数字,则向左补0。 //LCD_ShowNum(1,6,123,4); //若系统默认显示长度小于需要显示的数字,则从左往右擦除数字。 //LCD_ShowNum(1,6,1234,3); //若系统默认显示长度等于需要显示数字长度,则原样输出。 LCD_ShowNum(1,7,1234,4); //在LCD1602指定位置开始以有符号十进制显示所给数字 LCD_ShowSignedNum(1,11,-66,2); //在LCD1602指定位置开始以十六进制显示所给数字 LCD_ShowHexNum(2,1,128,2); LCD_ShowHexNum(2,4,0xA8,2); //在LCD1602指定位置开始以二进制显示所给数字 LCD_ShowBinNum(2,7,0xA8,8); }
(2)LCD1602库函数
#ifndef __LCD1602_H__
#define __LCD1602_H__
//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
#endif
#include <REGX52.H> //引脚配置: sbit LCD_RS=P2^6; sbit LCD_RW=P2^5; sbit LCD_EN=P2^7; #define LCD_DataPort P0 //函数定义: /** * @brief LCD1602延时函数,12MHz调用可延时1ms * @param 无 * @retval 无 */ void LCD_Delay() { unsigned char i, j; i = 2; j = 239; do { while (--j); } while (--i); } /** * @brief LCD1602写命令 * @param Command 要写入的命令 * @retval 无 */ void LCD_WriteCommand(unsigned char Command) { LCD_RS=0; LCD_RW=0; LCD_DataPort=Command; LCD_EN=1; LCD_Delay(); LCD_EN=0; LCD_Delay(); } /** * @brief LCD1602写数据 * @param Data 要写入的数据 * @retval 无 */ void LCD_WriteData(unsigned char Data) { LCD_RS=1; LCD_RW=0; LCD_DataPort=Data; LCD_EN=1; LCD_Delay(); LCD_EN=0; LCD_Delay(); } /** * @brief LCD1602设置光标位置 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @retval 无 */ void LCD_SetCursor(unsigned char Line,unsigned char Column) { if(Line==1) { LCD_WriteCommand(0x80|(Column-1)); } else if(Line==2) { LCD_WriteCommand(0x80|(Column-1+0x40)); } } /** * @brief LCD1602初始化函数 * @param 无 * @retval 无 */ void LCD_Init() { LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵 LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关 LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动 LCD_WriteCommand(0x01);//光标复位,清屏 } /** * @brief 在LCD1602指定位置上显示一个字符 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @param Char 要显示的字符 * @retval 无 */ void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char) { LCD_SetCursor(Line,Column); LCD_WriteData(Char); } /** * @brief 在LCD1602指定位置开始显示所给字符串 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param String 要显示的字符串 * @retval 无 */ void LCD_ShowString(unsigned char Line,unsigned char Column,char *String) { unsigned char i; LCD_SetCursor(Line,Column); for(i=0;String[i]!='\0';i++) { LCD_WriteData(String[i]); } } /** * @brief 返回值=X的Y次方 */ int LCD_Pow(int X,int Y) { unsigned char i; int Result=1; for(i=0;i<Y;i++) { Result*=X; } return Result; } /** * @brief 在LCD1602指定位置开始显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~65535 * @param Length 要显示数字的长度,范围:1~5 * @retval 无 */ void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length) { unsigned char i; LCD_SetCursor(Line,Column); for(i=Length;i>0;i--) { LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0'); } } /** * @brief 在LCD1602指定位置开始以有符号十进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:-32768~32767 * @param Length 要显示数字的长度,范围:1~5 * @retval 无 */ void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length) { unsigned char i; unsigned int Number1; LCD_SetCursor(Line,Column); if(Number>=0) { LCD_WriteData('+'); Number1=Number; } else { LCD_WriteData('-'); Number1=-Number; } for(i=Length;i>0;i--) { LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0'); } } /** * @brief 在LCD1602指定位置开始以十六进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~0xFFFF * @param Length 要显示数字的长度,范围:1~4 * @retval 无 */ void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length) { unsigned char i,SingleNumber; LCD_SetCursor(Line,Column); for(i=Length;i>0;i--) { SingleNumber=Number/LCD_Pow(16,i-1)%16; if(SingleNumber<10) { LCD_WriteData(SingleNumber+'0'); } else { LCD_WriteData(SingleNumber-10+'A'); } } } /** * @brief 在LCD1602指定位置开始以二进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~1111 1111 1111 1111 * @param Length 要显示数字的长度,范围:1~16 * @retval 无 */ void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length) { unsigned char i; LCD_SetCursor(Line,Column); for(i=Length;i>0;i--) { LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0'); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。