我自己做的是用stm32做的,这个是帮同学用51做的。设计要求见我的另一篇博客。
是基于普中科技的开发板做的。
工程文件可以到我的主页下载资源里找,我也上传上去了。
一点补充说明:
1.程序是在普中科技51开发板例程程序基础上改的。
2.关于LCD的使用可以到哔哩哔哩上找普中科技的51开发板视频,有详细的讲解。
3.由于在给LCD写数据的过程中按下按键程序不会理会,所以按的时间会略长一点,我写的程序是直接重写第二行,所以时间会长一点,当然可以在此基础上改进,比如只改写数字所对应的位,应该反应会快一些。
4.由于是在stm32程序的基础上改的(参见我的另一篇博客),所以没有写注释,有注释也是stm32程序的注释,有的和实际功能不符,在此说明一下,大家不要为此感到疑惑。
欢迎大家对代码进行改进和指正。
还有问题的话可以在下面留言或者找我(qq:2254786469)。
下面给出主函数代码:
/**************************************************************************************
* LCD1602液晶显示实验 *
实现现象:下载程序后插上LCD1602液晶在开发板上,即可显示
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
#define KEY0_PRES 1 //KEY0按下
#define KEY1_PRES 2 //KEY1按下
#define KEY2_PRES 3 //KEY2按下
#define WKUP_PRES 4 //KEY_UP按下(即WK_UP/KEY_UP)
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit KEY0=P3^1;//读取按键0
sbit KEY1=P3^0;//读取按键1
sbit KEY2=P3^2;//读取按键2
sbit WK_UP=P3^3;//读取按键3(WK_UP)
sbit A=P2^0;
sbit B2=P2^1;
sbit C=P2^2;
u8 Disp[]=" A B C ";
u8 Data[]=" 00 00 00 ";
u8 a1,a2,b1,b2,c1,c2,t;
void delay(u16 i)
{
while(i--);
}
void write(){
u8 i;
LcdWriteCom(0x80+0x40) ;
Data[1]=a2;
Data[2]=a1;
Data[6]=b2;
Data[7]=b1;
Data[11]=c2;
Data[12]=c1;
for(i=0;i<16;i++)
{
LcdWriteData(Data[i]);
}}
u8 KEY_Scan()
{
if(KEY0==0||KEY1==0||KEY2==0)
{
delay(500);//去抖动
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(KEY2==0)return KEY2_PRES;
}
return 0;// 无按键按下
}
void addition_A(){
if (a1<'9') a1++;
else {
if (a2<'9'){
a2++;
a1='0'; }
else {
a1='0';
a2='0';}
}
//write();
}
void addition_B(){
if (b1<'9') b1++;
else {
if (a2<'9'){
b2++;
b1='0'; }
else {
b1='0';
b2='0';
}
}
//write();
}
void addition_C(){
if (c1<'9') c1++;
else {
if (c2<'9'){
c2++;
c1='0'; }
else {
c1='0';
c2='0';
}
}
//write();
}
void subtract_A(){
if (a1<'1'&& a2<'1') a1=='0';//个位十位都等于0
else {
if (a2>'0'&& a1<'1'){//个位等于0,十位大于零
a2--;
a1='9'; }
else {//都大于0或十位等于0,个位大于0
a1--;
}
}
//write();
}
void subtract_B(){
if (b1<'1'&& b2<'1') b1=='0';//个位十位都等于0
else {
if (b2>'0'&& b1<'1'){//个位等于0,十位大于零
b2--;
b1='9'; }
else {//都大于0或十位等于0,个位大于0
b1--;
}
}
//write();
}
void subtract_C(){
if (c1<'1'&& c2<'1') c1=='0';//个位十位都等于0
else {
if (c2>'0'&& c1<'1'){//个位等于0,十位大于零
c2--;
c1='9'; }
else {//都大于0或十位等于0,个位大于0
c1--;
}
}
//write();
}
void key_press(u8 a){
if (a==0) ;
else{
if (a==1){
if(t==0) addition_A();
else if(t==1) addition_B();
else addition_C();
}
else if(a==2){
if(t==0) subtract_A();
else if(t==1) subtract_B();
else subtract_C();
}
else{//按下KEY3
if(t==2) t=0;
else t++;
}
}}
void indicator(){//指示当前操作的业务,在上面画条线
if(t==0) {
A=0;
B2=1;
C=1;
}
else if(t==1) {
A=1;
B2=0;
C=1;}
else{
A=1;
B2=1;
C=0;}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
u8 i;
LcdInit();
P3=0xff;
t=0;
a1='0';
a2='0';
b1='0';
b2='0';
c1='0';
c2='0';
//LcdWriteCom(0x80+0x40) ;
for(i=0;i<16;i++)
{
LcdWriteData(Disp[i]);
}
LcdWriteCom(0x80+0x40) ;
for(i=0;i<16;i++)
{
LcdWriteData(Data[i]);
}
while(1){
key_press(KEY_Scan());
indicator();
write();
};
}